From 670cc7bc430718f60093fdb19afc084171a860da Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 24 Feb 2026 17:28:19 +0000 Subject: [PATCH 1/3] feat: speed up gas estimation --- .../payload/simulator/simulatorstats/types.go | 12 ++++++ runner/payload/simulator/worker.go | 38 +++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/runner/payload/simulator/simulatorstats/types.go b/runner/payload/simulator/simulatorstats/types.go index 701093b..0285b90 100644 --- a/runner/payload/simulator/simulatorstats/types.go +++ b/runner/payload/simulator/simulatorstats/types.go @@ -1,6 +1,8 @@ package simulatorstats import ( + "crypto/sha256" + "encoding/json" "fmt" "maps" "math" @@ -222,6 +224,16 @@ type Stats struct { Precompiles OpcodeStats } +func (s *Stats) Hash() common.Hash { + + data, err := json.Marshal(s) + if err != nil { + panic(err) + } + hash := sha256.Sum256(data) + return common.Hash(hash[:]) +} + func (s *Stats) ToConfig() (*abi.SimulatorConfig, error) { rounded := s.Copy().Round() precompiles := make([]abi.PrecompileConfig, 0, len(rounded.Precompiles)) diff --git a/runner/payload/simulator/worker.go b/runner/payload/simulator/worker.go index a495023..0ddafaf 100644 --- a/runner/payload/simulator/worker.go +++ b/runner/payload/simulator/worker.go @@ -39,7 +39,8 @@ type Contract struct { type SimulatorPayloadDefinition = simulatorstats.StatsConfig type simulatorPayloadWorker struct { - log log.Logger + log log.Logger + gasUsedCache map[common.Hash]uint64 params benchtypes.RunParams chainID *big.Int @@ -139,12 +140,22 @@ func NewSimulatorPayloadWorker(ctx context.Context, log log.Logger, elRPCURL str // Create transactors for each caller transactors := make([]*bind.TransactOpts, numCallers) + for i, key := range callerKeys { transactor, err := bind.NewKeyedTransactorWithChainID(key, chainID) if err != nil { return nil, errors.Wrapf(err, "failed to create transactor for caller %d", i) } transactor.NoSend = true + nonce, err := client.PendingNonceAt(context.Background(), crypto.PubkeyToAddress(key.PublicKey)) + if err != nil { + return nil, errors.Wrapf(err, "failed to get nonce for caller %d", i) + } + transactor.Nonce = big.NewInt(int64(nonce)) + + transactor.GasFeeCap = new(big.Int).Mul(big.NewInt(1e9), big.NewInt(1)) + transactor.GasTipCap = big.NewInt(1) + transactors[i] = transactor } @@ -192,6 +203,7 @@ func NewSimulatorPayloadWorker(ctx context.Context, log log.Logger, elRPCURL str scaleFactor: scaleFactor, actualNumConfig: simulatorstats.NewStats(), numCallers: numCallers, + gasUsedCache: make(map[common.Hash]uint64), } return t, nil @@ -469,6 +481,11 @@ func (t *simulatorPayloadWorker) fundCallerAccounts(ctx context.Context) error { // If using just the prefunded account, no funding transfer needed if t.numCallers == 1 && t.callerAddrs[0] == prefundAddr { t.log.Info("Using single caller (prefunded account)", "address", prefundAddr.Hex()) + pendingNonce, err := t.client.PendingNonceAt(ctx, prefundAddr) + if err != nil { + return errors.Wrap(err, "failed to get pending nonce for prefunded account") + } + t.transactors[0].Nonce = big.NewInt(int64(pendingNonce)) return nil } @@ -562,6 +579,8 @@ func (t *simulatorPayloadWorker) sendTxs(ctx context.Context) error { gas := t.params.GasLimit - 100_000 + sendTxsStartTime := time.Now() + for i := uint64(0); i < uint64(math.Ceil(float64(t.numCallsPerBlock)*t.scaleFactor)); i++ { actual := t.actualNumConfig expected := t.payloadParams.Mul(float64(t.numCalls+1) * t.scaleFactor) @@ -569,14 +588,25 @@ func (t *simulatorPayloadWorker) sendTxs(ctx context.Context) error { // Round-robin across callers callerIdx := t.currCallerIdx t.currCallerIdx = (t.currCallerIdx + 1) % t.numCallers - blockCounts := expected.Sub(actual).Round() + + expectedGas, ok := t.gasUsedCache[blockCounts.Hash()] + if ok { + t.transactors[callerIdx].GasLimit = expectedGas + } else { + t.transactors[callerIdx].GasLimit = 0 + } + transferTx, err := t.createCallTx(t.transactors[callerIdx], t.callerKeys[callerIdx], blockCounts) if err != nil { t.log.Error("Failed to create transfer transaction", "err", err) return err } + t.gasUsedCache[blockCounts.Hash()] = transferTx.Gas() + + t.transactors[callerIdx].Nonce = t.transactors[callerIdx].Nonce.Add(t.transactors[callerIdx].Nonce, big.NewInt(1)) + gasUsed := transferTx.Gas() if gasUsed > gas { t.log.Warn("Gas used is greater than gas limit, stopping tx sending", "gasUsed", gasUsed, "gasLimit", t.params.GasLimit) @@ -594,11 +624,13 @@ func (t *simulatorPayloadWorker) sendTxs(ctx context.Context) error { } t.mempool.AddTransactions(txs) + sendTxsDuration := time.Since(sendTxsStartTime) + log.Info("Send transactions duration", "duration", sendTxsDuration, "numCalls", uint64(math.Ceil(float64(t.numCallsPerBlock)*t.scaleFactor))) return nil } func (t *simulatorPayloadWorker) createCallTx(transactor *bind.TransactOpts, fromPriv *ecdsa.PrivateKey, config *simulatorstats.Stats) (*types.Transaction, error) { - simulator, err := abi.NewSimulator(t.contractAddr, t.contractBackend) + simulator, err := abi.NewSimulatorTransactor(t.contractAddr, t.contractBackend) if err != nil { return nil, errors.Wrap(err, "failed to create simulator transactor") } From fc32ba8c18afbf0af26babfeb0a4ec0fa6650e3b Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 24 Feb 2026 17:28:50 +0000 Subject: [PATCH 2/3] fix: contract fixes --- contracts/Makefile | 2 +- contracts/src/Simulator.sol | 31 ++++++++++++++--------- runner/payload/simulator/abi/Simulator.go | 2 +- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/contracts/Makefile b/contracts/Makefile index 73ceae6..fbe4b79 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -2,7 +2,7 @@ build: build-abi build-bin build-abi-go build-abi: src/** mkdir -p abi - forge inspect src/Simulator.sol:Simulator abi --json > abi/Simulator.json + forge inspect contracts/src/Simulator.sol:Simulator abi --json > abi/Simulator.json build-bin: src/** forge build --extra-output-files bin --force diff --git a/contracts/src/Simulator.sol b/contracts/src/Simulator.sol index 81735e8..b52c7fb 100644 --- a/contracts/src/Simulator.sol +++ b/contracts/src/Simulator.sol @@ -319,26 +319,33 @@ contract Simulator { function run_blake2f(uint256 num_iterations) private { bytes32[2] memory h; - h[0] = 0x48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5; - h[1] = 0xd182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b; + h[0] = 0xa1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8; + h[1] = 0xa1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8; bytes32[4] memory m; - m[0] = 0x6162630000000000000000000000000000000000000000000000000000000000; - m[1] = 0x0000000000000000000000000000000000000000000000000000000000000000; - m[2] = 0x0000000000000000000000000000000000000000000000000000000000000000; - m[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + m[0] = 0xc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2; + m[1] = 0xc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2; + m[2] = 0xc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2; + m[3] = 0xc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2; bytes8[2] memory t; - t[0] = 0x0300000000000000; - t[1] = 0x0000000000000000; + t[0] = 0x0000000000000000; + t[1] = 0x0000000000ff00ff; bool f = true; for (uint256 i = 0; i < num_iterations; i++) { - uint32 rounds = uint32(i); - (bool ok,) = - address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); - require(ok, "Blake2f failed"); + uint32 rounds = 0xc00; + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); } } diff --git a/runner/payload/simulator/abi/Simulator.go b/runner/payload/simulator/abi/Simulator.go index 3c1eaa7..c841152 100644 --- a/runner/payload/simulator/abi/Simulator.go +++ b/runner/payload/simulator/abi/Simulator.go @@ -50,7 +50,7 @@ type SimulatorConfig struct { // SimulatorMetaData contains all meta data concerning the Simulator contract. var SimulatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"offset\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"hashLongString\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize_address_chunk\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize_storage_chunk\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"num_accounts_needed\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structSimulatorConfig\",\"components\":[{\"name\":\"load_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"update_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"create_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"load_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"update_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delete_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"create_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"precompiles\",\"type\":\"tuple[]\",\"internalType\":\"structPrecompileConfig[]\",\"components\":[{\"name\":\"precompile_address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"num_calls\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"num_address_initialized\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"num_storage_deleted\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"num_storage_initialized\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"num_storage_slots_needed\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structSimulatorConfig\",\"components\":[{\"name\":\"load_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"update_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"create_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"load_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"update_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delete_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"create_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"precompiles\",\"type\":\"tuple[]\",\"internalType\":\"structPrecompileConfig[]\",\"components\":[{\"name\":\"precompile_address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"num_calls\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"run\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structSimulatorConfig\",\"components\":[{\"name\":\"load_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"update_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"create_accounts\",\"type\":\"uint160\",\"internalType\":\"uint160\"},{\"name\":\"load_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"update_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delete_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"create_storage\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"precompiles\",\"type\":\"tuple[]\",\"internalType\":\"structPrecompileConfig[]\",\"components\":[{\"name\":\"precompile_address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"num_calls\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", - Bin: "0x60806040527002000000000000000000000000000000006001556202000060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507002000000000000000000000000000000006003557002000000000000000000000000000000006004556202000060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040516154fc3803806154fc83398181016040528101906100ea9190610219565b8060055f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661011a9190610271565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166101889190610271565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506102b8565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b6101f8816101d0565b8114610202575f80fd5b50565b5f81519050610213816101ef565b92915050565b5f6020828403121561022e5761022d6101cc565b5b5f61023b84828501610205565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61027b826101d0565b9150610286836101d0565b9250828201905073ffffffffffffffffffffffffffffffffffffffff8111156102b2576102b1610244565b5b92915050565b615237806102c55f395ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c8063768c39af11610064578063768c39af146100e35780637b58286614610113578063cb805ac114610131578063e2b5a25c14610161578063ee2bb32b1461017f57610091565b80633594dea61461009557806339aa1ab91461009f578063458240e8146100bd5780634e83a9d5146100d9575b5f80fd5b61009d61019d565b005b6100a76102e6565b6040516100b491906136a3565b60405180910390f35b6100d760048036038101906100d291906136f0565b6102ec565b005b6100e16109e7565b005b6100fd60048036038101906100f891906136f0565b610a4c565b60405161010a91906136a3565b60405180910390f35b61011b610a75565b60405161012891906137a7565b60405180910390f35b61014b600480360381019061014691906136f0565b610a9f565b60405161015891906137f5565b60405180910390f35b610169610b02565b60405161017691906137f5565b60405180910390f35b610187610b27565b60405161019491906136a3565b60405180910390f35b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f606460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166101f1919061383b565b90505f808390505b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161015610271578073ffffffffffffffffffffffffffffffffffffffff166108fc600190811502906040515f60405180830381858888f19350505050915080806001019150506101f9565b50606460025f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102a3919061383b565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60035481565b600154816080013582606001356004546103069190613882565b6103109190613882565b1115610351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034890613925565b60405180910390fd5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681602001602081019061039c919061396d565b825f0160208101906103ae919061396d565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103da919061383b565b6103e4919061383b565b73ffffffffffffffffffffffffffffffffffffffff16111561043b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043290613a08565b60405180910390fd5b5f8060045490505b82606001356004546104559190613882565b81101561046f578054820191508080600101915050610443565b50816060013560045f8282546104859190613882565b925050819055505f60045490505b82608001356004546104a59190613882565b8110156104bc578081558080600101915050610493565b50816080013560045f8282546104d29190613882565b925050819055505f60015490505b8260c001356001546104f29190613882565b8110156105095780815580806001019150506104e0565b508160c0013560015f82825461051f9190613882565b925050819055505f60035490505b8260a0013560035461053f9190613882565b811015610556575f8155808060010191505061052d565b508160a0013560035f82825461056c9190613882565b925050819055505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b8260400160208101906105ac919061396d565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166105d8919061383b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16101561064e578073ffffffffffffffffffffffffffffffffffffffff166108fc600190811502906040515f60405180830381858888f19350505050508080600101915050610599565b50816040016020810190610662919061396d565b60025f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610691919061383b565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b825f016020810190610707919061396d565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610733919061383b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1610156107735780806001019150506106f5565b50815f016020810190610786919061396d565b60055f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166107b5919061383b565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b82602001602081019061082c919061396d565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610858919061383b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1610156108ce578073ffffffffffffffffffffffffffffffffffffffff166108fc600190811502906040515f60405180830381858888f19350505050508080600101915050610819565b508160200160208101906108e2919061396d565b60055f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610911919061383b565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f5b828060e001906109619190613a32565b90508110156109e2576109d5838060e0019061097d9190613a32565b8381811061098e5761098d613a94565b5b9050604002015f0160208101906109a59190613afc565b848060e001906109b59190613a32565b848181106109c6576109c5613a94565b5b90506040020160200135610b2d565b8080600101915050610951565b505050565b5f60015490505f60646001546109fd9190613882565b90505f8290505b81811015610a2e57805f808381526020019081526020015f20819055508080600101915050610a04565b50606460015f828254610a419190613882565b925050819055505050565b5f81608001358260600135600454610a649190613882565b610a6e9190613882565b9050919050565b60605f604051602001610a8790613fb9565b60405160208183030381529060405290508091505090565b5f816020016020810190610ab3919061396d565b825f016020810190610ac5919061396d565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610af1919061383b565b610afb919061383b565b9050919050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b6f57610b6a81610fe7565b610fe3565b600273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb357610bae8160016110aa565b610fe2565b600373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bf757610bf28160016111b7565b610fe1565b600473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c3b57610c3681600161128c565b610fe0565b600573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c7f57610c7a8160016113c7565b610fdf565b600673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cc157610cbc816115d8565b610fde565b600773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d0357610cfe81611736565b610fdd565b600873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d4557610d408161188c565b610fdc565b600973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d8757610d8281611bb2565b610fdb565b61010073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dca57610dc581611f61565b610fda565b600b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0c57610e07816120f0565b610fd9565b600c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e4e57610e49816123be565b610fd8565b600d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e9057610e8b816125cb565b610fd7565b600e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ed257610ecd81612a59565b610fd6565b600f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f1457610f0f81612f12565b610fd5565b601073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f5657610f51816132aa565b610fd4565b601173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f9857610f938161341e565b610fd3565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca906140fe565b60405180910390fd5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5050565b5f601c90505f7f9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac80388256085f1b90505f7f4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada5f1b90505f5b848110156110a3575f815f1b90506001818686866040515f815260200160405260405161106a949392919061414f565b6020604051602081039080840390855afa15801561108a573d5f803e3d5ffd5b505050602060405103515050808060010191505061103a565b5050505050565b5f5b828110156111b25781156111365760026110c4610a75565b826040516020016110d69291906141e2565b6040516020818303038152906040526040516110f2919061424d565b602060405180830381855afa15801561110d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611130919061428d565b506111a5565b60028160405160200161114991906142b8565b604051602081830303815290604052604051611165919061424d565b602060405180830381855afa158015611180573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111a3919061428d565b505b80806001019150506110ac565b505050565b5f5b828110156112875781156112275760036111d1610a75565b826040516020016111e39291906141e2565b6040516020818303038152906040526040516111ff919061424d565b602060405180830381855afa15801561121a573d5f803e3d5ffd5b505050604051515061127a565b60038160405160200161123a91906142b8565b604051602081830303815290604052604051611256919061424d565b602060405180830381855afa158015611271573d5f803e3d5ffd5b50505060405151505b80806001019150506111b9565b505050565b5f5b828110156113c257811561132f57600473ffffffffffffffffffffffffffffffffffffffff166112bc610a75565b826040516020016112ce9291906142d2565b6040516020818303038152906040526040516112ea919061424d565b5f60405180830381855afa9150503d805f8114611322576040519150601f19603f3d011682016040523d82523d5f602084013e611327565b606091505b5050506113b5565b600473ffffffffffffffffffffffffffffffffffffffff168160405160200161135891906136a3565b604051602081830303815290604052604051611374919061424d565b5f60405180830381855afa9150503d805f81146113ac576040519150601f19603f3d011682016040523d82523d5f602084013e6113b1565b606091505b5050505b808060010191505061128e565b505050565b5f6040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525090505f6040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525090505f5b848110156115d157831561150d575f611452610a75565b826040516020016114649291906141e2565b6040516020818303038152906040529050600573ffffffffffffffffffffffffffffffffffffffff168451845183518787866040516020016114ab96959493929190614300565b6040516020818303038152906040526040516114c7919061424d565b5f60405180830381855afa9150503d805f81146114ff576040519150601f19603f3d011682016040523d82523d5f602084013e611504565b606091505b505050506115c4565b5f8160405160200161151f91906142b8565b6040516020818303038152906040529050600573ffffffffffffffffffffffffffffffffffffffff1684518451835187878660405160200161156696959493929190614300565b604051602081830303815290604052604051611582919061424d565b5f60405180830381855afa9150503d805f81146115ba576040519150601f19603f3d011682016040523d82523d5f602084013e6115bf565b606091505b505050505b808060010191505061143b565b5050505050565b5f7f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd390505f7f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490505f600190505f600290505f5b8581101561172e575f80600673ffffffffffffffffffffffffffffffffffffffff16878787876040516020016116659493929190614363565b604051602081830303815290604052604051611681919061424d565b5f60405180830381855afa9150503d805f81146116b9576040519150601f19603f3d011682016040523d82523d5f602084013e6116be565b606091505b509150915081611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906143f0565b60405180910390fd5b808060200190518101906117179190614438565b80955081965050505050808060010191505061162c565b505050505050565b5f7f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd390505f7f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490505f600290505f5b84811015611885575f80600773ffffffffffffffffffffffffffffffffffffffff168686866040516020016117bc93929190614476565b6040516020818303038152906040526040516117d8919061424d565b5f60405180830381855afa9150503d805f8114611810576040519150601f19603f3d011682016040523d82523d5f602084013e611815565b606091505b50915091508161185a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611851906144f5565b60405180910390fd5b8080602001905181019061186e9190614438565b809650819750505050508080600101915050611785565b5050505050565b5f6040518060c001604052807f2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da81526020017f2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f681526020017f1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc81526020017f22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d981526020017f2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f9081526020017f2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e81525090505f5b82811015611bad575f80600873ffffffffffffffffffffffffffffffffffffffff16846040516020016119b191906145b8565b6040516020818303038152906040526040516119cd919061424d565b5f60405180830381855afa9150503d805f8114611a05576040519150601f19603f3d011682016040523d82523d5f602084013e611a0a565b606091505b509150915081611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a469061461b565b60405180910390fd5b600673ffffffffffffffffffffffffffffffffffffffff16845f60068110611a7a57611a79613a94565b5b602002015185600160068110611a9357611a92613a94565b5b602002015160016002604051602001611aaf94939291906146b4565b604051602081830303815290604052604051611acb919061424d565b5f60405180830381855afa9150503d805f8114611b03576040519150601f19603f3d011682016040523d82523d5f602084013e611b08565b606091505b50809250819350505081611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b48906143f0565b60405180910390fd5b80806020019051810190611b659190614438565b855f60068110611b7857611b77613a94565b5b6020020186600160068110611b9057611b8f613a94565b5b60200201828152508281525050505050808060010191505061197e565b505050565b611bba613602565b7f48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa55f1b815f60028110611bf057611bef613a94565b5b6020020181815250507fd182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b5f1b81600160028110611c3057611c2f613a94565b5b602002018181525050611c41613624565b7f61626300000000000000000000000000000000000000000000000000000000005f1b815f60048110611c7757611c76613a94565b5b6020020181815250505f801b81600160048110611c9757611c96613a94565b5b6020020181815250505f801b81600260048110611cb757611cb6613a94565b5b6020020181815250505f801b81600360048110611cd757611cd6613a94565b5b602002018181525050611ce8613646565b67030000000000000060c01b815f60028110611d0757611d06613a94565b5b602002019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250505f60c01b81600160028110611d6057611d5f613a94565b5b602002019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250505f600190505f5b85811015611f59575f8190505f600973ffffffffffffffffffffffffffffffffffffffff1682885f60028110611de157611de0613a94565b5b602002015189600160028110611dfa57611df9613a94565b5b6020020151895f60048110611e1257611e11613a94565b5b60200201518a600160048110611e2b57611e2a613a94565b5b60200201518b600260048110611e4457611e43613a94565b5b60200201518c600360048110611e5d57611e5c613a94565b5b60200201518c5f60028110611e7557611e74613a94565b5b60200201518d600160028110611e8e57611e8d613a94565b5b60200201518d604051602001611ead9a999897969594939291906147f5565b604051602081830303815290604052604051611ec9919061424d565b5f60405180830381855afa9150503d805f8114611f01576040519150601f19603f3d011682016040523d82523d5f602084013e611f06565b606091505b5050905080611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f41906148f2565b60405180910390fd5b50508080600101915050611da8565b505050505050565b5f7f31a80482dadf89de6302b1988c82c29544c9c07bb910596158f6062517eb089a5f1b90505f7f2f54c9a0f348752950094d3228d3b940258c75fe2a413cb70baa21dc2e352fc55f1b90505f7fe22466e928fdccef0de49e3503d2657d00494a00e764fd437bdafa05f5922b1f5f1b90505f7fbbb77c6817ccf50748419477e843d5bac67e6a70e97dde5a57e0c983b777e1ad5f1b90505f5b858110156120e8575f815f1b90505f61010073ffffffffffffffffffffffffffffffffffffffff168286868a8a60405160200161203c959493929190614910565b604051602081830303815290604052604051612058919061424d565b5f60405180830381855afa9150503d805f8114612090576040519150601f19603f3d011682016040523d82523d5f602084013e612095565b606091505b50509050806120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d0906149ab565b60405180910390fd5b50508080600101915050611ffb565b505050505050565b6120f8613624565b6f17f1d3a73197d7942695638c4fa9ac0f5f1b815f6004811061211e5761211d613a94565b5b6020020181815250507fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb5f1b8160016004811061215e5761215d613a94565b5b6020020181815250506f08b3f481e3aaa0f1a09e30ed741d8ae45f1b8160026004811061218e5761218d613a94565b5b6020020181815250507ffcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e15f1b816003600481106121ce576121cd613a94565b5b6020020181815250506121df613624565b6f112b98340eee2777cc3c14163dea3ec95f1b815f6004811061220557612204613a94565b5b6020020181815250507f7977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca94265f1b8160016004811061224557612244613a94565b5b6020020181815250506f186b28d92356c4dfec4b5201ad099dbd5f1b8160026004811061227557612274613a94565b5b6020020181815250507fede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a215f1b816003600481106122b5576122b4613a94565b5b6020020181815250505f5b838110156123b8575f80600b73ffffffffffffffffffffffffffffffffffffffff1685856040516020016122f5929190614a6e565b604051602081830303815290604052604051612311919061424d565b5f60405180830381855afa9150503d805f8114612349576040519150601f19603f3d011682016040523d82523d5f602084013e61234e565b606091505b509150915081612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a90614ae0565b60405180910390fd5b808060200190518101906123a79190614c2c565b9350505080806001019150506122c0565b50505050565b6123c6613624565b6f17f1d3a73197d7942695638c4fa9ac0f5f1b815f600481106123ec576123eb613a94565b5b6020020181815250507fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb5f1b8160016004811061242c5761242b613a94565b5b6020020181815250506f08b3f481e3aaa0f1a09e30ed741d8ae45f1b8160026004811061245c5761245b613a94565b5b6020020181815250507ffcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e15f1b8160036004811061249c5761249b613a94565b5b6020020181815250505f7fe22466e928fdccef0de49e3503d2657d00494a00e764fd437bdafa05f5922b1f5f1b90505f5b838110156125c5575f80600c73ffffffffffffffffffffffffffffffffffffffff168585604051602001612502929190614c57565b60405160208183030381529060405260405161251e919061424d565b5f60405180830381855afa9150503d805f8114612556576040519150601f19603f3d011682016040523d82523d5f602084013e61255b565b606091505b5091509150816125a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259790614ae0565b60405180910390fd5b808060200190518101906125b49190614c2c565b9450505080806001019150506124cd565b50505050565b6125d3613668565b6f103121a2ceaae586d240843a398967325f1b815f600881106125f9576125f8613a94565b5b6020020181815250507f5f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f275f1b8160016008811061263957612638613a94565b5b6020020181815250506f086b990f3da2aeac0a36143b7d7c82445f1b8160026008811061266957612668613a94565b5b6020020181815250507f28215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b685f1b816003600881106126a9576126a8613a94565b5b6020020181815250506f0f9e7ba9a86a8f7624aa2b42dcc8772e5f1b816004600881106126d9576126d8613a94565b5b6020020181815250507f1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e5f1b8160056008811061271957612718613a94565b5b6020020181815250506f0d22c3652d0dc6f0fc9316e14268477c5f1b8160066008811061274957612748613a94565b5b6020020181815250507f2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784515f1b8160076008811061278957612788613a94565b5b60200201818152505061279a613668565b6f024aa2b2f08f0a91260805272dc510515f1b815f600881106127c0576127bf613a94565b5b6020020181815250507fc6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb85f1b81600160088110612800576127ff613a94565b5b6020020181815250506f13e02b6052719f607dacd3a088274f655f1b816002600881106128305761282f613a94565b5b6020020181815250507f596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e5f1b816003600881106128705761286f613a94565b5b6020020181815250506f0ce5d527727d6e118cc9cdc6da2e351a5f1b816004600881106128a05761289f613a94565b5b6020020181815250507fadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828015f1b816005600881106128e0576128df613a94565b5b6020020181815250506f0606c4a02ea734cc32acd2b02bc28b995f1b816006600881106129105761290f613a94565b5b6020020181815250507fcb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be5f1b816007600881106129505761294f613a94565b5b6020020181815250505f5b83811015612a53575f80600d73ffffffffffffffffffffffffffffffffffffffff168585604051602001612990929190614cfd565b6040516020818303038152906040526040516129ac919061424d565b5f60405180830381855afa9150503d805f81146129e4576040519150601f19603f3d011682016040523d82523d5f602084013e6129e9565b606091505b509150915081612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2590614d70565b60405180910390fd5b80806020019051810190612a429190614e3c565b93505050808060010191505061295b565b50505050565b612a61613668565b6f103121a2ceaae586d240843a398967325f1b815f60088110612a8757612a86613a94565b5b6020020181815250507f5f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f275f1b81600160088110612ac757612ac6613a94565b5b6020020181815250506f086b990f3da2aeac0a36143b7d7c82445f1b81600260088110612af757612af6613a94565b5b6020020181815250507f28215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b685f1b81600360088110612b3757612b36613a94565b5b6020020181815250506f0f9e7ba9a86a8f7624aa2b42dcc8772e5f1b81600460088110612b6757612b66613a94565b5b6020020181815250507f1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e5f1b81600560088110612ba757612ba6613a94565b5b6020020181815250506f0d22c3652d0dc6f0fc9316e14268477c5f1b81600660088110612bd757612bd6613a94565b5b6020020181815250507f2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784515f1b81600760088110612c1757612c16613a94565b5b602002018181525050612c28613668565b6f024aa2b2f08f0a91260805272dc510515f1b815f60088110612c4e57612c4d613a94565b5b6020020181815250507fc6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb85f1b81600160088110612c8e57612c8d613a94565b5b6020020181815250506f13e02b6052719f607dacd3a088274f655f1b81600260088110612cbe57612cbd613a94565b5b6020020181815250507f596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e5f1b81600360088110612cfe57612cfd613a94565b5b6020020181815250506f0ce5d527727d6e118cc9cdc6da2e351a5f1b81600460088110612d2e57612d2d613a94565b5b6020020181815250507fadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828015f1b81600560088110612d6e57612d6d613a94565b5b6020020181815250506f0606c4a02ea734cc32acd2b02bc28b995f1b81600660088110612d9e57612d9d613a94565b5b6020020181815250507fcb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be5f1b81600760088110612dde57612ddd613a94565b5b6020020181815250505f7fe22466e928fdccef0de49e3503d2657d00494a00e764fd437bdafa05f5922b1f5f1b90505f5b84811015612f0b575f80600e73ffffffffffffffffffffffffffffffffffffffff1686858787604051602001612e489493929190614e68565b604051602081830303815290604052604051612e64919061424d565b5f60405180830381855afa9150503d805f8114612e9c576040519150601f19603f3d011682016040523d82523d5f602084013e612ea1565b606091505b509150915081612ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edd90614ef9565b60405180910390fd5b80806020019051810190612efa9190614e3c565b955050508080600101915050612e0f565b5050505050565b612f1a613624565b6f17f1d3a73197d7942695638c4fa9ac0f5f1b815f60048110612f4057612f3f613a94565b5b6020020181815250507fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb5f1b81600160048110612f8057612f7f613a94565b5b6020020181815250506f08b3f481e3aaa0f1a09e30ed741d8ae45f1b81600260048110612fb057612faf613a94565b5b6020020181815250507ffcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e15f1b81600360048110612ff057612fef613a94565b5b602002018181525050613001613668565b6f024aa2b2f08f0a91260805272dc510515f1b815f6008811061302757613026613a94565b5b6020020181815250507fc6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb85f1b8160016008811061306757613066613a94565b5b6020020181815250506f13e02b6052719f607dacd3a088274f655f1b8160026008811061309757613096613a94565b5b6020020181815250507f596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e5f1b816003600881106130d7576130d6613a94565b5b6020020181815250506f0ce5d527727d6e118cc9cdc6da2e351a5f1b8160046008811061310757613106613a94565b5b6020020181815250507fadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828015f1b8160056008811061314757613146613a94565b5b6020020181815250506f0606c4a02ea734cc32acd2b02bc28b995f1b8160066008811061317757613176613a94565b5b6020020181815250507fcb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be5f1b816007600881106131b7576131b6613a94565b5b6020020181815250505f5b838110156132a4575f80600f73ffffffffffffffffffffffffffffffffffffffff1685856040516020016131f7929190614f17565b604051602081830303815290604052604051613213919061424d565b5f60405180830381855afa9150503d805f811461324b576040519150601f19603f3d011682016040523d82523d5f602084013e613250565b606091505b509150915081613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328c90614f89565b60405180910390fd5b505080806001019150506131c2565b50505050565b6132b2613602565b6f04090815ad598a06897dd89bcda860f25f1b815f600281106132d8576132d7613a94565b5b6020020181815250507f5837d54e897298ce31e6947378134d3761dc59a572154963e8c954919ecfa82d5f1b8160016002811061331857613317613a94565b5b6020020181815250505f5b82811015613419575f80601073ffffffffffffffffffffffffffffffffffffffff16846040516020016133569190615026565b604051602081830303815290604052604051613372919061424d565b5f60405180830381855afa9150503d805f81146133aa576040519150601f19603f3d011682016040523d82523d5f602084013e6133af565b606091505b5091509150816133f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133eb90615089565b60405180910390fd5b808060200190518101906134089190615155565b935050508080600101915050613323565b505050565b613426613624565b6f18c16fe362b7dbdfa102e42bdfd3e2f45f1b815f6004811061344c5761344b613a94565b5b6020020181815250507fe6191d479437a59db4eb716986bf08ee1f42634db66bde97d6c16bbfd342b3b85f1b8160016004811061348c5761348b613a94565b5b6020020181815250506f0e37812ce1b146d998d5f92bdd5ada2a5f1b816002600481106134bc576134bb613a94565b5b6020020181815250507f31bfd63dfe18311aa91637b5f279dd045763166aa1615e46a50d8d8f475f184e5f1b816003600481106134fc576134fb613a94565b5b6020020181815250505f5b828110156135fd575f80601173ffffffffffffffffffffffffffffffffffffffff168460405160200161353a9190615180565b604051602081830303815290604052604051613556919061424d565b5f60405180830381855afa9150503d805f811461358e576040519150601f19603f3d011682016040523d82523d5f602084013e613593565b606091505b5091509150816135d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cf906151e3565b60405180910390fd5b808060200190518101906135ec9190614c2c565b935050508080600101915050613507565b505050565b6040518060400160405280600290602082028036833780820191505090505090565b6040518060800160405280600490602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b604051806101000160405280600890602082028036833780820191505090505090565b5f819050919050565b61369d8161368b565b82525050565b5f6020820190506136b65f830184613694565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f61010082840312156136e7576136e66136cd565b5b81905092915050565b5f60208284031215613705576137046136c5565b5b5f82013567ffffffffffffffff811115613722576137216136c9565b5b61372e848285016136d1565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61377982613737565b6137838185613741565b9350613793818560208601613751565b61379c8161375f565b840191505092915050565b5f6020820190508181035f8301526137bf818461376f565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b6137ef816137c7565b82525050565b5f6020820190506138085f8301846137e6565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613845826137c7565b9150613850836137c7565b9250828201905073ffffffffffffffffffffffffffffffffffffffff81111561387c5761387b61380e565b5b92915050565b5f61388c8261368b565b91506138978361368b565b92508282019050808211156138af576138ae61380e565b5b92915050565b7f4e6f7420656e6f7567682073746f7261676520736c6f747320746f206c6f61645f8201527f2f75706461746500000000000000000000000000000000000000000000000000602082015250565b5f61390f602783613741565b915061391a826138b5565b604082019050919050565b5f6020820190508181035f83015261393c81613903565b9050919050565b61394c816137c7565b8114613956575f80fd5b50565b5f8135905061396781613943565b92915050565b5f60208284031215613982576139816136c5565b5b5f61398f84828501613959565b91505092915050565b7f4e6f7420656e6f756768206163636f756e747320746f206c6f61642f757064615f8201527f7465000000000000000000000000000000000000000000000000000000000000602082015250565b5f6139f2602283613741565b91506139fd82613998565b604082019050919050565b5f6020820190508181035f830152613a1f816139e6565b9050919050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112613a4e57613a4d613a26565b5b80840192508235915067ffffffffffffffff821115613a7057613a6f613a2a565b5b602083019250604082023603831315613a8c57613a8b613a2e565b5b509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613acb826137c7565b9050919050565b613adb81613ac1565b8114613ae5575f80fd5b50565b5f81359050613af681613ad2565b92915050565b5f60208284031215613b1157613b106136c5565b5b5f613b1e84828501613ae8565b91505092915050565b5f81905092915050565b7f546869732069732061206c6f6e6720696e70757420737472696e6720666f72205f8201527f707265636f6d70696c6520000000000000000000000000000000000000000000602082015250565b5f613b8b602b83613b27565b9150613b9682613b31565b602b82019050919050565b7f616e64206974206973206265696e67207265706561746564206d756c7469706c5f8201527f652074696d657320746f20696e637265617365207468652073697a652e200000602082015250565b5f613bfb603e83613b27565b9150613c0682613ba1565b603e82019050919050565b7f4c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e735f8201527f656374657475722061646970697363696e6720656c69742e2000000000000000602082015250565b5f613c6b603983613b27565b9150613c7682613c11565b603982019050919050565b7f566976616d7573206c75637475732075726e61207365642075726e6120756c745f8201527f7269636965732061632074656d706f72206475692073616769747469732e2000602082015250565b5f613cdb603f83613b27565b9150613ce682613c81565b603f82019050919050565b7f496e20636f6e64696d656e74756d20666163696c6973697320706f7274612e205f8201527f536564206e6563206469616d206575206469616d206d6174746973207669766560208201527f7272612e20000000000000000000000000000000000000000000000000000000604082015250565b5f613d71604583613b27565b9150613d7c82613cf1565b604582019050919050565b7f4e756c6c61206672696e67696c6c612c206f72636920616320657569736d6f645f8201527f2073656d7065722c206d61676e61206469616d20706f72747469746f72206d6160208201527f757269732c200000000000000000000000000000000000000000000000000000604082015250565b5f613e07604683613b27565b9150613e1282613d87565b604682019050919050565b7f7175697320736f6c6c696369747564696e2073617069656e206a7573746f20695f8201527f6e206c696265726f2e20566573746962756c756d206d6f6c6c6973206d61757260208201527f697320656e696d2e200000000000000000000000000000000000000000000000604082015250565b5f613e9d604983613b27565b9150613ea882613e1d565b604982019050919050565b7f4d6f72626920657569736d6f64206d61676e61206163206c6f72656d207275745f8201527f72756d20656c656d656e74756d2e20546869732069732061206c6f6e6720696e60208201527f70757420737472696e6720666f7220707265636f6d70696c6520000000000000604082015250565b5f613f33605a83613b27565b9150613f3e82613eb3565b605a82019050919050565b7f4d6f72626920657569736d6f64206d61676e61206163206c6f72656d207275745f8201527f72756d20656c656d656e74756d2e200000000000000000000000000000000000602082015250565b5f613fa3602f83613b27565b9150613fae82613f49565b602f82019050919050565b5f613fc382613b7f565b9150613fce82613bef565b9150613fd982613c5f565b9150613fe482613ccf565b9150613fef82613d65565b9150613ffa82613dfb565b915061400582613e91565b915061401082613f27565b915061401b82613bef565b915061402682613c5f565b915061403182613ccf565b915061403c82613d65565b915061404782613dfb565b915061405282613e91565b915061405d82613f27565b915061406882613bef565b915061407382613c5f565b915061407e82613ccf565b915061408982613d65565b915061409482613dfb565b915061409f82613e91565b91506140aa82613f97565b9150819050919050565b7f496e76616c696420707265636f6d70696c6520616464726573730000000000005f82015250565b5f6140e8601a83613741565b91506140f3826140b4565b602082019050919050565b5f6020820190508181035f830152614115816140dc565b9050919050565b5f819050919050565b61412e8161411c565b82525050565b5f60ff82169050919050565b61414981614134565b82525050565b5f6080820190506141625f830187614125565b61416f6020830186614140565b61417c6040830185614125565b6141896060830184614125565b95945050505050565b5f61419c82613737565b6141a68185613b27565b93506141b6818560208601613751565b80840191505092915050565b5f819050919050565b6141dc6141d78261368b565b6141c2565b82525050565b5f6141ed8285614192565b91506141f982846141cb565b6020820191508190509392505050565b5f81519050919050565b5f81905092915050565b5f61422782614209565b6142318185614213565b9350614241818560208601613751565b80840191505092915050565b5f614258828461421d565b915081905092915050565b61426c8161411c565b8114614276575f80fd5b50565b5f8151905061428781614263565b92915050565b5f602082840312156142a2576142a16136c5565b5b5f6142af84828501614279565b91505092915050565b5f6142c382846141cb565b60208201915081905092915050565b5f6040820190508181035f8301526142ea818561376f565b90506142f96020830184613694565b9392505050565b5f61430b82896141cb565b60208201915061431b82886141cb565b60208201915061432b82876141cb565b60208201915061433b828661421d565b9150614347828561421d565b9150614353828461421d565b9150819050979650505050505050565b5f6080820190506143765f830187613694565b6143836020830186613694565b6143906040830185613694565b61439d6060830184613694565b95945050505050565b7f4543416464206661696c656400000000000000000000000000000000000000005f82015250565b5f6143da600c83613741565b91506143e5826143a6565b602082019050919050565b5f6020820190508181035f830152614407816143ce565b9050919050565b6144178161368b565b8114614421575f80fd5b50565b5f815190506144328161440e565b92915050565b5f806040838503121561444e5761444d6136c5565b5b5f61445b85828601614424565b925050602061446c85828601614424565b9150509250929050565b5f6060820190506144895f830186613694565b6144966020830185613694565b6144a36040830184613694565b949350505050565b7f45434d756c206661696c656400000000000000000000000000000000000000005f82015250565b5f6144df600c83613741565b91506144ea826144ab565b602082019050919050565b5f6020820190508181035f83015261450c816144d3565b9050919050565b5f60069050919050565b5f81905092915050565b5f819050919050565b6145398161368b565b82525050565b5f61454a8383614530565b60208301905092915050565b5f602082019050919050565b61456b81614513565b614575818461451d565b925061458082614527565b805f5b838110156145b0578151614597878261453f565b96506145a283614556565b925050600181019050614583565b505050505050565b5f60c0820190506145cb5f830184614562565b92915050565b7f454350616972696e67206661696c6564000000000000000000000000000000005f82015250565b5f614605601083613741565b9150614610826145d1565b602082019050919050565b5f6020820190508181035f830152614632816145f9565b9050919050565b5f819050919050565b5f819050919050565b5f61466561466061465b84614639565b614642565b614134565b9050919050565b6146758161464b565b82525050565b5f819050919050565b5f61469e6146996146948461467b565b614642565b614134565b9050919050565b6146ae81614684565b82525050565b5f6080820190506146c75f830187613694565b6146d46020830186613694565b6146e1604083018561466c565b6146ee60608301846146a5565b95945050505050565b5f63ffffffff82169050919050565b5f8160e01b9050919050565b5f61471c82614706565b9050919050565b61473461472f826146f7565b614712565b82525050565b5f819050919050565b61475461474f8261411c565b61473a565b82525050565b5f7fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b61479f61479a8261475a565b614785565b82525050565b5f8115159050919050565b5f8160f81b9050919050565b5f6147c6826147b0565b9050919050565b5f6147d7826147bc565b9050919050565b6147ef6147ea826147a5565b6147cd565b82525050565b5f614800828d614723565b600482019150614810828c614743565b602082019150614820828b614743565b602082019150614830828a614743565b6020820191506148408289614743565b6020820191506148508288614743565b6020820191506148608287614743565b602082019150614870828661478e565b600882019150614880828561478e565b60088201915061489082846147de565b6001820191508190509b9a5050505050505050505050565b7f426c616b653266206661696c65640000000000000000000000000000000000005f82015250565b5f6148dc600e83613741565b91506148e7826148a8565b602082019050919050565b5f6020820190508181035f830152614909816148d0565b9050919050565b5f60a0820190506149235f830188614125565b6149306020830187614125565b61493d6040830186614125565b61494a6060830185614125565b6149576080830184614125565b9695505050505050565b7f70323536566572696679206661696c65640000000000000000000000000000005f82015250565b5f614995601183613741565b91506149a082614961565b602082019050919050565b5f6020820190508181035f8301526149c281614989565b9050919050565b5f60049050919050565b5f81905092915050565b5f819050919050565b6149ef8161411c565b82525050565b5f614a0083836149e6565b60208301905092915050565b5f602082019050919050565b614a21816149c9565b614a2b81846149d3565b9250614a36826149dd565b805f5b83811015614a66578151614a4d87826149f5565b9650614a5883614a0c565b925050600181019050614a39565b505050505050565b5f61010082019050614a825f830185614a18565b614a8f6080830184614a18565b9392505050565b7f4731416464206661696c656400000000000000000000000000000000000000005f82015250565b5f614aca600c83613741565b9150614ad582614a96565b602082019050919050565b5f6020820190508181035f830152614af781614abe565b9050919050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614b388261375f565b810181811067ffffffffffffffff82111715614b5757614b56614b02565b5b80604052505050565b5f614b696136bc565b9050614b758282614b2f565b919050565b5f67ffffffffffffffff821115614b9457614b93614b02565b5b602082029050919050565b5f80fd5b5f614bb5614bb084614b7a565b614b60565b90508060208402830185811115614bcf57614bce614b9f565b5b835b81811015614bf85780614be48882614279565b845260208401935050602081019050614bd1565b5050509392505050565b5f82601f830112614c1657614c15614afe565b5b6004614c23848285614ba3565b91505092915050565b5f60808284031215614c4157614c406136c5565b5b5f614c4e84828501614c02565b91505092915050565b5f60a082019050614c6a5f830185614a18565b614c776080830184614125565b9392505050565b5f60089050919050565b5f81905092915050565b5f819050919050565b5f602082019050919050565b614cb081614c7e565b614cba8184614c88565b9250614cc582614c92565b805f5b83811015614cf5578151614cdc87826149f5565b9650614ce783614c9b565b925050600181019050614cc8565b505050505050565b5f61020082019050614d115f830185614ca7565b614d1f610100830184614ca7565b9392505050565b7f4732416464206661696c656400000000000000000000000000000000000000005f82015250565b5f614d5a600c83613741565b9150614d6582614d26565b602082019050919050565b5f6020820190508181035f830152614d8781614d4e565b9050919050565b5f67ffffffffffffffff821115614da857614da7614b02565b5b602082029050919050565b5f614dc5614dc084614d8e565b614b60565b90508060208402830185811115614ddf57614dde614b9f565b5b835b81811015614e085780614df48882614279565b845260208401935050602081019050614de1565b5050509392505050565b5f82601f830112614e2657614e25614afe565b5b6008614e33848285614db3565b91505092915050565b5f6101008284031215614e5257614e516136c5565b5b5f614e5f84828501614e12565b91505092915050565b5f61024082019050614e7c5f830187614ca7565b614e8a610100830186614125565b614e98610120830185614ca7565b614ea6610220830184614125565b95945050505050565b7f47324d534d206661696c656400000000000000000000000000000000000000005f82015250565b5f614ee3600c83613741565b9150614eee82614eaf565b602082019050919050565b5f6020820190508181035f830152614f1081614ed7565b9050919050565b5f61018082019050614f2b5f830185614a18565b614f386080830184614ca7565b9392505050565b7f424c532050616972696e67206661696c656400000000000000000000000000005f82015250565b5f614f73601283613741565b9150614f7e82614f3f565b602082019050919050565b5f6020820190508181035f830152614fa081614f67565b9050919050565b5f60029050919050565b5f81905092915050565b5f819050919050565b5f602082019050919050565b614fd981614fa7565b614fe38184614fb1565b9250614fee82614fbb565b805f5b8381101561501e57815161500587826149f5565b965061501083614fc4565b925050600181019050614ff1565b505050505050565b5f6040820190506150395f830184614fd0565b92915050565b7f4d6170204731206661696c6564000000000000000000000000000000000000005f82015250565b5f615073600d83613741565b915061507e8261503f565b602082019050919050565b5f6020820190508181035f8301526150a081615067565b9050919050565b5f67ffffffffffffffff8211156150c1576150c0614b02565b5b602082029050919050565b5f6150de6150d9846150a7565b614b60565b905080602084028301858111156150f8576150f7614b9f565b5b835b81811015615121578061510d8882614279565b8452602084019350506020810190506150fa565b5050509392505050565b5f82601f83011261513f5761513e614afe565b5b600261514c8482856150cc565b91505092915050565b5f6040828403121561516a576151696136c5565b5b5f6151778482850161512b565b91505092915050565b5f6080820190506151935f830184614a18565b92915050565b7f4d6170204732206661696c6564000000000000000000000000000000000000005f82015250565b5f6151cd600d83613741565b91506151d882615199565b602082019050919050565b5f6020820190508181035f8301526151fa816151c1565b905091905056fea2646970667358221220daaadc09f9b6a12865bdc6aa105acdb6d823e1207652d06efbcce50978b64aec64736f6c63430008190033", + Bin: "0x60806040527002000000000000000000000000000000006001556202000060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507002000000000000000000000000000000006003557002000000000000000000000000000000006004556202000060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040516160db3803806160db83398181016040528101906100ea9190610219565b8060055f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661011a9190610271565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166101889190610271565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506102b8565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b6101f8816101d0565b8114610202575f5ffd5b50565b5f81519050610213816101ef565b92915050565b5f6020828403121561022e5761022d6101cc565b5b5f61023b84828501610205565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61027b826101d0565b9150610286836101d0565b9250828201905073ffffffffffffffffffffffffffffffffffffffff8111156102b2576102b1610244565b5b92915050565b615e16806102c55f395ff3fe608060405234801561000f575f5ffd5b5060043610610091575f3560e01c8063768c39af11610064578063768c39af146100e35780637b58286614610113578063cb805ac114610131578063e2b5a25c14610161578063ee2bb32b1461017f57610091565b80633594dea61461009557806339aa1ab91461009f578063458240e8146100bd5780634e83a9d5146100d9575b5f5ffd5b61009d61019d565b005b6100a76102e6565b6040516100b491906142ea565b60405180910390f35b6100d760048036038101906100d29190614337565b6102ec565b005b6100e16109ed565b005b6100fd60048036038101906100f89190614337565b610a52565b60405161010a91906142ea565b60405180910390f35b61011b610a7b565b60405161012891906143ee565b60405180910390f35b61014b60048036038101906101469190614337565b610aa5565b604051610158919061443c565b60405180910390f35b610169610b08565b604051610176919061443c565b60405180910390f35b610187610b2d565b60405161019491906142ea565b60405180910390f35b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f606460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166101f19190614482565b90505f5f8390505b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161015610271578073ffffffffffffffffffffffffffffffffffffffff166108fc600190811502906040515f60405180830381858888f19350505050915080806001019150506101f9565b50606460025f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102a39190614482565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60035481565b6001548160800135826060013560045461030691906144c9565b61031091906144c9565b1115610351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103489061456c565b60405180910390fd5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681602001602081019061039c91906145b4565b825f0160208101906103ae91906145b4565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103da9190614482565b6103e49190614482565b73ffffffffffffffffffffffffffffffffffffffff16111561043b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104329061464f565b60405180910390fd5b5f5f90505f60045490505b826060013560045461045891906144c9565b811015610472578054820191508080600101915050610446565b50816060013560045f82825461048891906144c9565b925050819055505f60045490505b82608001356004546104a891906144c9565b8110156104bf578081558080600101915050610496565b50816080013560045f8282546104d591906144c9565b925050819055505f60015490505b8260c001356001546104f591906144c9565b81101561050c5780815580806001019150506104e3565b508160c0013560015f82825461052291906144c9565b925050819055505f60035490505b8260a0013560035461054291906144c9565b811015610559575f81558080600101915050610530565b508160a0013560035f82825461056f91906144c9565b925050819055505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b8260400160208101906105af91906145b4565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166105db9190614482565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161015610651578073ffffffffffffffffffffffffffffffffffffffff166108fc600190811502906040515f60405180830381858888f1935050505050808060010191505061059c565b5081604001602081019061066591906145b4565b60025f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166106949190614482565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b825f01602081019061070a91906145b4565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166107369190614482565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1610156107765780806001019150506106f8565b50815f01602081019061078991906145b4565b60055f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166107b89190614482565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b82602001602081019061082f91906145b4565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661085b9190614482565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1610156108d1578073ffffffffffffffffffffffffffffffffffffffff166108fc600190811502906040515f60405180830381858888f1935050505050808060010191505061081c565b508160200160208101906108e591906145b4565b60055f8282829054906101000a900473ffffffffffffffffffffffffffffffffffffffff166109149190614482565b92506101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f5f90505b828060e001906109679190614679565b90508110156109e8576109db838060e001906109839190614679565b83818110610994576109936146db565b5b9050604002015f0160208101906109ab9190614743565b848060e001906109bb9190614679565b848181106109cc576109cb6146db565b5b90506040020160200135610b33565b8080600101915050610957565b505050565b5f60015490505f6064600154610a0391906144c9565b90505f8290505b81811015610a3457805f5f8381526020019081526020015f20819055508080600101915050610a0a565b50606460015f828254610a4791906144c9565b925050819055505050565b5f81608001358260600135600454610a6a91906144c9565b610a7491906144c9565b9050919050565b60605f604051602001610a8d90614c00565b60405160208183030381529060405290508091505090565b5f816020016020810190610ab991906145b4565b825f016020810190610acb91906145b4565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610af79190614482565b610b019190614482565b9050919050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b7557610b7081610fed565b610fe9565b600273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb957610bb48160016110b3565b610fe8565b600373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bfd57610bf88160016111c3565b610fe7565b600473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c4157610c3c81600161129b565b610fe6565b600573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c8557610c808160016113d9565b610fe5565b600673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cc757610cc2816115ed565b610fe4565b600773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d0957610d048161174e565b610fe3565b600873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d4b57610d46816118a7565b610fe2565b600973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d8d57610d8881611bd0565b610fe1565b61010073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dd057610dcb81612b90565b610fe0565b600b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e1257610e0d81612d22565b610fdf565b600c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5457610e4f81612ff3565b610fde565b600d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e9657610e9181613203565b610fdd565b600e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ed857610ed381613694565b610fdc565b600f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f1a57610f1581613b50565b610fdb565b601073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f5c57610f5781613eeb565b610fda565b601173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f9e57610f9981614062565b610fd9565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090614d45565b60405180910390fd5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5050565b5f601c90505f7f9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac80388256085f1b90505f7f4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada5f1b90505f5f90505b848110156110ac575f815f1b90506001818686866040515f81526020016040526040516110739493929190614d96565b6020604051602081039080840390855afa158015611093573d5f5f3e3d5ffd5b5050506020604051035150508080600101915050611043565b5050505050565b5f5f90505b828110156111be5781156111425760026110d0610a7b565b826040516020016110e2929190614e29565b6040516020818303038152906040526040516110fe9190614e94565b602060405180830381855afa158015611119573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061113c9190614ed4565b506111b1565b6002816040516020016111559190614eff565b6040516020818303038152906040526040516111719190614e94565b602060405180830381855afa15801561118c573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111af9190614ed4565b505b80806001019150506110b8565b505050565b5f5f90505b828110156112965781156112365760036111e0610a7b565b826040516020016111f2929190614e29565b60405160208183030381529060405260405161120e9190614e94565b602060405180830381855afa158015611229573d5f5f3e3d5ffd5b5050506040515150611289565b6003816040516020016112499190614eff565b6040516020818303038152906040526040516112659190614e94565b602060405180830381855afa158015611280573d5f5f3e3d5ffd5b50505060405151505b80806001019150506111c8565b505050565b5f5f90505b828110156113d457811561134157600473ffffffffffffffffffffffffffffffffffffffff166112ce610a7b565b826040516020016112e0929190614f19565b6040516020818303038152906040526040516112fc9190614e94565b5f60405180830381855afa9150503d805f8114611334576040519150601f19603f3d011682016040523d82523d5f602084013e611339565b606091505b5050506113c7565b600473ffffffffffffffffffffffffffffffffffffffff168160405160200161136a91906142ea565b6040516020818303038152906040526040516113869190614e94565b5f60405180830381855afa9150503d805f81146113be576040519150601f19603f3d011682016040523d82523d5f602084013e6113c3565b606091505b5050505b80806001019150506112a0565b505050565b5f6040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525090505f6040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525090505f5f90505b848110156115e6578315611522575f611467610a7b565b82604051602001611479929190614e29565b6040516020818303038152906040529050600573ffffffffffffffffffffffffffffffffffffffff168451845183518787866040516020016114c096959493929190614f47565b6040516020818303038152906040526040516114dc9190614e94565b5f60405180830381855afa9150503d805f8114611514576040519150601f19603f3d011682016040523d82523d5f602084013e611519565b606091505b505050506115d9565b5f816040516020016115349190614eff565b6040516020818303038152906040529050600573ffffffffffffffffffffffffffffffffffffffff1684518451835187878660405160200161157b96959493929190614f47565b6040516020818303038152906040526040516115979190614e94565b5f60405180830381855afa9150503d805f81146115cf576040519150601f19603f3d011682016040523d82523d5f602084013e6115d4565b606091505b505050505b8080600101915050611450565b5050505050565b5f7f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd390505f7f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490505f600190505f600290505f5f90505b85811015611746575f5f600673ffffffffffffffffffffffffffffffffffffffff168787878760405160200161167d9493929190614faa565b6040516020818303038152906040526040516116999190614e94565b5f60405180830381855afa9150503d805f81146116d1576040519150601f19603f3d011682016040523d82523d5f602084013e6116d6565b606091505b50915091508161171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290615037565b60405180910390fd5b8080602001905181019061172f919061507f565b809550819650505050508080600101915050611644565b505050505050565b5f7f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd390505f7f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490505f600290505f5f90505b848110156118a0575f5f600773ffffffffffffffffffffffffffffffffffffffff168686866040516020016117d7939291906150bd565b6040516020818303038152906040526040516117f39190614e94565b5f60405180830381855afa9150503d805f811461182b576040519150601f19603f3d011682016040523d82523d5f602084013e611830565b606091505b509150915081611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c9061513c565b60405180910390fd5b80806020019051810190611889919061507f565b8096508197505050505080806001019150506117a0565b5050505050565b5f6040518060c001604052807f2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da81526020017f2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f681526020017f1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc81526020017f22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d981526020017f2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f9081526020017f2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e81525090505f5f90505b82811015611bcb575f5f600873ffffffffffffffffffffffffffffffffffffffff16846040516020016119cf91906151ff565b6040516020818303038152906040526040516119eb9190614e94565b5f60405180830381855afa9150503d805f8114611a23576040519150601f19603f3d011682016040523d82523d5f602084013e611a28565b606091505b509150915081611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490615262565b60405180910390fd5b600673ffffffffffffffffffffffffffffffffffffffff16845f60068110611a9857611a976146db565b5b602002015185600160068110611ab157611ab06146db565b5b602002015160016002604051602001611acd94939291906152fb565b604051602081830303815290604052604051611ae99190614e94565b5f60405180830381855afa9150503d805f8114611b21576040519150601f19603f3d011682016040523d82523d5f602084013e611b26565b606091505b50809250819350505081611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690615037565b60405180910390fd5b80806020019051810190611b83919061507f565b855f60068110611b9657611b956146db565b5b6020020186600160068110611bae57611bad6146db565b5b60200201828152508281525050505050808060010191505061199c565b505050565b611bd8614249565b7fa1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b85f1b815f60028110611c0e57611c0d6146db565b5b6020020181815250507fa1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b8a1b2c3d4e5f6a7b85f1b81600160028110611c4e57611c4d6146db565b5b602002018181525050611c5f61426b565b7fc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d25f1b815f60048110611c9557611c946146db565b5b6020020181815250507fc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d25f1b81600160048110611cd557611cd46146db565b5b6020020181815250507fc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d25f1b81600260048110611d1557611d146146db565b5b6020020181815250507fc3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d2c3d4e5f6a7b8c1d25f1b81600360048110611d5557611d546146db565b5b602002018181525050611d6661428d565b5f60c01b815f60028110611d7d57611d7c6146db565b5b602002019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff19168152505062ff00ff60c01b81600160028110611dd957611dd86146db565b5b602002019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250505f600190505f5f90505b85811015612b88575f610c009050600973ffffffffffffffffffffffffffffffffffffffff1681875f60028110611e5e57611e5d6146db565b5b602002015188600160028110611e7757611e766146db565b5b6020020151885f60048110611e8f57611e8e6146db565b5b602002015189600160048110611ea857611ea76146db565b5b60200201518a600260048110611ec157611ec06146db565b5b60200201518b600360048110611eda57611ed96146db565b5b60200201518b5f60028110611ef257611ef16146db565b5b60200201518c600160028110611f0b57611f0a6146db565b5b60200201518c604051602001611f2a9a9998979695949392919061543c565b604051602081830303815290604052604051611f469190614e94565b5f60405180830381855afa9150503d805f8114611f7e576040519150601f19603f3d011682016040523d82523d5f602084013e611f83565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f60028110611fb257611fb16146db565b5b602002015188600160028110611fcb57611fca6146db565b5b6020020151885f60048110611fe357611fe26146db565b5b602002015189600160048110611ffc57611ffb6146db565b5b60200201518a600260048110612015576120146146db565b5b60200201518b60036004811061202e5761202d6146db565b5b60200201518b5f60028110612046576120456146db565b5b60200201518c60016002811061205f5761205e6146db565b5b60200201518c60405160200161207e9a9998979695949392919061543c565b60405160208183030381529060405260405161209a9190614e94565b5f60405180830381855afa9150503d805f81146120d2576040519150601f19603f3d011682016040523d82523d5f602084013e6120d7565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f60028110612106576121056146db565b5b60200201518860016002811061211f5761211e6146db565b5b6020020151885f60048110612137576121366146db565b5b6020020151896001600481106121505761214f6146db565b5b60200201518a600260048110612169576121686146db565b5b60200201518b600360048110612182576121816146db565b5b60200201518b5f6002811061219a576121996146db565b5b60200201518c6001600281106121b3576121b26146db565b5b60200201518c6040516020016121d29a9998979695949392919061543c565b6040516020818303038152906040526040516121ee9190614e94565b5f60405180830381855afa9150503d805f8114612226576040519150601f19603f3d011682016040523d82523d5f602084013e61222b565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f6002811061225a576122596146db565b5b602002015188600160028110612273576122726146db565b5b6020020151885f6004811061228b5761228a6146db565b5b6020020151896001600481106122a4576122a36146db565b5b60200201518a6002600481106122bd576122bc6146db565b5b60200201518b6003600481106122d6576122d56146db565b5b60200201518b5f600281106122ee576122ed6146db565b5b60200201518c600160028110612307576123066146db565b5b60200201518c6040516020016123269a9998979695949392919061543c565b6040516020818303038152906040526040516123429190614e94565b5f60405180830381855afa9150503d805f811461237a576040519150601f19603f3d011682016040523d82523d5f602084013e61237f565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f600281106123ae576123ad6146db565b5b6020020151886001600281106123c7576123c66146db565b5b6020020151885f600481106123df576123de6146db565b5b6020020151896001600481106123f8576123f76146db565b5b60200201518a600260048110612411576124106146db565b5b60200201518b60036004811061242a576124296146db565b5b60200201518b5f60028110612442576124416146db565b5b60200201518c60016002811061245b5761245a6146db565b5b60200201518c60405160200161247a9a9998979695949392919061543c565b6040516020818303038152906040526040516124969190614e94565b5f60405180830381855afa9150503d805f81146124ce576040519150601f19603f3d011682016040523d82523d5f602084013e6124d3565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f60028110612502576125016146db565b5b60200201518860016002811061251b5761251a6146db565b5b6020020151885f60048110612533576125326146db565b5b60200201518960016004811061254c5761254b6146db565b5b60200201518a600260048110612565576125646146db565b5b60200201518b60036004811061257e5761257d6146db565b5b60200201518b5f60028110612596576125956146db565b5b60200201518c6001600281106125af576125ae6146db565b5b60200201518c6040516020016125ce9a9998979695949392919061543c565b6040516020818303038152906040526040516125ea9190614e94565b5f60405180830381855afa9150503d805f8114612622576040519150601f19603f3d011682016040523d82523d5f602084013e612627565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f60028110612656576126556146db565b5b60200201518860016002811061266f5761266e6146db565b5b6020020151885f60048110612687576126866146db565b5b6020020151896001600481106126a05761269f6146db565b5b60200201518a6002600481106126b9576126b86146db565b5b60200201518b6003600481106126d2576126d16146db565b5b60200201518b5f600281106126ea576126e96146db565b5b60200201518c600160028110612703576127026146db565b5b60200201518c6040516020016127229a9998979695949392919061543c565b60405160208183030381529060405260405161273e9190614e94565b5f60405180830381855afa9150503d805f8114612776576040519150601f19603f3d011682016040523d82523d5f602084013e61277b565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f600281106127aa576127a96146db565b5b6020020151886001600281106127c3576127c26146db565b5b6020020151885f600481106127db576127da6146db565b5b6020020151896001600481106127f4576127f36146db565b5b60200201518a60026004811061280d5761280c6146db565b5b60200201518b600360048110612826576128256146db565b5b60200201518b5f6002811061283e5761283d6146db565b5b60200201518c600160028110612857576128566146db565b5b60200201518c6040516020016128769a9998979695949392919061543c565b6040516020818303038152906040526040516128929190614e94565b5f60405180830381855afa9150503d805f81146128ca576040519150601f19603f3d011682016040523d82523d5f602084013e6128cf565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f600281106128fe576128fd6146db565b5b602002015188600160028110612917576129166146db565b5b6020020151885f6004811061292f5761292e6146db565b5b602002015189600160048110612948576129476146db565b5b60200201518a600260048110612961576129606146db565b5b60200201518b60036004811061297a576129796146db565b5b60200201518b5f60028110612992576129916146db565b5b60200201518c6001600281106129ab576129aa6146db565b5b60200201518c6040516020016129ca9a9998979695949392919061543c565b6040516020818303038152906040526040516129e69190614e94565b5f60405180830381855afa9150503d805f8114612a1e576040519150601f19603f3d011682016040523d82523d5f602084013e612a23565b606091505b505050600973ffffffffffffffffffffffffffffffffffffffff1681875f60028110612a5257612a516146db565b5b602002015188600160028110612a6b57612a6a6146db565b5b6020020151885f60048110612a8357612a826146db565b5b602002015189600160048110612a9c57612a9b6146db565b5b60200201518a600260048110612ab557612ab46146db565b5b60200201518b600360048110612ace57612acd6146db565b5b60200201518b5f60028110612ae657612ae56146db565b5b60200201518c600160028110612aff57612afe6146db565b5b60200201518c604051602001612b1e9a9998979695949392919061543c565b604051602081830303815290604052604051612b3a9190614e94565b5f60405180830381855afa9150503d805f8114612b72576040519150601f19603f3d011682016040523d82523d5f602084013e612b77565b606091505b505050508080600101915050611e24565b505050505050565b5f7f31a80482dadf89de6302b1988c82c29544c9c07bb910596158f6062517eb089a5f1b90505f7f2f54c9a0f348752950094d3228d3b940258c75fe2a413cb70baa21dc2e352fc55f1b90505f7fe22466e928fdccef0de49e3503d2657d00494a00e764fd437bdafa05f5922b1f5f1b90505f7fbbb77c6817ccf50748419477e843d5bac67e6a70e97dde5a57e0c983b777e1ad5f1b90505f5f90505b85811015612d1a575f815f1b90505f61010073ffffffffffffffffffffffffffffffffffffffff168286868a8a604051602001612c6e9594939291906154ef565b604051602081830303815290604052604051612c8a9190614e94565b5f60405180830381855afa9150503d805f8114612cc2576040519150601f19603f3d011682016040523d82523d5f602084013e612cc7565b606091505b5050905080612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d029061558a565b60405180910390fd5b50508080600101915050612c2d565b505050505050565b612d2a61426b565b6f17f1d3a73197d7942695638c4fa9ac0f5f1b815f60048110612d5057612d4f6146db565b5b6020020181815250507fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb5f1b81600160048110612d9057612d8f6146db565b5b6020020181815250506f08b3f481e3aaa0f1a09e30ed741d8ae45f1b81600260048110612dc057612dbf6146db565b5b6020020181815250507ffcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e15f1b81600360048110612e0057612dff6146db565b5b602002018181525050612e1161426b565b6f112b98340eee2777cc3c14163dea3ec95f1b815f60048110612e3757612e366146db565b5b6020020181815250507f7977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca94265f1b81600160048110612e7757612e766146db565b5b6020020181815250506f186b28d92356c4dfec4b5201ad099dbd5f1b81600260048110612ea757612ea66146db565b5b6020020181815250507fede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a215f1b81600360048110612ee757612ee66146db565b5b6020020181815250505f5f90505b83811015612fed575f5f600b73ffffffffffffffffffffffffffffffffffffffff168585604051602001612f2a92919061564d565b604051602081830303815290604052604051612f469190614e94565b5f60405180830381855afa9150503d805f8114612f7e576040519150601f19603f3d011682016040523d82523d5f602084013e612f83565b606091505b509150915081612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbf906156bf565b60405180910390fd5b80806020019051810190612fdc919061580b565b935050508080600101915050612ef5565b50505050565b612ffb61426b565b6f17f1d3a73197d7942695638c4fa9ac0f5f1b815f60048110613021576130206146db565b5b6020020181815250507fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb5f1b81600160048110613061576130606146db565b5b6020020181815250506f08b3f481e3aaa0f1a09e30ed741d8ae45f1b81600260048110613091576130906146db565b5b6020020181815250507ffcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e15f1b816003600481106130d1576130d06146db565b5b6020020181815250505f7fe22466e928fdccef0de49e3503d2657d00494a00e764fd437bdafa05f5922b1f5f1b90505f5f90505b838110156131fd575f5f600c73ffffffffffffffffffffffffffffffffffffffff16858560405160200161313a929190615836565b6040516020818303038152906040526040516131569190614e94565b5f60405180830381855afa9150503d805f811461318e576040519150601f19603f3d011682016040523d82523d5f602084013e613193565b606091505b5091509150816131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf906156bf565b60405180910390fd5b808060200190518101906131ec919061580b565b945050508080600101915050613105565b50505050565b61320b6142af565b6f103121a2ceaae586d240843a398967325f1b815f60088110613231576132306146db565b5b6020020181815250507f5f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f275f1b81600160088110613271576132706146db565b5b6020020181815250506f086b990f3da2aeac0a36143b7d7c82445f1b816002600881106132a1576132a06146db565b5b6020020181815250507f28215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b685f1b816003600881106132e1576132e06146db565b5b6020020181815250506f0f9e7ba9a86a8f7624aa2b42dcc8772e5f1b81600460088110613311576133106146db565b5b6020020181815250507f1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e5f1b81600560088110613351576133506146db565b5b6020020181815250506f0d22c3652d0dc6f0fc9316e14268477c5f1b81600660088110613381576133806146db565b5b6020020181815250507f2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784515f1b816007600881106133c1576133c06146db565b5b6020020181815250506133d26142af565b6f024aa2b2f08f0a91260805272dc510515f1b815f600881106133f8576133f76146db565b5b6020020181815250507fc6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb85f1b81600160088110613438576134376146db565b5b6020020181815250506f13e02b6052719f607dacd3a088274f655f1b81600260088110613468576134676146db565b5b6020020181815250507f596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e5f1b816003600881106134a8576134a76146db565b5b6020020181815250506f0ce5d527727d6e118cc9cdc6da2e351a5f1b816004600881106134d8576134d76146db565b5b6020020181815250507fadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828015f1b81600560088110613518576135176146db565b5b6020020181815250506f0606c4a02ea734cc32acd2b02bc28b995f1b81600660088110613548576135476146db565b5b6020020181815250507fcb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be5f1b81600760088110613588576135876146db565b5b6020020181815250505f5f90505b8381101561368e575f5f600d73ffffffffffffffffffffffffffffffffffffffff1685856040516020016135cb9291906158dc565b6040516020818303038152906040526040516135e79190614e94565b5f60405180830381855afa9150503d805f811461361f576040519150601f19603f3d011682016040523d82523d5f602084013e613624565b606091505b509150915081613669576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136609061594f565b60405180910390fd5b8080602001905181019061367d9190615a1b565b935050508080600101915050613596565b50505050565b61369c6142af565b6f103121a2ceaae586d240843a398967325f1b815f600881106136c2576136c16146db565b5b6020020181815250507f5f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f275f1b81600160088110613702576137016146db565b5b6020020181815250506f086b990f3da2aeac0a36143b7d7c82445f1b81600260088110613732576137316146db565b5b6020020181815250507f28215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b685f1b81600360088110613772576137716146db565b5b6020020181815250506f0f9e7ba9a86a8f7624aa2b42dcc8772e5f1b816004600881106137a2576137a16146db565b5b6020020181815250507f1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e5f1b816005600881106137e2576137e16146db565b5b6020020181815250506f0d22c3652d0dc6f0fc9316e14268477c5f1b81600660088110613812576138116146db565b5b6020020181815250507f2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784515f1b81600760088110613852576138516146db565b5b6020020181815250506138636142af565b6f024aa2b2f08f0a91260805272dc510515f1b815f60088110613889576138886146db565b5b6020020181815250507fc6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb85f1b816001600881106138c9576138c86146db565b5b6020020181815250506f13e02b6052719f607dacd3a088274f655f1b816002600881106138f9576138f86146db565b5b6020020181815250507f596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e5f1b81600360088110613939576139386146db565b5b6020020181815250506f0ce5d527727d6e118cc9cdc6da2e351a5f1b81600460088110613969576139686146db565b5b6020020181815250507fadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828015f1b816005600881106139a9576139a86146db565b5b6020020181815250506f0606c4a02ea734cc32acd2b02bc28b995f1b816006600881106139d9576139d86146db565b5b6020020181815250507fcb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be5f1b81600760088110613a1957613a186146db565b5b6020020181815250505f7fe22466e928fdccef0de49e3503d2657d00494a00e764fd437bdafa05f5922b1f5f1b90505f5f90505b84811015613b49575f5f600e73ffffffffffffffffffffffffffffffffffffffff1686858787604051602001613a869493929190615a47565b604051602081830303815290604052604051613aa29190614e94565b5f60405180830381855afa9150503d805f8114613ada576040519150601f19603f3d011682016040523d82523d5f602084013e613adf565b606091505b509150915081613b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1b90615ad8565b60405180910390fd5b80806020019051810190613b389190615a1b565b955050508080600101915050613a4d565b5050505050565b613b5861426b565b6f17f1d3a73197d7942695638c4fa9ac0f5f1b815f60048110613b7e57613b7d6146db565b5b6020020181815250507fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb5f1b81600160048110613bbe57613bbd6146db565b5b6020020181815250506f08b3f481e3aaa0f1a09e30ed741d8ae45f1b81600260048110613bee57613bed6146db565b5b6020020181815250507ffcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e15f1b81600360048110613c2e57613c2d6146db565b5b602002018181525050613c3f6142af565b6f024aa2b2f08f0a91260805272dc510515f1b815f60088110613c6557613c646146db565b5b6020020181815250507fc6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb85f1b81600160088110613ca557613ca46146db565b5b6020020181815250506f13e02b6052719f607dacd3a088274f655f1b81600260088110613cd557613cd46146db565b5b6020020181815250507f596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e5f1b81600360088110613d1557613d146146db565b5b6020020181815250506f0ce5d527727d6e118cc9cdc6da2e351a5f1b81600460088110613d4557613d446146db565b5b6020020181815250507fadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828015f1b81600560088110613d8557613d846146db565b5b6020020181815250506f0606c4a02ea734cc32acd2b02bc28b995f1b81600660088110613db557613db46146db565b5b6020020181815250507fcb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be5f1b81600760088110613df557613df46146db565b5b6020020181815250505f5f90505b83811015613ee5575f5f600f73ffffffffffffffffffffffffffffffffffffffff168585604051602001613e38929190615af6565b604051602081830303815290604052604051613e549190614e94565b5f60405180830381855afa9150503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b509150915081613ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ecd90615b68565b60405180910390fd5b50508080600101915050613e03565b50505050565b613ef3614249565b6f04090815ad598a06897dd89bcda860f25f1b815f60028110613f1957613f186146db565b5b6020020181815250507f5837d54e897298ce31e6947378134d3761dc59a572154963e8c954919ecfa82d5f1b81600160028110613f5957613f586146db565b5b6020020181815250505f5f90505b8281101561405d575f5f601073ffffffffffffffffffffffffffffffffffffffff1684604051602001613f9a9190615c05565b604051602081830303815290604052604051613fb69190614e94565b5f60405180830381855afa9150503d805f8114613fee576040519150601f19603f3d011682016040523d82523d5f602084013e613ff3565b606091505b509150915081614038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161402f90615c68565b60405180910390fd5b8080602001905181019061404c9190615d34565b935050508080600101915050613f67565b505050565b61406a61426b565b6f18c16fe362b7dbdfa102e42bdfd3e2f45f1b815f600481106140905761408f6146db565b5b6020020181815250507fe6191d479437a59db4eb716986bf08ee1f42634db66bde97d6c16bbfd342b3b85f1b816001600481106140d0576140cf6146db565b5b6020020181815250506f0e37812ce1b146d998d5f92bdd5ada2a5f1b81600260048110614100576140ff6146db565b5b6020020181815250507f31bfd63dfe18311aa91637b5f279dd045763166aa1615e46a50d8d8f475f184e5f1b816003600481106141405761413f6146db565b5b6020020181815250505f5f90505b82811015614244575f5f601173ffffffffffffffffffffffffffffffffffffffff16846040516020016141819190615d5f565b60405160208183030381529060405260405161419d9190614e94565b5f60405180830381855afa9150503d805f81146141d5576040519150601f19603f3d011682016040523d82523d5f602084013e6141da565b606091505b50915091508161421f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161421690615dc2565b60405180910390fd5b80806020019051810190614233919061580b565b93505050808060010191505061414e565b505050565b6040518060400160405280600290602082028036833780820191505090505090565b6040518060800160405280600490602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b604051806101000160405280600890602082028036833780820191505090505090565b5f819050919050565b6142e4816142d2565b82525050565b5f6020820190506142fd5f8301846142db565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f610100828403121561432e5761432d614314565b5b81905092915050565b5f6020828403121561434c5761434b61430c565b5b5f82013567ffffffffffffffff81111561436957614368614310565b5b61437584828501614318565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6143c08261437e565b6143ca8185614388565b93506143da818560208601614398565b6143e3816143a6565b840191505092915050565b5f6020820190508181035f83015261440681846143b6565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b6144368161440e565b82525050565b5f60208201905061444f5f83018461442d565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61448c8261440e565b91506144978361440e565b9250828201905073ffffffffffffffffffffffffffffffffffffffff8111156144c3576144c2614455565b5b92915050565b5f6144d3826142d2565b91506144de836142d2565b92508282019050808211156144f6576144f5614455565b5b92915050565b7f4e6f7420656e6f7567682073746f7261676520736c6f747320746f206c6f61645f8201527f2f75706461746500000000000000000000000000000000000000000000000000602082015250565b5f614556602783614388565b9150614561826144fc565b604082019050919050565b5f6020820190508181035f8301526145838161454a565b9050919050565b6145938161440e565b811461459d575f5ffd5b50565b5f813590506145ae8161458a565b92915050565b5f602082840312156145c9576145c861430c565b5b5f6145d6848285016145a0565b91505092915050565b7f4e6f7420656e6f756768206163636f756e747320746f206c6f61642f757064615f8201527f7465000000000000000000000000000000000000000000000000000000000000602082015250565b5f614639602283614388565b9150614644826145df565b604082019050919050565b5f6020820190508181035f8301526146668161462d565b9050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f833560016020038436030381126146955761469461466d565b5b80840192508235915067ffffffffffffffff8211156146b7576146b6614671565b5b6020830192506040820236038313156146d3576146d2614675565b5b509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6147128261440e565b9050919050565b61472281614708565b811461472c575f5ffd5b50565b5f8135905061473d81614719565b92915050565b5f602082840312156147585761475761430c565b5b5f6147658482850161472f565b91505092915050565b5f81905092915050565b7f546869732069732061206c6f6e6720696e70757420737472696e6720666f72205f8201527f707265636f6d70696c6520000000000000000000000000000000000000000000602082015250565b5f6147d2602b8361476e565b91506147dd82614778565b602b82019050919050565b7f616e64206974206973206265696e67207265706561746564206d756c7469706c5f8201527f652074696d657320746f20696e637265617365207468652073697a652e200000602082015250565b5f614842603e8361476e565b915061484d826147e8565b603e82019050919050565b7f4c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e735f8201527f656374657475722061646970697363696e6720656c69742e2000000000000000602082015250565b5f6148b260398361476e565b91506148bd82614858565b603982019050919050565b7f566976616d7573206c75637475732075726e61207365642075726e6120756c745f8201527f7269636965732061632074656d706f72206475692073616769747469732e2000602082015250565b5f614922603f8361476e565b915061492d826148c8565b603f82019050919050565b7f496e20636f6e64696d656e74756d20666163696c6973697320706f7274612e205f8201527f536564206e6563206469616d206575206469616d206d6174746973207669766560208201527f7272612e20000000000000000000000000000000000000000000000000000000604082015250565b5f6149b860458361476e565b91506149c382614938565b604582019050919050565b7f4e756c6c61206672696e67696c6c612c206f72636920616320657569736d6f645f8201527f2073656d7065722c206d61676e61206469616d20706f72747469746f72206d6160208201527f757269732c200000000000000000000000000000000000000000000000000000604082015250565b5f614a4e60468361476e565b9150614a59826149ce565b604682019050919050565b7f7175697320736f6c6c696369747564696e2073617069656e206a7573746f20695f8201527f6e206c696265726f2e20566573746962756c756d206d6f6c6c6973206d61757260208201527f697320656e696d2e200000000000000000000000000000000000000000000000604082015250565b5f614ae460498361476e565b9150614aef82614a64565b604982019050919050565b7f4d6f72626920657569736d6f64206d61676e61206163206c6f72656d207275745f8201527f72756d20656c656d656e74756d2e20546869732069732061206c6f6e6720696e60208201527f70757420737472696e6720666f7220707265636f6d70696c6520000000000000604082015250565b5f614b7a605a8361476e565b9150614b8582614afa565b605a82019050919050565b7f4d6f72626920657569736d6f64206d61676e61206163206c6f72656d207275745f8201527f72756d20656c656d656e74756d2e200000000000000000000000000000000000602082015250565b5f614bea602f8361476e565b9150614bf582614b90565b602f82019050919050565b5f614c0a826147c6565b9150614c1582614836565b9150614c20826148a6565b9150614c2b82614916565b9150614c36826149ac565b9150614c4182614a42565b9150614c4c82614ad8565b9150614c5782614b6e565b9150614c6282614836565b9150614c6d826148a6565b9150614c7882614916565b9150614c83826149ac565b9150614c8e82614a42565b9150614c9982614ad8565b9150614ca482614b6e565b9150614caf82614836565b9150614cba826148a6565b9150614cc582614916565b9150614cd0826149ac565b9150614cdb82614a42565b9150614ce682614ad8565b9150614cf182614bde565b9150819050919050565b7f496e76616c696420707265636f6d70696c6520616464726573730000000000005f82015250565b5f614d2f601a83614388565b9150614d3a82614cfb565b602082019050919050565b5f6020820190508181035f830152614d5c81614d23565b9050919050565b5f819050919050565b614d7581614d63565b82525050565b5f60ff82169050919050565b614d9081614d7b565b82525050565b5f608082019050614da95f830187614d6c565b614db66020830186614d87565b614dc36040830185614d6c565b614dd06060830184614d6c565b95945050505050565b5f614de38261437e565b614ded818561476e565b9350614dfd818560208601614398565b80840191505092915050565b5f819050919050565b614e23614e1e826142d2565b614e09565b82525050565b5f614e348285614dd9565b9150614e408284614e12565b6020820191508190509392505050565b5f81519050919050565b5f81905092915050565b5f614e6e82614e50565b614e788185614e5a565b9350614e88818560208601614398565b80840191505092915050565b5f614e9f8284614e64565b915081905092915050565b614eb381614d63565b8114614ebd575f5ffd5b50565b5f81519050614ece81614eaa565b92915050565b5f60208284031215614ee957614ee861430c565b5b5f614ef684828501614ec0565b91505092915050565b5f614f0a8284614e12565b60208201915081905092915050565b5f6040820190508181035f830152614f3181856143b6565b9050614f4060208301846142db565b9392505050565b5f614f528289614e12565b602082019150614f628288614e12565b602082019150614f728287614e12565b602082019150614f828286614e64565b9150614f8e8285614e64565b9150614f9a8284614e64565b9150819050979650505050505050565b5f608082019050614fbd5f8301876142db565b614fca60208301866142db565b614fd760408301856142db565b614fe460608301846142db565b95945050505050565b7f4543416464206661696c656400000000000000000000000000000000000000005f82015250565b5f615021600c83614388565b915061502c82614fed565b602082019050919050565b5f6020820190508181035f83015261504e81615015565b9050919050565b61505e816142d2565b8114615068575f5ffd5b50565b5f8151905061507981615055565b92915050565b5f5f604083850312156150955761509461430c565b5b5f6150a28582860161506b565b92505060206150b38582860161506b565b9150509250929050565b5f6060820190506150d05f8301866142db565b6150dd60208301856142db565b6150ea60408301846142db565b949350505050565b7f45434d756c206661696c656400000000000000000000000000000000000000005f82015250565b5f615126600c83614388565b9150615131826150f2565b602082019050919050565b5f6020820190508181035f8301526151538161511a565b9050919050565b5f60069050919050565b5f81905092915050565b5f819050919050565b615180816142d2565b82525050565b5f6151918383615177565b60208301905092915050565b5f602082019050919050565b6151b28161515a565b6151bc8184615164565b92506151c78261516e565b805f5b838110156151f75781516151de8782615186565b96506151e98361519d565b9250506001810190506151ca565b505050505050565b5f60c0820190506152125f8301846151a9565b92915050565b7f454350616972696e67206661696c6564000000000000000000000000000000005f82015250565b5f61524c601083614388565b915061525782615218565b602082019050919050565b5f6020820190508181035f83015261527981615240565b9050919050565b5f819050919050565b5f819050919050565b5f6152ac6152a76152a284615280565b615289565b614d7b565b9050919050565b6152bc81615292565b82525050565b5f819050919050565b5f6152e56152e06152db846152c2565b615289565b614d7b565b9050919050565b6152f5816152cb565b82525050565b5f60808201905061530e5f8301876142db565b61531b60208301866142db565b61532860408301856152b3565b61533560608301846152ec565b95945050505050565b5f63ffffffff82169050919050565b5f8160e01b9050919050565b5f6153638261534d565b9050919050565b61537b6153768261533e565b615359565b82525050565b5f819050919050565b61539b61539682614d63565b615381565b82525050565b5f7fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b6153e66153e1826153a1565b6153cc565b82525050565b5f8115159050919050565b5f8160f81b9050919050565b5f61540d826153f7565b9050919050565b5f61541e82615403565b9050919050565b615436615431826153ec565b615414565b82525050565b5f615447828d61536a565b600482019150615457828c61538a565b602082019150615467828b61538a565b602082019150615477828a61538a565b602082019150615487828961538a565b602082019150615497828861538a565b6020820191506154a7828761538a565b6020820191506154b782866153d5565b6008820191506154c782856153d5565b6008820191506154d78284615425565b6001820191508190509b9a5050505050505050505050565b5f60a0820190506155025f830188614d6c565b61550f6020830187614d6c565b61551c6040830186614d6c565b6155296060830185614d6c565b6155366080830184614d6c565b9695505050505050565b7f70323536566572696679206661696c65640000000000000000000000000000005f82015250565b5f615574601183614388565b915061557f82615540565b602082019050919050565b5f6020820190508181035f8301526155a181615568565b9050919050565b5f60049050919050565b5f81905092915050565b5f819050919050565b6155ce81614d63565b82525050565b5f6155df83836155c5565b60208301905092915050565b5f602082019050919050565b615600816155a8565b61560a81846155b2565b9250615615826155bc565b805f5b8381101561564557815161562c87826155d4565b9650615637836155eb565b925050600181019050615618565b505050505050565b5f610100820190506156615f8301856155f7565b61566e60808301846155f7565b9392505050565b7f4731416464206661696c656400000000000000000000000000000000000000005f82015250565b5f6156a9600c83614388565b91506156b482615675565b602082019050919050565b5f6020820190508181035f8301526156d68161569d565b9050919050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b615717826143a6565b810181811067ffffffffffffffff82111715615736576157356156e1565b5b80604052505050565b5f615748614303565b9050615754828261570e565b919050565b5f67ffffffffffffffff821115615773576157726156e1565b5b602082029050919050565b5f5ffd5b5f61579461578f84615759565b61573f565b905080602084028301858111156157ae576157ad61577e565b5b835b818110156157d757806157c38882614ec0565b8452602084019350506020810190506157b0565b5050509392505050565b5f82601f8301126157f5576157f46156dd565b5b6004615802848285615782565b91505092915050565b5f608082840312156158205761581f61430c565b5b5f61582d848285016157e1565b91505092915050565b5f60a0820190506158495f8301856155f7565b6158566080830184614d6c565b9392505050565b5f60089050919050565b5f81905092915050565b5f819050919050565b5f602082019050919050565b61588f8161585d565b6158998184615867565b92506158a482615871565b805f5b838110156158d45781516158bb87826155d4565b96506158c68361587a565b9250506001810190506158a7565b505050505050565b5f610200820190506158f05f830185615886565b6158fe610100830184615886565b9392505050565b7f4732416464206661696c656400000000000000000000000000000000000000005f82015250565b5f615939600c83614388565b915061594482615905565b602082019050919050565b5f6020820190508181035f8301526159668161592d565b9050919050565b5f67ffffffffffffffff821115615987576159866156e1565b5b602082029050919050565b5f6159a461599f8461596d565b61573f565b905080602084028301858111156159be576159bd61577e565b5b835b818110156159e757806159d38882614ec0565b8452602084019350506020810190506159c0565b5050509392505050565b5f82601f830112615a0557615a046156dd565b5b6008615a12848285615992565b91505092915050565b5f6101008284031215615a3157615a3061430c565b5b5f615a3e848285016159f1565b91505092915050565b5f61024082019050615a5b5f830187615886565b615a69610100830186614d6c565b615a77610120830185615886565b615a85610220830184614d6c565b95945050505050565b7f47324d534d206661696c656400000000000000000000000000000000000000005f82015250565b5f615ac2600c83614388565b9150615acd82615a8e565b602082019050919050565b5f6020820190508181035f830152615aef81615ab6565b9050919050565b5f61018082019050615b0a5f8301856155f7565b615b176080830184615886565b9392505050565b7f424c532050616972696e67206661696c656400000000000000000000000000005f82015250565b5f615b52601283614388565b9150615b5d82615b1e565b602082019050919050565b5f6020820190508181035f830152615b7f81615b46565b9050919050565b5f60029050919050565b5f81905092915050565b5f819050919050565b5f602082019050919050565b615bb881615b86565b615bc28184615b90565b9250615bcd82615b9a565b805f5b83811015615bfd578151615be487826155d4565b9650615bef83615ba3565b925050600181019050615bd0565b505050505050565b5f604082019050615c185f830184615baf565b92915050565b7f4d6170204731206661696c6564000000000000000000000000000000000000005f82015250565b5f615c52600d83614388565b9150615c5d82615c1e565b602082019050919050565b5f6020820190508181035f830152615c7f81615c46565b9050919050565b5f67ffffffffffffffff821115615ca057615c9f6156e1565b5b602082029050919050565b5f615cbd615cb884615c86565b61573f565b90508060208402830185811115615cd757615cd661577e565b5b835b81811015615d005780615cec8882614ec0565b845260208401935050602081019050615cd9565b5050509392505050565b5f82601f830112615d1e57615d1d6156dd565b5b6002615d2b848285615cab565b91505092915050565b5f60408284031215615d4957615d4861430c565b5b5f615d5684828501615d0a565b91505092915050565b5f608082019050615d725f8301846155f7565b92915050565b7f4d6170204732206661696c6564000000000000000000000000000000000000005f82015250565b5f615dac600d83614388565b9150615db782615d78565b602082019050919050565b5f6020820190508181035f830152615dd981615da0565b905091905056fea26469706673582212204b9cff79017d5f118721b35e6a9550762f2cc8f5c647d4f3e86aff5f3552765f64736f6c63430008210033", } // SimulatorABI is the input ABI used to generate the binding from. From d403f29d8357c54fdb0587b2ce610a409986e63a Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Thu, 26 Feb 2026 07:56:21 -0800 Subject: [PATCH 3/3] fix timestamp issue --- runner/network/consensus/sequencer_consensus.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/runner/network/consensus/sequencer_consensus.go b/runner/network/consensus/sequencer_consensus.go index 36e6c72..6b62f96 100644 --- a/runner/network/consensus/sequencer_consensus.go +++ b/runner/network/consensus/sequencer_consensus.go @@ -121,7 +121,14 @@ func (f *SequencerConsensusClient) generatePayloadAttributes(sequencerTxs [][]by var b8 eth.Bytes8 copy(b8[:], eip1559.EncodeHolocene1559Params(50, 1)) - timestamp := f.lastTimestamp + 1 + lastTimestamp := f.lastTimestamp + + // if the last timestamp is more than 2 seconds in the past, set it to the current time + if int64(lastTimestamp)-time.Now().Unix() < -2 { + lastTimestamp = uint64(time.Now().Unix()) + } + + timestamp := lastTimestamp + 1 number := uint64(0) time := uint64(0)