diff --git a/abi/contracts/blockad/BlockAdV1.sol/BlockAdAuctionV1.json b/abi/contracts/blockad/BlockAdV1.sol/BlockAdAuctionV1.json index 8347d37..dca0fa9 100644 --- a/abi/contracts/blockad/BlockAdV1.sol/BlockAdAuctionV1.json +++ b/abi/contracts/blockad/BlockAdV1.sol/BlockAdAuctionV1.json @@ -175,6 +175,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", diff --git a/abi/contracts/blockad/BlockAdV2.sol/BlockAdAuctionV2.json b/abi/contracts/blockad/BlockAdV2.sol/BlockAdAuctionV2.json index 13fdc70..a873cd6 100644 --- a/abi/contracts/blockad/BlockAdV2.sol/BlockAdAuctionV2.json +++ b/abi/contracts/blockad/BlockAdV2.sol/BlockAdAuctionV2.json @@ -212,6 +212,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", diff --git a/abi/contracts/blockad/lib/Builder.sol/Builder.json b/abi/contracts/blockad/lib/Builder.sol/Builder.json index aa559ce..b125761 100644 --- a/abi/contracts/blockad/lib/Builder.sol/Builder.json +++ b/abi/contracts/blockad/lib/Builder.sol/Builder.json @@ -181,6 +181,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -313,6 +318,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -411,6 +421,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -509,6 +524,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", diff --git a/abi/contracts/standard_peekers/bids.sol/EthBlockBidSenderContract.json b/abi/contracts/standard_peekers/bids.sol/EthBlockBidSenderContract.json index e76568f..a0b3a67 100644 --- a/abi/contracts/standard_peekers/bids.sol/EthBlockBidSenderContract.json +++ b/abi/contracts/standard_peekers/bids.sol/EthBlockBidSenderContract.json @@ -141,6 +141,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -249,6 +254,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -347,6 +357,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -445,6 +460,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", diff --git a/abi/contracts/standard_peekers/bids.sol/EthBlockContract.json b/abi/contracts/standard_peekers/bids.sol/EthBlockContract.json index f33a2e3..43df1c9 100644 --- a/abi/contracts/standard_peekers/bids.sol/EthBlockContract.json +++ b/abi/contracts/standard_peekers/bids.sol/EthBlockContract.json @@ -130,6 +130,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -238,6 +243,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -336,6 +346,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -434,6 +449,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", diff --git a/abi/solady/src/utils/JSONParserLib.sol/JSONParserLib.json b/abi/solady/src/utils/JSONParserLib.sol/JSONParserLib.json new file mode 100644 index 0000000..7939487 --- /dev/null +++ b/abi/solady/src/utils/JSONParserLib.sol/JSONParserLib.json @@ -0,0 +1,7 @@ +[ + { + "inputs": [], + "name": "ParsingFailed", + "type": "error" + } +] diff --git a/abi/solady/src/utils/LibString.sol/LibString.json b/abi/solady/src/utils/LibString.sol/LibString.json new file mode 100644 index 0000000..82cb92c --- /dev/null +++ b/abi/solady/src/utils/LibString.sol/LibString.json @@ -0,0 +1,12 @@ +[ + { + "inputs": [], + "name": "HexLengthInsufficient", + "type": "error" + }, + { + "inputs": [], + "name": "TooBigForSmallString", + "type": "error" + } +] diff --git a/contracts/libraries/Suave.sol b/contracts/libraries/Suave.sol index 696b637..2b83e9d 100644 --- a/contracts/libraries/Suave.sol +++ b/contracts/libraries/Suave.sol @@ -16,6 +16,7 @@ library Suave { bytes32 random; Withdrawal[] withdrawals; bytes extra; + bytes32 parentBeaconBlockRoot; bool fillPending; } diff --git a/deployments/rigil/BlockAdAuctionV2.json b/deployments/rigil/BlockAdAuctionV2.json index 0b51876..d262bb3 100644 --- a/deployments/rigil/BlockAdAuctionV2.json +++ b/deployments/rigil/BlockAdAuctionV2.json @@ -1,5 +1,5 @@ { - "address": "0xbA1B456C993B5c18DBCC25aBEA7FcCE081EF57a8", + "address": "0x0829fC66B8D714f789e3f333c10d38B6B92D0D70", "abi": [ { "inputs": [ @@ -214,6 +214,11 @@ "name": "extra", "type": "bytes" }, + { + "internalType": "bytes32", + "name": "parentBeaconBlockRoot", + "type": "bytes32" + }, { "internalType": "bool", "name": "fillPending", @@ -533,30 +538,30 @@ "type": "function" } ], - "transactionHash": "0xd36d2cbc004a9a453d62f841b78e8e08f494f5b9d416bb238192aaaacb333ba9", + "transactionHash": "0xeaa503a088dc938e1e55e437f811fce0ee9996e6af4075cbc27215583856610b", "receipt": { "to": null, "from": "0x16f2Aa8dF055b6e672b93Ded41FecCCabAB565B0", - "contractAddress": "0xbA1B456C993B5c18DBCC25aBEA7FcCE081EF57a8", + "contractAddress": "0x0829fC66B8D714f789e3f333c10d38B6B92D0D70", "transactionIndex": 0, - "gasUsed": "7472747", + "gasUsed": "7491349", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x4f10cc4f3d2d0a888d2dd3da0a20a08b9120b2f76171705dcf41d3c5a49df74e", - "transactionHash": "0xd36d2cbc004a9a453d62f841b78e8e08f494f5b9d416bb238192aaaacb333ba9", + "blockHash": "0xc2f06e0a3a49bc13689a3b19a174937d017347bb238f579637efb5cf706f5e74", + "transactionHash": "0xeaa503a088dc938e1e55e437f811fce0ee9996e6af4075cbc27215583856610b", "logs": [], - "blockNumber": 1355423, - "cumulativeGasUsed": "7472747", + "blockNumber": 2115019, + "cumulativeGasUsed": "7491349", "status": 1, "byzantium": true }, "args": [ "https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-goerli.flashbots.net" ], - "numDeployments": 3, - "solcInputHash": "3f2cfcf165740f55302d083efbeaea10", - "metadata": "{\"compiler\":{\"version\":\"0.8.8+commit.dddeac2f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"boostRelayUrl_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"PeekerReverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"SuaveError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"SuaveErrorWithData\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"Suave.DataId\",\"name\":\"dataId\",\"type\":\"bytes16\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"decryptionCondition\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"allowedPeekers\",\"type\":\"address[]\"}],\"name\":\"DataRecordEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockLimit\",\"type\":\"uint256\"}],\"name\":\"RequestAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"egp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"blockHash\",\"type\":\"string\"}],\"name\":\"RequestIncluded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"RequestRemoved\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"slot\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"proposerPubkey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"parent\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"random\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"index\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"validator\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"Address\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"amount\",\"type\":\"uint64\"}],\"internalType\":\"struct Suave.Withdrawal[]\",\"name\":\"withdrawals\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"extra\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"fillPending\",\"type\":\"bool\"}],\"internalType\":\"struct Suave.BuildBlockArgs\",\"name\":\"blockArgs\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"blockHeight\",\"type\":\"uint64\"}],\"name\":\"buildBlock\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"builderCall\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"includedRequestB\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"pendingRemovalsB\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"nextHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConfidentialControl.UnlockArgs\",\"name\":\"uArgs\",\"type\":\"tuple\"}],\"name\":\"buildCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"builder\",\"outputs\":[{\"internalType\":\"contract Builder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"blockLimit\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"}],\"name\":\"buyAd\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"blockLimit\",\"type\":\"uint256\"},{\"internalType\":\"Suave.DataId\",\"name\":\"paymentBidId\",\"type\":\"bytes16\"}],\"internalType\":\"struct BlockAdAuctionV2.AdRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"nextHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConfidentialControl.UnlockArgs\",\"name\":\"uArgs\",\"type\":\"tuple\"}],\"name\":\"buyAdCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nextHash\",\"type\":\"bytes32\"},{\"internalType\":\"Suave.DataId\",\"name\":\"sBidId\",\"type\":\"bytes16\"}],\"name\":\"ccCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"confidentialConstructor\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Suave.DataId\",\"name\":\"id\",\"type\":\"bytes16\"},{\"internalType\":\"Suave.DataId\",\"name\":\"salt\",\"type\":\"bytes16\"},{\"internalType\":\"uint64\",\"name\":\"decryptionCondition\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"allowedPeekers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"allowedStores\",\"type\":\"address[]\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"internalType\":\"struct Suave.DataRecord\",\"name\":\"dataRecord\",\"type\":\"tuple\"}],\"name\":\"emitDataRecord\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fetchConfidentialBundleData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"requests\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"blockLimit\",\"type\":\"uint256\"},{\"internalType\":\"Suave.DataId\",\"name\":\"paymentBidId\",\"type\":\"bytes16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/blockad/BlockAdV2.sol\":\"BlockAdAuctionV2\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/blockad/BlockAdV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { AnyBundleContract, Suave } from \\\"../standard_peekers/bids.sol\\\";\\nimport { ConfidentialControl } from \\\"./lib/ConfidentialControl.sol\\\";\\nimport { DynamicUintArray } from \\\"./lib/Utils.sol\\\";\\nimport { Builder } from \\\"./lib/Builder.sol\\\";\\n\\n\\ncontract BlockAdAuctionV2 is AnyBundleContract, ConfidentialControl {\\n\\tusing DynamicUintArray for bytes;\\n\\n\\tstruct AdRequest {\\n\\t\\tuint id;\\n\\t\\tstring extra;\\n\\t\\tuint blockLimit;\\n\\t\\tSuave.DataId paymentBidId;\\n\\t}\\n\\tstruct Offer {\\n\\t\\tuint id;\\n\\t\\tstring extra;\\n\\t\\tuint64 egp;\\n\\t\\tbytes paymentBundle;\\n\\t}\\n\\n\\tevent RequestAdded(uint indexed id, string extra, uint blockLimit);\\n\\tevent RequestRemoved(uint indexed id);\\n\\tevent RequestIncluded(uint indexed id, uint64 egp, string blockHash);\\n\\n\\tstring internal constant PB_NAMESPACE = \\\"blockad:v0:paymentBundle\\\";\\n\\tstring internal constant EB_NAMESPACE = \\\"default:v0:ethBundles\\\";\\n\\tstring internal constant EB_SIM_NAMESPACE = \\\"default:v0:ethBundleSimResults\\\";\\n\\tBuilder public builder;\\n\\tAdRequest[] public requests;\\n\\tuint public nextId;\\n\\n\\t/**********************************************************************\\n\\t * \\u26d3\\ufe0f ON-CHAIN METHODS *\\n\\t ***********************************************************************/\\n\\n\\tconstructor(string memory boostRelayUrl_) {\\n\\t\\tbuilder = new Builder(boostRelayUrl_);\\n\\t}\\n\\n\\tfunction buyAdCallback(AdRequest calldata request, UnlockArgs calldata uArgs) external unlock(uArgs) {\\n\\t\\trequests.push(request);\\n\\t\\tnextId++;\\n\\t\\temit RequestAdded(request.id, request.extra, request.blockLimit);\\n\\t}\\n\\n\\tfunction buildCallback(\\n\\t\\tbytes memory builderCall,\\n\\t\\tbytes memory includedRequestB,\\n\\t\\tbytes memory pendingRemovalsB,\\n\\t\\tUnlockArgs calldata uArgs\\n\\t) external unlock(uArgs) {\\n\\t\\tif (pendingRemovalsB.length > 0) {\\n\\t\\t\\tremoveRequests(pendingRemovalsB.export());\\n\\t\\t}\\n\\t\\tstring memory blockHash = handleBuilderCallback(address(builder), builderCall);\\n\\t\\thandleIncludedRequest(includedRequestB, blockHash);\\n\\t}\\n\\n\\tfunction requestsLength() public view returns (uint) {\\n\\t\\treturn requests.length;\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udd12 CONFIDENTIAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction confidentialConstructor() public view override onlyConfidential returns (bytes memory) {\\n\\t\\treturn ConfidentialControl.confidentialConstructor();\\n\\t}\\n\\n\\tfunction buyAd(uint64 blockLimit, string memory extra) external onlyConfidential returns (bytes memory) {\\n\\t\\tbytes memory paymentBundle = this.fetchConfidentialBundleData();\\n\\t\\t(,uint64 egp) = simulateBundleSafe(paymentBundle, true);\\n\\t\\tcrequire(egp > 0, \\\"egp too low\\\");\\n\\t\\tSuave.DataId paymentBidId = storePaymentBundle(paymentBundle);\\n\\t\\tAdRequest memory request = AdRequest(nextId, extra, blockLimit, paymentBidId);\\n\\t\\treturn abi.encodeWithSelector(this.buyAdCallback.selector, request, getUnlockPair());\\n\\t}\\n\\n\\tfunction buildBlock(\\n\\t\\tSuave.BuildBlockArgs memory blockArgs,\\n\\t\\tuint64 blockHeight\\n\\t) public onlyConfidential returns (bytes memory) {\\n\\t\\tcrequire(requests.length > 0, \\\"No requests\\\");\\n\\t\\t(Offer memory bestOffer, bytes memory removals) = filterOffers(blockHeight);\\n\\t\\tcrequire(bestOffer.egp > 0, \\\"No valid offers\\\");\\n\\n\\t\\tstoreBundleInPool(blockHeight, bestOffer);\\n\\t\\tblockArgs.extra = bytes(bestOffer.extra);\\n\\t\\t// Expect flow is ordered by egp; if one wants to fail payment they need higher egp\\n\\t\\tbytes memory externalCallback = builder.buildFromPool(blockArgs, blockHeight);\\n\\n\\t\\treturn\\n\\t\\t\\tabi.encodeWithSelector(\\n\\t\\t\\t\\tthis.buildCallback.selector,\\n\\t\\t\\t\\texternalCallback,\\n\\t\\t\\t\\tabi.encode(bestOffer.id, bestOffer.egp),\\n\\t\\t\\t\\tremovals,\\n\\t\\t\\t\\tgetUnlockPair()\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udee0\\ufe0f INTERNAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction removeRequests(uint[] memory pendingRemovals) internal {\\n\\t\\t// Assume that the pendingRemovals were added in ascending order\\n\\t\\t// Assume that pendingRemovals.length <= requests.length\\n\\t\\tfor (uint i = pendingRemovals.length; i > 0; --i) {\\n\\t\\t\\tuint indexToRemove = pendingRemovals[i - 1];\\n\\t\\t\\tuint requestId = requests[indexToRemove].id;\\n\\t\\t\\tif (indexToRemove < requests.length - 1) {\\n\\t\\t\\t\\trequests[indexToRemove] = requests[requests.length - 1];\\n\\t\\t\\t}\\n\\t\\t\\trequests.pop();\\n\\t\\t\\temit RequestRemoved(requestId);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction handleIncludedRequest(bytes memory includedRequestB, string memory blockHash) internal {\\n\\t\\t(uint id, uint64 egp) = abi.decode(includedRequestB, (uint, uint64));\\n\\t\\temit RequestIncluded(id, egp, blockHash);\\n\\t}\\n\\n\\tfunction handleBuilderCallback(address target, bytes memory data) internal returns (string memory) {\\n\\t\\t(bool success, bytes memory res) = target.call(data);\\n\\t\\tcrequire(success, \\\"External call failed\\\");\\n\\t\\treturn abi.decode(res, (string));\\n\\t}\\n\\n\\tfunction storePaymentBundle(bytes memory paymentBundle) internal view returns (Suave.DataId) {\\n\\t\\taddress[] memory peekers = new address[](1);\\n\\t\\tpeekers[0] = address(this);\\n\\t\\tSuave.DataRecord memory paymentBid = Suave.newDataRecord(0, peekers, peekers, PB_NAMESPACE);\\n\\t\\tSuave.confidentialStore(paymentBid.id, PB_NAMESPACE, paymentBundle);\\n\\t\\treturn paymentBid.id;\\n\\t}\\n\\n\\tfunction filterOffers(uint blockHeight) internal view returns (Offer memory bestOffer, bytes memory removals) {\\n\\t\\tfor (uint i; i < requests.length; ++i) {\\n\\t\\t\\tAdRequest memory request = requests[i];\\n\\t\\t\\tif (request.blockLimit < blockHeight) {\\n\\t\\t\\t\\tremovals = removals.append(i);\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\t\\t\\tbytes memory paymentBundle = Suave.confidentialRetrieve(request.paymentBidId, PB_NAMESPACE);\\n\\t\\t\\t(bool success, uint64 egp) = simulateBundleSafe(paymentBundle, false);\\n\\t\\t\\tif (!success || egp == 0) {\\n\\t\\t\\t\\tremovals = removals.append(i);\\n\\t\\t\\t} else if (egp > bestOffer.egp) {\\n\\t\\t\\t\\tbestOffer = Offer(request.id, request.extra, egp, paymentBundle);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction storeBundleInPool(uint64 blockHeight, Offer memory bestOffer) internal view {\\n\\t\\taddress[] memory allowedPeekers = new address[](3);\\n\\t\\tallowedPeekers[0] = address(builder);\\n\\t\\tallowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\\n\\t\\tallowedPeekers[2] = address(this);\\n\\t\\tSuave.DataRecord memory paymentBundleBid = Suave.newDataRecord(\\n\\t\\t\\tblockHeight, \\n\\t\\t\\tallowedPeekers, \\n\\t\\t\\tallowedPeekers, \\n\\t\\t\\tEB_NAMESPACE\\n\\t\\t);\\n\\t\\tSuave.confidentialStore(paymentBundleBid.id, EB_NAMESPACE, bestOffer.paymentBundle);\\n\\t\\tSuave.confidentialStore(paymentBundleBid.id, EB_SIM_NAMESPACE, abi.encode(bestOffer.egp));\\n\\t}\\n}\\n\",\"keccak256\":\"0xb86119584a051b85338532cf92a2dbd58c334e632ef1962c3da0434f11eec203\",\"license\":\"MIT\"},\"contracts/blockad/lib/Builder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { EthBlockContract, Suave } from \\\"../../standard_peekers/bids.sol\\\";\\nimport { SuaveContract } from \\\"./SuaveContract.sol\\\";\\n\\n\\ncontract Builder is EthBlockContract, SuaveContract {\\n\\tstring constant BB_NAMESPACE = \\\"blockad:v0:builderBid\\\";\\n\\tstring boostRelayUrl;\\n\\n\\tevent RelaySubmission(bytes32 bidId);\\n\\n\\tconstructor(string memory boostRelayUrl_) {\\n\\t\\tboostRelayUrl = boostRelayUrl_;\\n\\t}\\n\\n\\tfunction buildAndEmitCallback(string memory blockHash, bytes32 id) external returns (string memory) {\\n\\t\\temit RelaySubmission(id);\\n\\t\\treturn blockHash;\\n\\t}\\n\\n\\tfunction buildAndEmit(\\n\\t\\tSuave.BuildBlockArgs memory blockArgs,\\n\\t\\tuint64 blockHeight,\\n\\t\\tSuave.DataId[] memory bids,\\n\\t\\tstring memory namespace\\n\\t) public virtual override onlyConfidential returns (bytes memory) {\\n\\t\\t(Suave.DataRecord memory blockBid, bytes memory builderBid) = this.doBuild(blockArgs, blockHeight, bids, namespace);\\n\\t\\tstoreBuilderBid(blockBid.id, builderBid);\\n\\t\\tsubmitToRelay(builderBid);\\n\\t\\tstring memory blockHash = extractBlockHash(builderBid, blockArgs.slot);\\n\\t\\treturn abi.encodeWithSelector(this.buildAndEmitCallback.selector, blockHash, keccak256(builderBid));\\n\\t}\\n\\n\\tfunction submitBlock(uint slot) external view onlyConfidential returns (bytes memory) {\\n\\t\\tbytes memory builderBid = Suave.confidentialInputs();\\n\\t\\tsubmitToRelay(builderBid);\\n\\t\\tstring memory blockHash = extractBlockHash(builderBid, slot);\\n\\t\\treturn abi.encodeWithSelector(this.buildAndEmitCallback.selector, blockHash, keccak256(builderBid));\\n\\t}\\n\\n\\tfunction submitToRelay(bytes memory builderBid) internal view {\\n\\t\\t(bool success, bytes memory data) = Suave.SUBMIT_ETH_BLOCK_BID_TO_RELAY\\n\\t\\t\\t.staticcall(abi.encode(boostRelayUrl, builderBid));\\n\\t\\tif (!success) {\\n\\t\\t\\trevert SuaveErrorWithData(string(data), builderBid);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction storeBuilderBid(Suave.DataId blockBidId, bytes memory builderBid) internal view {\\n\\t\\taddress[] memory peekers = new address[](1);\\n\\t\\tpeekers[0] = address(this);\\n\\t\\tSuave.confidentialStore(blockBidId, BB_NAMESPACE, builderBid);\\n\\t}\\n\\n\\t// Extract block-hash from stringified SubmitBlockRequest JSON object - method will fail if the struct changes!\\n\\tfunction extractBlockHash(bytes memory builderBid, uint slot) public pure returns (string memory) {\\n\\t\\tuint resultBytesLen = 64;\\n\\t\\tuint offset = 121 + decLen(slot);\\n\\t\\tbytes memory result = new bytes(resultBytesLen);\\n\\t\\tassembly {\\n\\t\\t\\tfor { let i:=32 } lt(i, add(resultBytesLen, 32)) { i:=add(i, 32) } {\\n\\t\\t\\t\\tmstore(add(result, i), mload(add(builderBid, add(offset, i))))\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n\\n\\tfunction decLen(uint num) internal pure returns (uint count) {\\n\\t\\tassembly {\\n\\t\\t\\tfor { let dec := 10 } true { dec := mul(dec, 10) } {\\n\\t\\t\\t\\tcount := add(count, 1)\\n\\t\\t\\t\\tswitch lt(num, dec)\\n\\t\\t\\t\\t\\tcase 1 { break }\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\",\"keccak256\":\"0xef71aa4ebf2e13c292016769e52df249ac1c0617a9aaeb47087a566f934639ef\",\"license\":\"MIT\"},\"contracts/blockad/lib/ConfidentialControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { SuaveContract, Suave } from \\\"./SuaveContract.sol\\\";\\n\\n\\nabstract contract ConfidentialControl is SuaveContract {\\n\\tstruct UnlockArgs {\\n\\t\\tbytes32 key;\\n\\t\\tbytes32 nextHash;\\n\\t}\\n\\n\\tmodifier unlock(UnlockArgs calldata unlockPair) {\\n\\t\\tcrequire(isValidKey(unlockPair.key), \\\"Invalid key\\\");\\n\\t\\t_;\\n\\t\\tpresentHash = unlockPair.nextHash;\\n\\t\\tnonce++;\\n\\t}\\n\\n\\tstring internal constant S_NAMESPACE = \\\"blockad:v0:secret\\\";\\n\\tSuave.DataId internal secretBidId;\\n\\tbytes32 internal presentHash;\\n\\tuint internal nonce;\\n\\n\\t/**********************************************************************\\n\\t * \\u26d3\\ufe0f ON-CHAIN METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction ccCallback(bytes32 nextHash, Suave.DataId sBidId) external {\\n\\t\\tcrequire(!isInitialized(), \\\"Already initialized\\\");\\n\\t\\tpresentHash = nextHash;\\n\\t\\tsecretBidId = sBidId;\\n\\t}\\n\\n\\tfunction isInitialized() public view returns (bool) {\\n\\t\\treturn presentHash != 0;\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udd12 CONFIDENTIAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction confidentialConstructor() public view virtual onlyConfidential returns (bytes memory) {\\n\\t\\tcrequire(!isInitialized(), \\\"Already initialized\\\");\\n\\t\\tbytes memory secret = Suave.confidentialInputs();\\n\\t\\tSuave.DataId sBidId = storeSecret(secret);\\n\\t\\tbytes32 nextHash = makeHash(abi.decode(secret, (bytes32)), nonce);\\n\\t\\treturn abi.encodeWithSelector(this.ccCallback.selector, nextHash, sBidId);\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udee0\\ufe0f INTERNAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction storeSecret(bytes memory secret) internal view returns (Suave.DataId) {\\n\\t\\taddress[] memory peekers = new address[](3);\\n\\t\\tpeekers[0] = address(this);\\n\\t\\tpeekers[1] = Suave.FETCH_DATA_RECORDS;\\n\\t\\tpeekers[2] = Suave.CONFIDENTIAL_RETRIEVE;\\n\\t\\tSuave.DataRecord memory secretBid = Suave.newDataRecord(0, peekers, peekers, S_NAMESPACE);\\n\\t\\tSuave.confidentialStore(secretBid.id, S_NAMESPACE, secret);\\n\\t\\treturn secretBid.id;\\n\\t}\\n\\n\\tfunction isValidKey(bytes32 key) internal view returns (bool) {\\n\\t\\treturn keccak256(abi.encode(key)) == presentHash;\\n\\t}\\n\\n\\tfunction getUnlockPair() internal view returns (UnlockArgs memory) {\\n\\t\\treturn UnlockArgs(getKey(nonce), getHash(nonce + 1));\\n\\t}\\n\\n\\tfunction getHash(uint _nonce) internal view returns (bytes32) {\\n\\t\\treturn keccak256(abi.encode(getKey(_nonce)));\\n\\t}\\n\\n\\tfunction getKey(uint _nonce) internal view returns (bytes32) {\\n\\t\\treturn makeKey(getSecret(), _nonce);\\n\\t}\\n\\n\\tfunction makeHash(bytes32 secret, uint _nonce) internal pure returns (bytes32) {\\n\\t\\treturn keccak256(abi.encode(makeKey(secret, _nonce)));\\n\\t}\\n\\n\\tfunction makeKey(bytes32 secret, uint _nonce) internal pure returns (bytes32) {\\n\\t\\treturn keccak256(abi.encode(secret, _nonce));\\n\\t}\\n\\n\\tfunction getSecret() internal view returns (bytes32) {\\n\\t\\tbytes memory secretB = Suave.confidentialRetrieve(secretBidId, S_NAMESPACE);\\n\\t\\treturn abi.decode(secretB, (bytes32));\\n\\t}\\n}\\n\",\"keccak256\":\"0x49ac0b4b3dbbe2e58f29454ae8586b6bf97105ad52d2b001867b4930da959217\",\"license\":\"MIT\"},\"contracts/blockad/lib/SuaveContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { Suave } from \\\"../../standard_peekers/bids.sol\\\";\\n\\n\\nabstract contract SuaveContract {\\n\\terror SuaveError(string message);\\n\\terror SuaveErrorWithData(string message, bytes data);\\n\\n\\tmodifier onlyConfidential() {\\n\\t\\tcrequire(Suave.isConfidential(), \\\"Not confidential\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\tfunction simulateBundleSafe(bytes memory bundle, bool doRevert) internal view returns (bool valid, uint64 egp) {\\n\\t\\t(bool success, bytes memory d) = Suave.SIMULATE_BUNDLE.staticcall{ gas: 20_000 }(abi.encode(bundle));\\n\\t\\tcrequire(!doRevert || success, string(d));\\n\\t\\tif (success) {\\n\\t\\t\\treturn (true, abi.decode(d, (uint64)));\\n\\t\\t}\\n\\t}\\n\\n\\tfunction crequire(bool condition, string memory message) internal pure {\\n\\t\\tif (!condition) {\\n\\t\\t\\trevert SuaveError(message);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x64eb01469afe18f29050571acd52ee35faca1da2c00a87e01d5ea0fdbcdf4bec\",\"license\":\"MIT\"},\"contracts/blockad/lib/Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.8;\\n\\n\\nlibrary DynamicUintArray {\\n\\tfunction append(bytes memory a, uint e) internal pure returns (bytes memory) {\\n\\t\\treturn bytes.concat(a, TypeConversion.toBytes(e));\\n\\t}\\n\\n\\tfunction export(bytes memory a) internal pure returns (uint[] memory) {\\n\\t\\treturn TypeConversion.toUints(a);\\n\\t}\\n}\\n\\nlibrary TypeConversion {\\n\\tfunction toBytes(uint x) internal pure returns (bytes memory y) {\\n\\t\\ty = new bytes(32);\\n\\t\\tassembly {\\n\\t\\t\\tmstore(add(y, 32), x)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction toUint(bytes memory x, uint offset) internal pure returns (uint y) {\\n\\t\\tassembly {\\n\\t\\t\\ty := mload(add(x, offset))\\n\\t\\t}\\n\\t}\\n\\n\\tfunction toUints(bytes memory xs) internal pure returns (uint[] memory ys) {\\n\\t\\tys = new uint[](xs.length / 32);\\n\\t\\tfor (uint i = 0; i < xs.length / 32; i++) {\\n\\t\\t\\tys[i] = toUint(xs, i * 32 + 32);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xec09eed9c1d6d24228b0473b9614be28b428ed832808ac3a75ffbcb444ac54af\",\"license\":\"MIT\"},\"contracts/libraries/Suave.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.8;\\n\\nlibrary Suave {\\n error PeekerReverted(address, bytes);\\n\\n type DataId is bytes16;\\n\\n struct BuildBlockArgs {\\n uint64 slot;\\n bytes proposerPubkey;\\n bytes32 parent;\\n uint64 timestamp;\\n address feeRecipient;\\n uint64 gasLimit;\\n bytes32 random;\\n Withdrawal[] withdrawals;\\n bytes extra;\\n bool fillPending;\\n }\\n\\n struct DataRecord {\\n DataId id;\\n DataId salt;\\n uint64 decryptionCondition;\\n address[] allowedPeekers;\\n address[] allowedStores;\\n string version;\\n }\\n\\n struct HttpRequest {\\n string url;\\n string method;\\n string[] headers;\\n bytes body;\\n }\\n\\n struct Withdrawal {\\n uint64 index;\\n uint64 validator;\\n address Address;\\n uint64 amount;\\n }\\n\\n address public constant ANYALLOWED = 0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829;\\n\\n address public constant IS_CONFIDENTIAL_ADDR = 0x0000000000000000000000000000000042010000;\\n\\n address public constant BUILD_ETH_BLOCK = 0x0000000000000000000000000000000042100001;\\n\\n address public constant CONFIDENTIAL_INPUTS = 0x0000000000000000000000000000000042010001;\\n\\n address public constant CONFIDENTIAL_RETRIEVE = 0x0000000000000000000000000000000042020001;\\n\\n address public constant CONFIDENTIAL_STORE = 0x0000000000000000000000000000000042020000;\\n\\n address public constant DO_HTTPREQUEST = 0x0000000000000000000000000000000043200002;\\n\\n address public constant ETHCALL = 0x0000000000000000000000000000000042100003;\\n\\n address public constant EXTRACT_HINT = 0x0000000000000000000000000000000042100037;\\n\\n address public constant FETCH_DATA_RECORDS = 0x0000000000000000000000000000000042030001;\\n\\n address public constant FILL_MEV_SHARE_BUNDLE = 0x0000000000000000000000000000000043200001;\\n\\n address public constant NEW_DATA_RECORD = 0x0000000000000000000000000000000042030000;\\n\\n address public constant SIGN_ETH_TRANSACTION = 0x0000000000000000000000000000000040100001;\\n\\n address public constant SIMULATE_BUNDLE = 0x0000000000000000000000000000000042100000;\\n\\n address public constant SUBMIT_BUNDLE_JSON_RPC = 0x0000000000000000000000000000000043000001;\\n\\n address public constant SUBMIT_ETH_BLOCK_BID_TO_RELAY = 0x0000000000000000000000000000000042100002;\\n\\n // Returns whether execution is off- or on-chain\\n function isConfidential() internal view returns (bool b) {\\n (bool success, bytes memory isConfidentialBytes) = IS_CONFIDENTIAL_ADDR.staticcall(\\\"\\\");\\n if (!success) {\\n revert PeekerReverted(IS_CONFIDENTIAL_ADDR, isConfidentialBytes);\\n }\\n assembly {\\n // Load the length of data (first 32 bytes)\\n let len := mload(isConfidentialBytes)\\n // Load the data after 32 bytes, so add 0x20\\n b := mload(add(isConfidentialBytes, 0x20))\\n }\\n }\\n\\n function buildEthBlock(BuildBlockArgs memory blockArgs, DataId dataId, string memory namespace)\\n internal\\n view\\n returns (bytes memory, bytes memory)\\n {\\n (bool success, bytes memory data) = BUILD_ETH_BLOCK.staticcall(abi.encode(blockArgs, dataId, namespace));\\n if (!success) {\\n revert PeekerReverted(BUILD_ETH_BLOCK, data);\\n }\\n\\n return abi.decode(data, (bytes, bytes));\\n }\\n\\n function confidentialInputs() internal view returns (bytes memory) {\\n (bool success, bytes memory data) = CONFIDENTIAL_INPUTS.staticcall(abi.encode());\\n if (!success) {\\n revert PeekerReverted(CONFIDENTIAL_INPUTS, data);\\n }\\n\\n return data;\\n }\\n\\n function confidentialRetrieve(DataId dataId, string memory key) internal view returns (bytes memory) {\\n (bool success, bytes memory data) = CONFIDENTIAL_RETRIEVE.staticcall(abi.encode(dataId, key));\\n if (!success) {\\n revert PeekerReverted(CONFIDENTIAL_RETRIEVE, data);\\n }\\n\\n return data;\\n }\\n\\n function confidentialStore(DataId dataId, string memory key, bytes memory data1) internal view {\\n (bool success, bytes memory data) = CONFIDENTIAL_STORE.staticcall(abi.encode(dataId, key, data1));\\n if (!success) {\\n revert PeekerReverted(CONFIDENTIAL_STORE, data);\\n }\\n }\\n\\n function doHTTPRequest(HttpRequest memory request) internal view returns (bytes memory) {\\n (bool success, bytes memory data) = DO_HTTPREQUEST.staticcall(abi.encode(request));\\n if (!success) {\\n revert PeekerReverted(DO_HTTPREQUEST, data);\\n }\\n\\n return abi.decode(data, (bytes));\\n }\\n\\n function ethcall(address contractAddr, bytes memory input1) internal view returns (bytes memory) {\\n (bool success, bytes memory data) = ETHCALL.staticcall(abi.encode(contractAddr, input1));\\n if (!success) {\\n revert PeekerReverted(ETHCALL, data);\\n }\\n\\n return abi.decode(data, (bytes));\\n }\\n\\n function extractHint(bytes memory bundleData) internal view returns (bytes memory) {\\n require(isConfidential());\\n (bool success, bytes memory data) = EXTRACT_HINT.staticcall(abi.encode(bundleData));\\n if (!success) {\\n revert PeekerReverted(EXTRACT_HINT, data);\\n }\\n\\n return data;\\n }\\n\\n function fetchDataRecords(uint64 cond, string memory namespace) internal view returns (DataRecord[] memory) {\\n (bool success, bytes memory data) = FETCH_DATA_RECORDS.staticcall(abi.encode(cond, namespace));\\n if (!success) {\\n revert PeekerReverted(FETCH_DATA_RECORDS, data);\\n }\\n\\n return abi.decode(data, (DataRecord[]));\\n }\\n\\n function fillMevShareBundle(DataId dataId) internal view returns (bytes memory) {\\n require(isConfidential());\\n (bool success, bytes memory data) = FILL_MEV_SHARE_BUNDLE.staticcall(abi.encode(dataId));\\n if (!success) {\\n revert PeekerReverted(FILL_MEV_SHARE_BUNDLE, data);\\n }\\n\\n return data;\\n }\\n\\n function newDataRecord(\\n uint64 decryptionCondition,\\n address[] memory allowedPeekers,\\n address[] memory allowedStores,\\n string memory dataType\\n ) internal view returns (DataRecord memory) {\\n (bool success, bytes memory data) =\\n NEW_DATA_RECORD.staticcall(abi.encode(decryptionCondition, allowedPeekers, allowedStores, dataType));\\n if (!success) {\\n revert PeekerReverted(NEW_DATA_RECORD, data);\\n }\\n\\n return abi.decode(data, (DataRecord));\\n }\\n\\n function signEthTransaction(bytes memory txn, string memory chainId, string memory signingKey)\\n internal\\n view\\n returns (bytes memory)\\n {\\n (bool success, bytes memory data) = SIGN_ETH_TRANSACTION.staticcall(abi.encode(txn, chainId, signingKey));\\n if (!success) {\\n revert PeekerReverted(SIGN_ETH_TRANSACTION, data);\\n }\\n\\n return abi.decode(data, (bytes));\\n }\\n\\n function simulateBundle(bytes memory bundleData) internal view returns (uint64) {\\n (bool success, bytes memory data) = SIMULATE_BUNDLE.staticcall(abi.encode(bundleData));\\n if (!success) {\\n revert PeekerReverted(SIMULATE_BUNDLE, data);\\n }\\n\\n return abi.decode(data, (uint64));\\n }\\n\\n function submitBundleJsonRPC(string memory url, string memory method, bytes memory params)\\n internal\\n view\\n returns (bytes memory)\\n {\\n require(isConfidential());\\n (bool success, bytes memory data) = SUBMIT_BUNDLE_JSON_RPC.staticcall(abi.encode(url, method, params));\\n if (!success) {\\n revert PeekerReverted(SUBMIT_BUNDLE_JSON_RPC, data);\\n }\\n\\n return data;\\n }\\n\\n function submitEthBlockBidToRelay(string memory relayUrl, bytes memory builderBid)\\n internal\\n view\\n returns (bytes memory)\\n {\\n require(isConfidential());\\n (bool success, bytes memory data) = SUBMIT_ETH_BLOCK_BID_TO_RELAY.staticcall(abi.encode(relayUrl, builderBid));\\n if (!success) {\\n revert PeekerReverted(SUBMIT_ETH_BLOCK_BID_TO_RELAY, data);\\n }\\n\\n return data;\\n }\\n}\\n\",\"keccak256\":\"0x121f472beba32310082a9cafa5c1b96a52d70f79e82c573b4a8b9ef62d3e6021\",\"license\":\"UNLICENSED\"},\"contracts/standard_peekers/bids.sol\":{\"content\":\"pragma solidity ^0.8.8;\\n\\nimport \\\"../libraries/Suave.sol\\\";\\n\\ncontract AnyBundleContract {\\n event DataRecordEvent(Suave.DataId dataId, uint64 decryptionCondition, address[] allowedPeekers);\\n\\n function fetchConfidentialBundleData() public returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n bytes memory confidentialInputs = Suave.confidentialInputs();\\n return abi.decode(confidentialInputs, (bytes));\\n }\\n\\n function emitDataRecord(Suave.DataRecord calldata dataRecord) public {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n }\\n}\\n\\ncontract BundleContract is AnyBundleContract {\\n function newBundle(\\n uint64 decryptionCondition,\\n address[] memory dataAllowedPeekers,\\n address[] memory dataAllowedStores\\n ) external payable returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n bytes memory bundleData = this.fetchConfidentialBundleData();\\n\\n uint64 egp = Suave.simulateBundle(bundleData);\\n\\n Suave.DataRecord memory dataRecord =\\n Suave.newDataRecord(decryptionCondition, dataAllowedPeekers, dataAllowedStores, \\\"default:v0:ethBundles\\\");\\n\\n Suave.confidentialStore(dataRecord.id, \\\"default:v0:ethBundles\\\", bundleData);\\n Suave.confidentialStore(dataRecord.id, \\\"default:v0:ethBundleSimResults\\\", abi.encode(egp));\\n\\n return emitAndReturn(dataRecord, bundleData);\\n }\\n\\n function emitAndReturn(Suave.DataRecord memory dataRecord, bytes memory) internal virtual returns (bytes memory) {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n return bytes.concat(this.emitDataRecord.selector, abi.encode(dataRecord));\\n }\\n}\\n\\ncontract EthBundleSenderContract is BundleContract {\\n string[] public builderUrls;\\n\\n constructor(string[] memory builderUrls_) {\\n builderUrls = builderUrls_;\\n }\\n\\n function emitAndReturn(Suave.DataRecord memory dataRecord, bytes memory bundleData)\\n internal\\n virtual\\n override\\n returns (bytes memory)\\n {\\n for (uint256 i = 0; i < builderUrls.length; i++) {\\n Suave.submitBundleJsonRPC(builderUrls[i], \\\"eth_sendBundle\\\", bundleData);\\n }\\n\\n return BundleContract.emitAndReturn(dataRecord, bundleData);\\n }\\n}\\n\\ncontract MevShareContract is AnyBundleContract {\\n event HintEvent(Suave.DataId dataId, bytes hint);\\n\\n event MatchEvent(Suave.DataId matchDataId, bytes matchHint);\\n\\n function newTransaction(\\n uint64 decryptionCondition,\\n address[] memory dataAllowedPeekers,\\n address[] memory dataAllowedStores\\n ) external payable returns (bytes memory) {\\n // 0. check confidential execution\\n require(Suave.isConfidential());\\n\\n // 1. fetch bundle data\\n bytes memory bundleData = this.fetchConfidentialBundleData();\\n\\n // 2. sim bundle\\n uint64 egp = Suave.simulateBundle(bundleData);\\n\\n // 3. extract hint\\n bytes memory hint = Suave.extractHint(bundleData);\\n\\n // // 4. store bundle and sim results\\n Suave.DataRecord memory dataRecord = Suave.newDataRecord(\\n decryptionCondition, dataAllowedPeekers, dataAllowedStores, \\\"mevshare:v0:unmatchedBundles\\\"\\n );\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundles\\\", bundleData);\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundleSimResults\\\", abi.encode(egp));\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n emit HintEvent(dataRecord.id, hint);\\n\\n // // 5. return \\\"callback\\\" to emit hint onchain\\n return bytes.concat(this.emitDataRecordAndHint.selector, abi.encode(dataRecord, hint));\\n }\\n\\n function emitDataRecordAndHint(Suave.DataRecord calldata dataRecord, bytes memory hint) public {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n emit HintEvent(dataRecord.id, hint);\\n }\\n\\n function newMatch(\\n uint64 decryptionCondition,\\n address[] memory dataAllowedPeekers,\\n address[] memory dataAllowedStores,\\n Suave.DataId sharedataId\\n ) external payable returns (bytes memory) {\\n // WARNING : this function will copy the original mev share bid\\n // into a new key with potentially different permsissions\\n\\n require(Suave.isConfidential());\\n // 1. fetch confidential data\\n bytes memory matchBundleData = this.fetchConfidentialBundleData();\\n\\n // 2. sim match alone for validity\\n uint64 egp = Suave.simulateBundle(matchBundleData);\\n\\n // 3. extract hint\\n bytes memory matchHint = Suave.extractHint(matchBundleData);\\n\\n Suave.DataRecord memory dataRecord = Suave.newDataRecord(\\n decryptionCondition, dataAllowedPeekers, dataAllowedStores, \\\"mevshare:v0:matchDataRecords\\\"\\n );\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundles\\\", matchBundleData);\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundleSimResults\\\", abi.encode(0));\\n\\n //4. merge data records\\n Suave.DataId[] memory dataRecords = new Suave.DataId[](2);\\n dataRecords[0] = sharedataId;\\n dataRecords[1] = dataRecord.id;\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:mergedDataRecords\\\", abi.encode(dataRecords));\\n\\n return emitMatchDataRecordAndHint(dataRecord, matchHint);\\n }\\n\\n function emitMatchDataRecordAndHint(Suave.DataRecord memory dataRecord, bytes memory matchHint)\\n internal\\n virtual\\n returns (bytes memory)\\n {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n emit MatchEvent(dataRecord.id, matchHint);\\n\\n return bytes.concat(this.emitDataRecord.selector, abi.encode(dataRecord));\\n }\\n}\\n\\ncontract MevShareBundleSenderContract is MevShareContract {\\n string[] public builderUrls;\\n\\n constructor(string[] memory builderUrls_) {\\n builderUrls = builderUrls_;\\n }\\n\\n function emitMatchDataRecordAndHint(Suave.DataRecord memory dataRecord, bytes memory matchHint)\\n internal\\n virtual\\n override\\n returns (bytes memory)\\n {\\n bytes memory bundleData = Suave.fillMevShareBundle(dataRecord.id);\\n for (uint256 i = 0; i < builderUrls.length; i++) {\\n Suave.submitBundleJsonRPC(builderUrls[i], \\\"mev_sendBundle\\\", bundleData);\\n }\\n\\n return MevShareContract.emitMatchDataRecordAndHint(dataRecord, matchHint);\\n }\\n}\\n\\n/* Not tested or implemented on the precompile side */\\nstruct EgpRecordPair {\\n uint64 egp; // in wei, beware overflow\\n Suave.DataId dataId;\\n}\\n\\ncontract EthBlockContract is AnyBundleContract {\\n event BuilderBoostBidEvent(Suave.DataId dataId, bytes builderBid);\\n\\n function idsEqual(Suave.DataId _l, Suave.DataId _r) public pure returns (bool) {\\n bytes memory l = abi.encodePacked(_l);\\n bytes memory r = abi.encodePacked(_r);\\n for (uint256 i = 0; i < l.length; i++) {\\n if (bytes(l)[i] != r[i]) {\\n return false;\\n }\\n }\\n\\n return true;\\n }\\n\\n function buildMevShare(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n Suave.DataRecord[] memory allShareMatchDataRecords =\\n Suave.fetchDataRecords(blockHeight, \\\"mevshare:v0:matchDataRecords\\\");\\n Suave.DataRecord[] memory allShareUserDataRecords =\\n Suave.fetchDataRecords(blockHeight, \\\"mevshare:v0:unmatchedBundles\\\");\\n\\n if (allShareUserDataRecords.length == 0) {\\n revert Suave.PeekerReverted(address(this), \\\"no data records\\\");\\n }\\n\\n Suave.DataRecord[] memory allRecords = new Suave.DataRecord[](allShareUserDataRecords.length);\\n for (uint256 i = 0; i < allShareUserDataRecords.length; i++) {\\n // TODO: sort matches by egp first!\\n Suave.DataRecord memory dataRecordToInsert = allShareUserDataRecords[i]; // will be updated with the best match if any\\n for (uint256 j = 0; j < allShareMatchDataRecords.length; j++) {\\n // TODO: should be done once at the start and sorted\\n Suave.DataId[] memory mergeddataIds = abi.decode(\\n Suave.confidentialRetrieve(allShareMatchDataRecords[j].id, \\\"mevshare:v0:mergedDataRecords\\\"),\\n (Suave.DataId[])\\n );\\n if (idsEqual(mergeddataIds[0], allShareUserDataRecords[i].id)) {\\n dataRecordToInsert = allShareMatchDataRecords[j];\\n break;\\n }\\n }\\n allRecords[i] = dataRecordToInsert;\\n }\\n\\n EgpRecordPair[] memory bidsByEGP = new EgpRecordPair[](allRecords.length);\\n for (uint256 i = 0; i < allRecords.length; i++) {\\n bytes memory simResults = Suave.confidentialRetrieve(allRecords[i].id, \\\"mevshare:v0:ethBundleSimResults\\\");\\n uint64 egp = abi.decode(simResults, (uint64));\\n bidsByEGP[i] = EgpRecordPair(egp, allRecords[i].id);\\n }\\n\\n // Bubble sort, cause why not\\n uint256 n = bidsByEGP.length;\\n for (uint256 i = 0; i < n - 1; i++) {\\n for (uint256 j = i + 1; j < n; j++) {\\n if (bidsByEGP[i].egp < bidsByEGP[j].egp) {\\n EgpRecordPair memory temp = bidsByEGP[i];\\n bidsByEGP[i] = bidsByEGP[j];\\n bidsByEGP[j] = temp;\\n }\\n }\\n }\\n\\n Suave.DataId[] memory alldataIds = new Suave.DataId[](allRecords.length);\\n for (uint256 i = 0; i < bidsByEGP.length; i++) {\\n alldataIds[i] = bidsByEGP[i].dataId;\\n }\\n\\n return buildAndEmit(blockArgs, blockHeight, alldataIds, \\\"mevshare:v0\\\");\\n }\\n\\n function buildFromPool(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n Suave.DataRecord[] memory allRecords = Suave.fetchDataRecords(blockHeight, \\\"default:v0:ethBundles\\\");\\n if (allRecords.length == 0) {\\n revert Suave.PeekerReverted(address(this), \\\"no data records\\\");\\n }\\n\\n EgpRecordPair[] memory bidsByEGP = new EgpRecordPair[](allRecords.length);\\n for (uint256 i = 0; i < allRecords.length; i++) {\\n bytes memory simResults = Suave.confidentialRetrieve(allRecords[i].id, \\\"default:v0:ethBundleSimResults\\\");\\n uint64 egp = abi.decode(simResults, (uint64));\\n bidsByEGP[i] = EgpRecordPair(egp, allRecords[i].id);\\n }\\n\\n // Bubble sort, cause why not\\n uint256 n = bidsByEGP.length;\\n for (uint256 i = 0; i < n - 1; i++) {\\n for (uint256 j = i + 1; j < n; j++) {\\n if (bidsByEGP[i].egp < bidsByEGP[j].egp) {\\n EgpRecordPair memory temp = bidsByEGP[i];\\n bidsByEGP[i] = bidsByEGP[j];\\n bidsByEGP[j] = temp;\\n }\\n }\\n }\\n\\n Suave.DataId[] memory alldataIds = new Suave.DataId[](allRecords.length);\\n for (uint256 i = 0; i < bidsByEGP.length; i++) {\\n alldataIds[i] = bidsByEGP[i].dataId;\\n }\\n\\n return buildAndEmit(blockArgs, blockHeight, alldataIds, \\\"\\\");\\n }\\n\\n function buildAndEmit(\\n Suave.BuildBlockArgs memory blockArgs,\\n uint64 blockHeight,\\n Suave.DataId[] memory records,\\n string memory namespace\\n ) public virtual returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n (Suave.DataRecord memory blockBid, bytes memory builderBid) =\\n this.doBuild(blockArgs, blockHeight, records, namespace);\\n\\n emit BuilderBoostBidEvent(blockBid.id, builderBid);\\n emit DataRecordEvent(blockBid.id, blockBid.decryptionCondition, blockBid.allowedPeekers);\\n return bytes.concat(this.emitBuilderBidAndBid.selector, abi.encode(blockBid, builderBid));\\n }\\n\\n function doBuild(\\n Suave.BuildBlockArgs memory blockArgs,\\n uint64 blockHeight,\\n Suave.DataId[] memory records,\\n string memory namespace\\n ) public view returns (Suave.DataRecord memory, bytes memory) {\\n address[] memory allowedPeekers = new address[](2);\\n allowedPeekers[0] = address(this);\\n allowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\\n\\n Suave.DataRecord memory blockBid =\\n Suave.newDataRecord(blockHeight, allowedPeekers, allowedPeekers, \\\"default:v0:mergedDataRecords\\\");\\n Suave.confidentialStore(blockBid.id, \\\"default:v0:mergedDataRecords\\\", abi.encode(records));\\n\\n (bytes memory builderBid, bytes memory payload) = Suave.buildEthBlock(blockArgs, blockBid.id, namespace);\\n Suave.confidentialStore(blockBid.id, \\\"default:v0:builderPayload\\\", payload); // only through this.unlock\\n\\n return (blockBid, builderBid);\\n }\\n\\n function emitBuilderBidAndBid(Suave.DataRecord memory dataRecord, bytes memory builderBid)\\n public\\n returns (Suave.DataRecord memory, bytes memory)\\n {\\n emit BuilderBoostBidEvent(dataRecord.id, builderBid);\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n return (dataRecord, builderBid);\\n }\\n\\n function unlock(Suave.DataId dataId, bytes memory signedBlindedHeader) public view returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n // TODO: verify the header is correct\\n // TODO: incorporate protocol name\\n bytes memory payload = Suave.confidentialRetrieve(dataId, \\\"default:v0:builderPayload\\\");\\n return payload;\\n }\\n}\\n\\ncontract EthBlockBidSenderContract is EthBlockContract {\\n string boostRelayUrl;\\n\\n constructor(string memory boostRelayUrl_) {\\n boostRelayUrl = boostRelayUrl_;\\n }\\n\\n function buildAndEmit(\\n Suave.BuildBlockArgs memory blockArgs,\\n uint64 blockHeight,\\n Suave.DataId[] memory dataRecords,\\n string memory namespace\\n ) public virtual override returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n (Suave.DataRecord memory blockDataRecord, bytes memory builderBid) =\\n this.doBuild(blockArgs, blockHeight, dataRecords, namespace);\\n Suave.submitEthBlockBidToRelay(boostRelayUrl, builderBid);\\n\\n emit DataRecordEvent(blockDataRecord.id, blockDataRecord.decryptionCondition, blockDataRecord.allowedPeekers);\\n return bytes.concat(this.emitDataRecord.selector, abi.encode(blockDataRecord));\\n }\\n}\\n\",\"keccak256\":\"0x7d8b6ebf763b86b5c7404d41d5ba39d19db206418782be279018354de23965fc\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200893138038062008931833981810160405281019062000037919062000262565b806040516200004690620000b7565b62000052919062000310565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000334565b6143d9806200455883390190565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200012e82620000e3565b810181811067ffffffffffffffff8211171562000150576200014f620000f4565b5b80604052505050565b600062000165620000c5565b905062000173828262000123565b919050565b600067ffffffffffffffff821115620001965762000195620000f4565b5b620001a182620000e3565b9050602081019050919050565b60005b83811015620001ce578082015181840152602081019050620001b1565b83811115620001de576000848401525b50505050565b6000620001fb620001f58462000178565b62000159565b9050828152602081018484840111156200021a5762000219620000de565b5b62000227848285620001ae565b509392505050565b600082601f830112620002475762000246620000d9565b5b815162000259848260208601620001e4565b91505092915050565b6000602082840312156200027b576200027a620000cf565b5b600082015167ffffffffffffffff8111156200029c576200029b620000d4565b5b620002aa848285016200022f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000620002dc82620002b3565b620002e88185620002be565b9350620002fa818560208601620001ae565b6200030581620000e3565b840191505092915050565b600060208201905081810360008301526200032c8184620002cf565b905092915050565b61421480620003446000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063bb7bae0a1161008c578063ee2cc36411610066578063ee2cc36414610203578063fd38f21d1461021f578063ff4aec7d1461024f578063ffbbfcb01461026d576100cf565b8063bb7bae0a146101ad578063bcbb3597146101c9578063d7e84fbf146101e5576100cf565b806332821faa146100d4578063392e53cd1461010457806361b8ce8c1461012257806364e65a62146101405780637e48532c1461015c57806381d12c581461017a575b600080fd5b6100ee60048036038101906100e991906126a4565b61028b565b6040516100fb9190612788565b60405180910390f35b61010c61050b565b60405161011991906127b9565b60405180910390f35b61012a61051b565b60405161013791906127ed565b60405180910390f35b61015a6004803603810190610155919061282c565b610521565b005b6101646105ee565b6040516101719190612788565b60405180910390f35b610194600480360381019061018f9190612913565b610643565b6040516101a494939291906129e2565b60405180910390f35b6101c760048036038101906101c29190612a5a565b61070b565b005b6101e360048036038101906101de9190612ab9565b610777565b005b6101ed6107ee565b6040516101fa9190612b61565b60405180910390f35b61021d60048036038101906102189190612b9b565b610814565b005b61023960048036038101906102349190612c98565b61092c565b6040516102469190612788565b60405180910390f35b610257610b35565b6040516102649190612788565b60405180910390f35b610275610b6e565b60405161028291906127ed565b60405180910390f35b60606102d3610298610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61031a6000600480549050116040518060400160405280600b81526020017f4e6f207265717565737473000000000000000000000000000000000000000000815250610c43565b6000806103308467ffffffffffffffff16610c89565b915091506103846000836040015167ffffffffffffffff16116040518060400160405280600f81526020017f4e6f2076616c6964206f66666572730000000000000000000000000000000000815250610c43565b61038e8483610ed3565b81602001518561010001819052506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663088243fb87876040518363ffffffff1660e01b81526004016103fb929190612f75565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104529190613015565b90506364e65a6260e01b818460000151856040015160405160200161047892919061305e565b6040516020818303038152906040528461049061112e565b6040516024016104a394939291906130b6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505092915050565b60008060001b6001541415905090565b60055481565b8061056d6105328260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b60008351111561058957610588610583846111a4565b6111b6565b5b60006105b7600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611377565b90506105c38582611445565b508060200135600181905550600260008154809291906105e29061313f565b91905055505050505050565b60606106366105fb610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61063e6114a0565b905090565b6004818154811061065357600080fd5b906000526020600020906004020160009150905080600001549080600101805461067c906131b7565b80601f01602080910402602001604051908101604052809291908181526020018280546106a8906131b7565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050908060020154908060030154905084565b61075261071661050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b81600181905550806000816fffffffffffffffffffffffffffffffff19169055505050565b7ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4781600001356fffffffffffffffffffffffffffffffff19168260400160208101906107c391906131e9565b8380606001906107d39190613225565b6040516107e3949392919061333c565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806108606108258260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b6004839080600181540180825580915050600190039060005260206000209060040201600090919091909150818161089891906137bf565b5050600560008154809291906108ad9061313f565b919050555082600001357fbf51327c63fb3c8741d4233ae0315e3e1a74641532f4e59c307f72314a3462358480602001906108e89190613430565b86604001356040516108fc939291906137fa565b60405180910390a28060200135600181905550600260008154809291906109229061313f565b9190505550505050565b6060610974610939610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b60003073ffffffffffffffffffffffffffffffffffffffff1663ff4aec7d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109fb9190613015565b90506000610a0a8260016115eb565b915050610a5960008267ffffffffffffffff16116040518060400160405280600b81526020017f65677020746f6f206c6f77000000000000000000000000000000000000000000815250610c43565b6000610a64836116c6565b90506000604051806080016040528060055481526020018781526020018867ffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff1916815250905063ee2cc36460e01b81610abb61112e565b604051602401610acc9291906138f7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505094505050505092915050565b6060610b3f610b7b565b610b4857600080fd5b6000610b526117fc565b905080806020019051810190610b689190613015565b91505090565b6000600480549050905090565b6000806000634201000073ffffffffffffffffffffffffffffffffffffffff16604051610ba790613958565b600060405180830381855afa9150503d8060008114610be2576040519150601f19603f3d011682016040523d82523d6000602084013e610be7565b606091505b509150915081610c34576342010000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401610c2b92919061397c565b60405180910390fd5b80516020820151935050505090565b81610c8557806040517f0c25cd98000000000000000000000000000000000000000000000000000000008152600401610c7c91906139ac565b60405180910390fd5b5050565b610c91612008565b606060005b600480549050811015610ecd57600060048281548110610cb957610cb86139ce565b5b906000526020600020906004020160405180608001604052908160008201548152602001600182018054610cec906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d18906131b7565b8015610d655780601f10610d3a57610100808354040283529160200191610d65565b820191906000526020600020905b815481529060010190602001808311610d4857829003601f168201915b505050505081526020016002820154815260200160038201546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff19168152505090508481604001511015610dd157610dc982846118d390919063ffffffff16565b925050610ebc565b6000610e1682606001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c650000000000000000815250611907565b9050600080610e268360006115eb565b91509150811580610e41575060008167ffffffffffffffff16145b15610e6057610e5985876118d390919063ffffffff16565b9550610eb7565b866040015167ffffffffffffffff168167ffffffffffffffff161115610eb657604051806080016040528085600001518152602001856020015181526020018267ffffffffffffffff1681526020018481525096505b5b505050505b80610ec69061313f565b9050610c96565b50915091565b6000600367ffffffffffffffff811115610ef057610eef6121d4565b5b604051908082528060200260200182016040528015610f1e5781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110610f5857610f576139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634210000181600181518110610fab57610faa6139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600281518110610ffa57610ff96139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006110778483846040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152506119ee565b90506110c181600001516040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152508560600151611af4565b61112881600001516040518060400160405280601e81526020017f64656661756c743a76303a65746842756e646c6553696d526573756c74730000815250856040015160405160200161111491906139fd565b604051602081830303815290604052611af4565b50505050565b61113661203a565b604051806040016040528061114c600254611bd7565b815260200161116860016002546111639190613a18565b611bf1565b815250905090565b6000600154826040516020016111869190613a7d565b60405160208183030381529060405280519060200120149050919050565b60606111af82611c29565b9050919050565b6000815190505b6000811115611373576000826001836111d69190613a98565b815181106111e7576111e66139ce565b5b60200260200101519050600060048281548110611207576112066139ce565b5b9060005260206000209060040201600001549050600160048054905061122d9190613a98565b8210156112e057600460016004805490506112489190613a98565b81548110611259576112586139ce565b5b90600052602060002090600402016004838154811061127b5761127a6139ce565b5b90600052602060002090600402016000820154816000015560018201816001019080546112a7906131b7565b6112b292919061205a565b5060028201548160020155600382015481600301906fffffffffffffffffffffffffffffffff191690559050505b60048054806112f2576112f1613acc565b5b600190038181906000526020600020906004020160008082016000905560018201600061131f91906120e7565b6002820160009055600382016000905550509055807f5fa4d8243d9549d33d615899224efcef51bfcacb970a31f68862ce74c858dbf060405160405180910390a250508061136c90613afb565b90506111bd565b5050565b60606000808473ffffffffffffffffffffffffffffffffffffffff16846040516113a19190613b56565b6000604051808303816000865af19150503d80600081146113de576040519150601f19603f3d011682016040523d82523d6000602084013e6113e3565b606091505b5091509150611427826040518060400160405280601481526020017f45787465726e616c2063616c6c206661696c6564000000000000000000000000815250610c43565b8080602001905181019061143b9190613bdd565b9250505092915050565b6000808380602001905181019061145c9190613c50565b91509150817f91badfc611f9ad79e4d6a58176e5c4cedc4f8ed9001447825f503e792bbf09e28285604051611492929190613c90565b60405180910390a250505050565b60606114e86114ad610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61152f6114f361050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b60006115396117fc565b9050600061154682611cf4565b90506000611569838060200190518101906115619190613cd5565b600254611ed0565b905063bb7bae0a60e01b8183604051602401611586929190613d02565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505090565b600080600080634210000073ffffffffffffffffffffffffffffffffffffffff16614e20876040516020016116209190612788565b60405160208183030381529060405260405161163c9190613b56565b6000604051808303818686fa925050503d8060008114611678576040519150601f19603f3d011682016040523d82523d6000602084013e61167d565b606091505b509150915061169585158061168f5750825b82610c43565b81156116bc576001818060200190518101906116b19190613d2b565b9350935050506116bf565b50505b9250929050565b600080600167ffffffffffffffff8111156116e4576116e36121d4565b5b6040519080825280602002602001820160405280156117125781602001602082028036833780820191505090505b509050308160008151811061172a576117296139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006117a8600083846040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c6500000000000000008152506119ee565b90506117ee81600001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c65000000000000000081525086611af4565b806000015192505050919050565b6060600080634201000173ffffffffffffffffffffffffffffffffffffffff1660405160200160405160208183030381529060405260405161183e9190613b56565b600060405180830381855afa9150503d8060008114611879576040519150601f19603f3d011682016040523d82523d6000602084013e61187e565b606091505b5091509150816118cb576342010001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016118c292919061397c565b60405180910390fd5b809250505090565b6060826118df83611f0a565b6040516020016118f0929190613d58565b604051602081830303815290604052905092915050565b6060600080634202000173ffffffffffffffffffffffffffffffffffffffff16858560405160200161193a929190613d7c565b6040516020818303038152906040526040516119569190613b56565b600060405180830381855afa9150503d8060008114611991576040519150601f19603f3d011682016040523d82523d6000602084013e611996565b606091505b5091509150816119e3576342020001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016119da92919061397c565b60405180910390fd5b809250505092915050565b6119f6612127565b600080634203000073ffffffffffffffffffffffffffffffffffffffff1687878787604051602001611a2b9493929190613e32565b604051602081830303815290604052604051611a479190613b56565b600060405180830381855afa9150503d8060008114611a82576040519150601f19603f3d011682016040523d82523d6000602084013e611a87565b606091505b509150915081611ad4576342030000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611acb92919061397c565b60405180910390fd5b80806020019051810190611ae8919061406d565b92505050949350505050565b600080634202000073ffffffffffffffffffffffffffffffffffffffff16858585604051602001611b27939291906140b6565b604051602081830303815290604052604051611b439190613b56565b600060405180830381855afa9150503d8060008114611b7e576040519150601f19603f3d011682016040523d82523d6000602084013e611b83565b606091505b509150915081611bd0576342020000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611bc792919061397c565b60405180910390fd5b5050505050565b6000611bea611be4611f67565b83611fc7565b9050919050565b6000611bfc82611bd7565b604051602001611c0c9190613a7d565b604051602081830303815290604052805190602001209050919050565b606060208251611c39919061412a565b67ffffffffffffffff811115611c5257611c516121d4565b5b604051908082528060200260200182016040528015611c805781602001602082028036833780820191505090505b50905060005b60208351611c94919061412a565b811015611cee57611cbc8360208084611cad919061415b565b611cb79190613a18565b611ffa565b828281518110611ccf57611cce6139ce565b5b6020026020010181815250508080611ce69061313f565b915050611c86565b50919050565b600080600367ffffffffffffffff811115611d1257611d116121d4565b5b604051908082528060200260200182016040528015611d405781602001602082028036833780820191505090505b5090503081600081518110611d5857611d576139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634203000181600181518110611dab57611daa6139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634202000181600281518110611dfe57611dfd6139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000611e7c600083846040518060400160405280601181526020017f626c6f636b61643a76303a7365637265740000000000000000000000000000008152506119ee565b9050611ec281600001516040518060400160405280601181526020017f626c6f636b61643a76303a73656372657400000000000000000000000000000081525086611af4565b806000015192505050919050565b6000611edc8383611fc7565b604051602001611eec9190613a7d565b60405160208183030381529060405280519060200120905092915050565b6060602067ffffffffffffffff811115611f2757611f266121d4565b5b6040519080825280601f01601f191660200182016040528015611f595781602001600182028036833780820191505090505b509050816020820152919050565b600080611fab6000546040518060400160405280601181526020017f626c6f636b61643a76303a736563726574000000000000000000000000000000815250611907565b905080806020019051810190611fc19190613cd5565b91505090565b60008282604051602001611fdc9291906141b5565b60405160208183030381529060405280519060200120905092915050565b600081830151905092915050565b60405180608001604052806000815260200160608152602001600067ffffffffffffffff168152602001606081525090565b604051806040016040528060008019168152602001600080191681525090565b828054612066906131b7565b90600052602060002090601f01602090048101928261208857600085556120d6565b82601f1061209957805485556120d6565b828001600101855582156120d657600052602060002091601f016020900482015b828111156120d55782548255916001019190600101906120ba565b5b5090506120e3919061218d565b5090565b5080546120f3906131b7565b6000825580601f106121055750612124565b601f016020900490600052602060002090810190612123919061218d565b5b50565b6040518060c0016040528060006fffffffffffffffffffffffffffffffff1916815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b5b808211156121a657600081600090555060010161218e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61220c826121c3565b810181811067ffffffffffffffff8211171561222b5761222a6121d4565b5b80604052505050565b600061223e6121aa565b905061224a8282612203565b919050565b600080fd5b600067ffffffffffffffff82169050919050565b61227181612254565b811461227c57600080fd5b50565b60008135905061228e81612268565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156122b9576122b86121d4565b5b6122c2826121c3565b9050602081019050919050565b82818337600083830152505050565b60006122f16122ec8461229e565b612234565b90508281526020810184848401111561230d5761230c612299565b5b6123188482856122cf565b509392505050565b600082601f83011261233557612334612294565b5b81356123458482602086016122de565b91505092915050565b6000819050919050565b6123618161234e565b811461236c57600080fd5b50565b60008135905061237e81612358565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123af82612384565b9050919050565b6123bf816123a4565b81146123ca57600080fd5b50565b6000813590506123dc816123b6565b92915050565b600067ffffffffffffffff8211156123fd576123fc6121d4565b5b602082029050602081019050919050565b600080fd5b600060808284031215612429576124286121be565b5b6124336080612234565b905060006124438482850161227f565b60008301525060206124578482850161227f565b602083015250604061246b848285016123cd565b604083015250606061247f8482850161227f565b60608301525092915050565b600061249e612499846123e2565b612234565b905080838252602082019050608084028301858111156124c1576124c061240e565b5b835b818110156124ea57806124d68882612413565b8452602084019350506080810190506124c3565b5050509392505050565b600082601f83011261250957612508612294565b5b813561251984826020860161248b565b91505092915050565b60008115159050919050565b61253781612522565b811461254257600080fd5b50565b6000813590506125548161252e565b92915050565b60006101408284031215612571576125706121be565b5b61257c610140612234565b9050600061258c8482850161227f565b600083015250602082013567ffffffffffffffff8111156125b0576125af61224f565b5b6125bc84828501612320565b60208301525060406125d08482850161236f565b60408301525060606125e48482850161227f565b60608301525060806125f8848285016123cd565b60808301525060a061260c8482850161227f565b60a08301525060c06126208482850161236f565b60c08301525060e082013567ffffffffffffffff8111156126445761264361224f565b5b612650848285016124f4565b60e08301525061010082013567ffffffffffffffff8111156126755761267461224f565b5b61268184828501612320565b6101008301525061012061269784828501612545565b6101208301525092915050565b600080604083850312156126bb576126ba6121b4565b5b600083013567ffffffffffffffff8111156126d9576126d86121b9565b5b6126e58582860161255a565b92505060206126f68582860161227f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561273a57808201518184015260208101905061271f565b83811115612749576000848401525b50505050565b600061275a82612700565b612764818561270b565b935061277481856020860161271c565b61277d816121c3565b840191505092915050565b600060208201905081810360008301526127a2818461274f565b905092915050565b6127b381612522565b82525050565b60006020820190506127ce60008301846127aa565b92915050565b6000819050919050565b6127e7816127d4565b82525050565b600060208201905061280260008301846127de565b92915050565b600080fd5b60006040828403121561282357612822612808565b5b81905092915050565b60008060008060a08587031215612846576128456121b4565b5b600085013567ffffffffffffffff811115612864576128636121b9565b5b61287087828801612320565b945050602085013567ffffffffffffffff811115612891576128906121b9565b5b61289d87828801612320565b935050604085013567ffffffffffffffff8111156128be576128bd6121b9565b5b6128ca87828801612320565b92505060606128db8782880161280d565b91505092959194509250565b6128f0816127d4565b81146128fb57600080fd5b50565b60008135905061290d816128e7565b92915050565b600060208284031215612929576129286121b4565b5b6000612937848285016128fe565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061296782612940565b612971818561294b565b935061298181856020860161271c565b61298a816121c3565b840191505092915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006129cc82612995565b9050919050565b6129dc816129c1565b82525050565b60006080820190506129f760008301876127de565b8181036020830152612a09818661295c565b9050612a1860408301856127de565b612a2560608301846129d3565b95945050505050565b612a3781612995565b8114612a4257600080fd5b50565b600081359050612a5481612a2e565b92915050565b60008060408385031215612a7157612a706121b4565b5b6000612a7f8582860161236f565b9250506020612a9085828601612a45565b9150509250929050565b600060c08284031215612ab057612aaf612808565b5b81905092915050565b600060208284031215612acf57612ace6121b4565b5b600082013567ffffffffffffffff811115612aed57612aec6121b9565b5b612af984828501612a9a565b91505092915050565b6000819050919050565b6000612b27612b22612b1d84612384565b612b02565b612384565b9050919050565b6000612b3982612b0c565b9050919050565b6000612b4b82612b2e565b9050919050565b612b5b81612b40565b82525050565b6000602082019050612b766000830184612b52565b92915050565b600060808284031215612b9257612b91612808565b5b81905092915050565b60008060608385031215612bb257612bb16121b4565b5b600083013567ffffffffffffffff811115612bd057612bcf6121b9565b5b612bdc85828601612b7c565b9250506020612bed8582860161280d565b9150509250929050565b600067ffffffffffffffff821115612c1257612c116121d4565b5b612c1b826121c3565b9050602081019050919050565b6000612c3b612c3684612bf7565b612234565b905082815260208101848484011115612c5757612c56612299565b5b612c628482856122cf565b509392505050565b600082601f830112612c7f57612c7e612294565b5b8135612c8f848260208601612c28565b91505092915050565b60008060408385031215612caf57612cae6121b4565b5b6000612cbd8582860161227f565b925050602083013567ffffffffffffffff811115612cde57612cdd6121b9565b5b612cea85828601612c6a565b9150509250929050565b612cfd81612254565b82525050565b600082825260208201905092915050565b6000612d1f82612700565b612d298185612d03565b9350612d3981856020860161271c565b612d42816121c3565b840191505092915050565b612d568161234e565b82525050565b612d65816123a4565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612dad6000850182612cf4565b506020820151612dc06020850182612cf4565b506040820151612dd36040850182612d5c565b506060820151612de66060850182612cf4565b50505050565b6000612df88383612d97565b60808301905092915050565b6000602082019050919050565b6000612e1c82612d6b565b612e268185612d76565b9350612e3183612d87565b8060005b83811015612e62578151612e498882612dec565b9750612e5483612e04565b925050600181019050612e35565b5085935050505092915050565b612e7881612522565b82525050565b600061014083016000830151612e976000860182612cf4565b5060208301518482036020860152612eaf8282612d14565b9150506040830151612ec46040860182612d4d565b506060830151612ed76060860182612cf4565b506080830151612eea6080860182612d5c565b5060a0830151612efd60a0860182612cf4565b5060c0830151612f1060c0860182612d4d565b5060e083015184820360e0860152612f288282612e11565b915050610100830151848203610100860152612f448282612d14565b915050610120830151612f5b610120860182612e6f565b508091505092915050565b612f6f81612254565b82525050565b60006040820190508181036000830152612f8f8185612e7e565b9050612f9e6020830184612f66565b9392505050565b6000612fb8612fb38461229e565b612234565b905082815260208101848484011115612fd457612fd3612299565b5b612fdf84828561271c565b509392505050565b600082601f830112612ffc57612ffb612294565b5b815161300c848260208601612fa5565b91505092915050565b60006020828403121561302b5761302a6121b4565b5b600082015167ffffffffffffffff811115613049576130486121b9565b5b61305584828501612fe7565b91505092915050565b600060408201905061307360008301856127de565b6130806020830184612f66565b9392505050565b60408201600082015161309d6000850182612d4d565b5060208201516130b06020850182612d4d565b50505050565b600060a08201905081810360008301526130d0818761274f565b905081810360208301526130e4818661274f565b905081810360408301526130f8818561274f565b90506131076060830184613087565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061314a826127d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561317d5761317c613110565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131cf57607f821691505b602082108114156131e3576131e2613188565b5b50919050565b6000602082840312156131ff576131fe6121b4565b5b600061320d8482850161227f565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261324257613241613216565b5b80840192508235915067ffffffffffffffff8211156132645761326361321b565b5b6020830192506020820236038313156132805761327f613220565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b60006132af8383612d5c565b60208301905092915050565b60006132ca60208401846123cd565b905092915050565b6000602082019050919050565b60006132eb8385613288565b93506132f682613299565b8060005b8581101561332f5761330c82846132bb565b61331688826132a3565b9750613321836132d2565b9250506001810190506132fa565b5085925050509392505050565b600060608201905061335160008301876129d3565b61335e6020830186612f66565b81810360408301526133718184866132df565b905095945050505050565b60008135613389816128e7565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6133cb84613392565b9350801983169250808416831791505092915050565b60006133fc6133f76133f2846127d4565b612b02565b6127d4565b9050919050565b6000819050919050565b613416826133e1565b61342961342282613403565b835461339f565b8255505050565b6000808335600160200384360303811261344d5761344c613216565b5b80840192508235915067ffffffffffffffff82111561346f5761346e61321b565b5b60208301925060018202360383131561348b5761348a613220565b5b509250929050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134c3565b61350a86836134c3565b95508019841693508086168417925050509392505050565b61352b836133e1565b61353f61353782613403565b8484546134d0565b825550505050565b600090565b613554613547565b61355f818484613522565b505050565b5b818110156135835761357860008261354c565b600181019050613565565b5050565b601f8211156135c8576135998161349e565b6135a2846134b3565b810160208510156135b1578190505b6135c56135bd856134b3565b830182613564565b50505b505050565b600082821c905092915050565b60006135eb600019846008026135cd565b1980831691505092915050565b600061360483836135da565b9150826002028217905092915050565b61361e8383613493565b67ffffffffffffffff811115613637576136366121d4565b5b61364182546131b7565b61364c828285613587565b6000601f83116001811461367b5760008415613669578287013590505b61367385826135f8565b8655506136db565b601f1984166136898661349e565b60005b828110156136b15784890135825560018201915060208501945060208101905061368c565b868310156136ce57848901356136ca601f8916826135da565b8355505b6001600288020188555050505b50505050505050565b6136ef838383613614565b505050565b6000813561370181612a2e565b80915050919050565b6000819050919050565b61371d826129c1565b6137306137298261370a565b835461339f565b8255505050565b6000810160008301806137498161337c565b9050613755818461340d565b505050600181016020830161376a8185613430565b6137758183866136e4565b5050505060028101604083018061378b8161337c565b9050613797818461340d565b5050506003810160608301806137ac816136f4565b90506137b88184613714565b5050505050565b6137c98282613737565b5050565b60006137d9838561294b565b93506137e68385846122cf565b6137ef836121c3565b840190509392505050565b600060408201905081810360008301526138158185876137cd565b905061382460208301846127de565b949350505050565b613835816127d4565b82525050565b600082825260208201905092915050565b600061385782612940565b613861818561383b565b935061387181856020860161271c565b61387a816121c3565b840191505092915050565b61388e816129c1565b82525050565b60006080830160008301516138ac600086018261382c565b50602083015184820360208601526138c4828261384c565b91505060408301516138d9604086018261382c565b5060608301516138ec6060860182613885565b508091505092915050565b600060608201905081810360008301526139118185613894565b90506139206020830184613087565b9392505050565b600081905092915050565b50565b6000613942600083613927565b915061394d82613932565b600082019050919050565b600061396382613935565b9150819050919050565b613976816123a4565b82525050565b6000604082019050613991600083018561396d565b81810360208301526139a3818461274f565b90509392505050565b600060208201905081810360008301526139c6818461295c565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082019050613a126000830184612f66565b92915050565b6000613a23826127d4565b9150613a2e836127d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a6357613a62613110565b5b828201905092915050565b613a778161234e565b82525050565b6000602082019050613a926000830184613a6e565b92915050565b6000613aa3826127d4565b9150613aae836127d4565b925082821015613ac157613ac0613110565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613b06826127d4565b91506000821415613b1a57613b19613110565b5b600182039050919050565b6000613b3082612700565b613b3a8185613927565b9350613b4a81856020860161271c565b80840191505092915050565b6000613b628284613b25565b915081905092915050565b6000613b80613b7b84612bf7565b612234565b905082815260208101848484011115613b9c57613b9b612299565b5b613ba784828561271c565b509392505050565b600082601f830112613bc457613bc3612294565b5b8151613bd4848260208601613b6d565b91505092915050565b600060208284031215613bf357613bf26121b4565b5b600082015167ffffffffffffffff811115613c1157613c106121b9565b5b613c1d84828501613baf565b91505092915050565b600081519050613c35816128e7565b92915050565b600081519050613c4a81612268565b92915050565b60008060408385031215613c6757613c666121b4565b5b6000613c7585828601613c26565b9250506020613c8685828601613c3b565b9150509250929050565b6000604082019050613ca56000830185612f66565b8181036020830152613cb7818461295c565b90509392505050565b600081519050613ccf81612358565b92915050565b600060208284031215613ceb57613cea6121b4565b5b6000613cf984828501613cc0565b91505092915050565b6000604082019050613d176000830185613a6e565b613d2460208301846129d3565b9392505050565b600060208284031215613d4157613d406121b4565b5b6000613d4f84828501613c3b565b91505092915050565b6000613d648285613b25565b9150613d708284613b25565b91508190509392505050565b6000604082019050613d9160008301856129d3565b8181036020830152613da3818461295c565b90509392505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000613ddf82613dac565b613de98185613288565b9350613df483613db7565b8060005b83811015613e25578151613e0c88826132a3565b9750613e1783613dc7565b925050600181019050613df8565b5085935050505092915050565b6000608082019050613e476000830187612f66565b8181036020830152613e598186613dd4565b90508181036040830152613e6d8185613dd4565b90508181036060830152613e81818461295c565b905095945050505050565b600081519050613e9b81612a2e565b92915050565b600067ffffffffffffffff821115613ebc57613ebb6121d4565b5b602082029050602081019050919050565b600081519050613edc816123b6565b92915050565b6000613ef5613ef084613ea1565b612234565b90508083825260208201905060208402830185811115613f1857613f1761240e565b5b835b81811015613f415780613f2d8882613ecd565b845260208401935050602081019050613f1a565b5050509392505050565b600082601f830112613f6057613f5f612294565b5b8151613f70848260208601613ee2565b91505092915050565b600060c08284031215613f8f57613f8e6121be565b5b613f9960c0612234565b90506000613fa984828501613e8c565b6000830152506020613fbd84828501613e8c565b6020830152506040613fd184828501613c3b565b604083015250606082015167ffffffffffffffff811115613ff557613ff461224f565b5b61400184828501613f4b565b606083015250608082015167ffffffffffffffff8111156140255761402461224f565b5b61403184828501613f4b565b60808301525060a082015167ffffffffffffffff8111156140555761405461224f565b5b61406184828501613baf565b60a08301525092915050565b600060208284031215614083576140826121b4565b5b600082015167ffffffffffffffff8111156140a1576140a06121b9565b5b6140ad84828501613f79565b91505092915050565b60006060820190506140cb60008301866129d3565b81810360208301526140dd818561295c565b905081810360408301526140f1818461274f565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614135826127d4565b9150614140836127d4565b9250826141505761414f6140fb565b5b828204905092915050565b6000614166826127d4565b9150614171836127d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141aa576141a9613110565b5b828202905092915050565b60006040820190506141ca6000830185613a6e565b6141d760208301846127de565b939250505056fea2646970667358221220dd0921e9f09665e92a2edcd352d2fd7e77bb0a715530e88b4aa8d6386069179164736f6c6343000808003360806040523480156200001157600080fd5b50604051620043d9380380620043d98339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b50506200035a565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b60208210811415620003545762000353620002f5565b5b50919050565b61406f806200036a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063cf5c941311610071578063cf5c9413146101c6578063e3ec1029146101f7578063e48c31e014610227578063e829cd5d14610257578063f72b8d2914610287578063ff4aec7d146102b7576100b4565b8063088243fb146100b95780636a9cc4b3146100e957806373e9710f146101195780637df1cde214610149578063b33e471514610179578063bcbb3597146101aa575b600080fd5b6100d360048036038101906100ce91906123c5565b6102d5565b6040516100e091906124a9565b60405180910390f35b61010360048036038101906100fe9190612501565b6106ff565b60405161011091906125b2565b60405180910390f35b610133600480360381019061012e91906125d4565b6107a1565b60405161014091906124a9565b60405180910390f35b610163600480360381019061015e9190612659565b610894565b60405161017091906124a9565b60405180910390f35b610193600480360381019061018e919061290d565b6108f4565b6040516101a1929190612b54565b60405180910390f35b6101c460048036038101906101bf9190612baf565b61098f565b005b6101e060048036038101906101db9190612cbb565b610a06565b6040516101ee929190612b54565b60405180910390f35b610211600480360381019061020c9190612cbb565b610c15565b60405161021e91906124a9565b60405180910390f35b610241600480360381019061023c9190612d76565b610db7565b60405161024e91906125b2565b60405180910390f35b610271600480360381019061026c9190612dd2565b610df9565b60405161027e9190612e21565b60405180910390f35b6102a1600480360381019061029c91906123c5565b610f00565b6040516102ae91906124a9565b60405180910390f35b6102bf61154d565b6040516102cc91906124a9565b60405180910390f35b60606102df611586565b6102e857600080fd5b6000610329836040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c6573000000000000000000000081525061164e565b905060008151141561037257306040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016103699190612e97565b60405180910390fd5b6000815167ffffffffffffffff81111561038f5761038e611ef5565b5b6040519080825280602002602001820160405280156103c857816020015b6103b5611e2e565b8152602001906001900390816103ad5790505b50905060005b82518110156104d35760006104368483815181106103ef576103ee612ec5565b5b6020026020010151600001516040518060400160405280601e81526020017f64656661756c743a76303a65746842756e646c6553696d526573756c74730000815250611748565b905060008180602001905181019061044e9190612f09565b905060405180604001604052808267ffffffffffffffff16815260200186858151811061047e5761047d612ec5565b5b6020026020010151600001516fffffffffffffffffffffffffffffffff19168152508484815181106104b3576104b2612ec5565b5b6020026020010181905250505080806104cb90612f65565b9150506103ce565b5060008151905060005b6001826104ea9190612fae565b8110156106035760006001826105009190612fe2565b90505b828110156105ef5783818151811061051e5761051d612ec5565b5b60200260200101516000015167ffffffffffffffff1684838151811061054757610546612ec5565b5b60200260200101516000015167ffffffffffffffff1610156105dc57600084838151811061057857610577612ec5565b5b6020026020010151905084828151811061059557610594612ec5565b5b60200260200101518584815181106105b0576105af612ec5565b5b6020026020010181905250808583815181106105cf576105ce612ec5565b5b6020026020010181905250505b80806105e790612f65565b915050610503565b5080806105fb90612f65565b9150506104dd565b506000835167ffffffffffffffff81111561062157610620611ef5565b5b60405190808252806020026020018201604052801561064f5781602001602082028036833780820191505090505b50905060005b83518110156106d75783818151811061067157610670612ec5565b5b6020026020010151602001518282815181106106905761068f612ec5565b5b60200260200101906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505080806106cf90612f65565b915050610655565b506106f387878360405180602001604052806000815250610c15565b94505050505092915050565b606060006040905060006107128461182f565b607961071e9190612fe2565b905060008267ffffffffffffffff81111561073c5761073b611ef5565b5b6040519080825280601f01601f19166020018201604052801561076e5781602001600182028036833780820191505090505b50905060205b602084018110156107945780830187015181830152602081019050610774565b5080935050505092915050565b60606107e96107ae611586565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250611869565b60006107f36118af565b90506107fe81611986565b600061080a82856106ff565b905063e48c31e060e01b81838051906020012060405160240161082e929190613047565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505092505050919050565b606061089e611586565b6108a757600080fd5b60006108e8846040518060400160405280601981526020017f64656661756c743a76303a6275696c6465725061796c6f616400000000000000815250611748565b90508091505092915050565b6108fc611e65565b60607f67fa9c16cd72410c4cc1d47205b31852a81ec5e92d1c8cebc3ecbe98ed67fe3f846000015184604051610933929190613086565b60405180910390a17ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4784600001518560400151866060015160405161097a93929190613134565b60405180910390a18383915091509250929050565b7ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4781600001356fffffffffffffffffffffffffffffffff19168260400160208101906109db9190613172565b8380606001906109eb91906131ae565b6040516109fb949392919061329c565b60405180910390a150565b610a0e611e65565b60606000600267ffffffffffffffff811115610a2d57610a2c611ef5565b5b604051908082528060200260200182016040528015610a5b5781602001602082028036833780820191505090505b5090503081600081518110610a7357610a72612ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634210000181600181518110610ac657610ac5612ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000610b438783846040518060400160405280601c81526020017f64656661756c743a76303a6d6572676564446174615265636f72647300000000815250611a62565b9050610ba881600001516040518060400160405280601c81526020017f64656661756c743a76303a6d6572676564446174615265636f7264730000000081525088604051602001610b94919061338b565b604051602081830303815290604052611b68565b600080610bba8a846000015189611c4b565b91509150610c0283600001516040518060400160405280601981526020017f64656661756c743a76303a6275696c6465725061796c6f61640000000000000081525083611b68565b8282955095505050505094509492505050565b6060610c5d610c22611586565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250611869565b6000803073ffffffffffffffffffffffffffffffffffffffff1663cf5c9413888888886040518563ffffffff1660e01b8152600401610c9f9493929190613601565b60006040518083038186803b158015610cb757600080fd5b505afa158015610ccb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cf491906138f0565b91509150610d06826000015182611d4c565b610d0f81611986565b6000610d2982896000015167ffffffffffffffff166106ff565b905063e48c31e060e01b818380519060200120604051602401610d4d929190613047565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509350505050949350505050565b60607f53e8ee078f2cd7d535018fdc18210ac92e4b70ee40542d1a43816dba5faae16982604051610de89190613968565b60405180910390a182905092915050565b60008083604051602001610e0d91906139a4565b6040516020818303038152906040529050600083604051602001610e3191906139a4565b604051602081830303815290604052905060005b8251811015610ef257818181518110610e6157610e60612ec5565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916838281518110610ea157610ea0612ec5565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610edf5760009350505050610efa565b8080610eea90612f65565b915050610e45565b506001925050505b92915050565b6060610f0a611586565b610f1357600080fd5b6000610f54836040518060400160405280601c81526020017f6d657673686172653a76303a6d61746368446174615265636f7264730000000081525061164e565b90506000610f97846040518060400160405280601c81526020017f6d657673686172653a76303a756e6d61746368656442756e646c65730000000081525061164e565b9050600081511415610fe057306040517f75fff467000000000000000000000000000000000000000000000000000000008152600401610fd79190612e97565b60405180910390fd5b6000815167ffffffffffffffff811115610ffd57610ffc611ef5565b5b60405190808252806020026020018201604052801561103657816020015b611023611e65565b81526020019060019003908161101b5790505b50905060005b825181101561119757600083828151811061105a57611059612ec5565b5b6020026020010151905060005b85518110156111635760006110cf87838151811061108857611087612ec5565b5b6020026020010151600001516040518060400160405280601d81526020017f6d657673686172653a76303a6d6572676564446174615265636f726473000000815250611748565b8060200190518101906110e29190613a56565b9050611127816000815181106110fb576110fa612ec5565b5b602002602001015187868151811061111657611115612ec5565b5b602002602001015160000151610df9565b1561114f5786828151811061113f5761113e612ec5565b5b6020026020010151925050611163565b50808061115b90612f65565b915050611067565b508083838151811061117857611177612ec5565b5b602002602001018190525050808061118f90612f65565b91505061103c565b506000815167ffffffffffffffff8111156111b5576111b4611ef5565b5b6040519080825280602002602001820160405280156111ee57816020015b6111db611e2e565b8152602001906001900390816111d35790505b50905060005b82518110156112f957600061125c84838151811061121557611214612ec5565b5b6020026020010151600001516040518060400160405280601f81526020017f6d657673686172653a76303a65746842756e646c6553696d526573756c747300815250611748565b90506000818060200190518101906112749190612f09565b905060405180604001604052808267ffffffffffffffff1681526020018685815181106112a4576112a3612ec5565b5b6020026020010151600001516fffffffffffffffffffffffffffffffff19168152508484815181106112d9576112d8612ec5565b5b6020026020010181905250505080806112f190612f65565b9150506111f4565b5060008151905060005b6001826113109190612fae565b8110156114295760006001826113269190612fe2565b90505b828110156114155783818151811061134457611343612ec5565b5b60200260200101516000015167ffffffffffffffff1684838151811061136d5761136c612ec5565b5b60200260200101516000015167ffffffffffffffff16101561140257600084838151811061139e5761139d612ec5565b5b602002602001015190508482815181106113bb576113ba612ec5565b5b60200260200101518584815181106113d6576113d5612ec5565b5b6020026020010181905250808583815181106113f5576113f4612ec5565b5b6020026020010181905250505b808061140d90612f65565b915050611329565b50808061142190612f65565b915050611303565b506000835167ffffffffffffffff81111561144757611446611ef5565b5b6040519080825280602002602001820160405280156114755781602001602082028036833780820191505090505b50905060005b83518110156114fd5783818151811061149757611496612ec5565b5b6020026020010151602001518282815181106114b6576114b5612ec5565b5b60200260200101906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505080806114f590612f65565b91505061147b565b5061153f8989836040518060400160405280600b81526020017f6d657673686172653a7630000000000000000000000000000000000000000000815250610c15565b965050505050505092915050565b6060611557611586565b61156057600080fd5b600061156a6118af565b9050808060200190518101906115809190613a9f565b91505090565b6000806000634201000073ffffffffffffffffffffffffffffffffffffffff166040516115b290613b19565b600060405180830381855afa9150503d80600081146115ed576040519150601f19603f3d011682016040523d82523d6000602084013e6115f2565b606091505b50915091508161163f576342010000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611636929190613b2e565b60405180910390fd5b80516020820151935050505090565b6060600080634203000173ffffffffffffffffffffffffffffffffffffffff168585604051602001611681929190613b5e565b60405160208183030381529060405260405161169d9190613bbf565b600060405180830381855afa9150503d80600081146116d8576040519150601f19603f3d011682016040523d82523d6000602084013e6116dd565b606091505b50915091508161172a576342030001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611721929190613b2e565b60405180910390fd5b8080602001905181019061173e9190613cb7565b9250505092915050565b6060600080634202000173ffffffffffffffffffffffffffffffffffffffff16858560405160200161177b929190613d00565b6040516020818303038152906040526040516117979190613bbf565b600060405180830381855afa9150503d80600081146117d2576040519150601f19603f3d011682016040523d82523d6000602084013e6117d7565b606091505b509150915081611824576342020001816040517f75fff46700000000000000000000000000000000000000000000000000000000815260040161181b929190613b2e565b60405180910390fd5b809250505092915050565b6000600a5b600115611863576001820191508083106001811461185157611857565b50611863565b50600a81029050611834565b50919050565b816118ab57806040517f0c25cd980000000000000000000000000000000000000000000000000000000081526004016118a291906125b2565b60405180910390fd5b5050565b6060600080634201000173ffffffffffffffffffffffffffffffffffffffff166040516020016040516020818303038152906040526040516118f19190613bbf565b600060405180830381855afa9150503d806000811461192c576040519150601f19603f3d011682016040523d82523d6000602084013e611931565b606091505b50915091508161197e576342010001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611975929190613b2e565b60405180910390fd5b809250505090565b600080634210000273ffffffffffffffffffffffffffffffffffffffff166000846040516020016119b8929190613e26565b6040516020818303038152906040526040516119d49190613bbf565b600060405180830381855afa9150503d8060008114611a0f576040519150601f19603f3d011682016040523d82523d6000602084013e611a14565b606091505b509150915081611a5d5780836040517fda3e641f000000000000000000000000000000000000000000000000000000008152600401611a54929190613e5d565b60405180910390fd5b505050565b611a6a611e65565b600080634203000073ffffffffffffffffffffffffffffffffffffffff1687878787604051602001611a9f9493929190613e94565b604051602081830303815290604052604051611abb9190613bbf565b600060405180830381855afa9150503d8060008114611af6576040519150601f19603f3d011682016040523d82523d6000602084013e611afb565b606091505b509150915081611b48576342030000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611b3f929190613b2e565b60405180910390fd5b80806020019051810190611b5c9190613eee565b92505050949350505050565b600080634202000073ffffffffffffffffffffffffffffffffffffffff16858585604051602001611b9b93929190613f37565b604051602081830303815290604052604051611bb79190613bbf565b600060405180830381855afa9150503d8060008114611bf2576040519150601f19603f3d011682016040523d82523d6000602084013e611bf7565b606091505b509150915081611c44576342020000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611c3b929190613b2e565b60405180910390fd5b5050505050565b606080600080634210000173ffffffffffffffffffffffffffffffffffffffff16878787604051602001611c8193929190613f7c565b604051602081830303815290604052604051611c9d9190613bbf565b600060405180830381855afa9150503d8060008114611cd8576040519150601f19603f3d011682016040523d82523d6000602084013e611cdd565b606091505b509150915081611d2a576342100001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611d21929190613b2e565b60405180910390fd5b80806020019051810190611d3e9190613fc1565b935093505050935093915050565b6000600167ffffffffffffffff811115611d6957611d68611ef5565b5b604051908082528060200260200182016040528015611d975781602001602082028036833780820191505090505b5090503081600081518110611daf57611dae612ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611e29836040518060400160405280601581526020017f626c6f636b61643a76303a6275696c646572426964000000000000000000000081525084611b68565b505050565b6040518060400160405280600067ffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff191681525090565b6040518060c0016040528060006fffffffffffffffffffffffffffffffff1916815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611f2d82611ee4565b810181811067ffffffffffffffff82111715611f4c57611f4b611ef5565b5b80604052505050565b6000611f5f611ecb565b9050611f6b8282611f24565b919050565b600080fd5b600067ffffffffffffffff82169050919050565b611f9281611f75565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff821115611fda57611fd9611ef5565b5b611fe382611ee4565b9050602081019050919050565b82818337600083830152505050565b600061201261200d84611fbf565b611f55565b90508281526020810184848401111561202e5761202d611fba565b5b612039848285611ff0565b509392505050565b600082601f83011261205657612055611fb5565b5b8135612066848260208601611fff565b91505092915050565b6000819050919050565b6120828161206f565b811461208d57600080fd5b50565b60008135905061209f81612079565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120d0826120a5565b9050919050565b6120e0816120c5565b81146120eb57600080fd5b50565b6000813590506120fd816120d7565b92915050565b600067ffffffffffffffff82111561211e5761211d611ef5565b5b602082029050602081019050919050565b600080fd5b60006080828403121561214a57612149611edf565b5b6121546080611f55565b9050600061216484828501611fa0565b600083015250602061217884828501611fa0565b602083015250604061218c848285016120ee565b60408301525060606121a084828501611fa0565b60608301525092915050565b60006121bf6121ba84612103565b611f55565b905080838252602082019050608084028301858111156121e2576121e161212f565b5b835b8181101561220b57806121f78882612134565b8452602084019350506080810190506121e4565b5050509392505050565b600082601f83011261222a57612229611fb5565b5b813561223a8482602086016121ac565b91505092915050565b60008115159050919050565b61225881612243565b811461226357600080fd5b50565b6000813590506122758161224f565b92915050565b6000610140828403121561229257612291611edf565b5b61229d610140611f55565b905060006122ad84828501611fa0565b600083015250602082013567ffffffffffffffff8111156122d1576122d0611f70565b5b6122dd84828501612041565b60208301525060406122f184828501612090565b604083015250606061230584828501611fa0565b6060830152506080612319848285016120ee565b60808301525060a061232d84828501611fa0565b60a08301525060c061234184828501612090565b60c08301525060e082013567ffffffffffffffff81111561236557612364611f70565b5b61237184828501612215565b60e08301525061010082013567ffffffffffffffff81111561239657612395611f70565b5b6123a284828501612041565b610100830152506101206123b884828501612266565b6101208301525092915050565b600080604083850312156123dc576123db611ed5565b5b600083013567ffffffffffffffff8111156123fa576123f9611eda565b5b6124068582860161227b565b925050602061241785828601611fa0565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561245b578082015181840152602081019050612440565b8381111561246a576000848401525b50505050565b600061247b82612421565b612485818561242c565b935061249581856020860161243d565b61249e81611ee4565b840191505092915050565b600060208201905081810360008301526124c38184612470565b905092915050565b6000819050919050565b6124de816124cb565b81146124e957600080fd5b50565b6000813590506124fb816124d5565b92915050565b6000806040838503121561251857612517611ed5565b5b600083013567ffffffffffffffff81111561253657612535611eda565b5b61254285828601612041565b9250506020612553858286016124ec565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60006125848261255d565b61258e8185612568565b935061259e81856020860161243d565b6125a781611ee4565b840191505092915050565b600060208201905081810360008301526125cc8184612579565b905092915050565b6000602082840312156125ea576125e9611ed5565b5b60006125f8848285016124ec565b91505092915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b61263681612601565b811461264157600080fd5b50565b6000813590506126538161262d565b92915050565b600080604083850312156126705761266f611ed5565b5b600061267e85828601612644565b925050602083013567ffffffffffffffff81111561269f5761269e611eda565b5b6126ab85828601612041565b9150509250929050565b600067ffffffffffffffff8211156126d0576126cf611ef5565b5b602082029050602081019050919050565b60006126f46126ef846126b5565b611f55565b905080838252602082019050602084028301858111156127175761271661212f565b5b835b81811015612740578061272c88826120ee565b845260208401935050602081019050612719565b5050509392505050565b600082601f83011261275f5761275e611fb5565b5b813561276f8482602086016126e1565b91505092915050565b600067ffffffffffffffff82111561279357612792611ef5565b5b61279c82611ee4565b9050602081019050919050565b60006127bc6127b784612778565b611f55565b9050828152602081018484840111156127d8576127d7611fba565b5b6127e3848285611ff0565b509392505050565b600082601f830112612800576127ff611fb5565b5b81356128108482602086016127a9565b91505092915050565b600060c0828403121561282f5761282e611edf565b5b61283960c0611f55565b9050600061284984828501612644565b600083015250602061285d84828501612644565b602083015250604061287184828501611fa0565b604083015250606082013567ffffffffffffffff81111561289557612894611f70565b5b6128a18482850161274a565b606083015250608082013567ffffffffffffffff8111156128c5576128c4611f70565b5b6128d18482850161274a565b60808301525060a082013567ffffffffffffffff8111156128f5576128f4611f70565b5b612901848285016127eb565b60a08301525092915050565b6000806040838503121561292457612923611ed5565b5b600083013567ffffffffffffffff81111561294257612941611eda565b5b61294e85828601612819565b925050602083013567ffffffffffffffff81111561296f5761296e611eda565b5b61297b85828601612041565b9150509250929050565b600061299082612601565b9050919050565b6129a081612985565b82525050565b6129af81611f75565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6129ea816120c5565b82525050565b60006129fc83836129e1565b60208301905092915050565b6000602082019050919050565b6000612a20826129b5565b612a2a81856129c0565b9350612a35836129d1565b8060005b83811015612a66578151612a4d88826129f0565b9750612a5883612a08565b925050600181019050612a39565b5085935050505092915050565b600082825260208201905092915050565b6000612a8f8261255d565b612a998185612a73565b9350612aa981856020860161243d565b612ab281611ee4565b840191505092915050565b600060c083016000830151612ad56000860182612997565b506020830151612ae86020860182612997565b506040830151612afb60408601826129a6565b5060608301518482036060860152612b138282612a15565b91505060808301518482036080860152612b2d8282612a15565b91505060a083015184820360a0860152612b478282612a84565b9150508091505092915050565b60006040820190508181036000830152612b6e8185612abd565b90508181036020830152612b828184612470565b90509392505050565b600080fd5b600060c08284031215612ba657612ba5612b8b565b5b81905092915050565b600060208284031215612bc557612bc4611ed5565b5b600082013567ffffffffffffffff811115612be357612be2611eda565b5b612bef84828501612b90565b91505092915050565b600067ffffffffffffffff821115612c1357612c12611ef5565b5b602082029050602081019050919050565b6000612c37612c3284612bf8565b611f55565b90508083825260208201905060208402830185811115612c5a57612c5961212f565b5b835b81811015612c835780612c6f8882612644565b845260208401935050602081019050612c5c565b5050509392505050565b600082601f830112612ca257612ca1611fb5565b5b8135612cb2848260208601612c24565b91505092915050565b60008060008060808587031215612cd557612cd4611ed5565b5b600085013567ffffffffffffffff811115612cf357612cf2611eda565b5b612cff8782880161227b565b9450506020612d1087828801611fa0565b935050604085013567ffffffffffffffff811115612d3157612d30611eda565b5b612d3d87828801612c8d565b925050606085013567ffffffffffffffff811115612d5e57612d5d611eda565b5b612d6a878288016127eb565b91505092959194509250565b60008060408385031215612d8d57612d8c611ed5565b5b600083013567ffffffffffffffff811115612dab57612daa611eda565b5b612db7858286016127eb565b9250506020612dc885828601612090565b9150509250929050565b60008060408385031215612de957612de8611ed5565b5b6000612df785828601612644565b9250506020612e0885828601612644565b9150509250929050565b612e1b81612243565b82525050565b6000602082019050612e366000830184612e12565b92915050565b612e45816120c5565b82525050565b7f6e6f2064617461207265636f7264730000000000000000000000000000000000600082015250565b6000612e81600f8361242c565b9150612e8c82612e4b565b602082019050919050565b6000604082019050612eac6000830184612e3c565b8181036020830152612ebd81612e74565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612f0381611f89565b92915050565b600060208284031215612f1f57612f1e611ed5565b5b6000612f2d84828501612ef4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f70826124cb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fa357612fa2612f36565b5b600182019050919050565b6000612fb9826124cb565b9150612fc4836124cb565b925082821015612fd757612fd6612f36565b5b828203905092915050565b6000612fed826124cb565b9150612ff8836124cb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561302d5761302c612f36565b5b828201905092915050565b6130418161206f565b82525050565b600060408201905081810360008301526130618185612579565b90506130706020830184613038565b9392505050565b61308081612985565b82525050565b600060408201905061309b6000830185613077565b81810360208301526130ad8184612470565b90509392505050565b6130bf81611f75565b82525050565b600082825260208201905092915050565b60006130e1826129b5565b6130eb81856130c5565b93506130f6836129d1565b8060005b8381101561312757815161310e88826129f0565b975061311983612a08565b9250506001810190506130fa565b5085935050505092915050565b60006060820190506131496000830186613077565b61315660208301856130b6565b818103604083015261316881846130d6565b9050949350505050565b60006020828403121561318857613187611ed5565b5b600061319684828501611fa0565b91505092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126131cb576131ca61319f565b5b80840192508235915067ffffffffffffffff8211156131ed576131ec6131a4565b5b602083019250602082023603831315613209576132086131a9565b5b509250929050565b6000819050919050565b600061322a60208401846120ee565b905092915050565b6000602082019050919050565b600061324b83856130c5565b935061325682613211565b8060005b8581101561328f5761326c828461321b565b61327688826129f0565b975061328183613232565b92505060018101905061325a565b5085925050509392505050565b60006060820190506132b16000830187613077565b6132be60208301866130b6565b81810360408301526132d181848661323f565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006133148383612997565b60208301905092915050565b6000602082019050919050565b6000613338826132dc565b61334281856132e7565b935061334d836132f8565b8060005b8381101561337e5781516133658882613308565b975061337083613320565b925050600181019050613351565b5085935050505092915050565b600060208201905081810360008301526133a5818461332d565b905092915050565b600082825260208201905092915050565b60006133c982612421565b6133d381856133ad565b93506133e381856020860161243d565b6133ec81611ee4565b840191505092915050565b6134008161206f565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60808201600082015161344860008501826129a6565b50602082015161345b60208501826129a6565b50604082015161346e60408501826129e1565b50606082015161348160608501826129a6565b50505050565b60006134938383613432565b60808301905092915050565b6000602082019050919050565b60006134b782613406565b6134c18185613411565b93506134cc83613422565b8060005b838110156134fd5781516134e48882613487565b97506134ef8361349f565b9250506001810190506134d0565b5085935050505092915050565b61351381612243565b82525050565b60006101408301600083015161353260008601826129a6565b506020830151848203602086015261354a82826133be565b915050604083015161355f60408601826133f7565b50606083015161357260608601826129a6565b50608083015161358560808601826129e1565b5060a083015161359860a08601826129a6565b5060c08301516135ab60c08601826133f7565b5060e083015184820360e08601526135c382826134ac565b9150506101008301518482036101008601526135df82826133be565b9150506101208301516135f661012086018261350a565b508091505092915050565b6000608082019050818103600083015261361b8187613519565b905061362a60208301866130b6565b818103604083015261363c818561332d565b905081810360608301526136508184612579565b905095945050505050565b60008151905061366a8161262d565b92915050565b60008151905061367f816120d7565b92915050565b6000613698613693846126b5565b611f55565b905080838252602082019050602084028301858111156136bb576136ba61212f565b5b835b818110156136e457806136d08882613670565b8452602084019350506020810190506136bd565b5050509392505050565b600082601f83011261370357613702611fb5565b5b8151613713848260208601613685565b91505092915050565b600061372f61372a84612778565b611f55565b90508281526020810184848401111561374b5761374a611fba565b5b61375684828561243d565b509392505050565b600082601f83011261377357613772611fb5565b5b815161378384826020860161371c565b91505092915050565b600060c082840312156137a2576137a1611edf565b5b6137ac60c0611f55565b905060006137bc8482850161365b565b60008301525060206137d08482850161365b565b60208301525060406137e484828501612ef4565b604083015250606082015167ffffffffffffffff81111561380857613807611f70565b5b613814848285016136ee565b606083015250608082015167ffffffffffffffff81111561383857613837611f70565b5b613844848285016136ee565b60808301525060a082015167ffffffffffffffff81111561386857613867611f70565b5b6138748482850161375e565b60a08301525092915050565b600061389361388e84611fbf565b611f55565b9050828152602081018484840111156138af576138ae611fba565b5b6138ba84828561243d565b509392505050565b600082601f8301126138d7576138d6611fb5565b5b81516138e7848260208601613880565b91505092915050565b6000806040838503121561390757613906611ed5565b5b600083015167ffffffffffffffff81111561392557613924611eda565b5b6139318582860161378c565b925050602083015167ffffffffffffffff81111561395257613951611eda565b5b61395e858286016138c2565b9150509250929050565b600060208201905061397d6000830184613038565b92915050565b6000819050919050565b61399e61399982612985565b613983565b82525050565b60006139b0828461398d565b60108201915081905092915050565b60006139d26139cd84612bf8565b611f55565b905080838252602082019050602084028301858111156139f5576139f461212f565b5b835b81811015613a1e5780613a0a888261365b565b8452602084019350506020810190506139f7565b5050509392505050565b600082601f830112613a3d57613a3c611fb5565b5b8151613a4d8482602086016139bf565b91505092915050565b600060208284031215613a6c57613a6b611ed5565b5b600082015167ffffffffffffffff811115613a8a57613a89611eda565b5b613a9684828501613a28565b91505092915050565b600060208284031215613ab557613ab4611ed5565b5b600082015167ffffffffffffffff811115613ad357613ad2611eda565b5b613adf848285016138c2565b91505092915050565b600081905092915050565b50565b6000613b03600083613ae8565b9150613b0e82613af3565b600082019050919050565b6000613b2482613af6565b9150819050919050565b6000604082019050613b436000830185612e3c565b8181036020830152613b558184612470565b90509392505050565b6000604082019050613b7360008301856130b6565b8181036020830152613b858184612579565b90509392505050565b6000613b9982612421565b613ba38185613ae8565b9350613bb381856020860161243d565b80840191505092915050565b6000613bcb8284613b8e565b915081905092915050565b600067ffffffffffffffff821115613bf157613bf0611ef5565b5b602082029050602081019050919050565b6000613c15613c1084613bd6565b611f55565b90508083825260208201905060208402830185811115613c3857613c3761212f565b5b835b81811015613c7f57805167ffffffffffffffff811115613c5d57613c5c611fb5565b5b808601613c6a898261378c565b85526020850194505050602081019050613c3a565b5050509392505050565b600082601f830112613c9e57613c9d611fb5565b5b8151613cae848260208601613c02565b91505092915050565b600060208284031215613ccd57613ccc611ed5565b5b600082015167ffffffffffffffff811115613ceb57613cea611eda565b5b613cf784828501613c89565b91505092915050565b6000604082019050613d156000830185613077565b8181036020830152613d278184612579565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d7757607f821691505b60208210811415613d8b57613d8a613d30565b5b50919050565b60008190508160005260206000209050919050565b60008154613db381613d5f565b613dbd8186612568565b94506001821660008114613dd85760018114613dea57613e1d565b60ff1983168652602086019350613e1d565b613df385613d91565b60005b83811015613e1557815481890152600182019150602081019050613df6565b808801955050505b50505092915050565b60006040820190508181036000830152613e408185613da6565b90508181036020830152613e548184612470565b90509392505050565b60006040820190508181036000830152613e778185612579565b90508181036020830152613e8b8184612470565b90509392505050565b6000608082019050613ea960008301876130b6565b8181036020830152613ebb81866130d6565b90508181036040830152613ecf81856130d6565b90508181036060830152613ee38184612579565b905095945050505050565b600060208284031215613f0457613f03611ed5565b5b600082015167ffffffffffffffff811115613f2257613f21611eda565b5b613f2e8482850161378c565b91505092915050565b6000606082019050613f4c6000830186613077565b8181036020830152613f5e8185612579565b90508181036040830152613f728184612470565b9050949350505050565b60006060820190508181036000830152613f968186613519565b9050613fa56020830185613077565b8181036040830152613fb78184612579565b9050949350505050565b60008060408385031215613fd857613fd7611ed5565b5b600083015167ffffffffffffffff811115613ff657613ff5611eda565b5b614002858286016138c2565b925050602083015167ffffffffffffffff81111561402357614022611eda565b5b61402f858286016138c2565b915050925092905056fea2646970667358221220f7930f77612462e2c58b7d6b7d7d053f804dec3eb0b2f11acb3deeb9afe9896664736f6c63430008080033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063bb7bae0a1161008c578063ee2cc36411610066578063ee2cc36414610203578063fd38f21d1461021f578063ff4aec7d1461024f578063ffbbfcb01461026d576100cf565b8063bb7bae0a146101ad578063bcbb3597146101c9578063d7e84fbf146101e5576100cf565b806332821faa146100d4578063392e53cd1461010457806361b8ce8c1461012257806364e65a62146101405780637e48532c1461015c57806381d12c581461017a575b600080fd5b6100ee60048036038101906100e991906126a4565b61028b565b6040516100fb9190612788565b60405180910390f35b61010c61050b565b60405161011991906127b9565b60405180910390f35b61012a61051b565b60405161013791906127ed565b60405180910390f35b61015a6004803603810190610155919061282c565b610521565b005b6101646105ee565b6040516101719190612788565b60405180910390f35b610194600480360381019061018f9190612913565b610643565b6040516101a494939291906129e2565b60405180910390f35b6101c760048036038101906101c29190612a5a565b61070b565b005b6101e360048036038101906101de9190612ab9565b610777565b005b6101ed6107ee565b6040516101fa9190612b61565b60405180910390f35b61021d60048036038101906102189190612b9b565b610814565b005b61023960048036038101906102349190612c98565b61092c565b6040516102469190612788565b60405180910390f35b610257610b35565b6040516102649190612788565b60405180910390f35b610275610b6e565b60405161028291906127ed565b60405180910390f35b60606102d3610298610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61031a6000600480549050116040518060400160405280600b81526020017f4e6f207265717565737473000000000000000000000000000000000000000000815250610c43565b6000806103308467ffffffffffffffff16610c89565b915091506103846000836040015167ffffffffffffffff16116040518060400160405280600f81526020017f4e6f2076616c6964206f66666572730000000000000000000000000000000000815250610c43565b61038e8483610ed3565b81602001518561010001819052506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663088243fb87876040518363ffffffff1660e01b81526004016103fb929190612f75565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104529190613015565b90506364e65a6260e01b818460000151856040015160405160200161047892919061305e565b6040516020818303038152906040528461049061112e565b6040516024016104a394939291906130b6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505092915050565b60008060001b6001541415905090565b60055481565b8061056d6105328260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b60008351111561058957610588610583846111a4565b6111b6565b5b60006105b7600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611377565b90506105c38582611445565b508060200135600181905550600260008154809291906105e29061313f565b91905055505050505050565b60606106366105fb610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61063e6114a0565b905090565b6004818154811061065357600080fd5b906000526020600020906004020160009150905080600001549080600101805461067c906131b7565b80601f01602080910402602001604051908101604052809291908181526020018280546106a8906131b7565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050908060020154908060030154905084565b61075261071661050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b81600181905550806000816fffffffffffffffffffffffffffffffff19169055505050565b7ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4781600001356fffffffffffffffffffffffffffffffff19168260400160208101906107c391906131e9565b8380606001906107d39190613225565b6040516107e3949392919061333c565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806108606108258260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b6004839080600181540180825580915050600190039060005260206000209060040201600090919091909150818161089891906137bf565b5050600560008154809291906108ad9061313f565b919050555082600001357fbf51327c63fb3c8741d4233ae0315e3e1a74641532f4e59c307f72314a3462358480602001906108e89190613430565b86604001356040516108fc939291906137fa565b60405180910390a28060200135600181905550600260008154809291906109229061313f565b9190505550505050565b6060610974610939610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b60003073ffffffffffffffffffffffffffffffffffffffff1663ff4aec7d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109fb9190613015565b90506000610a0a8260016115eb565b915050610a5960008267ffffffffffffffff16116040518060400160405280600b81526020017f65677020746f6f206c6f77000000000000000000000000000000000000000000815250610c43565b6000610a64836116c6565b90506000604051806080016040528060055481526020018781526020018867ffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff1916815250905063ee2cc36460e01b81610abb61112e565b604051602401610acc9291906138f7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505094505050505092915050565b6060610b3f610b7b565b610b4857600080fd5b6000610b526117fc565b905080806020019051810190610b689190613015565b91505090565b6000600480549050905090565b6000806000634201000073ffffffffffffffffffffffffffffffffffffffff16604051610ba790613958565b600060405180830381855afa9150503d8060008114610be2576040519150601f19603f3d011682016040523d82523d6000602084013e610be7565b606091505b509150915081610c34576342010000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401610c2b92919061397c565b60405180910390fd5b80516020820151935050505090565b81610c8557806040517f0c25cd98000000000000000000000000000000000000000000000000000000008152600401610c7c91906139ac565b60405180910390fd5b5050565b610c91612008565b606060005b600480549050811015610ecd57600060048281548110610cb957610cb86139ce565b5b906000526020600020906004020160405180608001604052908160008201548152602001600182018054610cec906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d18906131b7565b8015610d655780601f10610d3a57610100808354040283529160200191610d65565b820191906000526020600020905b815481529060010190602001808311610d4857829003601f168201915b505050505081526020016002820154815260200160038201546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff19168152505090508481604001511015610dd157610dc982846118d390919063ffffffff16565b925050610ebc565b6000610e1682606001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c650000000000000000815250611907565b9050600080610e268360006115eb565b91509150811580610e41575060008167ffffffffffffffff16145b15610e6057610e5985876118d390919063ffffffff16565b9550610eb7565b866040015167ffffffffffffffff168167ffffffffffffffff161115610eb657604051806080016040528085600001518152602001856020015181526020018267ffffffffffffffff1681526020018481525096505b5b505050505b80610ec69061313f565b9050610c96565b50915091565b6000600367ffffffffffffffff811115610ef057610eef6121d4565b5b604051908082528060200260200182016040528015610f1e5781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110610f5857610f576139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634210000181600181518110610fab57610faa6139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600281518110610ffa57610ff96139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006110778483846040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152506119ee565b90506110c181600001516040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152508560600151611af4565b61112881600001516040518060400160405280601e81526020017f64656661756c743a76303a65746842756e646c6553696d526573756c74730000815250856040015160405160200161111491906139fd565b604051602081830303815290604052611af4565b50505050565b61113661203a565b604051806040016040528061114c600254611bd7565b815260200161116860016002546111639190613a18565b611bf1565b815250905090565b6000600154826040516020016111869190613a7d565b60405160208183030381529060405280519060200120149050919050565b60606111af82611c29565b9050919050565b6000815190505b6000811115611373576000826001836111d69190613a98565b815181106111e7576111e66139ce565b5b60200260200101519050600060048281548110611207576112066139ce565b5b9060005260206000209060040201600001549050600160048054905061122d9190613a98565b8210156112e057600460016004805490506112489190613a98565b81548110611259576112586139ce565b5b90600052602060002090600402016004838154811061127b5761127a6139ce565b5b90600052602060002090600402016000820154816000015560018201816001019080546112a7906131b7565b6112b292919061205a565b5060028201548160020155600382015481600301906fffffffffffffffffffffffffffffffff191690559050505b60048054806112f2576112f1613acc565b5b600190038181906000526020600020906004020160008082016000905560018201600061131f91906120e7565b6002820160009055600382016000905550509055807f5fa4d8243d9549d33d615899224efcef51bfcacb970a31f68862ce74c858dbf060405160405180910390a250508061136c90613afb565b90506111bd565b5050565b60606000808473ffffffffffffffffffffffffffffffffffffffff16846040516113a19190613b56565b6000604051808303816000865af19150503d80600081146113de576040519150601f19603f3d011682016040523d82523d6000602084013e6113e3565b606091505b5091509150611427826040518060400160405280601481526020017f45787465726e616c2063616c6c206661696c6564000000000000000000000000815250610c43565b8080602001905181019061143b9190613bdd565b9250505092915050565b6000808380602001905181019061145c9190613c50565b91509150817f91badfc611f9ad79e4d6a58176e5c4cedc4f8ed9001447825f503e792bbf09e28285604051611492929190613c90565b60405180910390a250505050565b60606114e86114ad610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61152f6114f361050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b60006115396117fc565b9050600061154682611cf4565b90506000611569838060200190518101906115619190613cd5565b600254611ed0565b905063bb7bae0a60e01b8183604051602401611586929190613d02565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505090565b600080600080634210000073ffffffffffffffffffffffffffffffffffffffff16614e20876040516020016116209190612788565b60405160208183030381529060405260405161163c9190613b56565b6000604051808303818686fa925050503d8060008114611678576040519150601f19603f3d011682016040523d82523d6000602084013e61167d565b606091505b509150915061169585158061168f5750825b82610c43565b81156116bc576001818060200190518101906116b19190613d2b565b9350935050506116bf565b50505b9250929050565b600080600167ffffffffffffffff8111156116e4576116e36121d4565b5b6040519080825280602002602001820160405280156117125781602001602082028036833780820191505090505b509050308160008151811061172a576117296139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006117a8600083846040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c6500000000000000008152506119ee565b90506117ee81600001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c65000000000000000081525086611af4565b806000015192505050919050565b6060600080634201000173ffffffffffffffffffffffffffffffffffffffff1660405160200160405160208183030381529060405260405161183e9190613b56565b600060405180830381855afa9150503d8060008114611879576040519150601f19603f3d011682016040523d82523d6000602084013e61187e565b606091505b5091509150816118cb576342010001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016118c292919061397c565b60405180910390fd5b809250505090565b6060826118df83611f0a565b6040516020016118f0929190613d58565b604051602081830303815290604052905092915050565b6060600080634202000173ffffffffffffffffffffffffffffffffffffffff16858560405160200161193a929190613d7c565b6040516020818303038152906040526040516119569190613b56565b600060405180830381855afa9150503d8060008114611991576040519150601f19603f3d011682016040523d82523d6000602084013e611996565b606091505b5091509150816119e3576342020001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016119da92919061397c565b60405180910390fd5b809250505092915050565b6119f6612127565b600080634203000073ffffffffffffffffffffffffffffffffffffffff1687878787604051602001611a2b9493929190613e32565b604051602081830303815290604052604051611a479190613b56565b600060405180830381855afa9150503d8060008114611a82576040519150601f19603f3d011682016040523d82523d6000602084013e611a87565b606091505b509150915081611ad4576342030000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611acb92919061397c565b60405180910390fd5b80806020019051810190611ae8919061406d565b92505050949350505050565b600080634202000073ffffffffffffffffffffffffffffffffffffffff16858585604051602001611b27939291906140b6565b604051602081830303815290604052604051611b439190613b56565b600060405180830381855afa9150503d8060008114611b7e576040519150601f19603f3d011682016040523d82523d6000602084013e611b83565b606091505b509150915081611bd0576342020000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611bc792919061397c565b60405180910390fd5b5050505050565b6000611bea611be4611f67565b83611fc7565b9050919050565b6000611bfc82611bd7565b604051602001611c0c9190613a7d565b604051602081830303815290604052805190602001209050919050565b606060208251611c39919061412a565b67ffffffffffffffff811115611c5257611c516121d4565b5b604051908082528060200260200182016040528015611c805781602001602082028036833780820191505090505b50905060005b60208351611c94919061412a565b811015611cee57611cbc8360208084611cad919061415b565b611cb79190613a18565b611ffa565b828281518110611ccf57611cce6139ce565b5b6020026020010181815250508080611ce69061313f565b915050611c86565b50919050565b600080600367ffffffffffffffff811115611d1257611d116121d4565b5b604051908082528060200260200182016040528015611d405781602001602082028036833780820191505090505b5090503081600081518110611d5857611d576139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634203000181600181518110611dab57611daa6139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634202000181600281518110611dfe57611dfd6139ce565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000611e7c600083846040518060400160405280601181526020017f626c6f636b61643a76303a7365637265740000000000000000000000000000008152506119ee565b9050611ec281600001516040518060400160405280601181526020017f626c6f636b61643a76303a73656372657400000000000000000000000000000081525086611af4565b806000015192505050919050565b6000611edc8383611fc7565b604051602001611eec9190613a7d565b60405160208183030381529060405280519060200120905092915050565b6060602067ffffffffffffffff811115611f2757611f266121d4565b5b6040519080825280601f01601f191660200182016040528015611f595781602001600182028036833780820191505090505b509050816020820152919050565b600080611fab6000546040518060400160405280601181526020017f626c6f636b61643a76303a736563726574000000000000000000000000000000815250611907565b905080806020019051810190611fc19190613cd5565b91505090565b60008282604051602001611fdc9291906141b5565b60405160208183030381529060405280519060200120905092915050565b600081830151905092915050565b60405180608001604052806000815260200160608152602001600067ffffffffffffffff168152602001606081525090565b604051806040016040528060008019168152602001600080191681525090565b828054612066906131b7565b90600052602060002090601f01602090048101928261208857600085556120d6565b82601f1061209957805485556120d6565b828001600101855582156120d657600052602060002091601f016020900482015b828111156120d55782548255916001019190600101906120ba565b5b5090506120e3919061218d565b5090565b5080546120f3906131b7565b6000825580601f106121055750612124565b601f016020900490600052602060002090810190612123919061218d565b5b50565b6040518060c0016040528060006fffffffffffffffffffffffffffffffff1916815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b5b808211156121a657600081600090555060010161218e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61220c826121c3565b810181811067ffffffffffffffff8211171561222b5761222a6121d4565b5b80604052505050565b600061223e6121aa565b905061224a8282612203565b919050565b600080fd5b600067ffffffffffffffff82169050919050565b61227181612254565b811461227c57600080fd5b50565b60008135905061228e81612268565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156122b9576122b86121d4565b5b6122c2826121c3565b9050602081019050919050565b82818337600083830152505050565b60006122f16122ec8461229e565b612234565b90508281526020810184848401111561230d5761230c612299565b5b6123188482856122cf565b509392505050565b600082601f83011261233557612334612294565b5b81356123458482602086016122de565b91505092915050565b6000819050919050565b6123618161234e565b811461236c57600080fd5b50565b60008135905061237e81612358565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123af82612384565b9050919050565b6123bf816123a4565b81146123ca57600080fd5b50565b6000813590506123dc816123b6565b92915050565b600067ffffffffffffffff8211156123fd576123fc6121d4565b5b602082029050602081019050919050565b600080fd5b600060808284031215612429576124286121be565b5b6124336080612234565b905060006124438482850161227f565b60008301525060206124578482850161227f565b602083015250604061246b848285016123cd565b604083015250606061247f8482850161227f565b60608301525092915050565b600061249e612499846123e2565b612234565b905080838252602082019050608084028301858111156124c1576124c061240e565b5b835b818110156124ea57806124d68882612413565b8452602084019350506080810190506124c3565b5050509392505050565b600082601f83011261250957612508612294565b5b813561251984826020860161248b565b91505092915050565b60008115159050919050565b61253781612522565b811461254257600080fd5b50565b6000813590506125548161252e565b92915050565b60006101408284031215612571576125706121be565b5b61257c610140612234565b9050600061258c8482850161227f565b600083015250602082013567ffffffffffffffff8111156125b0576125af61224f565b5b6125bc84828501612320565b60208301525060406125d08482850161236f565b60408301525060606125e48482850161227f565b60608301525060806125f8848285016123cd565b60808301525060a061260c8482850161227f565b60a08301525060c06126208482850161236f565b60c08301525060e082013567ffffffffffffffff8111156126445761264361224f565b5b612650848285016124f4565b60e08301525061010082013567ffffffffffffffff8111156126755761267461224f565b5b61268184828501612320565b6101008301525061012061269784828501612545565b6101208301525092915050565b600080604083850312156126bb576126ba6121b4565b5b600083013567ffffffffffffffff8111156126d9576126d86121b9565b5b6126e58582860161255a565b92505060206126f68582860161227f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561273a57808201518184015260208101905061271f565b83811115612749576000848401525b50505050565b600061275a82612700565b612764818561270b565b935061277481856020860161271c565b61277d816121c3565b840191505092915050565b600060208201905081810360008301526127a2818461274f565b905092915050565b6127b381612522565b82525050565b60006020820190506127ce60008301846127aa565b92915050565b6000819050919050565b6127e7816127d4565b82525050565b600060208201905061280260008301846127de565b92915050565b600080fd5b60006040828403121561282357612822612808565b5b81905092915050565b60008060008060a08587031215612846576128456121b4565b5b600085013567ffffffffffffffff811115612864576128636121b9565b5b61287087828801612320565b945050602085013567ffffffffffffffff811115612891576128906121b9565b5b61289d87828801612320565b935050604085013567ffffffffffffffff8111156128be576128bd6121b9565b5b6128ca87828801612320565b92505060606128db8782880161280d565b91505092959194509250565b6128f0816127d4565b81146128fb57600080fd5b50565b60008135905061290d816128e7565b92915050565b600060208284031215612929576129286121b4565b5b6000612937848285016128fe565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061296782612940565b612971818561294b565b935061298181856020860161271c565b61298a816121c3565b840191505092915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006129cc82612995565b9050919050565b6129dc816129c1565b82525050565b60006080820190506129f760008301876127de565b8181036020830152612a09818661295c565b9050612a1860408301856127de565b612a2560608301846129d3565b95945050505050565b612a3781612995565b8114612a4257600080fd5b50565b600081359050612a5481612a2e565b92915050565b60008060408385031215612a7157612a706121b4565b5b6000612a7f8582860161236f565b9250506020612a9085828601612a45565b9150509250929050565b600060c08284031215612ab057612aaf612808565b5b81905092915050565b600060208284031215612acf57612ace6121b4565b5b600082013567ffffffffffffffff811115612aed57612aec6121b9565b5b612af984828501612a9a565b91505092915050565b6000819050919050565b6000612b27612b22612b1d84612384565b612b02565b612384565b9050919050565b6000612b3982612b0c565b9050919050565b6000612b4b82612b2e565b9050919050565b612b5b81612b40565b82525050565b6000602082019050612b766000830184612b52565b92915050565b600060808284031215612b9257612b91612808565b5b81905092915050565b60008060608385031215612bb257612bb16121b4565b5b600083013567ffffffffffffffff811115612bd057612bcf6121b9565b5b612bdc85828601612b7c565b9250506020612bed8582860161280d565b9150509250929050565b600067ffffffffffffffff821115612c1257612c116121d4565b5b612c1b826121c3565b9050602081019050919050565b6000612c3b612c3684612bf7565b612234565b905082815260208101848484011115612c5757612c56612299565b5b612c628482856122cf565b509392505050565b600082601f830112612c7f57612c7e612294565b5b8135612c8f848260208601612c28565b91505092915050565b60008060408385031215612caf57612cae6121b4565b5b6000612cbd8582860161227f565b925050602083013567ffffffffffffffff811115612cde57612cdd6121b9565b5b612cea85828601612c6a565b9150509250929050565b612cfd81612254565b82525050565b600082825260208201905092915050565b6000612d1f82612700565b612d298185612d03565b9350612d3981856020860161271c565b612d42816121c3565b840191505092915050565b612d568161234e565b82525050565b612d65816123a4565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612dad6000850182612cf4565b506020820151612dc06020850182612cf4565b506040820151612dd36040850182612d5c565b506060820151612de66060850182612cf4565b50505050565b6000612df88383612d97565b60808301905092915050565b6000602082019050919050565b6000612e1c82612d6b565b612e268185612d76565b9350612e3183612d87565b8060005b83811015612e62578151612e498882612dec565b9750612e5483612e04565b925050600181019050612e35565b5085935050505092915050565b612e7881612522565b82525050565b600061014083016000830151612e976000860182612cf4565b5060208301518482036020860152612eaf8282612d14565b9150506040830151612ec46040860182612d4d565b506060830151612ed76060860182612cf4565b506080830151612eea6080860182612d5c565b5060a0830151612efd60a0860182612cf4565b5060c0830151612f1060c0860182612d4d565b5060e083015184820360e0860152612f288282612e11565b915050610100830151848203610100860152612f448282612d14565b915050610120830151612f5b610120860182612e6f565b508091505092915050565b612f6f81612254565b82525050565b60006040820190508181036000830152612f8f8185612e7e565b9050612f9e6020830184612f66565b9392505050565b6000612fb8612fb38461229e565b612234565b905082815260208101848484011115612fd457612fd3612299565b5b612fdf84828561271c565b509392505050565b600082601f830112612ffc57612ffb612294565b5b815161300c848260208601612fa5565b91505092915050565b60006020828403121561302b5761302a6121b4565b5b600082015167ffffffffffffffff811115613049576130486121b9565b5b61305584828501612fe7565b91505092915050565b600060408201905061307360008301856127de565b6130806020830184612f66565b9392505050565b60408201600082015161309d6000850182612d4d565b5060208201516130b06020850182612d4d565b50505050565b600060a08201905081810360008301526130d0818761274f565b905081810360208301526130e4818661274f565b905081810360408301526130f8818561274f565b90506131076060830184613087565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061314a826127d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561317d5761317c613110565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131cf57607f821691505b602082108114156131e3576131e2613188565b5b50919050565b6000602082840312156131ff576131fe6121b4565b5b600061320d8482850161227f565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261324257613241613216565b5b80840192508235915067ffffffffffffffff8211156132645761326361321b565b5b6020830192506020820236038313156132805761327f613220565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b60006132af8383612d5c565b60208301905092915050565b60006132ca60208401846123cd565b905092915050565b6000602082019050919050565b60006132eb8385613288565b93506132f682613299565b8060005b8581101561332f5761330c82846132bb565b61331688826132a3565b9750613321836132d2565b9250506001810190506132fa565b5085925050509392505050565b600060608201905061335160008301876129d3565b61335e6020830186612f66565b81810360408301526133718184866132df565b905095945050505050565b60008135613389816128e7565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6133cb84613392565b9350801983169250808416831791505092915050565b60006133fc6133f76133f2846127d4565b612b02565b6127d4565b9050919050565b6000819050919050565b613416826133e1565b61342961342282613403565b835461339f565b8255505050565b6000808335600160200384360303811261344d5761344c613216565b5b80840192508235915067ffffffffffffffff82111561346f5761346e61321b565b5b60208301925060018202360383131561348b5761348a613220565b5b509250929050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134c3565b61350a86836134c3565b95508019841693508086168417925050509392505050565b61352b836133e1565b61353f61353782613403565b8484546134d0565b825550505050565b600090565b613554613547565b61355f818484613522565b505050565b5b818110156135835761357860008261354c565b600181019050613565565b5050565b601f8211156135c8576135998161349e565b6135a2846134b3565b810160208510156135b1578190505b6135c56135bd856134b3565b830182613564565b50505b505050565b600082821c905092915050565b60006135eb600019846008026135cd565b1980831691505092915050565b600061360483836135da565b9150826002028217905092915050565b61361e8383613493565b67ffffffffffffffff811115613637576136366121d4565b5b61364182546131b7565b61364c828285613587565b6000601f83116001811461367b5760008415613669578287013590505b61367385826135f8565b8655506136db565b601f1984166136898661349e565b60005b828110156136b15784890135825560018201915060208501945060208101905061368c565b868310156136ce57848901356136ca601f8916826135da565b8355505b6001600288020188555050505b50505050505050565b6136ef838383613614565b505050565b6000813561370181612a2e565b80915050919050565b6000819050919050565b61371d826129c1565b6137306137298261370a565b835461339f565b8255505050565b6000810160008301806137498161337c565b9050613755818461340d565b505050600181016020830161376a8185613430565b6137758183866136e4565b5050505060028101604083018061378b8161337c565b9050613797818461340d565b5050506003810160608301806137ac816136f4565b90506137b88184613714565b5050505050565b6137c98282613737565b5050565b60006137d9838561294b565b93506137e68385846122cf565b6137ef836121c3565b840190509392505050565b600060408201905081810360008301526138158185876137cd565b905061382460208301846127de565b949350505050565b613835816127d4565b82525050565b600082825260208201905092915050565b600061385782612940565b613861818561383b565b935061387181856020860161271c565b61387a816121c3565b840191505092915050565b61388e816129c1565b82525050565b60006080830160008301516138ac600086018261382c565b50602083015184820360208601526138c4828261384c565b91505060408301516138d9604086018261382c565b5060608301516138ec6060860182613885565b508091505092915050565b600060608201905081810360008301526139118185613894565b90506139206020830184613087565b9392505050565b600081905092915050565b50565b6000613942600083613927565b915061394d82613932565b600082019050919050565b600061396382613935565b9150819050919050565b613976816123a4565b82525050565b6000604082019050613991600083018561396d565b81810360208301526139a3818461274f565b90509392505050565b600060208201905081810360008301526139c6818461295c565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082019050613a126000830184612f66565b92915050565b6000613a23826127d4565b9150613a2e836127d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a6357613a62613110565b5b828201905092915050565b613a778161234e565b82525050565b6000602082019050613a926000830184613a6e565b92915050565b6000613aa3826127d4565b9150613aae836127d4565b925082821015613ac157613ac0613110565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613b06826127d4565b91506000821415613b1a57613b19613110565b5b600182039050919050565b6000613b3082612700565b613b3a8185613927565b9350613b4a81856020860161271c565b80840191505092915050565b6000613b628284613b25565b915081905092915050565b6000613b80613b7b84612bf7565b612234565b905082815260208101848484011115613b9c57613b9b612299565b5b613ba784828561271c565b509392505050565b600082601f830112613bc457613bc3612294565b5b8151613bd4848260208601613b6d565b91505092915050565b600060208284031215613bf357613bf26121b4565b5b600082015167ffffffffffffffff811115613c1157613c106121b9565b5b613c1d84828501613baf565b91505092915050565b600081519050613c35816128e7565b92915050565b600081519050613c4a81612268565b92915050565b60008060408385031215613c6757613c666121b4565b5b6000613c7585828601613c26565b9250506020613c8685828601613c3b565b9150509250929050565b6000604082019050613ca56000830185612f66565b8181036020830152613cb7818461295c565b90509392505050565b600081519050613ccf81612358565b92915050565b600060208284031215613ceb57613cea6121b4565b5b6000613cf984828501613cc0565b91505092915050565b6000604082019050613d176000830185613a6e565b613d2460208301846129d3565b9392505050565b600060208284031215613d4157613d406121b4565b5b6000613d4f84828501613c3b565b91505092915050565b6000613d648285613b25565b9150613d708284613b25565b91508190509392505050565b6000604082019050613d9160008301856129d3565b8181036020830152613da3818461295c565b90509392505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000613ddf82613dac565b613de98185613288565b9350613df483613db7565b8060005b83811015613e25578151613e0c88826132a3565b9750613e1783613dc7565b925050600181019050613df8565b5085935050505092915050565b6000608082019050613e476000830187612f66565b8181036020830152613e598186613dd4565b90508181036040830152613e6d8185613dd4565b90508181036060830152613e81818461295c565b905095945050505050565b600081519050613e9b81612a2e565b92915050565b600067ffffffffffffffff821115613ebc57613ebb6121d4565b5b602082029050602081019050919050565b600081519050613edc816123b6565b92915050565b6000613ef5613ef084613ea1565b612234565b90508083825260208201905060208402830185811115613f1857613f1761240e565b5b835b81811015613f415780613f2d8882613ecd565b845260208401935050602081019050613f1a565b5050509392505050565b600082601f830112613f6057613f5f612294565b5b8151613f70848260208601613ee2565b91505092915050565b600060c08284031215613f8f57613f8e6121be565b5b613f9960c0612234565b90506000613fa984828501613e8c565b6000830152506020613fbd84828501613e8c565b6020830152506040613fd184828501613c3b565b604083015250606082015167ffffffffffffffff811115613ff557613ff461224f565b5b61400184828501613f4b565b606083015250608082015167ffffffffffffffff8111156140255761402461224f565b5b61403184828501613f4b565b60808301525060a082015167ffffffffffffffff8111156140555761405461224f565b5b61406184828501613baf565b60a08301525092915050565b600060208284031215614083576140826121b4565b5b600082015167ffffffffffffffff8111156140a1576140a06121b9565b5b6140ad84828501613f79565b91505092915050565b60006060820190506140cb60008301866129d3565b81810360208301526140dd818561295c565b905081810360408301526140f1818461274f565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614135826127d4565b9150614140836127d4565b9250826141505761414f6140fb565b5b828204905092915050565b6000614166826127d4565b9150614171836127d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141aa576141a9613110565b5b828202905092915050565b60006040820190506141ca6000830185613a6e565b6141d760208301846127de565b939250505056fea2646970667358221220dd0921e9f09665e92a2edcd352d2fd7e77bb0a715530e88b4aa8d6386069179164736f6c63430008080033", + "numDeployments": 1, + "solcInputHash": "2c77e4990a5e02143cdaa02b8820ef1d", + "metadata": "{\"compiler\":{\"version\":\"0.8.8+commit.dddeac2f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"boostRelayUrl_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"PeekerReverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"SuaveError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"SuaveErrorWithData\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"Suave.DataId\",\"name\":\"dataId\",\"type\":\"bytes16\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"decryptionCondition\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"allowedPeekers\",\"type\":\"address[]\"}],\"name\":\"DataRecordEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockLimit\",\"type\":\"uint256\"}],\"name\":\"RequestAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"egp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"blockHash\",\"type\":\"string\"}],\"name\":\"RequestIncluded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"RequestRemoved\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"slot\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"proposerPubkey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"parent\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"random\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"index\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"validator\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"Address\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"amount\",\"type\":\"uint64\"}],\"internalType\":\"struct Suave.Withdrawal[]\",\"name\":\"withdrawals\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"extra\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"parentBeaconBlockRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"fillPending\",\"type\":\"bool\"}],\"internalType\":\"struct Suave.BuildBlockArgs\",\"name\":\"blockArgs\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"blockHeight\",\"type\":\"uint64\"}],\"name\":\"buildBlock\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"builderCall\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"includedRequestB\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"pendingRemovalsB\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"nextHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConfidentialControl.UnlockArgs\",\"name\":\"uArgs\",\"type\":\"tuple\"}],\"name\":\"buildCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"builder\",\"outputs\":[{\"internalType\":\"contract Builder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"blockLimit\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"}],\"name\":\"buyAd\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"blockLimit\",\"type\":\"uint256\"},{\"internalType\":\"Suave.DataId\",\"name\":\"paymentBidId\",\"type\":\"bytes16\"}],\"internalType\":\"struct BlockAdAuctionV2.AdRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"nextHash\",\"type\":\"bytes32\"}],\"internalType\":\"struct ConfidentialControl.UnlockArgs\",\"name\":\"uArgs\",\"type\":\"tuple\"}],\"name\":\"buyAdCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nextHash\",\"type\":\"bytes32\"},{\"internalType\":\"Suave.DataId\",\"name\":\"sBidId\",\"type\":\"bytes16\"}],\"name\":\"ccCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"confidentialConstructor\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Suave.DataId\",\"name\":\"id\",\"type\":\"bytes16\"},{\"internalType\":\"Suave.DataId\",\"name\":\"salt\",\"type\":\"bytes16\"},{\"internalType\":\"uint64\",\"name\":\"decryptionCondition\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"allowedPeekers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"allowedStores\",\"type\":\"address[]\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"internalType\":\"struct Suave.DataRecord\",\"name\":\"dataRecord\",\"type\":\"tuple\"}],\"name\":\"emitDataRecord\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fetchConfidentialBundleData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"requests\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"blockLimit\",\"type\":\"uint256\"},{\"internalType\":\"Suave.DataId\",\"name\":\"paymentBidId\",\"type\":\"bytes16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/blockad/BlockAdV2.sol\":\"BlockAdAuctionV2\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/blockad/BlockAdV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { AnyBundleContract, Suave } from \\\"../standard_peekers/bids.sol\\\";\\nimport { ConfidentialControl } from \\\"./lib/ConfidentialControl.sol\\\";\\nimport { DynamicUintArray } from \\\"./lib/Utils.sol\\\";\\nimport { Builder } from \\\"./lib/Builder.sol\\\";\\n\\n\\ncontract BlockAdAuctionV2 is AnyBundleContract, ConfidentialControl {\\n\\tusing DynamicUintArray for bytes;\\n\\n\\tstruct AdRequest {\\n\\t\\tuint id;\\n\\t\\tstring extra;\\n\\t\\tuint blockLimit;\\n\\t\\tSuave.DataId paymentBidId;\\n\\t}\\n\\tstruct Offer {\\n\\t\\tuint id;\\n\\t\\tstring extra;\\n\\t\\tuint64 egp;\\n\\t\\tbytes paymentBundle;\\n\\t}\\n\\n\\tevent RequestAdded(uint indexed id, string extra, uint blockLimit);\\n\\tevent RequestRemoved(uint indexed id);\\n\\tevent RequestIncluded(uint indexed id, uint64 egp, string blockHash);\\n\\n\\tstring internal constant PB_NAMESPACE = \\\"blockad:v0:paymentBundle\\\";\\n\\tstring internal constant EB_NAMESPACE = \\\"default:v0:ethBundles\\\";\\n\\tstring internal constant EB_SIM_NAMESPACE = \\\"default:v0:ethBundleSimResults\\\";\\n\\tBuilder public builder;\\n\\tAdRequest[] public requests;\\n\\tuint public nextId;\\n\\n\\t/**********************************************************************\\n\\t * \\u26d3\\ufe0f ON-CHAIN METHODS *\\n\\t ***********************************************************************/\\n\\n\\tconstructor(string memory boostRelayUrl_) {\\n\\t\\tbuilder = new Builder(boostRelayUrl_);\\n\\t}\\n\\n\\tfunction buyAdCallback(AdRequest calldata request, UnlockArgs calldata uArgs) external unlock(uArgs) {\\n\\t\\trequests.push(request);\\n\\t\\tnextId++;\\n\\t\\temit RequestAdded(request.id, request.extra, request.blockLimit);\\n\\t}\\n\\n\\tfunction buildCallback(\\n\\t\\tbytes memory builderCall,\\n\\t\\tbytes memory includedRequestB,\\n\\t\\tbytes memory pendingRemovalsB,\\n\\t\\tUnlockArgs calldata uArgs\\n\\t) external unlock(uArgs) {\\n\\t\\tif (pendingRemovalsB.length > 0) {\\n\\t\\t\\tremoveRequests(pendingRemovalsB.export());\\n\\t\\t}\\n\\t\\tstring memory blockHash = handleBuilderCallback(address(builder), builderCall);\\n\\t\\thandleIncludedRequest(includedRequestB, blockHash);\\n\\t}\\n\\n\\tfunction requestsLength() public view returns (uint) {\\n\\t\\treturn requests.length;\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udd12 CONFIDENTIAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction confidentialConstructor() public view override onlyConfidential returns (bytes memory) {\\n\\t\\treturn ConfidentialControl.confidentialConstructor();\\n\\t}\\n\\n\\tfunction buyAd(uint64 blockLimit, string memory extra) external onlyConfidential returns (bytes memory) {\\n\\t\\tbytes memory paymentBundle = this.fetchConfidentialBundleData();\\n\\t\\t(,uint64 egp) = simulateBundleSafe(paymentBundle, true);\\n\\t\\tcrequire(egp > 0, \\\"egp too low\\\");\\n\\t\\tSuave.DataId paymentBidId = storePaymentBundle(paymentBundle);\\n\\t\\tAdRequest memory request = AdRequest(nextId, extra, blockLimit, paymentBidId);\\n\\t\\treturn abi.encodeWithSelector(this.buyAdCallback.selector, request, getUnlockPair());\\n\\t}\\n\\n\\tfunction buildBlock(\\n\\t\\tSuave.BuildBlockArgs memory blockArgs,\\n\\t\\tuint64 blockHeight\\n\\t) public onlyConfidential returns (bytes memory) {\\n\\t\\tcrequire(requests.length > 0, \\\"No requests\\\");\\n\\t\\t(Offer memory bestOffer, bytes memory removals) = filterOffers(blockHeight);\\n\\t\\tcrequire(bestOffer.egp > 0, \\\"No valid offers\\\");\\n\\n\\t\\tstoreBundleInPool(blockHeight, bestOffer);\\n\\t\\tblockArgs.extra = bytes(bestOffer.extra);\\n\\t\\t// Expect flow is ordered by egp; if one wants to fail payment they need higher egp\\n\\t\\tbytes memory externalCallback = builder.buildFromPool(blockArgs, blockHeight);\\n\\n\\t\\treturn\\n\\t\\t\\tabi.encodeWithSelector(\\n\\t\\t\\t\\tthis.buildCallback.selector,\\n\\t\\t\\t\\texternalCallback,\\n\\t\\t\\t\\tabi.encode(bestOffer.id, bestOffer.egp),\\n\\t\\t\\t\\tremovals,\\n\\t\\t\\t\\tgetUnlockPair()\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udee0\\ufe0f INTERNAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction removeRequests(uint[] memory pendingRemovals) internal {\\n\\t\\t// Assume that the pendingRemovals were added in ascending order\\n\\t\\t// Assume that pendingRemovals.length <= requests.length\\n\\t\\tfor (uint i = pendingRemovals.length; i > 0; --i) {\\n\\t\\t\\tuint indexToRemove = pendingRemovals[i - 1];\\n\\t\\t\\tuint requestId = requests[indexToRemove].id;\\n\\t\\t\\tif (indexToRemove < requests.length - 1) {\\n\\t\\t\\t\\trequests[indexToRemove] = requests[requests.length - 1];\\n\\t\\t\\t}\\n\\t\\t\\trequests.pop();\\n\\t\\t\\temit RequestRemoved(requestId);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction handleIncludedRequest(bytes memory includedRequestB, string memory blockHash) internal {\\n\\t\\t(uint id, uint64 egp) = abi.decode(includedRequestB, (uint, uint64));\\n\\t\\temit RequestIncluded(id, egp, blockHash);\\n\\t}\\n\\n\\tfunction handleBuilderCallback(address target, bytes memory data) internal returns (string memory) {\\n\\t\\t(bool success, bytes memory res) = target.call(data);\\n\\t\\tcrequire(success, \\\"External call failed\\\");\\n\\t\\treturn abi.decode(res, (string));\\n\\t}\\n\\n\\tfunction storePaymentBundle(bytes memory paymentBundle) internal view returns (Suave.DataId) {\\n\\t\\taddress[] memory peekers = new address[](1);\\n\\t\\tpeekers[0] = address(this);\\n\\t\\tSuave.DataRecord memory paymentBid = Suave.newDataRecord(0, peekers, peekers, PB_NAMESPACE);\\n\\t\\tSuave.confidentialStore(paymentBid.id, PB_NAMESPACE, paymentBundle);\\n\\t\\treturn paymentBid.id;\\n\\t}\\n\\n\\tfunction filterOffers(uint blockHeight) internal view returns (Offer memory bestOffer, bytes memory removals) {\\n\\t\\tfor (uint i; i < requests.length; ++i) {\\n\\t\\t\\tAdRequest memory request = requests[i];\\n\\t\\t\\tif (request.blockLimit < blockHeight) {\\n\\t\\t\\t\\tremovals = removals.append(i);\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\t\\t\\tbytes memory paymentBundle = Suave.confidentialRetrieve(request.paymentBidId, PB_NAMESPACE);\\n\\t\\t\\t(bool success, uint64 egp) = simulateBundleSafe(paymentBundle, false);\\n\\t\\t\\tif (!success || egp == 0) {\\n\\t\\t\\t\\tremovals = removals.append(i);\\n\\t\\t\\t} else if (egp > bestOffer.egp) {\\n\\t\\t\\t\\tbestOffer = Offer(request.id, request.extra, egp, paymentBundle);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tfunction storeBundleInPool(uint64 blockHeight, Offer memory bestOffer) internal view {\\n\\t\\taddress[] memory allowedPeekers = new address[](3);\\n\\t\\tallowedPeekers[0] = address(builder);\\n\\t\\tallowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\\n\\t\\tallowedPeekers[2] = address(this);\\n\\t\\tSuave.DataRecord memory paymentBundleBid = Suave.newDataRecord(\\n\\t\\t\\tblockHeight, \\n\\t\\t\\tallowedPeekers, \\n\\t\\t\\tallowedPeekers, \\n\\t\\t\\tEB_NAMESPACE\\n\\t\\t);\\n\\t\\tSuave.confidentialStore(paymentBundleBid.id, EB_NAMESPACE, bestOffer.paymentBundle);\\n\\t\\tSuave.confidentialStore(paymentBundleBid.id, EB_SIM_NAMESPACE, abi.encode(bestOffer.egp));\\n\\t}\\n}\\n\",\"keccak256\":\"0xb86119584a051b85338532cf92a2dbd58c334e632ef1962c3da0434f11eec203\",\"license\":\"MIT\"},\"contracts/blockad/lib/Builder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { EthBlockContract, Suave } from \\\"../../standard_peekers/bids.sol\\\";\\nimport { SuaveContract } from \\\"./SuaveContract.sol\\\";\\n\\n\\ncontract Builder is EthBlockContract, SuaveContract {\\n\\tstring constant BB_NAMESPACE = \\\"blockad:v0:builderBid\\\";\\n\\tstring boostRelayUrl;\\n\\n\\tevent RelaySubmission(bytes32 bidId);\\n\\n\\tconstructor(string memory boostRelayUrl_) {\\n\\t\\tboostRelayUrl = boostRelayUrl_;\\n\\t}\\n\\n\\tfunction buildAndEmitCallback(string memory blockHash, bytes32 id) external returns (string memory) {\\n\\t\\temit RelaySubmission(id);\\n\\t\\treturn blockHash;\\n\\t}\\n\\n\\tfunction buildAndEmit(\\n\\t\\tSuave.BuildBlockArgs memory blockArgs,\\n\\t\\tuint64 blockHeight,\\n\\t\\tSuave.DataId[] memory bids,\\n\\t\\tstring memory namespace\\n\\t) public virtual override onlyConfidential returns (bytes memory) {\\n\\t\\t(Suave.DataRecord memory blockBid, bytes memory builderBid) = this.doBuild(blockArgs, blockHeight, bids, namespace);\\n\\t\\tstoreBuilderBid(blockBid.id, builderBid);\\n\\t\\tsubmitToRelay(builderBid);\\n\\t\\tstring memory blockHash = extractBlockHash(builderBid, blockArgs.slot);\\n\\t\\treturn abi.encodeWithSelector(this.buildAndEmitCallback.selector, blockHash, keccak256(builderBid));\\n\\t}\\n\\n\\tfunction submitBlock(uint slot) external view onlyConfidential returns (bytes memory) {\\n\\t\\tbytes memory builderBid = Suave.confidentialInputs();\\n\\t\\tsubmitToRelay(builderBid);\\n\\t\\tstring memory blockHash = extractBlockHash(builderBid, slot);\\n\\t\\treturn abi.encodeWithSelector(this.buildAndEmitCallback.selector, blockHash, keccak256(builderBid));\\n\\t}\\n\\n\\tfunction submitToRelay(bytes memory builderBid) internal view {\\n\\t\\t(bool success, bytes memory data) = Suave.SUBMIT_ETH_BLOCK_BID_TO_RELAY\\n\\t\\t\\t.staticcall(abi.encode(boostRelayUrl, builderBid));\\n\\t\\tif (!success) {\\n\\t\\t\\trevert SuaveErrorWithData(string(data), builderBid);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction storeBuilderBid(Suave.DataId blockBidId, bytes memory builderBid) internal view {\\n\\t\\taddress[] memory peekers = new address[](1);\\n\\t\\tpeekers[0] = address(this);\\n\\t\\tSuave.confidentialStore(blockBidId, BB_NAMESPACE, builderBid);\\n\\t}\\n\\n\\t// Extract block-hash from stringified SubmitBlockRequest JSON object - method will fail if the struct changes!\\n\\tfunction extractBlockHash(bytes memory builderBid, uint slot) public pure returns (string memory) {\\n\\t\\tuint resultBytesLen = 64;\\n\\t\\tuint offset = 121 + decLen(slot);\\n\\t\\tbytes memory result = new bytes(resultBytesLen);\\n\\t\\tassembly {\\n\\t\\t\\tfor { let i:=32 } lt(i, add(resultBytesLen, 32)) { i:=add(i, 32) } {\\n\\t\\t\\t\\tmstore(add(result, i), mload(add(builderBid, add(offset, i))))\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n\\n\\tfunction decLen(uint num) internal pure returns (uint count) {\\n\\t\\tassembly {\\n\\t\\t\\tfor { let dec := 10 } true { dec := mul(dec, 10) } {\\n\\t\\t\\t\\tcount := add(count, 1)\\n\\t\\t\\t\\tswitch lt(num, dec)\\n\\t\\t\\t\\t\\tcase 1 { break }\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\",\"keccak256\":\"0xef71aa4ebf2e13c292016769e52df249ac1c0617a9aaeb47087a566f934639ef\",\"license\":\"MIT\"},\"contracts/blockad/lib/ConfidentialControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { SuaveContract, Suave } from \\\"./SuaveContract.sol\\\";\\n\\n\\nabstract contract ConfidentialControl is SuaveContract {\\n\\tstruct UnlockArgs {\\n\\t\\tbytes32 key;\\n\\t\\tbytes32 nextHash;\\n\\t}\\n\\n\\tmodifier unlock(UnlockArgs calldata unlockPair) {\\n\\t\\tcrequire(isValidKey(unlockPair.key), \\\"Invalid key\\\");\\n\\t\\t_;\\n\\t\\tpresentHash = unlockPair.nextHash;\\n\\t\\tnonce++;\\n\\t}\\n\\n\\tstring internal constant S_NAMESPACE = \\\"blockad:v0:secret\\\";\\n\\tSuave.DataId internal secretBidId;\\n\\tbytes32 internal presentHash;\\n\\tuint internal nonce;\\n\\n\\t/**********************************************************************\\n\\t * \\u26d3\\ufe0f ON-CHAIN METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction ccCallback(bytes32 nextHash, Suave.DataId sBidId) external {\\n\\t\\tcrequire(!isInitialized(), \\\"Already initialized\\\");\\n\\t\\tpresentHash = nextHash;\\n\\t\\tsecretBidId = sBidId;\\n\\t}\\n\\n\\tfunction isInitialized() public view returns (bool) {\\n\\t\\treturn presentHash != 0;\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udd12 CONFIDENTIAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction confidentialConstructor() public view virtual onlyConfidential returns (bytes memory) {\\n\\t\\tcrequire(!isInitialized(), \\\"Already initialized\\\");\\n\\t\\tbytes memory secret = Suave.confidentialInputs();\\n\\t\\tSuave.DataId sBidId = storeSecret(secret);\\n\\t\\tbytes32 nextHash = makeHash(abi.decode(secret, (bytes32)), nonce);\\n\\t\\treturn abi.encodeWithSelector(this.ccCallback.selector, nextHash, sBidId);\\n\\t}\\n\\n\\t/**********************************************************************\\n\\t * \\ud83d\\udee0\\ufe0f INTERNAL METHODS *\\n\\t ***********************************************************************/\\n\\n\\tfunction storeSecret(bytes memory secret) internal view returns (Suave.DataId) {\\n\\t\\taddress[] memory peekers = new address[](3);\\n\\t\\tpeekers[0] = address(this);\\n\\t\\tpeekers[1] = Suave.FETCH_DATA_RECORDS;\\n\\t\\tpeekers[2] = Suave.CONFIDENTIAL_RETRIEVE;\\n\\t\\tSuave.DataRecord memory secretBid = Suave.newDataRecord(0, peekers, peekers, S_NAMESPACE);\\n\\t\\tSuave.confidentialStore(secretBid.id, S_NAMESPACE, secret);\\n\\t\\treturn secretBid.id;\\n\\t}\\n\\n\\tfunction isValidKey(bytes32 key) internal view returns (bool) {\\n\\t\\treturn keccak256(abi.encode(key)) == presentHash;\\n\\t}\\n\\n\\tfunction getUnlockPair() internal view returns (UnlockArgs memory) {\\n\\t\\treturn UnlockArgs(getKey(nonce), getHash(nonce + 1));\\n\\t}\\n\\n\\tfunction getHash(uint _nonce) internal view returns (bytes32) {\\n\\t\\treturn keccak256(abi.encode(getKey(_nonce)));\\n\\t}\\n\\n\\tfunction getKey(uint _nonce) internal view returns (bytes32) {\\n\\t\\treturn makeKey(getSecret(), _nonce);\\n\\t}\\n\\n\\tfunction makeHash(bytes32 secret, uint _nonce) internal pure returns (bytes32) {\\n\\t\\treturn keccak256(abi.encode(makeKey(secret, _nonce)));\\n\\t}\\n\\n\\tfunction makeKey(bytes32 secret, uint _nonce) internal pure returns (bytes32) {\\n\\t\\treturn keccak256(abi.encode(secret, _nonce));\\n\\t}\\n\\n\\tfunction getSecret() internal view returns (bytes32) {\\n\\t\\tbytes memory secretB = Suave.confidentialRetrieve(secretBidId, S_NAMESPACE);\\n\\t\\treturn abi.decode(secretB, (bytes32));\\n\\t}\\n}\\n\",\"keccak256\":\"0x49ac0b4b3dbbe2e58f29454ae8586b6bf97105ad52d2b001867b4930da959217\",\"license\":\"MIT\"},\"contracts/blockad/lib/SuaveContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Author: Miha Lotric (halo3mic)\\n\\npragma solidity ^0.8.8;\\n\\nimport { Suave } from \\\"../../standard_peekers/bids.sol\\\";\\n\\n\\nabstract contract SuaveContract {\\n\\terror SuaveError(string message);\\n\\terror SuaveErrorWithData(string message, bytes data);\\n\\n\\tmodifier onlyConfidential() {\\n\\t\\tcrequire(Suave.isConfidential(), \\\"Not confidential\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\tfunction simulateBundleSafe(bytes memory bundle, bool doRevert) internal view returns (bool valid, uint64 egp) {\\n\\t\\t(bool success, bytes memory d) = Suave.SIMULATE_BUNDLE.staticcall{ gas: 20_000 }(abi.encode(bundle));\\n\\t\\tcrequire(!doRevert || success, string(d));\\n\\t\\tif (success) {\\n\\t\\t\\treturn (true, abi.decode(d, (uint64)));\\n\\t\\t}\\n\\t}\\n\\n\\tfunction crequire(bool condition, string memory message) internal pure {\\n\\t\\tif (!condition) {\\n\\t\\t\\trevert SuaveError(message);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x64eb01469afe18f29050571acd52ee35faca1da2c00a87e01d5ea0fdbcdf4bec\",\"license\":\"MIT\"},\"contracts/blockad/lib/Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.8;\\n\\n\\nlibrary DynamicUintArray {\\n\\tfunction append(bytes memory a, uint e) internal pure returns (bytes memory) {\\n\\t\\treturn bytes.concat(a, TypeConversion.toBytes(e));\\n\\t}\\n\\n\\tfunction export(bytes memory a) internal pure returns (uint[] memory) {\\n\\t\\treturn TypeConversion.toUints(a);\\n\\t}\\n}\\n\\nlibrary TypeConversion {\\n\\tfunction toBytes(uint x) internal pure returns (bytes memory y) {\\n\\t\\ty = new bytes(32);\\n\\t\\tassembly {\\n\\t\\t\\tmstore(add(y, 32), x)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction toUint(bytes memory x, uint offset) internal pure returns (uint y) {\\n\\t\\tassembly {\\n\\t\\t\\ty := mload(add(x, offset))\\n\\t\\t}\\n\\t}\\n\\n\\tfunction toUints(bytes memory xs) internal pure returns (uint[] memory ys) {\\n\\t\\tys = new uint[](xs.length / 32);\\n\\t\\tfor (uint i = 0; i < xs.length / 32; i++) {\\n\\t\\t\\tys[i] = toUint(xs, i * 32 + 32);\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xec09eed9c1d6d24228b0473b9614be28b428ed832808ac3a75ffbcb444ac54af\",\"license\":\"MIT\"},\"contracts/libraries/Suave.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.8;\\n\\nlibrary Suave {\\n error PeekerReverted(address, bytes);\\n\\n type DataId is bytes16;\\n\\n struct BuildBlockArgs {\\n uint64 slot;\\n bytes proposerPubkey;\\n bytes32 parent;\\n uint64 timestamp;\\n address feeRecipient;\\n uint64 gasLimit;\\n bytes32 random;\\n Withdrawal[] withdrawals;\\n bytes extra;\\n bytes32 parentBeaconBlockRoot;\\n bool fillPending;\\n }\\n\\n struct DataRecord {\\n DataId id;\\n DataId salt;\\n uint64 decryptionCondition;\\n address[] allowedPeekers;\\n address[] allowedStores;\\n string version;\\n }\\n\\n struct HttpRequest {\\n string url;\\n string method;\\n string[] headers;\\n bytes body;\\n }\\n\\n struct Withdrawal {\\n uint64 index;\\n uint64 validator;\\n address Address;\\n uint64 amount;\\n }\\n\\n address public constant ANYALLOWED = 0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829;\\n\\n address public constant IS_CONFIDENTIAL_ADDR = 0x0000000000000000000000000000000042010000;\\n\\n address public constant BUILD_ETH_BLOCK = 0x0000000000000000000000000000000042100001;\\n\\n address public constant CONFIDENTIAL_INPUTS = 0x0000000000000000000000000000000042010001;\\n\\n address public constant CONFIDENTIAL_RETRIEVE = 0x0000000000000000000000000000000042020001;\\n\\n address public constant CONFIDENTIAL_STORE = 0x0000000000000000000000000000000042020000;\\n\\n address public constant DO_HTTPREQUEST = 0x0000000000000000000000000000000043200002;\\n\\n address public constant ETHCALL = 0x0000000000000000000000000000000042100003;\\n\\n address public constant EXTRACT_HINT = 0x0000000000000000000000000000000042100037;\\n\\n address public constant FETCH_DATA_RECORDS = 0x0000000000000000000000000000000042030001;\\n\\n address public constant FILL_MEV_SHARE_BUNDLE = 0x0000000000000000000000000000000043200001;\\n\\n address public constant NEW_DATA_RECORD = 0x0000000000000000000000000000000042030000;\\n\\n address public constant SIGN_ETH_TRANSACTION = 0x0000000000000000000000000000000040100001;\\n\\n address public constant SIMULATE_BUNDLE = 0x0000000000000000000000000000000042100000;\\n\\n address public constant SUBMIT_BUNDLE_JSON_RPC = 0x0000000000000000000000000000000043000001;\\n\\n address public constant SUBMIT_ETH_BLOCK_BID_TO_RELAY = 0x0000000000000000000000000000000042100002;\\n\\n // Returns whether execution is off- or on-chain\\n function isConfidential() internal view returns (bool b) {\\n (bool success, bytes memory isConfidentialBytes) = IS_CONFIDENTIAL_ADDR.staticcall(\\\"\\\");\\n if (!success) {\\n revert PeekerReverted(IS_CONFIDENTIAL_ADDR, isConfidentialBytes);\\n }\\n assembly {\\n // Load the length of data (first 32 bytes)\\n let len := mload(isConfidentialBytes)\\n // Load the data after 32 bytes, so add 0x20\\n b := mload(add(isConfidentialBytes, 0x20))\\n }\\n }\\n\\n function buildEthBlock(BuildBlockArgs memory blockArgs, DataId dataId, string memory namespace)\\n internal\\n view\\n returns (bytes memory, bytes memory)\\n {\\n (bool success, bytes memory data) = BUILD_ETH_BLOCK.staticcall(abi.encode(blockArgs, dataId, namespace));\\n if (!success) {\\n revert PeekerReverted(BUILD_ETH_BLOCK, data);\\n }\\n\\n return abi.decode(data, (bytes, bytes));\\n }\\n\\n function confidentialInputs() internal view returns (bytes memory) {\\n (bool success, bytes memory data) = CONFIDENTIAL_INPUTS.staticcall(abi.encode());\\n if (!success) {\\n revert PeekerReverted(CONFIDENTIAL_INPUTS, data);\\n }\\n\\n return data;\\n }\\n\\n function confidentialRetrieve(DataId dataId, string memory key) internal view returns (bytes memory) {\\n (bool success, bytes memory data) = CONFIDENTIAL_RETRIEVE.staticcall(abi.encode(dataId, key));\\n if (!success) {\\n revert PeekerReverted(CONFIDENTIAL_RETRIEVE, data);\\n }\\n\\n return data;\\n }\\n\\n function confidentialStore(DataId dataId, string memory key, bytes memory data1) internal view {\\n (bool success, bytes memory data) = CONFIDENTIAL_STORE.staticcall(abi.encode(dataId, key, data1));\\n if (!success) {\\n revert PeekerReverted(CONFIDENTIAL_STORE, data);\\n }\\n }\\n\\n function doHTTPRequest(HttpRequest memory request) internal view returns (bytes memory) {\\n (bool success, bytes memory data) = DO_HTTPREQUEST.staticcall(abi.encode(request));\\n if (!success) {\\n revert PeekerReverted(DO_HTTPREQUEST, data);\\n }\\n\\n return abi.decode(data, (bytes));\\n }\\n\\n function ethcall(address contractAddr, bytes memory input1) internal view returns (bytes memory) {\\n (bool success, bytes memory data) = ETHCALL.staticcall(abi.encode(contractAddr, input1));\\n if (!success) {\\n revert PeekerReverted(ETHCALL, data);\\n }\\n\\n return abi.decode(data, (bytes));\\n }\\n\\n function extractHint(bytes memory bundleData) internal view returns (bytes memory) {\\n require(isConfidential());\\n (bool success, bytes memory data) = EXTRACT_HINT.staticcall(abi.encode(bundleData));\\n if (!success) {\\n revert PeekerReverted(EXTRACT_HINT, data);\\n }\\n\\n return data;\\n }\\n\\n function fetchDataRecords(uint64 cond, string memory namespace) internal view returns (DataRecord[] memory) {\\n (bool success, bytes memory data) = FETCH_DATA_RECORDS.staticcall(abi.encode(cond, namespace));\\n if (!success) {\\n revert PeekerReverted(FETCH_DATA_RECORDS, data);\\n }\\n\\n return abi.decode(data, (DataRecord[]));\\n }\\n\\n function fillMevShareBundle(DataId dataId) internal view returns (bytes memory) {\\n require(isConfidential());\\n (bool success, bytes memory data) = FILL_MEV_SHARE_BUNDLE.staticcall(abi.encode(dataId));\\n if (!success) {\\n revert PeekerReverted(FILL_MEV_SHARE_BUNDLE, data);\\n }\\n\\n return data;\\n }\\n\\n function newDataRecord(\\n uint64 decryptionCondition,\\n address[] memory allowedPeekers,\\n address[] memory allowedStores,\\n string memory dataType\\n ) internal view returns (DataRecord memory) {\\n (bool success, bytes memory data) =\\n NEW_DATA_RECORD.staticcall(abi.encode(decryptionCondition, allowedPeekers, allowedStores, dataType));\\n if (!success) {\\n revert PeekerReverted(NEW_DATA_RECORD, data);\\n }\\n\\n return abi.decode(data, (DataRecord));\\n }\\n\\n function signEthTransaction(bytes memory txn, string memory chainId, string memory signingKey)\\n internal\\n view\\n returns (bytes memory)\\n {\\n (bool success, bytes memory data) = SIGN_ETH_TRANSACTION.staticcall(abi.encode(txn, chainId, signingKey));\\n if (!success) {\\n revert PeekerReverted(SIGN_ETH_TRANSACTION, data);\\n }\\n\\n return abi.decode(data, (bytes));\\n }\\n\\n function simulateBundle(bytes memory bundleData) internal view returns (uint64) {\\n (bool success, bytes memory data) = SIMULATE_BUNDLE.staticcall(abi.encode(bundleData));\\n if (!success) {\\n revert PeekerReverted(SIMULATE_BUNDLE, data);\\n }\\n\\n return abi.decode(data, (uint64));\\n }\\n\\n function submitBundleJsonRPC(string memory url, string memory method, bytes memory params)\\n internal\\n view\\n returns (bytes memory)\\n {\\n require(isConfidential());\\n (bool success, bytes memory data) = SUBMIT_BUNDLE_JSON_RPC.staticcall(abi.encode(url, method, params));\\n if (!success) {\\n revert PeekerReverted(SUBMIT_BUNDLE_JSON_RPC, data);\\n }\\n\\n return data;\\n }\\n\\n function submitEthBlockBidToRelay(string memory relayUrl, bytes memory builderBid)\\n internal\\n view\\n returns (bytes memory)\\n {\\n require(isConfidential());\\n (bool success, bytes memory data) = SUBMIT_ETH_BLOCK_BID_TO_RELAY.staticcall(abi.encode(relayUrl, builderBid));\\n if (!success) {\\n revert PeekerReverted(SUBMIT_ETH_BLOCK_BID_TO_RELAY, data);\\n }\\n\\n return data;\\n }\\n}\\n\",\"keccak256\":\"0x429caee8b64a203c3bfeac588d431e38939a15cab57f8185cc108af3f2961ca4\",\"license\":\"UNLICENSED\"},\"contracts/standard_peekers/bids.sol\":{\"content\":\"pragma solidity ^0.8.8;\\n\\nimport \\\"../libraries/Suave.sol\\\";\\n\\ncontract AnyBundleContract {\\n event DataRecordEvent(Suave.DataId dataId, uint64 decryptionCondition, address[] allowedPeekers);\\n\\n function fetchConfidentialBundleData() public returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n bytes memory confidentialInputs = Suave.confidentialInputs();\\n return abi.decode(confidentialInputs, (bytes));\\n }\\n\\n function emitDataRecord(Suave.DataRecord calldata dataRecord) public {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n }\\n}\\n\\ncontract BundleContract is AnyBundleContract {\\n function newBundle(\\n uint64 decryptionCondition,\\n address[] memory dataAllowedPeekers,\\n address[] memory dataAllowedStores\\n ) external payable returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n bytes memory bundleData = this.fetchConfidentialBundleData();\\n\\n uint64 egp = Suave.simulateBundle(bundleData);\\n\\n Suave.DataRecord memory dataRecord =\\n Suave.newDataRecord(decryptionCondition, dataAllowedPeekers, dataAllowedStores, \\\"default:v0:ethBundles\\\");\\n\\n Suave.confidentialStore(dataRecord.id, \\\"default:v0:ethBundles\\\", bundleData);\\n Suave.confidentialStore(dataRecord.id, \\\"default:v0:ethBundleSimResults\\\", abi.encode(egp));\\n\\n return emitAndReturn(dataRecord, bundleData);\\n }\\n\\n function emitAndReturn(Suave.DataRecord memory dataRecord, bytes memory) internal virtual returns (bytes memory) {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n return bytes.concat(this.emitDataRecord.selector, abi.encode(dataRecord));\\n }\\n}\\n\\ncontract EthBundleSenderContract is BundleContract {\\n string[] public builderUrls;\\n\\n constructor(string[] memory builderUrls_) {\\n builderUrls = builderUrls_;\\n }\\n\\n function emitAndReturn(Suave.DataRecord memory dataRecord, bytes memory bundleData)\\n internal\\n virtual\\n override\\n returns (bytes memory)\\n {\\n for (uint256 i = 0; i < builderUrls.length; i++) {\\n Suave.submitBundleJsonRPC(builderUrls[i], \\\"eth_sendBundle\\\", bundleData);\\n }\\n\\n return BundleContract.emitAndReturn(dataRecord, bundleData);\\n }\\n}\\n\\ncontract MevShareContract is AnyBundleContract {\\n event HintEvent(Suave.DataId dataId, bytes hint);\\n\\n event MatchEvent(Suave.DataId matchDataId, bytes matchHint);\\n\\n function newTransaction(\\n uint64 decryptionCondition,\\n address[] memory dataAllowedPeekers,\\n address[] memory dataAllowedStores\\n ) external payable returns (bytes memory) {\\n // 0. check confidential execution\\n require(Suave.isConfidential());\\n\\n // 1. fetch bundle data\\n bytes memory bundleData = this.fetchConfidentialBundleData();\\n\\n // 2. sim bundle\\n uint64 egp = Suave.simulateBundle(bundleData);\\n\\n // 3. extract hint\\n bytes memory hint = Suave.extractHint(bundleData);\\n\\n // // 4. store bundle and sim results\\n Suave.DataRecord memory dataRecord = Suave.newDataRecord(\\n decryptionCondition, dataAllowedPeekers, dataAllowedStores, \\\"mevshare:v0:unmatchedBundles\\\"\\n );\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundles\\\", bundleData);\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundleSimResults\\\", abi.encode(egp));\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n emit HintEvent(dataRecord.id, hint);\\n\\n // // 5. return \\\"callback\\\" to emit hint onchain\\n return bytes.concat(this.emitDataRecordAndHint.selector, abi.encode(dataRecord, hint));\\n }\\n\\n function emitDataRecordAndHint(Suave.DataRecord calldata dataRecord, bytes memory hint) public {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n emit HintEvent(dataRecord.id, hint);\\n }\\n\\n function newMatch(\\n uint64 decryptionCondition,\\n address[] memory dataAllowedPeekers,\\n address[] memory dataAllowedStores,\\n Suave.DataId sharedataId\\n ) external payable returns (bytes memory) {\\n // WARNING : this function will copy the original mev share bid\\n // into a new key with potentially different permsissions\\n\\n require(Suave.isConfidential());\\n // 1. fetch confidential data\\n bytes memory matchBundleData = this.fetchConfidentialBundleData();\\n\\n // 2. sim match alone for validity\\n uint64 egp = Suave.simulateBundle(matchBundleData);\\n\\n // 3. extract hint\\n bytes memory matchHint = Suave.extractHint(matchBundleData);\\n\\n Suave.DataRecord memory dataRecord = Suave.newDataRecord(\\n decryptionCondition, dataAllowedPeekers, dataAllowedStores, \\\"mevshare:v0:matchDataRecords\\\"\\n );\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundles\\\", matchBundleData);\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:ethBundleSimResults\\\", abi.encode(0));\\n\\n //4. merge data records\\n Suave.DataId[] memory dataRecords = new Suave.DataId[](2);\\n dataRecords[0] = sharedataId;\\n dataRecords[1] = dataRecord.id;\\n Suave.confidentialStore(dataRecord.id, \\\"mevshare:v0:mergedDataRecords\\\", abi.encode(dataRecords));\\n\\n return emitMatchDataRecordAndHint(dataRecord, matchHint);\\n }\\n\\n function emitMatchDataRecordAndHint(Suave.DataRecord memory dataRecord, bytes memory matchHint)\\n internal\\n virtual\\n returns (bytes memory)\\n {\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n emit MatchEvent(dataRecord.id, matchHint);\\n\\n return bytes.concat(this.emitDataRecord.selector, abi.encode(dataRecord));\\n }\\n}\\n\\ncontract MevShareBundleSenderContract is MevShareContract {\\n string[] public builderUrls;\\n\\n constructor(string[] memory builderUrls_) {\\n builderUrls = builderUrls_;\\n }\\n\\n function emitMatchDataRecordAndHint(Suave.DataRecord memory dataRecord, bytes memory matchHint)\\n internal\\n virtual\\n override\\n returns (bytes memory)\\n {\\n bytes memory bundleData = Suave.fillMevShareBundle(dataRecord.id);\\n for (uint256 i = 0; i < builderUrls.length; i++) {\\n Suave.submitBundleJsonRPC(builderUrls[i], \\\"mev_sendBundle\\\", bundleData);\\n }\\n\\n return MevShareContract.emitMatchDataRecordAndHint(dataRecord, matchHint);\\n }\\n}\\n\\n/* Not tested or implemented on the precompile side */\\nstruct EgpRecordPair {\\n uint64 egp; // in wei, beware overflow\\n Suave.DataId dataId;\\n}\\n\\ncontract EthBlockContract is AnyBundleContract {\\n event BuilderBoostBidEvent(Suave.DataId dataId, bytes builderBid);\\n\\n function idsEqual(Suave.DataId _l, Suave.DataId _r) public pure returns (bool) {\\n bytes memory l = abi.encodePacked(_l);\\n bytes memory r = abi.encodePacked(_r);\\n for (uint256 i = 0; i < l.length; i++) {\\n if (bytes(l)[i] != r[i]) {\\n return false;\\n }\\n }\\n\\n return true;\\n }\\n\\n function buildMevShare(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n Suave.DataRecord[] memory allShareMatchDataRecords =\\n Suave.fetchDataRecords(blockHeight, \\\"mevshare:v0:matchDataRecords\\\");\\n Suave.DataRecord[] memory allShareUserDataRecords =\\n Suave.fetchDataRecords(blockHeight, \\\"mevshare:v0:unmatchedBundles\\\");\\n\\n if (allShareUserDataRecords.length == 0) {\\n revert Suave.PeekerReverted(address(this), \\\"no data records\\\");\\n }\\n\\n Suave.DataRecord[] memory allRecords = new Suave.DataRecord[](allShareUserDataRecords.length);\\n for (uint256 i = 0; i < allShareUserDataRecords.length; i++) {\\n // TODO: sort matches by egp first!\\n Suave.DataRecord memory dataRecordToInsert = allShareUserDataRecords[i]; // will be updated with the best match if any\\n for (uint256 j = 0; j < allShareMatchDataRecords.length; j++) {\\n // TODO: should be done once at the start and sorted\\n Suave.DataId[] memory mergeddataIds = abi.decode(\\n Suave.confidentialRetrieve(allShareMatchDataRecords[j].id, \\\"mevshare:v0:mergedDataRecords\\\"),\\n (Suave.DataId[])\\n );\\n if (idsEqual(mergeddataIds[0], allShareUserDataRecords[i].id)) {\\n dataRecordToInsert = allShareMatchDataRecords[j];\\n break;\\n }\\n }\\n allRecords[i] = dataRecordToInsert;\\n }\\n\\n EgpRecordPair[] memory bidsByEGP = new EgpRecordPair[](allRecords.length);\\n for (uint256 i = 0; i < allRecords.length; i++) {\\n bytes memory simResults = Suave.confidentialRetrieve(allRecords[i].id, \\\"mevshare:v0:ethBundleSimResults\\\");\\n uint64 egp = abi.decode(simResults, (uint64));\\n bidsByEGP[i] = EgpRecordPair(egp, allRecords[i].id);\\n }\\n\\n // Bubble sort, cause why not\\n uint256 n = bidsByEGP.length;\\n for (uint256 i = 0; i < n - 1; i++) {\\n for (uint256 j = i + 1; j < n; j++) {\\n if (bidsByEGP[i].egp < bidsByEGP[j].egp) {\\n EgpRecordPair memory temp = bidsByEGP[i];\\n bidsByEGP[i] = bidsByEGP[j];\\n bidsByEGP[j] = temp;\\n }\\n }\\n }\\n\\n Suave.DataId[] memory alldataIds = new Suave.DataId[](allRecords.length);\\n for (uint256 i = 0; i < bidsByEGP.length; i++) {\\n alldataIds[i] = bidsByEGP[i].dataId;\\n }\\n\\n return buildAndEmit(blockArgs, blockHeight, alldataIds, \\\"mevshare:v0\\\");\\n }\\n\\n function buildFromPool(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n Suave.DataRecord[] memory allRecords = Suave.fetchDataRecords(blockHeight, \\\"default:v0:ethBundles\\\");\\n if (allRecords.length == 0) {\\n revert Suave.PeekerReverted(address(this), \\\"no data records\\\");\\n }\\n\\n EgpRecordPair[] memory bidsByEGP = new EgpRecordPair[](allRecords.length);\\n for (uint256 i = 0; i < allRecords.length; i++) {\\n bytes memory simResults = Suave.confidentialRetrieve(allRecords[i].id, \\\"default:v0:ethBundleSimResults\\\");\\n uint64 egp = abi.decode(simResults, (uint64));\\n bidsByEGP[i] = EgpRecordPair(egp, allRecords[i].id);\\n }\\n\\n // Bubble sort, cause why not\\n uint256 n = bidsByEGP.length;\\n for (uint256 i = 0; i < n - 1; i++) {\\n for (uint256 j = i + 1; j < n; j++) {\\n if (bidsByEGP[i].egp < bidsByEGP[j].egp) {\\n EgpRecordPair memory temp = bidsByEGP[i];\\n bidsByEGP[i] = bidsByEGP[j];\\n bidsByEGP[j] = temp;\\n }\\n }\\n }\\n\\n Suave.DataId[] memory alldataIds = new Suave.DataId[](allRecords.length);\\n for (uint256 i = 0; i < bidsByEGP.length; i++) {\\n alldataIds[i] = bidsByEGP[i].dataId;\\n }\\n\\n return buildAndEmit(blockArgs, blockHeight, alldataIds, \\\"\\\");\\n }\\n\\n function buildAndEmit(\\n Suave.BuildBlockArgs memory blockArgs,\\n uint64 blockHeight,\\n Suave.DataId[] memory records,\\n string memory namespace\\n ) public virtual returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n (Suave.DataRecord memory blockBid, bytes memory builderBid) =\\n this.doBuild(blockArgs, blockHeight, records, namespace);\\n\\n emit BuilderBoostBidEvent(blockBid.id, builderBid);\\n emit DataRecordEvent(blockBid.id, blockBid.decryptionCondition, blockBid.allowedPeekers);\\n return bytes.concat(this.emitBuilderBidAndBid.selector, abi.encode(blockBid, builderBid));\\n }\\n\\n function doBuild(\\n Suave.BuildBlockArgs memory blockArgs,\\n uint64 blockHeight,\\n Suave.DataId[] memory records,\\n string memory namespace\\n ) public view returns (Suave.DataRecord memory, bytes memory) {\\n address[] memory allowedPeekers = new address[](2);\\n allowedPeekers[0] = address(this);\\n allowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\\n\\n Suave.DataRecord memory blockBid =\\n Suave.newDataRecord(blockHeight, allowedPeekers, allowedPeekers, \\\"default:v0:mergedDataRecords\\\");\\n Suave.confidentialStore(blockBid.id, \\\"default:v0:mergedDataRecords\\\", abi.encode(records));\\n\\n (bytes memory builderBid, bytes memory payload) = Suave.buildEthBlock(blockArgs, blockBid.id, namespace);\\n Suave.confidentialStore(blockBid.id, \\\"default:v0:builderPayload\\\", payload); // only through this.unlock\\n\\n return (blockBid, builderBid);\\n }\\n\\n function emitBuilderBidAndBid(Suave.DataRecord memory dataRecord, bytes memory builderBid)\\n public\\n returns (Suave.DataRecord memory, bytes memory)\\n {\\n emit BuilderBoostBidEvent(dataRecord.id, builderBid);\\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\\n return (dataRecord, builderBid);\\n }\\n\\n function unlock(Suave.DataId dataId, bytes memory signedBlindedHeader) public view returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n // TODO: verify the header is correct\\n // TODO: incorporate protocol name\\n bytes memory payload = Suave.confidentialRetrieve(dataId, \\\"default:v0:builderPayload\\\");\\n return payload;\\n }\\n}\\n\\ncontract EthBlockBidSenderContract is EthBlockContract {\\n string boostRelayUrl;\\n\\n constructor(string memory boostRelayUrl_) {\\n boostRelayUrl = boostRelayUrl_;\\n }\\n\\n function buildAndEmit(\\n Suave.BuildBlockArgs memory blockArgs,\\n uint64 blockHeight,\\n Suave.DataId[] memory dataRecords,\\n string memory namespace\\n ) public virtual override returns (bytes memory) {\\n require(Suave.isConfidential());\\n\\n (Suave.DataRecord memory blockDataRecord, bytes memory builderBid) =\\n this.doBuild(blockArgs, blockHeight, dataRecords, namespace);\\n Suave.submitEthBlockBidToRelay(boostRelayUrl, builderBid);\\n\\n emit DataRecordEvent(blockDataRecord.id, blockDataRecord.decryptionCondition, blockDataRecord.allowedPeekers);\\n return bytes.concat(this.emitDataRecord.selector, abi.encode(blockDataRecord));\\n }\\n}\\n\",\"keccak256\":\"0x7d8b6ebf763b86b5c7404d41d5ba39d19db206418782be279018354de23965fc\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200898738038062008987833981810160405281019062000037919062000262565b806040516200004690620000b7565b62000052919062000310565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000334565b614404806200458383390190565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200012e82620000e3565b810181811067ffffffffffffffff8211171562000150576200014f620000f4565b5b80604052505050565b600062000165620000c5565b905062000173828262000123565b919050565b600067ffffffffffffffff821115620001965762000195620000f4565b5b620001a182620000e3565b9050602081019050919050565b60005b83811015620001ce578082015181840152602081019050620001b1565b83811115620001de576000848401525b50505050565b6000620001fb620001f58462000178565b62000159565b9050828152602081018484840111156200021a5762000219620000de565b5b62000227848285620001ae565b509392505050565b600082601f830112620002475762000246620000d9565b5b815162000259848260208601620001e4565b91505092915050565b6000602082840312156200027b576200027a620000cf565b5b600082015167ffffffffffffffff8111156200029c576200029b620000d4565b5b620002aa848285016200022f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000620002dc82620002b3565b620002e88185620002be565b9350620002fa818560208601620001ae565b6200030581620000e3565b840191505092915050565b600060208201905081810360008301526200032c8184620002cf565b905092915050565b61423f80620003446000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063bb7bae0a1161008c578063ee2cc36411610066578063ee2cc36414610203578063fd38f21d1461021f578063ff4aec7d1461024f578063ffbbfcb01461026d576100cf565b8063bb7bae0a146101ad578063bcbb3597146101c9578063d7e84fbf146101e5576100cf565b8063060b0d17146100d4578063392e53cd1461010457806361b8ce8c1461012257806364e65a62146101405780637e48532c1461015c57806381d12c581461017a575b600080fd5b6100ee60048036038101906100e991906126ba565b61028b565b6040516100fb919061279e565b60405180910390f35b61010c61050b565b60405161011991906127cf565b60405180910390f35b61012a61051b565b6040516101379190612803565b60405180910390f35b61015a60048036038101906101559190612842565b610521565b005b6101646105ee565b604051610171919061279e565b60405180910390f35b610194600480360381019061018f9190612929565b610643565b6040516101a494939291906129f8565b60405180910390f35b6101c760048036038101906101c29190612a70565b61070b565b005b6101e360048036038101906101de9190612acf565b610777565b005b6101ed6107ee565b6040516101fa9190612b77565b60405180910390f35b61021d60048036038101906102189190612bb1565b610814565b005b61023960048036038101906102349190612cae565b61092c565b604051610246919061279e565b60405180910390f35b610257610b35565b604051610264919061279e565b60405180910390f35b610275610b6e565b6040516102829190612803565b60405180910390f35b60606102d3610298610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61031a6000600480549050116040518060400160405280600b81526020017f4e6f207265717565737473000000000000000000000000000000000000000000815250610c43565b6000806103308467ffffffffffffffff16610c89565b915091506103846000836040015167ffffffffffffffff16116040518060400160405280600f81526020017f4e6f2076616c6964206f66666572730000000000000000000000000000000000815250610c43565b61038e8483610ed3565b81602001518561010001819052506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dac44aef87876040518363ffffffff1660e01b81526004016103fb929190612fa0565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104529190613040565b90506364e65a6260e01b8184600001518560400151604051602001610478929190613089565b6040516020818303038152906040528461049061112e565b6040516024016104a394939291906130e1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505092915050565b60008060001b6001541415905090565b60055481565b8061056d6105328260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b60008351111561058957610588610583846111a4565b6111b6565b5b60006105b7600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611377565b90506105c38582611445565b508060200135600181905550600260008154809291906105e29061316a565b91905055505050505050565b60606106366105fb610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61063e6114a0565b905090565b6004818154811061065357600080fd5b906000526020600020906004020160009150905080600001549080600101805461067c906131e2565b80601f01602080910402602001604051908101604052809291908181526020018280546106a8906131e2565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050908060020154908060030154905084565b61075261071661050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b81600181905550806000816fffffffffffffffffffffffffffffffff19169055505050565b7ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4781600001356fffffffffffffffffffffffffffffffff19168260400160208101906107c39190613214565b8380606001906107d39190613250565b6040516107e39493929190613367565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806108606108258260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b6004839080600181540180825580915050600190039060005260206000209060040201600090919091909150818161089891906137ea565b5050600560008154809291906108ad9061316a565b919050555082600001357fbf51327c63fb3c8741d4233ae0315e3e1a74641532f4e59c307f72314a3462358480602001906108e8919061345b565b86604001356040516108fc93929190613825565b60405180910390a28060200135600181905550600260008154809291906109229061316a565b9190505550505050565b6060610974610939610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b60003073ffffffffffffffffffffffffffffffffffffffff1663ff4aec7d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109fb9190613040565b90506000610a0a8260016115eb565b915050610a5960008267ffffffffffffffff16116040518060400160405280600b81526020017f65677020746f6f206c6f77000000000000000000000000000000000000000000815250610c43565b6000610a64836116c6565b90506000604051806080016040528060055481526020018781526020018867ffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff1916815250905063ee2cc36460e01b81610abb61112e565b604051602401610acc929190613922565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505094505050505092915050565b6060610b3f610b7b565b610b4857600080fd5b6000610b526117fc565b905080806020019051810190610b689190613040565b91505090565b6000600480549050905090565b6000806000634201000073ffffffffffffffffffffffffffffffffffffffff16604051610ba790613983565b600060405180830381855afa9150503d8060008114610be2576040519150601f19603f3d011682016040523d82523d6000602084013e610be7565b606091505b509150915081610c34576342010000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401610c2b9291906139a7565b60405180910390fd5b80516020820151935050505090565b81610c8557806040517f0c25cd98000000000000000000000000000000000000000000000000000000008152600401610c7c91906139d7565b60405180910390fd5b5050565b610c91612008565b606060005b600480549050811015610ecd57600060048281548110610cb957610cb86139f9565b5b906000526020600020906004020160405180608001604052908160008201548152602001600182018054610cec906131e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d18906131e2565b8015610d655780601f10610d3a57610100808354040283529160200191610d65565b820191906000526020600020905b815481529060010190602001808311610d4857829003601f168201915b505050505081526020016002820154815260200160038201546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff19168152505090508481604001511015610dd157610dc982846118d390919063ffffffff16565b925050610ebc565b6000610e1682606001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c650000000000000000815250611907565b9050600080610e268360006115eb565b91509150811580610e41575060008167ffffffffffffffff16145b15610e6057610e5985876118d390919063ffffffff16565b9550610eb7565b866040015167ffffffffffffffff168167ffffffffffffffff161115610eb657604051806080016040528085600001518152602001856020015181526020018267ffffffffffffffff1681526020018481525096505b5b505050505b80610ec69061316a565b9050610c96565b50915091565b6000600367ffffffffffffffff811115610ef057610eef6121d4565b5b604051908082528060200260200182016040528015610f1e5781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110610f5857610f576139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634210000181600181518110610fab57610faa6139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600281518110610ffa57610ff96139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006110778483846040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152506119ee565b90506110c181600001516040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152508560600151611af4565b61112881600001516040518060400160405280601e81526020017f64656661756c743a76303a65746842756e646c6553696d526573756c7473000081525085604001516040516020016111149190613a28565b604051602081830303815290604052611af4565b50505050565b61113661203a565b604051806040016040528061114c600254611bd7565b815260200161116860016002546111639190613a43565b611bf1565b815250905090565b6000600154826040516020016111869190613aa8565b60405160208183030381529060405280519060200120149050919050565b60606111af82611c29565b9050919050565b6000815190505b6000811115611373576000826001836111d69190613ac3565b815181106111e7576111e66139f9565b5b60200260200101519050600060048281548110611207576112066139f9565b5b9060005260206000209060040201600001549050600160048054905061122d9190613ac3565b8210156112e057600460016004805490506112489190613ac3565b81548110611259576112586139f9565b5b90600052602060002090600402016004838154811061127b5761127a6139f9565b5b90600052602060002090600402016000820154816000015560018201816001019080546112a7906131e2565b6112b292919061205a565b5060028201548160020155600382015481600301906fffffffffffffffffffffffffffffffff191690559050505b60048054806112f2576112f1613af7565b5b600190038181906000526020600020906004020160008082016000905560018201600061131f91906120e7565b6002820160009055600382016000905550509055807f5fa4d8243d9549d33d615899224efcef51bfcacb970a31f68862ce74c858dbf060405160405180910390a250508061136c90613b26565b90506111bd565b5050565b60606000808473ffffffffffffffffffffffffffffffffffffffff16846040516113a19190613b81565b6000604051808303816000865af19150503d80600081146113de576040519150601f19603f3d011682016040523d82523d6000602084013e6113e3565b606091505b5091509150611427826040518060400160405280601481526020017f45787465726e616c2063616c6c206661696c6564000000000000000000000000815250610c43565b8080602001905181019061143b9190613c08565b9250505092915050565b6000808380602001905181019061145c9190613c7b565b91509150817f91badfc611f9ad79e4d6a58176e5c4cedc4f8ed9001447825f503e792bbf09e28285604051611492929190613cbb565b60405180910390a250505050565b60606114e86114ad610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61152f6114f361050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b60006115396117fc565b9050600061154682611cf4565b90506000611569838060200190518101906115619190613d00565b600254611ed0565b905063bb7bae0a60e01b8183604051602401611586929190613d2d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505090565b600080600080634210000073ffffffffffffffffffffffffffffffffffffffff16614e2087604051602001611620919061279e565b60405160208183030381529060405260405161163c9190613b81565b6000604051808303818686fa925050503d8060008114611678576040519150601f19603f3d011682016040523d82523d6000602084013e61167d565b606091505b509150915061169585158061168f5750825b82610c43565b81156116bc576001818060200190518101906116b19190613d56565b9350935050506116bf565b50505b9250929050565b600080600167ffffffffffffffff8111156116e4576116e36121d4565b5b6040519080825280602002602001820160405280156117125781602001602082028036833780820191505090505b509050308160008151811061172a576117296139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006117a8600083846040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c6500000000000000008152506119ee565b90506117ee81600001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c65000000000000000081525086611af4565b806000015192505050919050565b6060600080634201000173ffffffffffffffffffffffffffffffffffffffff1660405160200160405160208183030381529060405260405161183e9190613b81565b600060405180830381855afa9150503d8060008114611879576040519150601f19603f3d011682016040523d82523d6000602084013e61187e565b606091505b5091509150816118cb576342010001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016118c29291906139a7565b60405180910390fd5b809250505090565b6060826118df83611f0a565b6040516020016118f0929190613d83565b604051602081830303815290604052905092915050565b6060600080634202000173ffffffffffffffffffffffffffffffffffffffff16858560405160200161193a929190613da7565b6040516020818303038152906040526040516119569190613b81565b600060405180830381855afa9150503d8060008114611991576040519150601f19603f3d011682016040523d82523d6000602084013e611996565b606091505b5091509150816119e3576342020001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016119da9291906139a7565b60405180910390fd5b809250505092915050565b6119f6612127565b600080634203000073ffffffffffffffffffffffffffffffffffffffff1687878787604051602001611a2b9493929190613e5d565b604051602081830303815290604052604051611a479190613b81565b600060405180830381855afa9150503d8060008114611a82576040519150601f19603f3d011682016040523d82523d6000602084013e611a87565b606091505b509150915081611ad4576342030000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611acb9291906139a7565b60405180910390fd5b80806020019051810190611ae89190614098565b92505050949350505050565b600080634202000073ffffffffffffffffffffffffffffffffffffffff16858585604051602001611b27939291906140e1565b604051602081830303815290604052604051611b439190613b81565b600060405180830381855afa9150503d8060008114611b7e576040519150601f19603f3d011682016040523d82523d6000602084013e611b83565b606091505b509150915081611bd0576342020000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611bc79291906139a7565b60405180910390fd5b5050505050565b6000611bea611be4611f67565b83611fc7565b9050919050565b6000611bfc82611bd7565b604051602001611c0c9190613aa8565b604051602081830303815290604052805190602001209050919050565b606060208251611c399190614155565b67ffffffffffffffff811115611c5257611c516121d4565b5b604051908082528060200260200182016040528015611c805781602001602082028036833780820191505090505b50905060005b60208351611c949190614155565b811015611cee57611cbc8360208084611cad9190614186565b611cb79190613a43565b611ffa565b828281518110611ccf57611cce6139f9565b5b6020026020010181815250508080611ce69061316a565b915050611c86565b50919050565b600080600367ffffffffffffffff811115611d1257611d116121d4565b5b604051908082528060200260200182016040528015611d405781602001602082028036833780820191505090505b5090503081600081518110611d5857611d576139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634203000181600181518110611dab57611daa6139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634202000181600281518110611dfe57611dfd6139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000611e7c600083846040518060400160405280601181526020017f626c6f636b61643a76303a7365637265740000000000000000000000000000008152506119ee565b9050611ec281600001516040518060400160405280601181526020017f626c6f636b61643a76303a73656372657400000000000000000000000000000081525086611af4565b806000015192505050919050565b6000611edc8383611fc7565b604051602001611eec9190613aa8565b60405160208183030381529060405280519060200120905092915050565b6060602067ffffffffffffffff811115611f2757611f266121d4565b5b6040519080825280601f01601f191660200182016040528015611f595781602001600182028036833780820191505090505b509050816020820152919050565b600080611fab6000546040518060400160405280601181526020017f626c6f636b61643a76303a736563726574000000000000000000000000000000815250611907565b905080806020019051810190611fc19190613d00565b91505090565b60008282604051602001611fdc9291906141e0565b60405160208183030381529060405280519060200120905092915050565b600081830151905092915050565b60405180608001604052806000815260200160608152602001600067ffffffffffffffff168152602001606081525090565b604051806040016040528060008019168152602001600080191681525090565b828054612066906131e2565b90600052602060002090601f01602090048101928261208857600085556120d6565b82601f1061209957805485556120d6565b828001600101855582156120d657600052602060002091601f016020900482015b828111156120d55782548255916001019190600101906120ba565b5b5090506120e3919061218d565b5090565b5080546120f3906131e2565b6000825580601f106121055750612124565b601f016020900490600052602060002090810190612123919061218d565b5b50565b6040518060c0016040528060006fffffffffffffffffffffffffffffffff1916815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b5b808211156121a657600081600090555060010161218e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61220c826121c3565b810181811067ffffffffffffffff8211171561222b5761222a6121d4565b5b80604052505050565b600061223e6121aa565b905061224a8282612203565b919050565b600080fd5b600067ffffffffffffffff82169050919050565b61227181612254565b811461227c57600080fd5b50565b60008135905061228e81612268565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156122b9576122b86121d4565b5b6122c2826121c3565b9050602081019050919050565b82818337600083830152505050565b60006122f16122ec8461229e565b612234565b90508281526020810184848401111561230d5761230c612299565b5b6123188482856122cf565b509392505050565b600082601f83011261233557612334612294565b5b81356123458482602086016122de565b91505092915050565b6000819050919050565b6123618161234e565b811461236c57600080fd5b50565b60008135905061237e81612358565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123af82612384565b9050919050565b6123bf816123a4565b81146123ca57600080fd5b50565b6000813590506123dc816123b6565b92915050565b600067ffffffffffffffff8211156123fd576123fc6121d4565b5b602082029050602081019050919050565b600080fd5b600060808284031215612429576124286121be565b5b6124336080612234565b905060006124438482850161227f565b60008301525060206124578482850161227f565b602083015250604061246b848285016123cd565b604083015250606061247f8482850161227f565b60608301525092915050565b600061249e612499846123e2565b612234565b905080838252602082019050608084028301858111156124c1576124c061240e565b5b835b818110156124ea57806124d68882612413565b8452602084019350506080810190506124c3565b5050509392505050565b600082601f83011261250957612508612294565b5b813561251984826020860161248b565b91505092915050565b60008115159050919050565b61253781612522565b811461254257600080fd5b50565b6000813590506125548161252e565b92915050565b60006101608284031215612571576125706121be565b5b61257c610160612234565b9050600061258c8482850161227f565b600083015250602082013567ffffffffffffffff8111156125b0576125af61224f565b5b6125bc84828501612320565b60208301525060406125d08482850161236f565b60408301525060606125e48482850161227f565b60608301525060806125f8848285016123cd565b60808301525060a061260c8482850161227f565b60a08301525060c06126208482850161236f565b60c08301525060e082013567ffffffffffffffff8111156126445761264361224f565b5b612650848285016124f4565b60e08301525061010082013567ffffffffffffffff8111156126755761267461224f565b5b61268184828501612320565b610100830152506101206126978482850161236f565b610120830152506101406126ad84828501612545565b6101408301525092915050565b600080604083850312156126d1576126d06121b4565b5b600083013567ffffffffffffffff8111156126ef576126ee6121b9565b5b6126fb8582860161255a565b925050602061270c8582860161227f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612750578082015181840152602081019050612735565b8381111561275f576000848401525b50505050565b600061277082612716565b61277a8185612721565b935061278a818560208601612732565b612793816121c3565b840191505092915050565b600060208201905081810360008301526127b88184612765565b905092915050565b6127c981612522565b82525050565b60006020820190506127e460008301846127c0565b92915050565b6000819050919050565b6127fd816127ea565b82525050565b600060208201905061281860008301846127f4565b92915050565b600080fd5b6000604082840312156128395761283861281e565b5b81905092915050565b60008060008060a0858703121561285c5761285b6121b4565b5b600085013567ffffffffffffffff81111561287a576128796121b9565b5b61288687828801612320565b945050602085013567ffffffffffffffff8111156128a7576128a66121b9565b5b6128b387828801612320565b935050604085013567ffffffffffffffff8111156128d4576128d36121b9565b5b6128e087828801612320565b92505060606128f187828801612823565b91505092959194509250565b612906816127ea565b811461291157600080fd5b50565b600081359050612923816128fd565b92915050565b60006020828403121561293f5761293e6121b4565b5b600061294d84828501612914565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061297d82612956565b6129878185612961565b9350612997818560208601612732565b6129a0816121c3565b840191505092915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006129e2826129ab565b9050919050565b6129f2816129d7565b82525050565b6000608082019050612a0d60008301876127f4565b8181036020830152612a1f8186612972565b9050612a2e60408301856127f4565b612a3b60608301846129e9565b95945050505050565b612a4d816129ab565b8114612a5857600080fd5b50565b600081359050612a6a81612a44565b92915050565b60008060408385031215612a8757612a866121b4565b5b6000612a958582860161236f565b9250506020612aa685828601612a5b565b9150509250929050565b600060c08284031215612ac657612ac561281e565b5b81905092915050565b600060208284031215612ae557612ae46121b4565b5b600082013567ffffffffffffffff811115612b0357612b026121b9565b5b612b0f84828501612ab0565b91505092915050565b6000819050919050565b6000612b3d612b38612b3384612384565b612b18565b612384565b9050919050565b6000612b4f82612b22565b9050919050565b6000612b6182612b44565b9050919050565b612b7181612b56565b82525050565b6000602082019050612b8c6000830184612b68565b92915050565b600060808284031215612ba857612ba761281e565b5b81905092915050565b60008060608385031215612bc857612bc76121b4565b5b600083013567ffffffffffffffff811115612be657612be56121b9565b5b612bf285828601612b92565b9250506020612c0385828601612823565b9150509250929050565b600067ffffffffffffffff821115612c2857612c276121d4565b5b612c31826121c3565b9050602081019050919050565b6000612c51612c4c84612c0d565b612234565b905082815260208101848484011115612c6d57612c6c612299565b5b612c788482856122cf565b509392505050565b600082601f830112612c9557612c94612294565b5b8135612ca5848260208601612c3e565b91505092915050565b60008060408385031215612cc557612cc46121b4565b5b6000612cd38582860161227f565b925050602083013567ffffffffffffffff811115612cf457612cf36121b9565b5b612d0085828601612c80565b9150509250929050565b612d1381612254565b82525050565b600082825260208201905092915050565b6000612d3582612716565b612d3f8185612d19565b9350612d4f818560208601612732565b612d58816121c3565b840191505092915050565b612d6c8161234e565b82525050565b612d7b816123a4565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612dc36000850182612d0a565b506020820151612dd66020850182612d0a565b506040820151612de96040850182612d72565b506060820151612dfc6060850182612d0a565b50505050565b6000612e0e8383612dad565b60808301905092915050565b6000602082019050919050565b6000612e3282612d81565b612e3c8185612d8c565b9350612e4783612d9d565b8060005b83811015612e78578151612e5f8882612e02565b9750612e6a83612e1a565b925050600181019050612e4b565b5085935050505092915050565b612e8e81612522565b82525050565b600061016083016000830151612ead6000860182612d0a565b5060208301518482036020860152612ec58282612d2a565b9150506040830151612eda6040860182612d63565b506060830151612eed6060860182612d0a565b506080830151612f006080860182612d72565b5060a0830151612f1360a0860182612d0a565b5060c0830151612f2660c0860182612d63565b5060e083015184820360e0860152612f3e8282612e27565b915050610100830151848203610100860152612f5a8282612d2a565b915050610120830151612f71610120860182612d63565b50610140830151612f86610140860182612e85565b508091505092915050565b612f9a81612254565b82525050565b60006040820190508181036000830152612fba8185612e94565b9050612fc96020830184612f91565b9392505050565b6000612fe3612fde8461229e565b612234565b905082815260208101848484011115612fff57612ffe612299565b5b61300a848285612732565b509392505050565b600082601f83011261302757613026612294565b5b8151613037848260208601612fd0565b91505092915050565b600060208284031215613056576130556121b4565b5b600082015167ffffffffffffffff811115613074576130736121b9565b5b61308084828501613012565b91505092915050565b600060408201905061309e60008301856127f4565b6130ab6020830184612f91565b9392505050565b6040820160008201516130c86000850182612d63565b5060208201516130db6020850182612d63565b50505050565b600060a08201905081810360008301526130fb8187612765565b9050818103602083015261310f8186612765565b905081810360408301526131238185612765565b905061313260608301846130b2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613175826127ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131a8576131a761313b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131fa57607f821691505b6020821081141561320e5761320d6131b3565b5b50919050565b60006020828403121561322a576132296121b4565b5b60006132388482850161227f565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261326d5761326c613241565b5b80840192508235915067ffffffffffffffff82111561328f5761328e613246565b5b6020830192506020820236038313156132ab576132aa61324b565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b60006132da8383612d72565b60208301905092915050565b60006132f560208401846123cd565b905092915050565b6000602082019050919050565b600061331683856132b3565b9350613321826132c4565b8060005b8581101561335a5761333782846132e6565b61334188826132ce565b975061334c836132fd565b925050600181019050613325565b5085925050509392505050565b600060608201905061337c60008301876129e9565b6133896020830186612f91565b818103604083015261339c81848661330a565b905095945050505050565b600081356133b4816128fd565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6133f6846133bd565b9350801983169250808416831791505092915050565b600061342761342261341d846127ea565b612b18565b6127ea565b9050919050565b6000819050919050565b6134418261340c565b61345461344d8261342e565b83546133ca565b8255505050565b6000808335600160200384360303811261347857613477613241565b5b80840192508235915067ffffffffffffffff82111561349a57613499613246565b5b6020830192506001820236038313156134b6576134b561324b565b5b509250929050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261352b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134ee565b61353586836134ee565b95508019841693508086168417925050509392505050565b6135568361340c565b61356a6135628261342e565b8484546134fb565b825550505050565b600090565b61357f613572565b61358a81848461354d565b505050565b5b818110156135ae576135a3600082613577565b600181019050613590565b5050565b601f8211156135f3576135c4816134c9565b6135cd846134de565b810160208510156135dc578190505b6135f06135e8856134de565b83018261358f565b50505b505050565b600082821c905092915050565b6000613616600019846008026135f8565b1980831691505092915050565b600061362f8383613605565b9150826002028217905092915050565b61364983836134be565b67ffffffffffffffff811115613662576136616121d4565b5b61366c82546131e2565b6136778282856135b2565b6000601f8311600181146136a65760008415613694578287013590505b61369e8582613623565b865550613706565b601f1984166136b4866134c9565b60005b828110156136dc578489013582556001820191506020850194506020810190506136b7565b868310156136f957848901356136f5601f891682613605565b8355505b6001600288020188555050505b50505050505050565b61371a83838361363f565b505050565b6000813561372c81612a44565b80915050919050565b6000819050919050565b613748826129d7565b61375b61375482613735565b83546133ca565b8255505050565b600081016000830180613774816133a7565b90506137808184613438565b5050506001810160208301613795818561345b565b6137a081838661370f565b505050506002810160408301806137b6816133a7565b90506137c28184613438565b5050506003810160608301806137d78161371f565b90506137e3818461373f565b5050505050565b6137f48282613762565b5050565b60006138048385612961565b93506138118385846122cf565b61381a836121c3565b840190509392505050565b600060408201905081810360008301526138408185876137f8565b905061384f60208301846127f4565b949350505050565b613860816127ea565b82525050565b600082825260208201905092915050565b600061388282612956565b61388c8185613866565b935061389c818560208601612732565b6138a5816121c3565b840191505092915050565b6138b9816129d7565b82525050565b60006080830160008301516138d76000860182613857565b50602083015184820360208601526138ef8282613877565b91505060408301516139046040860182613857565b50606083015161391760608601826138b0565b508091505092915050565b6000606082019050818103600083015261393c81856138bf565b905061394b60208301846130b2565b9392505050565b600081905092915050565b50565b600061396d600083613952565b91506139788261395d565b600082019050919050565b600061398e82613960565b9150819050919050565b6139a1816123a4565b82525050565b60006040820190506139bc6000830185613998565b81810360208301526139ce8184612765565b90509392505050565b600060208201905081810360008301526139f18184612972565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082019050613a3d6000830184612f91565b92915050565b6000613a4e826127ea565b9150613a59836127ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8e57613a8d61313b565b5b828201905092915050565b613aa28161234e565b82525050565b6000602082019050613abd6000830184613a99565b92915050565b6000613ace826127ea565b9150613ad9836127ea565b925082821015613aec57613aeb61313b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613b31826127ea565b91506000821415613b4557613b4461313b565b5b600182039050919050565b6000613b5b82612716565b613b658185613952565b9350613b75818560208601612732565b80840191505092915050565b6000613b8d8284613b50565b915081905092915050565b6000613bab613ba684612c0d565b612234565b905082815260208101848484011115613bc757613bc6612299565b5b613bd2848285612732565b509392505050565b600082601f830112613bef57613bee612294565b5b8151613bff848260208601613b98565b91505092915050565b600060208284031215613c1e57613c1d6121b4565b5b600082015167ffffffffffffffff811115613c3c57613c3b6121b9565b5b613c4884828501613bda565b91505092915050565b600081519050613c60816128fd565b92915050565b600081519050613c7581612268565b92915050565b60008060408385031215613c9257613c916121b4565b5b6000613ca085828601613c51565b9250506020613cb185828601613c66565b9150509250929050565b6000604082019050613cd06000830185612f91565b8181036020830152613ce28184612972565b90509392505050565b600081519050613cfa81612358565b92915050565b600060208284031215613d1657613d156121b4565b5b6000613d2484828501613ceb565b91505092915050565b6000604082019050613d426000830185613a99565b613d4f60208301846129e9565b9392505050565b600060208284031215613d6c57613d6b6121b4565b5b6000613d7a84828501613c66565b91505092915050565b6000613d8f8285613b50565b9150613d9b8284613b50565b91508190509392505050565b6000604082019050613dbc60008301856129e9565b8181036020830152613dce8184612972565b90509392505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000613e0a82613dd7565b613e1481856132b3565b9350613e1f83613de2565b8060005b83811015613e50578151613e3788826132ce565b9750613e4283613df2565b925050600181019050613e23565b5085935050505092915050565b6000608082019050613e726000830187612f91565b8181036020830152613e848186613dff565b90508181036040830152613e988185613dff565b90508181036060830152613eac8184612972565b905095945050505050565b600081519050613ec681612a44565b92915050565b600067ffffffffffffffff821115613ee757613ee66121d4565b5b602082029050602081019050919050565b600081519050613f07816123b6565b92915050565b6000613f20613f1b84613ecc565b612234565b90508083825260208201905060208402830185811115613f4357613f4261240e565b5b835b81811015613f6c5780613f588882613ef8565b845260208401935050602081019050613f45565b5050509392505050565b600082601f830112613f8b57613f8a612294565b5b8151613f9b848260208601613f0d565b91505092915050565b600060c08284031215613fba57613fb96121be565b5b613fc460c0612234565b90506000613fd484828501613eb7565b6000830152506020613fe884828501613eb7565b6020830152506040613ffc84828501613c66565b604083015250606082015167ffffffffffffffff8111156140205761401f61224f565b5b61402c84828501613f76565b606083015250608082015167ffffffffffffffff8111156140505761404f61224f565b5b61405c84828501613f76565b60808301525060a082015167ffffffffffffffff8111156140805761407f61224f565b5b61408c84828501613bda565b60a08301525092915050565b6000602082840312156140ae576140ad6121b4565b5b600082015167ffffffffffffffff8111156140cc576140cb6121b9565b5b6140d884828501613fa4565b91505092915050565b60006060820190506140f660008301866129e9565b81810360208301526141088185612972565b9050818103604083015261411c8184612765565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614160826127ea565b915061416b836127ea565b92508261417b5761417a614126565b5b828204905092915050565b6000614191826127ea565b915061419c836127ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141d5576141d461313b565b5b828202905092915050565b60006040820190506141f56000830185613a99565b61420260208301846127f4565b939250505056fea264697066735822122034f98af89b41f53cdbb5e7c71b3745678f1ac236e88890aac447aa77b5f4c41064736f6c6343000808003360806040523480156200001157600080fd5b5060405162004404380380620044048339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b50506200035a565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b60208210811415620003545762000353620002f5565b5b50919050565b61409a806200036a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b33e471511610071578063b33e4715146101da578063bcbb35971461020b578063dac44aef14610227578063e48c31e014610257578063e829cd5d14610287578063ff4aec7d146102b7576100b4565b80634a3540c0146100b95780636a9cc4b3146100e957806373e9710f146101195780637df1cde214610149578063958adcdb14610179578063aa8c95a6146101aa575b600080fd5b6100d360048036038101906100ce9190612597565b6102d5565b6040516100e091906126da565b60405180910390f35b61010360048036038101906100fe9190612732565b610477565b60405161011091906127e3565b60405180910390f35b610133600480360381019061012e9190612805565b610519565b60405161014091906126da565b60405180910390f35b610163600480360381019061015e9190612832565b61060c565b60405161017091906126da565b60405180910390f35b610193600480360381019061018e9190612597565b61066c565b6040516101a1929190612a5d565b60405180910390f35b6101c460048036038101906101bf9190612a94565b61087b565b6040516101d191906126da565b60405180910390f35b6101f460048036038101906101ef9190612ca7565b610ec8565b604051610202929190612a5d565b60405180910390f35b61022560048036038101906102209190612d43565b610f63565b005b610241600480360381019061023c9190612a94565b610fda565b60405161024e91906126da565b60405180910390f35b610271600480360381019061026c9190612d8c565b611404565b60405161027e91906127e3565b60405180910390f35b6102a1600480360381019061029c9190612de8565b611446565b6040516102ae9190612e37565b60405180910390f35b6102bf61154d565b6040516102cc91906126da565b60405180910390f35b606061031d6102e2611586565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c0000000000000000000000000000000081525061164e565b6000803073ffffffffffffffffffffffffffffffffffffffff1663958adcdb888888886040518563ffffffff1660e01b815260040161035f9493929190613179565b60006040518083038186803b15801561037757600080fd5b505afa15801561038b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103b4919061347d565b915091506103c6826000015182611694565b6103cf81611776565b60006103e982896000015167ffffffffffffffff16610477565b905063e48c31e060e01b81838051906020012060405160240161040d929190613504565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509350505050949350505050565b6060600060409050600061048a84611852565b60796104969190613563565b905060008267ffffffffffffffff8111156104b4576104b3611ef5565b5b6040519080825280601f01601f1916602001820160405280156104e65781602001600182028036833780820191505090505b50905060205b6020840181101561050c57808301870151818301526020810190506104ec565b5080935050505092915050565b6060610561610526611586565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c0000000000000000000000000000000081525061164e565b600061056b61188c565b905061057681611776565b60006105828285610477565b905063e48c31e060e01b8183805190602001206040516024016105a6929190613504565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505092505050919050565b6060610616611586565b61061f57600080fd5b6000610660846040518060400160405280601981526020017f64656661756c743a76303a6275696c6465725061796c6f616400000000000000815250611963565b90508091505092915050565b610674611e2e565b60606000600267ffffffffffffffff81111561069357610692611ef5565b5b6040519080825280602002602001820160405280156106c15781602001602082028036833780820191505090505b50905030816000815181106106d9576106d86135b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505063421000018160018151811061072c5761072b6135b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006107a98783846040518060400160405280601c81526020017f64656661756c743a76303a6d6572676564446174615265636f72647300000000815250611a4a565b905061080e81600001516040518060400160405280601c81526020017f64656661756c743a76303a6d6572676564446174615265636f72647300000000815250886040516020016107fa91906135e8565b604051602081830303815290604052611b50565b6000806108208a846000015189611c33565b9150915061086883600001516040518060400160405280601981526020017f64656661756c743a76303a6275696c6465725061796c6f61640000000000000081525083611b50565b8282955095505050505094509492505050565b6060610885611586565b61088e57600080fd5b60006108cf836040518060400160405280601c81526020017f6d657673686172653a76303a6d61746368446174615265636f72647300000000815250611d34565b90506000610912846040518060400160405280601c81526020017f6d657673686172653a76303a756e6d61746368656442756e646c657300000000815250611d34565b905060008151141561095b57306040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016109529190613665565b60405180910390fd5b6000815167ffffffffffffffff81111561097857610977611ef5565b5b6040519080825280602002602001820160405280156109b157816020015b61099e611e2e565b8152602001906001900390816109965790505b50905060005b8251811015610b125760008382815181106109d5576109d46135b9565b5b6020026020010151905060005b8551811015610ade576000610a4a878381518110610a0357610a026135b9565b5b6020026020010151600001516040518060400160405280601d81526020017f6d657673686172653a76303a6d6572676564446174615265636f726473000000815250611963565b806020019051810190610a5d919061372a565b9050610aa281600081518110610a7657610a756135b9565b5b6020026020010151878681518110610a9157610a906135b9565b5b602002602001015160000151611446565b15610aca57868281518110610aba57610ab96135b9565b5b6020026020010151925050610ade565b508080610ad690613773565b9150506109e2565b5080838381518110610af357610af26135b9565b5b6020026020010181905250508080610b0a90613773565b9150506109b7565b506000815167ffffffffffffffff811115610b3057610b2f611ef5565b5b604051908082528060200260200182016040528015610b6957816020015b610b56611e94565b815260200190600190039081610b4e5790505b50905060005b8251811015610c74576000610bd7848381518110610b9057610b8f6135b9565b5b6020026020010151600001516040518060400160405280601f81526020017f6d657673686172653a76303a65746842756e646c6553696d526573756c747300815250611963565b9050600081806020019051810190610bef91906137bc565b905060405180604001604052808267ffffffffffffffff168152602001868581518110610c1f57610c1e6135b9565b5b6020026020010151600001516fffffffffffffffffffffffffffffffff1916815250848481518110610c5457610c536135b9565b5b602002602001018190525050508080610c6c90613773565b915050610b6f565b5060008151905060005b600182610c8b91906137e9565b811015610da4576000600182610ca19190613563565b90505b82811015610d9057838181518110610cbf57610cbe6135b9565b5b60200260200101516000015167ffffffffffffffff16848381518110610ce857610ce76135b9565b5b60200260200101516000015167ffffffffffffffff161015610d7d576000848381518110610d1957610d186135b9565b5b60200260200101519050848281518110610d3657610d356135b9565b5b6020026020010151858481518110610d5157610d506135b9565b5b602002602001018190525080858381518110610d7057610d6f6135b9565b5b6020026020010181905250505b8080610d8890613773565b915050610ca4565b508080610d9c90613773565b915050610c7e565b506000835167ffffffffffffffff811115610dc257610dc1611ef5565b5b604051908082528060200260200182016040528015610df05781602001602082028036833780820191505090505b50905060005b8351811015610e7857838181518110610e1257610e116135b9565b5b602002602001015160200151828281518110610e3157610e306135b9565b5b60200260200101906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff1916815250508080610e7090613773565b915050610df6565b50610eba8989836040518060400160405280600b81526020017f6d657673686172653a76300000000000000000000000000000000000000000008152506102d5565b965050505050505092915050565b610ed0611e2e565b60607f67fa9c16cd72410c4cc1d47205b31852a81ec5e92d1c8cebc3ecbe98ed67fe3f846000015184604051610f0792919061382c565b60405180910390a17ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb47846000015185604001518660600151604051610f4e939291906138cb565b60405180910390a18383915091509250929050565b7ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4781600001356fffffffffffffffffffffffffffffffff1916826040016020810190610faf9190613909565b838060600190610fbf9190613945565b604051610fcf9493929190613a33565b60405180910390a150565b6060610fe4611586565b610fed57600080fd5b600061102e836040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c65730000000000000000000000815250611d34565b905060008151141561107757306040517f75fff46700000000000000000000000000000000000000000000000000000000815260040161106e9190613665565b60405180910390fd5b6000815167ffffffffffffffff81111561109457611093611ef5565b5b6040519080825280602002602001820160405280156110cd57816020015b6110ba611e94565b8152602001906001900390816110b25790505b50905060005b82518110156111d857600061113b8483815181106110f4576110f36135b9565b5b6020026020010151600001516040518060400160405280601e81526020017f64656661756c743a76303a65746842756e646c6553696d526573756c74730000815250611963565b905060008180602001905181019061115391906137bc565b905060405180604001604052808267ffffffffffffffff168152602001868581518110611183576111826135b9565b5b6020026020010151600001516fffffffffffffffffffffffffffffffff19168152508484815181106111b8576111b76135b9565b5b6020026020010181905250505080806111d090613773565b9150506110d3565b5060008151905060005b6001826111ef91906137e9565b8110156113085760006001826112059190613563565b90505b828110156112f457838181518110611223576112226135b9565b5b60200260200101516000015167ffffffffffffffff1684838151811061124c5761124b6135b9565b5b60200260200101516000015167ffffffffffffffff1610156112e157600084838151811061127d5761127c6135b9565b5b6020026020010151905084828151811061129a576112996135b9565b5b60200260200101518584815181106112b5576112b46135b9565b5b6020026020010181905250808583815181106112d4576112d36135b9565b5b6020026020010181905250505b80806112ec90613773565b915050611208565b50808061130090613773565b9150506111e2565b506000835167ffffffffffffffff81111561132657611325611ef5565b5b6040519080825280602002602001820160405280156113545781602001602082028036833780820191505090505b50905060005b83518110156113dc57838181518110611376576113756135b9565b5b602002602001015160200151828281518110611395576113946135b9565b5b60200260200101906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505080806113d490613773565b91505061135a565b506113f8878783604051806020016040528060008152506102d5565b94505050505092915050565b60607f53e8ee078f2cd7d535018fdc18210ac92e4b70ee40542d1a43816dba5faae169826040516114359190613a73565b60405180910390a182905092915050565b6000808360405160200161145a9190613aaf565b604051602081830303815290604052905060008360405160200161147e9190613aaf565b604051602081830303815290604052905060005b825181101561153f578181815181106114ae576114ad6135b9565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168382815181106114ee576114ed6135b9565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461152c5760009350505050611547565b808061153790613773565b915050611492565b506001925050505b92915050565b6060611557611586565b61156057600080fd5b600061156a61188c565b9050808060200190518101906115809190613aca565b91505090565b6000806000634201000073ffffffffffffffffffffffffffffffffffffffff166040516115b290613b44565b600060405180830381855afa9150503d80600081146115ed576040519150601f19603f3d011682016040523d82523d6000602084013e6115f2565b606091505b50915091508161163f576342010000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611636929190613b59565b60405180910390fd5b80516020820151935050505090565b8161169057806040517f0c25cd9800000000000000000000000000000000000000000000000000000000815260040161168791906127e3565b60405180910390fd5b5050565b6000600167ffffffffffffffff8111156116b1576116b0611ef5565b5b6040519080825280602002602001820160405280156116df5781602001602082028036833780820191505090505b50905030816000815181106116f7576116f66135b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611771836040518060400160405280601581526020017f626c6f636b61643a76303a6275696c646572426964000000000000000000000081525084611b50565b505050565b600080634210000273ffffffffffffffffffffffffffffffffffffffff166000846040516020016117a8929190613c7f565b6040516020818303038152906040526040516117c49190613ce7565b600060405180830381855afa9150503d80600081146117ff576040519150601f19603f3d011682016040523d82523d6000602084013e611804565b606091505b50915091508161184d5780836040517fda3e641f000000000000000000000000000000000000000000000000000000008152600401611844929190613cfe565b60405180910390fd5b505050565b6000600a5b60011561188657600182019150808310600181146118745761187a565b50611886565b50600a81029050611857565b50919050565b6060600080634201000173ffffffffffffffffffffffffffffffffffffffff166040516020016040516020818303038152906040526040516118ce9190613ce7565b600060405180830381855afa9150503d8060008114611909576040519150601f19603f3d011682016040523d82523d6000602084013e61190e565b606091505b50915091508161195b576342010001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611952929190613b59565b60405180910390fd5b809250505090565b6060600080634202000173ffffffffffffffffffffffffffffffffffffffff168585604051602001611996929190613d35565b6040516020818303038152906040526040516119b29190613ce7565b600060405180830381855afa9150503d80600081146119ed576040519150601f19603f3d011682016040523d82523d6000602084013e6119f2565b606091505b509150915081611a3f576342020001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611a36929190613b59565b60405180910390fd5b809250505092915050565b611a52611e2e565b600080634203000073ffffffffffffffffffffffffffffffffffffffff1687878787604051602001611a879493929190613d65565b604051602081830303815290604052604051611aa39190613ce7565b600060405180830381855afa9150503d8060008114611ade576040519150601f19603f3d011682016040523d82523d6000602084013e611ae3565b606091505b509150915081611b30576342030000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611b27929190613b59565b60405180910390fd5b80806020019051810190611b449190613dbf565b92505050949350505050565b600080634202000073ffffffffffffffffffffffffffffffffffffffff16858585604051602001611b8393929190613e08565b604051602081830303815290604052604051611b9f9190613ce7565b600060405180830381855afa9150503d8060008114611bda576040519150601f19603f3d011682016040523d82523d6000602084013e611bdf565b606091505b509150915081611c2c576342020000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611c23929190613b59565b60405180910390fd5b5050505050565b606080600080634210000173ffffffffffffffffffffffffffffffffffffffff16878787604051602001611c6993929190613e4d565b604051602081830303815290604052604051611c859190613ce7565b600060405180830381855afa9150503d8060008114611cc0576040519150601f19603f3d011682016040523d82523d6000602084013e611cc5565b606091505b509150915081611d12576342100001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611d09929190613b59565b60405180910390fd5b80806020019051810190611d269190613e92565b935093505050935093915050565b6060600080634203000173ffffffffffffffffffffffffffffffffffffffff168585604051602001611d67929190613f0a565b604051602081830303815290604052604051611d839190613ce7565b600060405180830381855afa9150503d8060008114611dbe576040519150601f19603f3d011682016040523d82523d6000602084013e611dc3565b606091505b509150915081611e10576342030001816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611e07929190613b59565b60405180910390fd5b80806020019051810190611e24919061401b565b9250505092915050565b6040518060c0016040528060006fffffffffffffffffffffffffffffffff1916815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b6040518060400160405280600067ffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611f2d82611ee4565b810181811067ffffffffffffffff82111715611f4c57611f4b611ef5565b5b80604052505050565b6000611f5f611ecb565b9050611f6b8282611f24565b919050565b600080fd5b600067ffffffffffffffff82169050919050565b611f9281611f75565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff821115611fda57611fd9611ef5565b5b611fe382611ee4565b9050602081019050919050565b82818337600083830152505050565b600061201261200d84611fbf565b611f55565b90508281526020810184848401111561202e5761202d611fba565b5b612039848285611ff0565b509392505050565b600082601f83011261205657612055611fb5565b5b8135612066848260208601611fff565b91505092915050565b6000819050919050565b6120828161206f565b811461208d57600080fd5b50565b60008135905061209f81612079565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120d0826120a5565b9050919050565b6120e0816120c5565b81146120eb57600080fd5b50565b6000813590506120fd816120d7565b92915050565b600067ffffffffffffffff82111561211e5761211d611ef5565b5b602082029050602081019050919050565b600080fd5b60006080828403121561214a57612149611edf565b5b6121546080611f55565b9050600061216484828501611fa0565b600083015250602061217884828501611fa0565b602083015250604061218c848285016120ee565b60408301525060606121a084828501611fa0565b60608301525092915050565b60006121bf6121ba84612103565b611f55565b905080838252602082019050608084028301858111156121e2576121e161212f565b5b835b8181101561220b57806121f78882612134565b8452602084019350506080810190506121e4565b5050509392505050565b600082601f83011261222a57612229611fb5565b5b813561223a8482602086016121ac565b91505092915050565b60008115159050919050565b61225881612243565b811461226357600080fd5b50565b6000813590506122758161224f565b92915050565b6000610160828403121561229257612291611edf565b5b61229d610160611f55565b905060006122ad84828501611fa0565b600083015250602082013567ffffffffffffffff8111156122d1576122d0611f70565b5b6122dd84828501612041565b60208301525060406122f184828501612090565b604083015250606061230584828501611fa0565b6060830152506080612319848285016120ee565b60808301525060a061232d84828501611fa0565b60a08301525060c061234184828501612090565b60c08301525060e082013567ffffffffffffffff81111561236557612364611f70565b5b61237184828501612215565b60e08301525061010082013567ffffffffffffffff81111561239657612395611f70565b5b6123a284828501612041565b610100830152506101206123b884828501612090565b610120830152506101406123ce84828501612266565b6101408301525092915050565b600067ffffffffffffffff8211156123f6576123f5611ef5565b5b602082029050602081019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b61243c81612407565b811461244757600080fd5b50565b60008135905061245981612433565b92915050565b600061247261246d846123db565b611f55565b905080838252602082019050602084028301858111156124955761249461212f565b5b835b818110156124be57806124aa888261244a565b845260208401935050602081019050612497565b5050509392505050565b600082601f8301126124dd576124dc611fb5565b5b81356124ed84826020860161245f565b91505092915050565b600067ffffffffffffffff82111561251157612510611ef5565b5b61251a82611ee4565b9050602081019050919050565b600061253a612535846124f6565b611f55565b90508281526020810184848401111561255657612555611fba565b5b612561848285611ff0565b509392505050565b600082601f83011261257e5761257d611fb5565b5b813561258e848260208601612527565b91505092915050565b600080600080608085870312156125b1576125b0611ed5565b5b600085013567ffffffffffffffff8111156125cf576125ce611eda565b5b6125db8782880161227b565b94505060206125ec87828801611fa0565b935050604085013567ffffffffffffffff81111561260d5761260c611eda565b5b612619878288016124c8565b925050606085013567ffffffffffffffff81111561263a57612639611eda565b5b61264687828801612569565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b8381101561268c578082015181840152602081019050612671565b8381111561269b576000848401525b50505050565b60006126ac82612652565b6126b6818561265d565b93506126c681856020860161266e565b6126cf81611ee4565b840191505092915050565b600060208201905081810360008301526126f481846126a1565b905092915050565b6000819050919050565b61270f816126fc565b811461271a57600080fd5b50565b60008135905061272c81612706565b92915050565b6000806040838503121561274957612748611ed5565b5b600083013567ffffffffffffffff81111561276757612766611eda565b5b61277385828601612041565b92505060206127848582860161271d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60006127b58261278e565b6127bf8185612799565b93506127cf81856020860161266e565b6127d881611ee4565b840191505092915050565b600060208201905081810360008301526127fd81846127aa565b905092915050565b60006020828403121561281b5761281a611ed5565b5b60006128298482850161271d565b91505092915050565b6000806040838503121561284957612848611ed5565b5b60006128578582860161244a565b925050602083013567ffffffffffffffff81111561287857612877611eda565b5b61288485828601612041565b9150509250929050565b600061289982612407565b9050919050565b6128a98161288e565b82525050565b6128b881611f75565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6128f3816120c5565b82525050565b600061290583836128ea565b60208301905092915050565b6000602082019050919050565b6000612929826128be565b61293381856128c9565b935061293e836128da565b8060005b8381101561296f57815161295688826128f9565b975061296183612911565b925050600181019050612942565b5085935050505092915050565b600082825260208201905092915050565b60006129988261278e565b6129a2818561297c565b93506129b281856020860161266e565b6129bb81611ee4565b840191505092915050565b600060c0830160008301516129de60008601826128a0565b5060208301516129f160208601826128a0565b506040830151612a0460408601826128af565b5060608301518482036060860152612a1c828261291e565b91505060808301518482036080860152612a36828261291e565b91505060a083015184820360a0860152612a50828261298d565b9150508091505092915050565b60006040820190508181036000830152612a7781856129c6565b90508181036020830152612a8b81846126a1565b90509392505050565b60008060408385031215612aab57612aaa611ed5565b5b600083013567ffffffffffffffff811115612ac957612ac8611eda565b5b612ad58582860161227b565b9250506020612ae685828601611fa0565b9150509250929050565b600067ffffffffffffffff821115612b0b57612b0a611ef5565b5b602082029050602081019050919050565b6000612b2f612b2a84612af0565b611f55565b90508083825260208201905060208402830185811115612b5257612b5161212f565b5b835b81811015612b7b5780612b6788826120ee565b845260208401935050602081019050612b54565b5050509392505050565b600082601f830112612b9a57612b99611fb5565b5b8135612baa848260208601612b1c565b91505092915050565b600060c08284031215612bc957612bc8611edf565b5b612bd360c0611f55565b90506000612be38482850161244a565b6000830152506020612bf78482850161244a565b6020830152506040612c0b84828501611fa0565b604083015250606082013567ffffffffffffffff811115612c2f57612c2e611f70565b5b612c3b84828501612b85565b606083015250608082013567ffffffffffffffff811115612c5f57612c5e611f70565b5b612c6b84828501612b85565b60808301525060a082013567ffffffffffffffff811115612c8f57612c8e611f70565b5b612c9b84828501612569565b60a08301525092915050565b60008060408385031215612cbe57612cbd611ed5565b5b600083013567ffffffffffffffff811115612cdc57612cdb611eda565b5b612ce885828601612bb3565b925050602083013567ffffffffffffffff811115612d0957612d08611eda565b5b612d1585828601612041565b9150509250929050565b600080fd5b600060c08284031215612d3a57612d39612d1f565b5b81905092915050565b600060208284031215612d5957612d58611ed5565b5b600082013567ffffffffffffffff811115612d7757612d76611eda565b5b612d8384828501612d24565b91505092915050565b60008060408385031215612da357612da2611ed5565b5b600083013567ffffffffffffffff811115612dc157612dc0611eda565b5b612dcd85828601612569565b9250506020612dde85828601612090565b9150509250929050565b60008060408385031215612dff57612dfe611ed5565b5b6000612e0d8582860161244a565b9250506020612e1e8582860161244a565b9150509250929050565b612e3181612243565b82525050565b6000602082019050612e4c6000830184612e28565b92915050565b600082825260208201905092915050565b6000612e6e82612652565b612e788185612e52565b9350612e8881856020860161266e565b612e9181611ee4565b840191505092915050565b612ea58161206f565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612eed60008501826128af565b506020820151612f0060208501826128af565b506040820151612f1360408501826128ea565b506060820151612f2660608501826128af565b50505050565b6000612f388383612ed7565b60808301905092915050565b6000602082019050919050565b6000612f5c82612eab565b612f668185612eb6565b9350612f7183612ec7565b8060005b83811015612fa2578151612f898882612f2c565b9750612f9483612f44565b925050600181019050612f75565b5085935050505092915050565b612fb881612243565b82525050565b600061016083016000830151612fd760008601826128af565b5060208301518482036020860152612fef8282612e63565b91505060408301516130046040860182612e9c565b50606083015161301760608601826128af565b50608083015161302a60808601826128ea565b5060a083015161303d60a08601826128af565b5060c083015161305060c0860182612e9c565b5060e083015184820360e08601526130688282612f51565b9150506101008301518482036101008601526130848282612e63565b91505061012083015161309b610120860182612e9c565b506101408301516130b0610140860182612faf565b508091505092915050565b6130c481611f75565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061310283836128a0565b60208301905092915050565b6000602082019050919050565b6000613126826130ca565b61313081856130d5565b935061313b836130e6565b8060005b8381101561316c57815161315388826130f6565b975061315e8361310e565b92505060018101905061313f565b5085935050505092915050565b600060808201905081810360008301526131938187612fbe565b90506131a260208301866130bb565b81810360408301526131b4818561311b565b905081810360608301526131c881846127aa565b905095945050505050565b6000815190506131e281612433565b92915050565b6000815190506131f781611f89565b92915050565b60008151905061320c816120d7565b92915050565b600061322561322084612af0565b611f55565b905080838252602082019050602084028301858111156132485761324761212f565b5b835b81811015613271578061325d88826131fd565b84526020840193505060208101905061324a565b5050509392505050565b600082601f8301126132905761328f611fb5565b5b81516132a0848260208601613212565b91505092915050565b60006132bc6132b7846124f6565b611f55565b9050828152602081018484840111156132d8576132d7611fba565b5b6132e384828561266e565b509392505050565b600082601f830112613300576132ff611fb5565b5b81516133108482602086016132a9565b91505092915050565b600060c0828403121561332f5761332e611edf565b5b61333960c0611f55565b90506000613349848285016131d3565b600083015250602061335d848285016131d3565b6020830152506040613371848285016131e8565b604083015250606082015167ffffffffffffffff81111561339557613394611f70565b5b6133a18482850161327b565b606083015250608082015167ffffffffffffffff8111156133c5576133c4611f70565b5b6133d18482850161327b565b60808301525060a082015167ffffffffffffffff8111156133f5576133f4611f70565b5b613401848285016132eb565b60a08301525092915050565b600061342061341b84611fbf565b611f55565b90508281526020810184848401111561343c5761343b611fba565b5b61344784828561266e565b509392505050565b600082601f83011261346457613463611fb5565b5b815161347484826020860161340d565b91505092915050565b6000806040838503121561349457613493611ed5565b5b600083015167ffffffffffffffff8111156134b2576134b1611eda565b5b6134be85828601613319565b925050602083015167ffffffffffffffff8111156134df576134de611eda565b5b6134eb8582860161344f565b9150509250929050565b6134fe8161206f565b82525050565b6000604082019050818103600083015261351e81856127aa565b905061352d60208301846134f5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061356e826126fc565b9150613579836126fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135ae576135ad613534565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020820190508181036000830152613602818461311b565b905092915050565b613613816120c5565b82525050565b7f6e6f2064617461207265636f7264730000000000000000000000000000000000600082015250565b600061364f600f8361265d565b915061365a82613619565b602082019050919050565b600060408201905061367a600083018461360a565b818103602083015261368b81613642565b905092915050565b60006136a66136a1846123db565b611f55565b905080838252602082019050602084028301858111156136c9576136c861212f565b5b835b818110156136f257806136de88826131d3565b8452602084019350506020810190506136cb565b5050509392505050565b600082601f83011261371157613710611fb5565b5b8151613721848260208601613693565b91505092915050565b6000602082840312156137405761373f611ed5565b5b600082015167ffffffffffffffff81111561375e5761375d611eda565b5b61376a848285016136fc565b91505092915050565b600061377e826126fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137b1576137b0613534565b5b600182019050919050565b6000602082840312156137d2576137d1611ed5565b5b60006137e0848285016131e8565b91505092915050565b60006137f4826126fc565b91506137ff836126fc565b92508282101561381257613811613534565b5b828203905092915050565b6138268161288e565b82525050565b6000604082019050613841600083018561381d565b818103602083015261385381846126a1565b90509392505050565b600082825260208201905092915050565b6000613878826128be565b613882818561385c565b935061388d836128da565b8060005b838110156138be5781516138a588826128f9565b97506138b083612911565b925050600181019050613891565b5085935050505092915050565b60006060820190506138e0600083018661381d565b6138ed60208301856130bb565b81810360408301526138ff818461386d565b9050949350505050565b60006020828403121561391f5761391e611ed5565b5b600061392d84828501611fa0565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261396257613961613936565b5b80840192508235915067ffffffffffffffff8211156139845761398361393b565b5b6020830192506020820236038313156139a05761399f613940565b5b509250929050565b6000819050919050565b60006139c160208401846120ee565b905092915050565b6000602082019050919050565b60006139e2838561385c565b93506139ed826139a8565b8060005b85811015613a2657613a0382846139b2565b613a0d88826128f9565b9750613a18836139c9565b9250506001810190506139f1565b5085925050509392505050565b6000606082019050613a48600083018761381d565b613a5560208301866130bb565b8181036040830152613a688184866139d6565b905095945050505050565b6000602082019050613a8860008301846134f5565b92915050565b6000819050919050565b613aa9613aa48261288e565b613a8e565b82525050565b6000613abb8284613a98565b60108201915081905092915050565b600060208284031215613ae057613adf611ed5565b5b600082015167ffffffffffffffff811115613afe57613afd611eda565b5b613b0a8482850161344f565b91505092915050565b600081905092915050565b50565b6000613b2e600083613b13565b9150613b3982613b1e565b600082019050919050565b6000613b4f82613b21565b9150819050919050565b6000604082019050613b6e600083018561360a565b8181036020830152613b8081846126a1565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bd057607f821691505b60208210811415613be457613be3613b89565b5b50919050565b60008190508160005260206000209050919050565b60008154613c0c81613bb8565b613c168186612799565b94506001821660008114613c315760018114613c4357613c76565b60ff1983168652602086019350613c76565b613c4c85613bea565b60005b83811015613c6e57815481890152600182019150602081019050613c4f565b808801955050505b50505092915050565b60006040820190508181036000830152613c998185613bff565b90508181036020830152613cad81846126a1565b90509392505050565b6000613cc182612652565b613ccb8185613b13565b9350613cdb81856020860161266e565b80840191505092915050565b6000613cf38284613cb6565b915081905092915050565b60006040820190508181036000830152613d1881856127aa565b90508181036020830152613d2c81846126a1565b90509392505050565b6000604082019050613d4a600083018561381d565b8181036020830152613d5c81846127aa565b90509392505050565b6000608082019050613d7a60008301876130bb565b8181036020830152613d8c818661386d565b90508181036040830152613da0818561386d565b90508181036060830152613db481846127aa565b905095945050505050565b600060208284031215613dd557613dd4611ed5565b5b600082015167ffffffffffffffff811115613df357613df2611eda565b5b613dff84828501613319565b91505092915050565b6000606082019050613e1d600083018661381d565b8181036020830152613e2f81856127aa565b90508181036040830152613e4381846126a1565b9050949350505050565b60006060820190508181036000830152613e678186612fbe565b9050613e76602083018561381d565b8181036040830152613e8881846127aa565b9050949350505050565b60008060408385031215613ea957613ea8611ed5565b5b600083015167ffffffffffffffff811115613ec757613ec6611eda565b5b613ed38582860161344f565b925050602083015167ffffffffffffffff811115613ef457613ef3611eda565b5b613f008582860161344f565b9150509250929050565b6000604082019050613f1f60008301856130bb565b8181036020830152613f3181846127aa565b90509392505050565b600067ffffffffffffffff821115613f5557613f54611ef5565b5b602082029050602081019050919050565b6000613f79613f7484613f3a565b611f55565b90508083825260208201905060208402830185811115613f9c57613f9b61212f565b5b835b81811015613fe357805167ffffffffffffffff811115613fc157613fc0611fb5565b5b808601613fce8982613319565b85526020850194505050602081019050613f9e565b5050509392505050565b600082601f83011261400257614001611fb5565b5b8151614012848260208601613f66565b91505092915050565b60006020828403121561403157614030611ed5565b5b600082015167ffffffffffffffff81111561404f5761404e611eda565b5b61405b84828501613fed565b9150509291505056fea2646970667358221220b2d821fc58bff400bd4df8ef898a173ca1b31872a13f6f4782b821758363097864736f6c63430008080033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063bb7bae0a1161008c578063ee2cc36411610066578063ee2cc36414610203578063fd38f21d1461021f578063ff4aec7d1461024f578063ffbbfcb01461026d576100cf565b8063bb7bae0a146101ad578063bcbb3597146101c9578063d7e84fbf146101e5576100cf565b8063060b0d17146100d4578063392e53cd1461010457806361b8ce8c1461012257806364e65a62146101405780637e48532c1461015c57806381d12c581461017a575b600080fd5b6100ee60048036038101906100e991906126ba565b61028b565b6040516100fb919061279e565b60405180910390f35b61010c61050b565b60405161011991906127cf565b60405180910390f35b61012a61051b565b6040516101379190612803565b60405180910390f35b61015a60048036038101906101559190612842565b610521565b005b6101646105ee565b604051610171919061279e565b60405180910390f35b610194600480360381019061018f9190612929565b610643565b6040516101a494939291906129f8565b60405180910390f35b6101c760048036038101906101c29190612a70565b61070b565b005b6101e360048036038101906101de9190612acf565b610777565b005b6101ed6107ee565b6040516101fa9190612b77565b60405180910390f35b61021d60048036038101906102189190612bb1565b610814565b005b61023960048036038101906102349190612cae565b61092c565b604051610246919061279e565b60405180910390f35b610257610b35565b604051610264919061279e565b60405180910390f35b610275610b6e565b6040516102829190612803565b60405180910390f35b60606102d3610298610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61031a6000600480549050116040518060400160405280600b81526020017f4e6f207265717565737473000000000000000000000000000000000000000000815250610c43565b6000806103308467ffffffffffffffff16610c89565b915091506103846000836040015167ffffffffffffffff16116040518060400160405280600f81526020017f4e6f2076616c6964206f66666572730000000000000000000000000000000000815250610c43565b61038e8483610ed3565b81602001518561010001819052506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dac44aef87876040518363ffffffff1660e01b81526004016103fb929190612fa0565b600060405180830381600087803b15801561041557600080fd5b505af1158015610429573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104529190613040565b90506364e65a6260e01b8184600001518560400151604051602001610478929190613089565b6040516020818303038152906040528461049061112e565b6040516024016104a394939291906130e1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505092915050565b60008060001b6001541415905090565b60055481565b8061056d6105328260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b60008351111561058957610588610583846111a4565b6111b6565b5b60006105b7600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611377565b90506105c38582611445565b508060200135600181905550600260008154809291906105e29061316a565b91905055505050505050565b60606106366105fb610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61063e6114a0565b905090565b6004818154811061065357600080fd5b906000526020600020906004020160009150905080600001549080600101805461067c906131e2565b80601f01602080910402602001604051908101604052809291908181526020018280546106a8906131e2565b80156106f55780601f106106ca576101008083540402835291602001916106f5565b820191906000526020600020905b8154815290600101906020018083116106d857829003601f168201915b5050505050908060020154908060030154905084565b61075261071661050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b81600181905550806000816fffffffffffffffffffffffffffffffff19169055505050565b7ff7645ba1634d8aed79d5bd07dd401d4ef0860e018d7eb3949c3f4da8fa26fb4781600001356fffffffffffffffffffffffffffffffff19168260400160208101906107c39190613214565b8380606001906107d39190613250565b6040516107e39493929190613367565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806108606108258260000135611170565b6040518060400160405280600b81526020017f496e76616c6964206b6579000000000000000000000000000000000000000000815250610c43565b6004839080600181540180825580915050600190039060005260206000209060040201600090919091909150818161089891906137ea565b5050600560008154809291906108ad9061316a565b919050555082600001357fbf51327c63fb3c8741d4233ae0315e3e1a74641532f4e59c307f72314a3462358480602001906108e8919061345b565b86604001356040516108fc93929190613825565b60405180910390a28060200135600181905550600260008154809291906109229061316a565b9190505550505050565b6060610974610939610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b60003073ffffffffffffffffffffffffffffffffffffffff1663ff4aec7d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109fb9190613040565b90506000610a0a8260016115eb565b915050610a5960008267ffffffffffffffff16116040518060400160405280600b81526020017f65677020746f6f206c6f77000000000000000000000000000000000000000000815250610c43565b6000610a64836116c6565b90506000604051806080016040528060055481526020018781526020018867ffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff1916815250905063ee2cc36460e01b81610abb61112e565b604051602401610acc929190613922565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505094505050505092915050565b6060610b3f610b7b565b610b4857600080fd5b6000610b526117fc565b905080806020019051810190610b689190613040565b91505090565b6000600480549050905090565b6000806000634201000073ffffffffffffffffffffffffffffffffffffffff16604051610ba790613983565b600060405180830381855afa9150503d8060008114610be2576040519150601f19603f3d011682016040523d82523d6000602084013e610be7565b606091505b509150915081610c34576342010000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401610c2b9291906139a7565b60405180910390fd5b80516020820151935050505090565b81610c8557806040517f0c25cd98000000000000000000000000000000000000000000000000000000008152600401610c7c91906139d7565b60405180910390fd5b5050565b610c91612008565b606060005b600480549050811015610ecd57600060048281548110610cb957610cb86139f9565b5b906000526020600020906004020160405180608001604052908160008201548152602001600182018054610cec906131e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d18906131e2565b8015610d655780601f10610d3a57610100808354040283529160200191610d65565b820191906000526020600020905b815481529060010190602001808311610d4857829003601f168201915b505050505081526020016002820154815260200160038201546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff19168152505090508481604001511015610dd157610dc982846118d390919063ffffffff16565b925050610ebc565b6000610e1682606001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c650000000000000000815250611907565b9050600080610e268360006115eb565b91509150811580610e41575060008167ffffffffffffffff16145b15610e6057610e5985876118d390919063ffffffff16565b9550610eb7565b866040015167ffffffffffffffff168167ffffffffffffffff161115610eb657604051806080016040528085600001518152602001856020015181526020018267ffffffffffffffff1681526020018481525096505b5b505050505b80610ec69061316a565b9050610c96565b50915091565b6000600367ffffffffffffffff811115610ef057610eef6121d4565b5b604051908082528060200260200182016040528015610f1e5781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110610f5857610f576139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634210000181600181518110610fab57610faa6139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600281518110610ffa57610ff96139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006110778483846040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152506119ee565b90506110c181600001516040518060400160405280601581526020017f64656661756c743a76303a65746842756e646c657300000000000000000000008152508560600151611af4565b61112881600001516040518060400160405280601e81526020017f64656661756c743a76303a65746842756e646c6553696d526573756c7473000081525085604001516040516020016111149190613a28565b604051602081830303815290604052611af4565b50505050565b61113661203a565b604051806040016040528061114c600254611bd7565b815260200161116860016002546111639190613a43565b611bf1565b815250905090565b6000600154826040516020016111869190613aa8565b60405160208183030381529060405280519060200120149050919050565b60606111af82611c29565b9050919050565b6000815190505b6000811115611373576000826001836111d69190613ac3565b815181106111e7576111e66139f9565b5b60200260200101519050600060048281548110611207576112066139f9565b5b9060005260206000209060040201600001549050600160048054905061122d9190613ac3565b8210156112e057600460016004805490506112489190613ac3565b81548110611259576112586139f9565b5b90600052602060002090600402016004838154811061127b5761127a6139f9565b5b90600052602060002090600402016000820154816000015560018201816001019080546112a7906131e2565b6112b292919061205a565b5060028201548160020155600382015481600301906fffffffffffffffffffffffffffffffff191690559050505b60048054806112f2576112f1613af7565b5b600190038181906000526020600020906004020160008082016000905560018201600061131f91906120e7565b6002820160009055600382016000905550509055807f5fa4d8243d9549d33d615899224efcef51bfcacb970a31f68862ce74c858dbf060405160405180910390a250508061136c90613b26565b90506111bd565b5050565b60606000808473ffffffffffffffffffffffffffffffffffffffff16846040516113a19190613b81565b6000604051808303816000865af19150503d80600081146113de576040519150601f19603f3d011682016040523d82523d6000602084013e6113e3565b606091505b5091509150611427826040518060400160405280601481526020017f45787465726e616c2063616c6c206661696c6564000000000000000000000000815250610c43565b8080602001905181019061143b9190613c08565b9250505092915050565b6000808380602001905181019061145c9190613c7b565b91509150817f91badfc611f9ad79e4d6a58176e5c4cedc4f8ed9001447825f503e792bbf09e28285604051611492929190613cbb565b60405180910390a250505050565b60606114e86114ad610b7b565b6040518060400160405280601081526020017f4e6f7420636f6e666964656e7469616c00000000000000000000000000000000815250610c43565b61152f6114f361050b565b156040518060400160405280601381526020017f416c726561647920696e697469616c697a656400000000000000000000000000815250610c43565b60006115396117fc565b9050600061154682611cf4565b90506000611569838060200190518101906115619190613d00565b600254611ed0565b905063bb7bae0a60e01b8183604051602401611586929190613d2d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050935050505090565b600080600080634210000073ffffffffffffffffffffffffffffffffffffffff16614e2087604051602001611620919061279e565b60405160208183030381529060405260405161163c9190613b81565b6000604051808303818686fa925050503d8060008114611678576040519150601f19603f3d011682016040523d82523d6000602084013e61167d565b606091505b509150915061169585158061168f5750825b82610c43565b81156116bc576001818060200190518101906116b19190613d56565b9350935050506116bf565b50505b9250929050565b600080600167ffffffffffffffff8111156116e4576116e36121d4565b5b6040519080825280602002602001820160405280156117125781602001602082028036833780820191505090505b509050308160008151811061172a576117296139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006117a8600083846040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c6500000000000000008152506119ee565b90506117ee81600001516040518060400160405280601881526020017f626c6f636b61643a76303a7061796d656e7442756e646c65000000000000000081525086611af4565b806000015192505050919050565b6060600080634201000173ffffffffffffffffffffffffffffffffffffffff1660405160200160405160208183030381529060405260405161183e9190613b81565b600060405180830381855afa9150503d8060008114611879576040519150601f19603f3d011682016040523d82523d6000602084013e61187e565b606091505b5091509150816118cb576342010001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016118c29291906139a7565b60405180910390fd5b809250505090565b6060826118df83611f0a565b6040516020016118f0929190613d83565b604051602081830303815290604052905092915050565b6060600080634202000173ffffffffffffffffffffffffffffffffffffffff16858560405160200161193a929190613da7565b6040516020818303038152906040526040516119569190613b81565b600060405180830381855afa9150503d8060008114611991576040519150601f19603f3d011682016040523d82523d6000602084013e611996565b606091505b5091509150816119e3576342020001816040517f75fff4670000000000000000000000000000000000000000000000000000000081526004016119da9291906139a7565b60405180910390fd5b809250505092915050565b6119f6612127565b600080634203000073ffffffffffffffffffffffffffffffffffffffff1687878787604051602001611a2b9493929190613e5d565b604051602081830303815290604052604051611a479190613b81565b600060405180830381855afa9150503d8060008114611a82576040519150601f19603f3d011682016040523d82523d6000602084013e611a87565b606091505b509150915081611ad4576342030000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611acb9291906139a7565b60405180910390fd5b80806020019051810190611ae89190614098565b92505050949350505050565b600080634202000073ffffffffffffffffffffffffffffffffffffffff16858585604051602001611b27939291906140e1565b604051602081830303815290604052604051611b439190613b81565b600060405180830381855afa9150503d8060008114611b7e576040519150601f19603f3d011682016040523d82523d6000602084013e611b83565b606091505b509150915081611bd0576342020000816040517f75fff467000000000000000000000000000000000000000000000000000000008152600401611bc79291906139a7565b60405180910390fd5b5050505050565b6000611bea611be4611f67565b83611fc7565b9050919050565b6000611bfc82611bd7565b604051602001611c0c9190613aa8565b604051602081830303815290604052805190602001209050919050565b606060208251611c399190614155565b67ffffffffffffffff811115611c5257611c516121d4565b5b604051908082528060200260200182016040528015611c805781602001602082028036833780820191505090505b50905060005b60208351611c949190614155565b811015611cee57611cbc8360208084611cad9190614186565b611cb79190613a43565b611ffa565b828281518110611ccf57611cce6139f9565b5b6020026020010181815250508080611ce69061316a565b915050611c86565b50919050565b600080600367ffffffffffffffff811115611d1257611d116121d4565b5b604051908082528060200260200182016040528015611d405781602001602082028036833780820191505090505b5090503081600081518110611d5857611d576139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634203000181600181518110611dab57611daa6139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050634202000181600281518110611dfe57611dfd6139f9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000611e7c600083846040518060400160405280601181526020017f626c6f636b61643a76303a7365637265740000000000000000000000000000008152506119ee565b9050611ec281600001516040518060400160405280601181526020017f626c6f636b61643a76303a73656372657400000000000000000000000000000081525086611af4565b806000015192505050919050565b6000611edc8383611fc7565b604051602001611eec9190613aa8565b60405160208183030381529060405280519060200120905092915050565b6060602067ffffffffffffffff811115611f2757611f266121d4565b5b6040519080825280601f01601f191660200182016040528015611f595781602001600182028036833780820191505090505b509050816020820152919050565b600080611fab6000546040518060400160405280601181526020017f626c6f636b61643a76303a736563726574000000000000000000000000000000815250611907565b905080806020019051810190611fc19190613d00565b91505090565b60008282604051602001611fdc9291906141e0565b60405160208183030381529060405280519060200120905092915050565b600081830151905092915050565b60405180608001604052806000815260200160608152602001600067ffffffffffffffff168152602001606081525090565b604051806040016040528060008019168152602001600080191681525090565b828054612066906131e2565b90600052602060002090601f01602090048101928261208857600085556120d6565b82601f1061209957805485556120d6565b828001600101855582156120d657600052602060002091601f016020900482015b828111156120d55782548255916001019190600101906120ba565b5b5090506120e3919061218d565b5090565b5080546120f3906131e2565b6000825580601f106121055750612124565b601f016020900490600052602060002090810190612123919061218d565b5b50565b6040518060c0016040528060006fffffffffffffffffffffffffffffffff1916815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081525090565b5b808211156121a657600081600090555060010161218e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61220c826121c3565b810181811067ffffffffffffffff8211171561222b5761222a6121d4565b5b80604052505050565b600061223e6121aa565b905061224a8282612203565b919050565b600080fd5b600067ffffffffffffffff82169050919050565b61227181612254565b811461227c57600080fd5b50565b60008135905061228e81612268565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156122b9576122b86121d4565b5b6122c2826121c3565b9050602081019050919050565b82818337600083830152505050565b60006122f16122ec8461229e565b612234565b90508281526020810184848401111561230d5761230c612299565b5b6123188482856122cf565b509392505050565b600082601f83011261233557612334612294565b5b81356123458482602086016122de565b91505092915050565b6000819050919050565b6123618161234e565b811461236c57600080fd5b50565b60008135905061237e81612358565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123af82612384565b9050919050565b6123bf816123a4565b81146123ca57600080fd5b50565b6000813590506123dc816123b6565b92915050565b600067ffffffffffffffff8211156123fd576123fc6121d4565b5b602082029050602081019050919050565b600080fd5b600060808284031215612429576124286121be565b5b6124336080612234565b905060006124438482850161227f565b60008301525060206124578482850161227f565b602083015250604061246b848285016123cd565b604083015250606061247f8482850161227f565b60608301525092915050565b600061249e612499846123e2565b612234565b905080838252602082019050608084028301858111156124c1576124c061240e565b5b835b818110156124ea57806124d68882612413565b8452602084019350506080810190506124c3565b5050509392505050565b600082601f83011261250957612508612294565b5b813561251984826020860161248b565b91505092915050565b60008115159050919050565b61253781612522565b811461254257600080fd5b50565b6000813590506125548161252e565b92915050565b60006101608284031215612571576125706121be565b5b61257c610160612234565b9050600061258c8482850161227f565b600083015250602082013567ffffffffffffffff8111156125b0576125af61224f565b5b6125bc84828501612320565b60208301525060406125d08482850161236f565b60408301525060606125e48482850161227f565b60608301525060806125f8848285016123cd565b60808301525060a061260c8482850161227f565b60a08301525060c06126208482850161236f565b60c08301525060e082013567ffffffffffffffff8111156126445761264361224f565b5b612650848285016124f4565b60e08301525061010082013567ffffffffffffffff8111156126755761267461224f565b5b61268184828501612320565b610100830152506101206126978482850161236f565b610120830152506101406126ad84828501612545565b6101408301525092915050565b600080604083850312156126d1576126d06121b4565b5b600083013567ffffffffffffffff8111156126ef576126ee6121b9565b5b6126fb8582860161255a565b925050602061270c8582860161227f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612750578082015181840152602081019050612735565b8381111561275f576000848401525b50505050565b600061277082612716565b61277a8185612721565b935061278a818560208601612732565b612793816121c3565b840191505092915050565b600060208201905081810360008301526127b88184612765565b905092915050565b6127c981612522565b82525050565b60006020820190506127e460008301846127c0565b92915050565b6000819050919050565b6127fd816127ea565b82525050565b600060208201905061281860008301846127f4565b92915050565b600080fd5b6000604082840312156128395761283861281e565b5b81905092915050565b60008060008060a0858703121561285c5761285b6121b4565b5b600085013567ffffffffffffffff81111561287a576128796121b9565b5b61288687828801612320565b945050602085013567ffffffffffffffff8111156128a7576128a66121b9565b5b6128b387828801612320565b935050604085013567ffffffffffffffff8111156128d4576128d36121b9565b5b6128e087828801612320565b92505060606128f187828801612823565b91505092959194509250565b612906816127ea565b811461291157600080fd5b50565b600081359050612923816128fd565b92915050565b60006020828403121561293f5761293e6121b4565b5b600061294d84828501612914565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061297d82612956565b6129878185612961565b9350612997818560208601612732565b6129a0816121c3565b840191505092915050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006129e2826129ab565b9050919050565b6129f2816129d7565b82525050565b6000608082019050612a0d60008301876127f4565b8181036020830152612a1f8186612972565b9050612a2e60408301856127f4565b612a3b60608301846129e9565b95945050505050565b612a4d816129ab565b8114612a5857600080fd5b50565b600081359050612a6a81612a44565b92915050565b60008060408385031215612a8757612a866121b4565b5b6000612a958582860161236f565b9250506020612aa685828601612a5b565b9150509250929050565b600060c08284031215612ac657612ac561281e565b5b81905092915050565b600060208284031215612ae557612ae46121b4565b5b600082013567ffffffffffffffff811115612b0357612b026121b9565b5b612b0f84828501612ab0565b91505092915050565b6000819050919050565b6000612b3d612b38612b3384612384565b612b18565b612384565b9050919050565b6000612b4f82612b22565b9050919050565b6000612b6182612b44565b9050919050565b612b7181612b56565b82525050565b6000602082019050612b8c6000830184612b68565b92915050565b600060808284031215612ba857612ba761281e565b5b81905092915050565b60008060608385031215612bc857612bc76121b4565b5b600083013567ffffffffffffffff811115612be657612be56121b9565b5b612bf285828601612b92565b9250506020612c0385828601612823565b9150509250929050565b600067ffffffffffffffff821115612c2857612c276121d4565b5b612c31826121c3565b9050602081019050919050565b6000612c51612c4c84612c0d565b612234565b905082815260208101848484011115612c6d57612c6c612299565b5b612c788482856122cf565b509392505050565b600082601f830112612c9557612c94612294565b5b8135612ca5848260208601612c3e565b91505092915050565b60008060408385031215612cc557612cc46121b4565b5b6000612cd38582860161227f565b925050602083013567ffffffffffffffff811115612cf457612cf36121b9565b5b612d0085828601612c80565b9150509250929050565b612d1381612254565b82525050565b600082825260208201905092915050565b6000612d3582612716565b612d3f8185612d19565b9350612d4f818560208601612732565b612d58816121c3565b840191505092915050565b612d6c8161234e565b82525050565b612d7b816123a4565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b608082016000820151612dc36000850182612d0a565b506020820151612dd66020850182612d0a565b506040820151612de96040850182612d72565b506060820151612dfc6060850182612d0a565b50505050565b6000612e0e8383612dad565b60808301905092915050565b6000602082019050919050565b6000612e3282612d81565b612e3c8185612d8c565b9350612e4783612d9d565b8060005b83811015612e78578151612e5f8882612e02565b9750612e6a83612e1a565b925050600181019050612e4b565b5085935050505092915050565b612e8e81612522565b82525050565b600061016083016000830151612ead6000860182612d0a565b5060208301518482036020860152612ec58282612d2a565b9150506040830151612eda6040860182612d63565b506060830151612eed6060860182612d0a565b506080830151612f006080860182612d72565b5060a0830151612f1360a0860182612d0a565b5060c0830151612f2660c0860182612d63565b5060e083015184820360e0860152612f3e8282612e27565b915050610100830151848203610100860152612f5a8282612d2a565b915050610120830151612f71610120860182612d63565b50610140830151612f86610140860182612e85565b508091505092915050565b612f9a81612254565b82525050565b60006040820190508181036000830152612fba8185612e94565b9050612fc96020830184612f91565b9392505050565b6000612fe3612fde8461229e565b612234565b905082815260208101848484011115612fff57612ffe612299565b5b61300a848285612732565b509392505050565b600082601f83011261302757613026612294565b5b8151613037848260208601612fd0565b91505092915050565b600060208284031215613056576130556121b4565b5b600082015167ffffffffffffffff811115613074576130736121b9565b5b61308084828501613012565b91505092915050565b600060408201905061309e60008301856127f4565b6130ab6020830184612f91565b9392505050565b6040820160008201516130c86000850182612d63565b5060208201516130db6020850182612d63565b50505050565b600060a08201905081810360008301526130fb8187612765565b9050818103602083015261310f8186612765565b905081810360408301526131238185612765565b905061313260608301846130b2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613175826127ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131a8576131a761313b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131fa57607f821691505b6020821081141561320e5761320d6131b3565b5b50919050565b60006020828403121561322a576132296121b4565b5b60006132388482850161227f565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261326d5761326c613241565b5b80840192508235915067ffffffffffffffff82111561328f5761328e613246565b5b6020830192506020820236038313156132ab576132aa61324b565b5b509250929050565b600082825260208201905092915050565b6000819050919050565b60006132da8383612d72565b60208301905092915050565b60006132f560208401846123cd565b905092915050565b6000602082019050919050565b600061331683856132b3565b9350613321826132c4565b8060005b8581101561335a5761333782846132e6565b61334188826132ce565b975061334c836132fd565b925050600181019050613325565b5085925050509392505050565b600060608201905061337c60008301876129e9565b6133896020830186612f91565b818103604083015261339c81848661330a565b905095945050505050565b600081356133b4816128fd565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6133f6846133bd565b9350801983169250808416831791505092915050565b600061342761342261341d846127ea565b612b18565b6127ea565b9050919050565b6000819050919050565b6134418261340c565b61345461344d8261342e565b83546133ca565b8255505050565b6000808335600160200384360303811261347857613477613241565b5b80840192508235915067ffffffffffffffff82111561349a57613499613246565b5b6020830192506001820236038313156134b6576134b561324b565b5b509250929050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261352b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134ee565b61353586836134ee565b95508019841693508086168417925050509392505050565b6135568361340c565b61356a6135628261342e565b8484546134fb565b825550505050565b600090565b61357f613572565b61358a81848461354d565b505050565b5b818110156135ae576135a3600082613577565b600181019050613590565b5050565b601f8211156135f3576135c4816134c9565b6135cd846134de565b810160208510156135dc578190505b6135f06135e8856134de565b83018261358f565b50505b505050565b600082821c905092915050565b6000613616600019846008026135f8565b1980831691505092915050565b600061362f8383613605565b9150826002028217905092915050565b61364983836134be565b67ffffffffffffffff811115613662576136616121d4565b5b61366c82546131e2565b6136778282856135b2565b6000601f8311600181146136a65760008415613694578287013590505b61369e8582613623565b865550613706565b601f1984166136b4866134c9565b60005b828110156136dc578489013582556001820191506020850194506020810190506136b7565b868310156136f957848901356136f5601f891682613605565b8355505b6001600288020188555050505b50505050505050565b61371a83838361363f565b505050565b6000813561372c81612a44565b80915050919050565b6000819050919050565b613748826129d7565b61375b61375482613735565b83546133ca565b8255505050565b600081016000830180613774816133a7565b90506137808184613438565b5050506001810160208301613795818561345b565b6137a081838661370f565b505050506002810160408301806137b6816133a7565b90506137c28184613438565b5050506003810160608301806137d78161371f565b90506137e3818461373f565b5050505050565b6137f48282613762565b5050565b60006138048385612961565b93506138118385846122cf565b61381a836121c3565b840190509392505050565b600060408201905081810360008301526138408185876137f8565b905061384f60208301846127f4565b949350505050565b613860816127ea565b82525050565b600082825260208201905092915050565b600061388282612956565b61388c8185613866565b935061389c818560208601612732565b6138a5816121c3565b840191505092915050565b6138b9816129d7565b82525050565b60006080830160008301516138d76000860182613857565b50602083015184820360208601526138ef8282613877565b91505060408301516139046040860182613857565b50606083015161391760608601826138b0565b508091505092915050565b6000606082019050818103600083015261393c81856138bf565b905061394b60208301846130b2565b9392505050565b600081905092915050565b50565b600061396d600083613952565b91506139788261395d565b600082019050919050565b600061398e82613960565b9150819050919050565b6139a1816123a4565b82525050565b60006040820190506139bc6000830185613998565b81810360208301526139ce8184612765565b90509392505050565b600060208201905081810360008301526139f18184612972565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082019050613a3d6000830184612f91565b92915050565b6000613a4e826127ea565b9150613a59836127ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8e57613a8d61313b565b5b828201905092915050565b613aa28161234e565b82525050565b6000602082019050613abd6000830184613a99565b92915050565b6000613ace826127ea565b9150613ad9836127ea565b925082821015613aec57613aeb61313b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613b31826127ea565b91506000821415613b4557613b4461313b565b5b600182039050919050565b6000613b5b82612716565b613b658185613952565b9350613b75818560208601612732565b80840191505092915050565b6000613b8d8284613b50565b915081905092915050565b6000613bab613ba684612c0d565b612234565b905082815260208101848484011115613bc757613bc6612299565b5b613bd2848285612732565b509392505050565b600082601f830112613bef57613bee612294565b5b8151613bff848260208601613b98565b91505092915050565b600060208284031215613c1e57613c1d6121b4565b5b600082015167ffffffffffffffff811115613c3c57613c3b6121b9565b5b613c4884828501613bda565b91505092915050565b600081519050613c60816128fd565b92915050565b600081519050613c7581612268565b92915050565b60008060408385031215613c9257613c916121b4565b5b6000613ca085828601613c51565b9250506020613cb185828601613c66565b9150509250929050565b6000604082019050613cd06000830185612f91565b8181036020830152613ce28184612972565b90509392505050565b600081519050613cfa81612358565b92915050565b600060208284031215613d1657613d156121b4565b5b6000613d2484828501613ceb565b91505092915050565b6000604082019050613d426000830185613a99565b613d4f60208301846129e9565b9392505050565b600060208284031215613d6c57613d6b6121b4565b5b6000613d7a84828501613c66565b91505092915050565b6000613d8f8285613b50565b9150613d9b8284613b50565b91508190509392505050565b6000604082019050613dbc60008301856129e9565b8181036020830152613dce8184612972565b90509392505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000613e0a82613dd7565b613e1481856132b3565b9350613e1f83613de2565b8060005b83811015613e50578151613e3788826132ce565b9750613e4283613df2565b925050600181019050613e23565b5085935050505092915050565b6000608082019050613e726000830187612f91565b8181036020830152613e848186613dff565b90508181036040830152613e988185613dff565b90508181036060830152613eac8184612972565b905095945050505050565b600081519050613ec681612a44565b92915050565b600067ffffffffffffffff821115613ee757613ee66121d4565b5b602082029050602081019050919050565b600081519050613f07816123b6565b92915050565b6000613f20613f1b84613ecc565b612234565b90508083825260208201905060208402830185811115613f4357613f4261240e565b5b835b81811015613f6c5780613f588882613ef8565b845260208401935050602081019050613f45565b5050509392505050565b600082601f830112613f8b57613f8a612294565b5b8151613f9b848260208601613f0d565b91505092915050565b600060c08284031215613fba57613fb96121be565b5b613fc460c0612234565b90506000613fd484828501613eb7565b6000830152506020613fe884828501613eb7565b6020830152506040613ffc84828501613c66565b604083015250606082015167ffffffffffffffff8111156140205761401f61224f565b5b61402c84828501613f76565b606083015250608082015167ffffffffffffffff8111156140505761404f61224f565b5b61405c84828501613f76565b60808301525060a082015167ffffffffffffffff8111156140805761407f61224f565b5b61408c84828501613bda565b60a08301525092915050565b6000602082840312156140ae576140ad6121b4565b5b600082015167ffffffffffffffff8111156140cc576140cb6121b9565b5b6140d884828501613fa4565b91505092915050565b60006060820190506140f660008301866129e9565b81810360208301526141088185612972565b9050818103604083015261411c8184612765565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614160826127ea565b915061416b836127ea565b92508261417b5761417a614126565b5b828204905092915050565b6000614191826127ea565b915061419c836127ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141d5576141d461313b565b5b828202905092915050565b60006040820190506141f56000830185613a99565b61420260208301846127f4565b939250505056fea264697066735822122034f98af89b41f53cdbb5e7c71b3745678f1ac236e88890aac447aa77b5f4c41064736f6c63430008080033", "devdoc": { "kind": "dev", "methods": {}, diff --git a/deployments/rigil/solcInputs/2c77e4990a5e02143cdaa02b8820ef1d.json b/deployments/rigil/solcInputs/2c77e4990a5e02143cdaa02b8820ef1d.json new file mode 100644 index 0000000..b91c30f --- /dev/null +++ b/deployments/rigil/solcInputs/2c77e4990a5e02143cdaa02b8820ef1d.json @@ -0,0 +1,56 @@ +{ + "language": "Solidity", + "sources": { + "contracts/blockad/BlockAdV1.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { AnyBundleContract, EthBlockBidSenderContract, Suave } from \"../standard_peekers/bids.sol\";\n\n\ncontract BlockAdAuctionV1 is AnyBundleContract {\n\n\tstruct AdBid {\n\t\tstring extra; \n\t\tSuave.DataId paymentBidId;\n\t\tuint blockHeight;\n\t}\n\n\tstruct EffectiveAdBid {\n\t\tstring extra;\n\t\tuint64 egp;\n\t\tbytes paymentBundle;\n\t}\n\n\tevent AdBidEvent(\n\t\tstring extra,\n\t\tuint blockNum\n\t);\n\n\tmapping(uint => AdBid[]) public blockToBid;\n\tEthBlockBidSenderContract public builder;\n\n\tconstructor(string memory boostRelayUrl_) {\n\t\t// Make sure the builder contract cannot abuse the confidential payment bundle\n\t\tbuilder = new EthBlockBidSenderContract(boostRelayUrl_);\n\t}\n\n\t// ON-CHAIN METHODS\n\n\tfunction buyAdCallback(AdBid[] memory bids) external {\n\t\tfor (uint i = 0; i < bids.length; ++i) {\n\t\t\tuint blockNum = bids[i].blockHeight;\n\t\t\tblockToBid[blockNum].push(bids[i]);\n\t\t\t// todo: add some form of an id to the bid\n\t\t\temit AdBidEvent(bids[i].extra, blockNum);\n\t\t}\n\t}\n\n\t// CONFIDENTIAL METHODS\n\n\tfunction buyAd(\n\t\tuint64 blockStart, \n\t\tuint64 range, \n\t\tstring memory extra\n\t) external returns (bytes memory) {\n\t\trequire(Suave.isConfidential(), \"Not confidential\");\n\t\t// Check payment is valid for the latest state\n\t\tbytes memory paymentBundle = this.fetchConfidentialBundleData();\n\t\trequire(Suave.simulateBundle(paymentBundle) != 0, \"Initial sim check failed\");\n\t\t\n\t\taddress[] memory allowedPeekers = new address[](1);\n\t\tallowedPeekers[0] = address(this);\n\n\t\tAdBid[] memory bids = new AdBid[](range);\n\t\tfor (uint64 b = blockStart; b < blockStart+range; b++) {\n\t\t\t// Store payment bundle\n\t\t\tSuave.DataRecord memory paymentBid = Suave.newDataRecord(0, allowedPeekers, allowedPeekers, \"blockad:v0:paymentBundle\");\n\t\t\tSuave.confidentialStore(paymentBid.id, \"blockad:v0:paymentBundle\", paymentBundle);\n\t\t\t// Prepare bid data to be commited on-chain\n\t\t\tbids[b-blockStart] = AdBid(extra, paymentBid.id, b);\n\t\t}\n\t\treturn abi.encodeWithSelector(this.buyAdCallback.selector, bids);\n\t}\n\n\tfunction buildBlock(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\n\t\trequire(Suave.isConfidential());\n\n\t\tAdBid[] storage blockBids = blockToBid[blockHeight];\n\t\trequire(blockBids.length > 0, \"No bids\");\n\n\t\tEffectiveAdBid memory bestOffer;\n\t\tfor (uint i = 0; i < blockBids.length; ++i) {\n\t\t\tbytes memory paymentBundle = Suave.confidentialRetrieve(\n\t\t\t\tblockBids[i].paymentBidId, \n\t\t\t\t\"blockad:v0:paymentBundle\"\n\t\t\t);\n\t\t\tuint64 egp = Suave.simulateBundle(paymentBundle);\n\t\t\tif (egp > bestOffer.egp)\n\t\t\t\tbestOffer = EffectiveAdBid(blockBids[i].extra, egp, paymentBundle);\n\t\t\t// todo: if egp == 0, delete all of their bids for the next blocks (when someone wins an ad, discard their subsequent(pending) bids)\n\t\t}\n\t\tdelete blockToBid[blockHeight];\n\n\t\t// Prep for block building - include extra & payment bundle\n\t\tif (bestOffer.egp > 0)\n\t\t\tblockArgs.extra = bytes(bestOffer.extra);\n\t\t// Expect the payment on top; if someone wants to fail the payment with other txs they have to have higher egp than the payment tx\n\t\taddress[] memory allowedPeekers = new address[](3);\n\t\tallowedPeekers[0] = address(builder);\n\t\tallowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\n\t\tallowedPeekers[2] = address(this);\n\t\tSuave.DataRecord memory paymentBundleBid = Suave.newDataRecord(blockHeight, allowedPeekers, allowedPeekers, \"default:v0:ethBundles\");\n\t\tSuave.confidentialStore(paymentBundleBid.id, \"default:v0:ethBundles\", bestOffer.paymentBundle);\n\t\tSuave.confidentialStore(paymentBundleBid.id, \"default:v0:ethBundleSimResults\", abi.encode(bestOffer.egp));\n\t\t\n\t\treturn builder.buildFromPool(blockArgs, blockHeight);\n\t}\n\n}\n" + }, + "contracts/blockad/BlockAdV2.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Author: Miha Lotric (halo3mic)\n\npragma solidity ^0.8.8;\n\nimport { AnyBundleContract, Suave } from \"../standard_peekers/bids.sol\";\nimport { ConfidentialControl } from \"./lib/ConfidentialControl.sol\";\nimport { DynamicUintArray } from \"./lib/Utils.sol\";\nimport { Builder } from \"./lib/Builder.sol\";\n\n\ncontract BlockAdAuctionV2 is AnyBundleContract, ConfidentialControl {\n\tusing DynamicUintArray for bytes;\n\n\tstruct AdRequest {\n\t\tuint id;\n\t\tstring extra;\n\t\tuint blockLimit;\n\t\tSuave.DataId paymentBidId;\n\t}\n\tstruct Offer {\n\t\tuint id;\n\t\tstring extra;\n\t\tuint64 egp;\n\t\tbytes paymentBundle;\n\t}\n\n\tevent RequestAdded(uint indexed id, string extra, uint blockLimit);\n\tevent RequestRemoved(uint indexed id);\n\tevent RequestIncluded(uint indexed id, uint64 egp, string blockHash);\n\n\tstring internal constant PB_NAMESPACE = \"blockad:v0:paymentBundle\";\n\tstring internal constant EB_NAMESPACE = \"default:v0:ethBundles\";\n\tstring internal constant EB_SIM_NAMESPACE = \"default:v0:ethBundleSimResults\";\n\tBuilder public builder;\n\tAdRequest[] public requests;\n\tuint public nextId;\n\n\t/**********************************************************************\n\t * ⛓️ ON-CHAIN METHODS *\n\t ***********************************************************************/\n\n\tconstructor(string memory boostRelayUrl_) {\n\t\tbuilder = new Builder(boostRelayUrl_);\n\t}\n\n\tfunction buyAdCallback(AdRequest calldata request, UnlockArgs calldata uArgs) external unlock(uArgs) {\n\t\trequests.push(request);\n\t\tnextId++;\n\t\temit RequestAdded(request.id, request.extra, request.blockLimit);\n\t}\n\n\tfunction buildCallback(\n\t\tbytes memory builderCall,\n\t\tbytes memory includedRequestB,\n\t\tbytes memory pendingRemovalsB,\n\t\tUnlockArgs calldata uArgs\n\t) external unlock(uArgs) {\n\t\tif (pendingRemovalsB.length > 0) {\n\t\t\tremoveRequests(pendingRemovalsB.export());\n\t\t}\n\t\tstring memory blockHash = handleBuilderCallback(address(builder), builderCall);\n\t\thandleIncludedRequest(includedRequestB, blockHash);\n\t}\n\n\tfunction requestsLength() public view returns (uint) {\n\t\treturn requests.length;\n\t}\n\n\t/**********************************************************************\n\t * 🔒 CONFIDENTIAL METHODS *\n\t ***********************************************************************/\n\n\tfunction confidentialConstructor() public view override onlyConfidential returns (bytes memory) {\n\t\treturn ConfidentialControl.confidentialConstructor();\n\t}\n\n\tfunction buyAd(uint64 blockLimit, string memory extra) external onlyConfidential returns (bytes memory) {\n\t\tbytes memory paymentBundle = this.fetchConfidentialBundleData();\n\t\t(,uint64 egp) = simulateBundleSafe(paymentBundle, true);\n\t\tcrequire(egp > 0, \"egp too low\");\n\t\tSuave.DataId paymentBidId = storePaymentBundle(paymentBundle);\n\t\tAdRequest memory request = AdRequest(nextId, extra, blockLimit, paymentBidId);\n\t\treturn abi.encodeWithSelector(this.buyAdCallback.selector, request, getUnlockPair());\n\t}\n\n\tfunction buildBlock(\n\t\tSuave.BuildBlockArgs memory blockArgs,\n\t\tuint64 blockHeight\n\t) public onlyConfidential returns (bytes memory) {\n\t\tcrequire(requests.length > 0, \"No requests\");\n\t\t(Offer memory bestOffer, bytes memory removals) = filterOffers(blockHeight);\n\t\tcrequire(bestOffer.egp > 0, \"No valid offers\");\n\n\t\tstoreBundleInPool(blockHeight, bestOffer);\n\t\tblockArgs.extra = bytes(bestOffer.extra);\n\t\t// Expect flow is ordered by egp; if one wants to fail payment they need higher egp\n\t\tbytes memory externalCallback = builder.buildFromPool(blockArgs, blockHeight);\n\n\t\treturn\n\t\t\tabi.encodeWithSelector(\n\t\t\t\tthis.buildCallback.selector,\n\t\t\t\texternalCallback,\n\t\t\t\tabi.encode(bestOffer.id, bestOffer.egp),\n\t\t\t\tremovals,\n\t\t\t\tgetUnlockPair()\n\t\t\t);\n\t}\n\n\t/**********************************************************************\n\t * 🛠️ INTERNAL METHODS *\n\t ***********************************************************************/\n\n\tfunction removeRequests(uint[] memory pendingRemovals) internal {\n\t\t// Assume that the pendingRemovals were added in ascending order\n\t\t// Assume that pendingRemovals.length <= requests.length\n\t\tfor (uint i = pendingRemovals.length; i > 0; --i) {\n\t\t\tuint indexToRemove = pendingRemovals[i - 1];\n\t\t\tuint requestId = requests[indexToRemove].id;\n\t\t\tif (indexToRemove < requests.length - 1) {\n\t\t\t\trequests[indexToRemove] = requests[requests.length - 1];\n\t\t\t}\n\t\t\trequests.pop();\n\t\t\temit RequestRemoved(requestId);\n\t\t}\n\t}\n\n\tfunction handleIncludedRequest(bytes memory includedRequestB, string memory blockHash) internal {\n\t\t(uint id, uint64 egp) = abi.decode(includedRequestB, (uint, uint64));\n\t\temit RequestIncluded(id, egp, blockHash);\n\t}\n\n\tfunction handleBuilderCallback(address target, bytes memory data) internal returns (string memory) {\n\t\t(bool success, bytes memory res) = target.call(data);\n\t\tcrequire(success, \"External call failed\");\n\t\treturn abi.decode(res, (string));\n\t}\n\n\tfunction storePaymentBundle(bytes memory paymentBundle) internal view returns (Suave.DataId) {\n\t\taddress[] memory peekers = new address[](1);\n\t\tpeekers[0] = address(this);\n\t\tSuave.DataRecord memory paymentBid = Suave.newDataRecord(0, peekers, peekers, PB_NAMESPACE);\n\t\tSuave.confidentialStore(paymentBid.id, PB_NAMESPACE, paymentBundle);\n\t\treturn paymentBid.id;\n\t}\n\n\tfunction filterOffers(uint blockHeight) internal view returns (Offer memory bestOffer, bytes memory removals) {\n\t\tfor (uint i; i < requests.length; ++i) {\n\t\t\tAdRequest memory request = requests[i];\n\t\t\tif (request.blockLimit < blockHeight) {\n\t\t\t\tremovals = removals.append(i);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbytes memory paymentBundle = Suave.confidentialRetrieve(request.paymentBidId, PB_NAMESPACE);\n\t\t\t(bool success, uint64 egp) = simulateBundleSafe(paymentBundle, false);\n\t\t\tif (!success || egp == 0) {\n\t\t\t\tremovals = removals.append(i);\n\t\t\t} else if (egp > bestOffer.egp) {\n\t\t\t\tbestOffer = Offer(request.id, request.extra, egp, paymentBundle);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction storeBundleInPool(uint64 blockHeight, Offer memory bestOffer) internal view {\n\t\taddress[] memory allowedPeekers = new address[](3);\n\t\tallowedPeekers[0] = address(builder);\n\t\tallowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\n\t\tallowedPeekers[2] = address(this);\n\t\tSuave.DataRecord memory paymentBundleBid = Suave.newDataRecord(\n\t\t\tblockHeight, \n\t\t\tallowedPeekers, \n\t\t\tallowedPeekers, \n\t\t\tEB_NAMESPACE\n\t\t);\n\t\tSuave.confidentialStore(paymentBundleBid.id, EB_NAMESPACE, bestOffer.paymentBundle);\n\t\tSuave.confidentialStore(paymentBundleBid.id, EB_SIM_NAMESPACE, abi.encode(bestOffer.egp));\n\t}\n}\n" + }, + "contracts/blockad/lib/Builder.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Author: Miha Lotric (halo3mic)\n\npragma solidity ^0.8.8;\n\nimport { EthBlockContract, Suave } from \"../../standard_peekers/bids.sol\";\nimport { SuaveContract } from \"./SuaveContract.sol\";\n\n\ncontract Builder is EthBlockContract, SuaveContract {\n\tstring constant BB_NAMESPACE = \"blockad:v0:builderBid\";\n\tstring boostRelayUrl;\n\n\tevent RelaySubmission(bytes32 bidId);\n\n\tconstructor(string memory boostRelayUrl_) {\n\t\tboostRelayUrl = boostRelayUrl_;\n\t}\n\n\tfunction buildAndEmitCallback(string memory blockHash, bytes32 id) external returns (string memory) {\n\t\temit RelaySubmission(id);\n\t\treturn blockHash;\n\t}\n\n\tfunction buildAndEmit(\n\t\tSuave.BuildBlockArgs memory blockArgs,\n\t\tuint64 blockHeight,\n\t\tSuave.DataId[] memory bids,\n\t\tstring memory namespace\n\t) public virtual override onlyConfidential returns (bytes memory) {\n\t\t(Suave.DataRecord memory blockBid, bytes memory builderBid) = this.doBuild(blockArgs, blockHeight, bids, namespace);\n\t\tstoreBuilderBid(blockBid.id, builderBid);\n\t\tsubmitToRelay(builderBid);\n\t\tstring memory blockHash = extractBlockHash(builderBid, blockArgs.slot);\n\t\treturn abi.encodeWithSelector(this.buildAndEmitCallback.selector, blockHash, keccak256(builderBid));\n\t}\n\n\tfunction submitBlock(uint slot) external view onlyConfidential returns (bytes memory) {\n\t\tbytes memory builderBid = Suave.confidentialInputs();\n\t\tsubmitToRelay(builderBid);\n\t\tstring memory blockHash = extractBlockHash(builderBid, slot);\n\t\treturn abi.encodeWithSelector(this.buildAndEmitCallback.selector, blockHash, keccak256(builderBid));\n\t}\n\n\tfunction submitToRelay(bytes memory builderBid) internal view {\n\t\t(bool success, bytes memory data) = Suave.SUBMIT_ETH_BLOCK_BID_TO_RELAY\n\t\t\t.staticcall(abi.encode(boostRelayUrl, builderBid));\n\t\tif (!success) {\n\t\t\trevert SuaveErrorWithData(string(data), builderBid);\n\t\t}\n\t}\n\n\tfunction storeBuilderBid(Suave.DataId blockBidId, bytes memory builderBid) internal view {\n\t\taddress[] memory peekers = new address[](1);\n\t\tpeekers[0] = address(this);\n\t\tSuave.confidentialStore(blockBidId, BB_NAMESPACE, builderBid);\n\t}\n\n\t// Extract block-hash from stringified SubmitBlockRequest JSON object - method will fail if the struct changes!\n\tfunction extractBlockHash(bytes memory builderBid, uint slot) public pure returns (string memory) {\n\t\tuint resultBytesLen = 64;\n\t\tuint offset = 121 + decLen(slot);\n\t\tbytes memory result = new bytes(resultBytesLen);\n\t\tassembly {\n\t\t\tfor { let i:=32 } lt(i, add(resultBytesLen, 32)) { i:=add(i, 32) } {\n\t\t\t\tmstore(add(result, i), mload(add(builderBid, add(offset, i))))\n\t\t\t}\n\t\t}\n\t\treturn string(result);\n\t}\n\n\tfunction decLen(uint num) internal pure returns (uint count) {\n\t\tassembly {\n\t\t\tfor { let dec := 10 } true { dec := mul(dec, 10) } {\n\t\t\t\tcount := add(count, 1)\n\t\t\t\tswitch lt(num, dec)\n\t\t\t\t\tcase 1 { break }\n\t\t\t}\n\t\t}\n\t}\n}" + }, + "contracts/blockad/lib/ConfidentialControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Author: Miha Lotric (halo3mic)\n\npragma solidity ^0.8.8;\n\nimport { SuaveContract, Suave } from \"./SuaveContract.sol\";\n\n\nabstract contract ConfidentialControl is SuaveContract {\n\tstruct UnlockArgs {\n\t\tbytes32 key;\n\t\tbytes32 nextHash;\n\t}\n\n\tmodifier unlock(UnlockArgs calldata unlockPair) {\n\t\tcrequire(isValidKey(unlockPair.key), \"Invalid key\");\n\t\t_;\n\t\tpresentHash = unlockPair.nextHash;\n\t\tnonce++;\n\t}\n\n\tstring internal constant S_NAMESPACE = \"blockad:v0:secret\";\n\tSuave.DataId internal secretBidId;\n\tbytes32 internal presentHash;\n\tuint internal nonce;\n\n\t/**********************************************************************\n\t * ⛓️ ON-CHAIN METHODS *\n\t ***********************************************************************/\n\n\tfunction ccCallback(bytes32 nextHash, Suave.DataId sBidId) external {\n\t\tcrequire(!isInitialized(), \"Already initialized\");\n\t\tpresentHash = nextHash;\n\t\tsecretBidId = sBidId;\n\t}\n\n\tfunction isInitialized() public view returns (bool) {\n\t\treturn presentHash != 0;\n\t}\n\n\t/**********************************************************************\n\t * 🔒 CONFIDENTIAL METHODS *\n\t ***********************************************************************/\n\n\tfunction confidentialConstructor() public view virtual onlyConfidential returns (bytes memory) {\n\t\tcrequire(!isInitialized(), \"Already initialized\");\n\t\tbytes memory secret = Suave.confidentialInputs();\n\t\tSuave.DataId sBidId = storeSecret(secret);\n\t\tbytes32 nextHash = makeHash(abi.decode(secret, (bytes32)), nonce);\n\t\treturn abi.encodeWithSelector(this.ccCallback.selector, nextHash, sBidId);\n\t}\n\n\t/**********************************************************************\n\t * 🛠️ INTERNAL METHODS *\n\t ***********************************************************************/\n\n\tfunction storeSecret(bytes memory secret) internal view returns (Suave.DataId) {\n\t\taddress[] memory peekers = new address[](3);\n\t\tpeekers[0] = address(this);\n\t\tpeekers[1] = Suave.FETCH_DATA_RECORDS;\n\t\tpeekers[2] = Suave.CONFIDENTIAL_RETRIEVE;\n\t\tSuave.DataRecord memory secretBid = Suave.newDataRecord(0, peekers, peekers, S_NAMESPACE);\n\t\tSuave.confidentialStore(secretBid.id, S_NAMESPACE, secret);\n\t\treturn secretBid.id;\n\t}\n\n\tfunction isValidKey(bytes32 key) internal view returns (bool) {\n\t\treturn keccak256(abi.encode(key)) == presentHash;\n\t}\n\n\tfunction getUnlockPair() internal view returns (UnlockArgs memory) {\n\t\treturn UnlockArgs(getKey(nonce), getHash(nonce + 1));\n\t}\n\n\tfunction getHash(uint _nonce) internal view returns (bytes32) {\n\t\treturn keccak256(abi.encode(getKey(_nonce)));\n\t}\n\n\tfunction getKey(uint _nonce) internal view returns (bytes32) {\n\t\treturn makeKey(getSecret(), _nonce);\n\t}\n\n\tfunction makeHash(bytes32 secret, uint _nonce) internal pure returns (bytes32) {\n\t\treturn keccak256(abi.encode(makeKey(secret, _nonce)));\n\t}\n\n\tfunction makeKey(bytes32 secret, uint _nonce) internal pure returns (bytes32) {\n\t\treturn keccak256(abi.encode(secret, _nonce));\n\t}\n\n\tfunction getSecret() internal view returns (bytes32) {\n\t\tbytes memory secretB = Suave.confidentialRetrieve(secretBidId, S_NAMESPACE);\n\t\treturn abi.decode(secretB, (bytes32));\n\t}\n}\n" + }, + "contracts/blockad/lib/SuaveContract.sol": { + "content": "// SPDX-License-Identifier: MIT\n// Author: Miha Lotric (halo3mic)\n\npragma solidity ^0.8.8;\n\nimport { Suave } from \"../../standard_peekers/bids.sol\";\n\n\nabstract contract SuaveContract {\n\terror SuaveError(string message);\n\terror SuaveErrorWithData(string message, bytes data);\n\n\tmodifier onlyConfidential() {\n\t\tcrequire(Suave.isConfidential(), \"Not confidential\");\n\t\t_;\n\t}\n\n\tfunction simulateBundleSafe(bytes memory bundle, bool doRevert) internal view returns (bool valid, uint64 egp) {\n\t\t(bool success, bytes memory d) = Suave.SIMULATE_BUNDLE.staticcall{ gas: 20_000 }(abi.encode(bundle));\n\t\tcrequire(!doRevert || success, string(d));\n\t\tif (success) {\n\t\t\treturn (true, abi.decode(d, (uint64)));\n\t\t}\n\t}\n\n\tfunction crequire(bool condition, string memory message) internal pure {\n\t\tif (!condition) {\n\t\t\trevert SuaveError(message);\n\t\t}\n\t}\n}\n" + }, + "contracts/blockad/lib/Utils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.8;\n\n\nlibrary DynamicUintArray {\n\tfunction append(bytes memory a, uint e) internal pure returns (bytes memory) {\n\t\treturn bytes.concat(a, TypeConversion.toBytes(e));\n\t}\n\n\tfunction export(bytes memory a) internal pure returns (uint[] memory) {\n\t\treturn TypeConversion.toUints(a);\n\t}\n}\n\nlibrary TypeConversion {\n\tfunction toBytes(uint x) internal pure returns (bytes memory y) {\n\t\ty = new bytes(32);\n\t\tassembly {\n\t\t\tmstore(add(y, 32), x)\n\t\t}\n\t}\n\n\tfunction toUint(bytes memory x, uint offset) internal pure returns (uint y) {\n\t\tassembly {\n\t\t\ty := mload(add(x, offset))\n\t\t}\n\t}\n\n\tfunction toUints(bytes memory xs) internal pure returns (uint[] memory ys) {\n\t\tys = new uint[](xs.length / 32);\n\t\tfor (uint i = 0; i < xs.length / 32; i++) {\n\t\t\tys[i] = toUint(xs, i * 32 + 32);\n\t\t}\n\t}\n}\n" + }, + "contracts/libraries/Suave.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.8;\n\nlibrary Suave {\n error PeekerReverted(address, bytes);\n\n type DataId is bytes16;\n\n struct BuildBlockArgs {\n uint64 slot;\n bytes proposerPubkey;\n bytes32 parent;\n uint64 timestamp;\n address feeRecipient;\n uint64 gasLimit;\n bytes32 random;\n Withdrawal[] withdrawals;\n bytes extra;\n bytes32 parentBeaconBlockRoot;\n bool fillPending;\n }\n\n struct DataRecord {\n DataId id;\n DataId salt;\n uint64 decryptionCondition;\n address[] allowedPeekers;\n address[] allowedStores;\n string version;\n }\n\n struct HttpRequest {\n string url;\n string method;\n string[] headers;\n bytes body;\n }\n\n struct Withdrawal {\n uint64 index;\n uint64 validator;\n address Address;\n uint64 amount;\n }\n\n address public constant ANYALLOWED = 0xC8df3686b4Afb2BB53e60EAe97EF043FE03Fb829;\n\n address public constant IS_CONFIDENTIAL_ADDR = 0x0000000000000000000000000000000042010000;\n\n address public constant BUILD_ETH_BLOCK = 0x0000000000000000000000000000000042100001;\n\n address public constant CONFIDENTIAL_INPUTS = 0x0000000000000000000000000000000042010001;\n\n address public constant CONFIDENTIAL_RETRIEVE = 0x0000000000000000000000000000000042020001;\n\n address public constant CONFIDENTIAL_STORE = 0x0000000000000000000000000000000042020000;\n\n address public constant DO_HTTPREQUEST = 0x0000000000000000000000000000000043200002;\n\n address public constant ETHCALL = 0x0000000000000000000000000000000042100003;\n\n address public constant EXTRACT_HINT = 0x0000000000000000000000000000000042100037;\n\n address public constant FETCH_DATA_RECORDS = 0x0000000000000000000000000000000042030001;\n\n address public constant FILL_MEV_SHARE_BUNDLE = 0x0000000000000000000000000000000043200001;\n\n address public constant NEW_DATA_RECORD = 0x0000000000000000000000000000000042030000;\n\n address public constant SIGN_ETH_TRANSACTION = 0x0000000000000000000000000000000040100001;\n\n address public constant SIMULATE_BUNDLE = 0x0000000000000000000000000000000042100000;\n\n address public constant SUBMIT_BUNDLE_JSON_RPC = 0x0000000000000000000000000000000043000001;\n\n address public constant SUBMIT_ETH_BLOCK_BID_TO_RELAY = 0x0000000000000000000000000000000042100002;\n\n // Returns whether execution is off- or on-chain\n function isConfidential() internal view returns (bool b) {\n (bool success, bytes memory isConfidentialBytes) = IS_CONFIDENTIAL_ADDR.staticcall(\"\");\n if (!success) {\n revert PeekerReverted(IS_CONFIDENTIAL_ADDR, isConfidentialBytes);\n }\n assembly {\n // Load the length of data (first 32 bytes)\n let len := mload(isConfidentialBytes)\n // Load the data after 32 bytes, so add 0x20\n b := mload(add(isConfidentialBytes, 0x20))\n }\n }\n\n function buildEthBlock(BuildBlockArgs memory blockArgs, DataId dataId, string memory namespace)\n internal\n view\n returns (bytes memory, bytes memory)\n {\n (bool success, bytes memory data) = BUILD_ETH_BLOCK.staticcall(abi.encode(blockArgs, dataId, namespace));\n if (!success) {\n revert PeekerReverted(BUILD_ETH_BLOCK, data);\n }\n\n return abi.decode(data, (bytes, bytes));\n }\n\n function confidentialInputs() internal view returns (bytes memory) {\n (bool success, bytes memory data) = CONFIDENTIAL_INPUTS.staticcall(abi.encode());\n if (!success) {\n revert PeekerReverted(CONFIDENTIAL_INPUTS, data);\n }\n\n return data;\n }\n\n function confidentialRetrieve(DataId dataId, string memory key) internal view returns (bytes memory) {\n (bool success, bytes memory data) = CONFIDENTIAL_RETRIEVE.staticcall(abi.encode(dataId, key));\n if (!success) {\n revert PeekerReverted(CONFIDENTIAL_RETRIEVE, data);\n }\n\n return data;\n }\n\n function confidentialStore(DataId dataId, string memory key, bytes memory data1) internal view {\n (bool success, bytes memory data) = CONFIDENTIAL_STORE.staticcall(abi.encode(dataId, key, data1));\n if (!success) {\n revert PeekerReverted(CONFIDENTIAL_STORE, data);\n }\n }\n\n function doHTTPRequest(HttpRequest memory request) internal view returns (bytes memory) {\n (bool success, bytes memory data) = DO_HTTPREQUEST.staticcall(abi.encode(request));\n if (!success) {\n revert PeekerReverted(DO_HTTPREQUEST, data);\n }\n\n return abi.decode(data, (bytes));\n }\n\n function ethcall(address contractAddr, bytes memory input1) internal view returns (bytes memory) {\n (bool success, bytes memory data) = ETHCALL.staticcall(abi.encode(contractAddr, input1));\n if (!success) {\n revert PeekerReverted(ETHCALL, data);\n }\n\n return abi.decode(data, (bytes));\n }\n\n function extractHint(bytes memory bundleData) internal view returns (bytes memory) {\n require(isConfidential());\n (bool success, bytes memory data) = EXTRACT_HINT.staticcall(abi.encode(bundleData));\n if (!success) {\n revert PeekerReverted(EXTRACT_HINT, data);\n }\n\n return data;\n }\n\n function fetchDataRecords(uint64 cond, string memory namespace) internal view returns (DataRecord[] memory) {\n (bool success, bytes memory data) = FETCH_DATA_RECORDS.staticcall(abi.encode(cond, namespace));\n if (!success) {\n revert PeekerReverted(FETCH_DATA_RECORDS, data);\n }\n\n return abi.decode(data, (DataRecord[]));\n }\n\n function fillMevShareBundle(DataId dataId) internal view returns (bytes memory) {\n require(isConfidential());\n (bool success, bytes memory data) = FILL_MEV_SHARE_BUNDLE.staticcall(abi.encode(dataId));\n if (!success) {\n revert PeekerReverted(FILL_MEV_SHARE_BUNDLE, data);\n }\n\n return data;\n }\n\n function newDataRecord(\n uint64 decryptionCondition,\n address[] memory allowedPeekers,\n address[] memory allowedStores,\n string memory dataType\n ) internal view returns (DataRecord memory) {\n (bool success, bytes memory data) =\n NEW_DATA_RECORD.staticcall(abi.encode(decryptionCondition, allowedPeekers, allowedStores, dataType));\n if (!success) {\n revert PeekerReverted(NEW_DATA_RECORD, data);\n }\n\n return abi.decode(data, (DataRecord));\n }\n\n function signEthTransaction(bytes memory txn, string memory chainId, string memory signingKey)\n internal\n view\n returns (bytes memory)\n {\n (bool success, bytes memory data) = SIGN_ETH_TRANSACTION.staticcall(abi.encode(txn, chainId, signingKey));\n if (!success) {\n revert PeekerReverted(SIGN_ETH_TRANSACTION, data);\n }\n\n return abi.decode(data, (bytes));\n }\n\n function simulateBundle(bytes memory bundleData) internal view returns (uint64) {\n (bool success, bytes memory data) = SIMULATE_BUNDLE.staticcall(abi.encode(bundleData));\n if (!success) {\n revert PeekerReverted(SIMULATE_BUNDLE, data);\n }\n\n return abi.decode(data, (uint64));\n }\n\n function submitBundleJsonRPC(string memory url, string memory method, bytes memory params)\n internal\n view\n returns (bytes memory)\n {\n require(isConfidential());\n (bool success, bytes memory data) = SUBMIT_BUNDLE_JSON_RPC.staticcall(abi.encode(url, method, params));\n if (!success) {\n revert PeekerReverted(SUBMIT_BUNDLE_JSON_RPC, data);\n }\n\n return data;\n }\n\n function submitEthBlockBidToRelay(string memory relayUrl, bytes memory builderBid)\n internal\n view\n returns (bytes memory)\n {\n require(isConfidential());\n (bool success, bytes memory data) = SUBMIT_ETH_BLOCK_BID_TO_RELAY.staticcall(abi.encode(relayUrl, builderBid));\n if (!success) {\n revert PeekerReverted(SUBMIT_ETH_BLOCK_BID_TO_RELAY, data);\n }\n\n return data;\n }\n}\n" + }, + "contracts/standard_peekers/bids.sol": { + "content": "pragma solidity ^0.8.8;\n\nimport \"../libraries/Suave.sol\";\n\ncontract AnyBundleContract {\n event DataRecordEvent(Suave.DataId dataId, uint64 decryptionCondition, address[] allowedPeekers);\n\n function fetchConfidentialBundleData() public returns (bytes memory) {\n require(Suave.isConfidential());\n\n bytes memory confidentialInputs = Suave.confidentialInputs();\n return abi.decode(confidentialInputs, (bytes));\n }\n\n function emitDataRecord(Suave.DataRecord calldata dataRecord) public {\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\n }\n}\n\ncontract BundleContract is AnyBundleContract {\n function newBundle(\n uint64 decryptionCondition,\n address[] memory dataAllowedPeekers,\n address[] memory dataAllowedStores\n ) external payable returns (bytes memory) {\n require(Suave.isConfidential());\n\n bytes memory bundleData = this.fetchConfidentialBundleData();\n\n uint64 egp = Suave.simulateBundle(bundleData);\n\n Suave.DataRecord memory dataRecord =\n Suave.newDataRecord(decryptionCondition, dataAllowedPeekers, dataAllowedStores, \"default:v0:ethBundles\");\n\n Suave.confidentialStore(dataRecord.id, \"default:v0:ethBundles\", bundleData);\n Suave.confidentialStore(dataRecord.id, \"default:v0:ethBundleSimResults\", abi.encode(egp));\n\n return emitAndReturn(dataRecord, bundleData);\n }\n\n function emitAndReturn(Suave.DataRecord memory dataRecord, bytes memory) internal virtual returns (bytes memory) {\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\n return bytes.concat(this.emitDataRecord.selector, abi.encode(dataRecord));\n }\n}\n\ncontract EthBundleSenderContract is BundleContract {\n string[] public builderUrls;\n\n constructor(string[] memory builderUrls_) {\n builderUrls = builderUrls_;\n }\n\n function emitAndReturn(Suave.DataRecord memory dataRecord, bytes memory bundleData)\n internal\n virtual\n override\n returns (bytes memory)\n {\n for (uint256 i = 0; i < builderUrls.length; i++) {\n Suave.submitBundleJsonRPC(builderUrls[i], \"eth_sendBundle\", bundleData);\n }\n\n return BundleContract.emitAndReturn(dataRecord, bundleData);\n }\n}\n\ncontract MevShareContract is AnyBundleContract {\n event HintEvent(Suave.DataId dataId, bytes hint);\n\n event MatchEvent(Suave.DataId matchDataId, bytes matchHint);\n\n function newTransaction(\n uint64 decryptionCondition,\n address[] memory dataAllowedPeekers,\n address[] memory dataAllowedStores\n ) external payable returns (bytes memory) {\n // 0. check confidential execution\n require(Suave.isConfidential());\n\n // 1. fetch bundle data\n bytes memory bundleData = this.fetchConfidentialBundleData();\n\n // 2. sim bundle\n uint64 egp = Suave.simulateBundle(bundleData);\n\n // 3. extract hint\n bytes memory hint = Suave.extractHint(bundleData);\n\n // // 4. store bundle and sim results\n Suave.DataRecord memory dataRecord = Suave.newDataRecord(\n decryptionCondition, dataAllowedPeekers, dataAllowedStores, \"mevshare:v0:unmatchedBundles\"\n );\n Suave.confidentialStore(dataRecord.id, \"mevshare:v0:ethBundles\", bundleData);\n Suave.confidentialStore(dataRecord.id, \"mevshare:v0:ethBundleSimResults\", abi.encode(egp));\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\n emit HintEvent(dataRecord.id, hint);\n\n // // 5. return \"callback\" to emit hint onchain\n return bytes.concat(this.emitDataRecordAndHint.selector, abi.encode(dataRecord, hint));\n }\n\n function emitDataRecordAndHint(Suave.DataRecord calldata dataRecord, bytes memory hint) public {\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\n emit HintEvent(dataRecord.id, hint);\n }\n\n function newMatch(\n uint64 decryptionCondition,\n address[] memory dataAllowedPeekers,\n address[] memory dataAllowedStores,\n Suave.DataId sharedataId\n ) external payable returns (bytes memory) {\n // WARNING : this function will copy the original mev share bid\n // into a new key with potentially different permsissions\n\n require(Suave.isConfidential());\n // 1. fetch confidential data\n bytes memory matchBundleData = this.fetchConfidentialBundleData();\n\n // 2. sim match alone for validity\n uint64 egp = Suave.simulateBundle(matchBundleData);\n\n // 3. extract hint\n bytes memory matchHint = Suave.extractHint(matchBundleData);\n\n Suave.DataRecord memory dataRecord = Suave.newDataRecord(\n decryptionCondition, dataAllowedPeekers, dataAllowedStores, \"mevshare:v0:matchDataRecords\"\n );\n Suave.confidentialStore(dataRecord.id, \"mevshare:v0:ethBundles\", matchBundleData);\n Suave.confidentialStore(dataRecord.id, \"mevshare:v0:ethBundleSimResults\", abi.encode(0));\n\n //4. merge data records\n Suave.DataId[] memory dataRecords = new Suave.DataId[](2);\n dataRecords[0] = sharedataId;\n dataRecords[1] = dataRecord.id;\n Suave.confidentialStore(dataRecord.id, \"mevshare:v0:mergedDataRecords\", abi.encode(dataRecords));\n\n return emitMatchDataRecordAndHint(dataRecord, matchHint);\n }\n\n function emitMatchDataRecordAndHint(Suave.DataRecord memory dataRecord, bytes memory matchHint)\n internal\n virtual\n returns (bytes memory)\n {\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\n emit MatchEvent(dataRecord.id, matchHint);\n\n return bytes.concat(this.emitDataRecord.selector, abi.encode(dataRecord));\n }\n}\n\ncontract MevShareBundleSenderContract is MevShareContract {\n string[] public builderUrls;\n\n constructor(string[] memory builderUrls_) {\n builderUrls = builderUrls_;\n }\n\n function emitMatchDataRecordAndHint(Suave.DataRecord memory dataRecord, bytes memory matchHint)\n internal\n virtual\n override\n returns (bytes memory)\n {\n bytes memory bundleData = Suave.fillMevShareBundle(dataRecord.id);\n for (uint256 i = 0; i < builderUrls.length; i++) {\n Suave.submitBundleJsonRPC(builderUrls[i], \"mev_sendBundle\", bundleData);\n }\n\n return MevShareContract.emitMatchDataRecordAndHint(dataRecord, matchHint);\n }\n}\n\n/* Not tested or implemented on the precompile side */\nstruct EgpRecordPair {\n uint64 egp; // in wei, beware overflow\n Suave.DataId dataId;\n}\n\ncontract EthBlockContract is AnyBundleContract {\n event BuilderBoostBidEvent(Suave.DataId dataId, bytes builderBid);\n\n function idsEqual(Suave.DataId _l, Suave.DataId _r) public pure returns (bool) {\n bytes memory l = abi.encodePacked(_l);\n bytes memory r = abi.encodePacked(_r);\n for (uint256 i = 0; i < l.length; i++) {\n if (bytes(l)[i] != r[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function buildMevShare(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\n require(Suave.isConfidential());\n\n Suave.DataRecord[] memory allShareMatchDataRecords =\n Suave.fetchDataRecords(blockHeight, \"mevshare:v0:matchDataRecords\");\n Suave.DataRecord[] memory allShareUserDataRecords =\n Suave.fetchDataRecords(blockHeight, \"mevshare:v0:unmatchedBundles\");\n\n if (allShareUserDataRecords.length == 0) {\n revert Suave.PeekerReverted(address(this), \"no data records\");\n }\n\n Suave.DataRecord[] memory allRecords = new Suave.DataRecord[](allShareUserDataRecords.length);\n for (uint256 i = 0; i < allShareUserDataRecords.length; i++) {\n // TODO: sort matches by egp first!\n Suave.DataRecord memory dataRecordToInsert = allShareUserDataRecords[i]; // will be updated with the best match if any\n for (uint256 j = 0; j < allShareMatchDataRecords.length; j++) {\n // TODO: should be done once at the start and sorted\n Suave.DataId[] memory mergeddataIds = abi.decode(\n Suave.confidentialRetrieve(allShareMatchDataRecords[j].id, \"mevshare:v0:mergedDataRecords\"),\n (Suave.DataId[])\n );\n if (idsEqual(mergeddataIds[0], allShareUserDataRecords[i].id)) {\n dataRecordToInsert = allShareMatchDataRecords[j];\n break;\n }\n }\n allRecords[i] = dataRecordToInsert;\n }\n\n EgpRecordPair[] memory bidsByEGP = new EgpRecordPair[](allRecords.length);\n for (uint256 i = 0; i < allRecords.length; i++) {\n bytes memory simResults = Suave.confidentialRetrieve(allRecords[i].id, \"mevshare:v0:ethBundleSimResults\");\n uint64 egp = abi.decode(simResults, (uint64));\n bidsByEGP[i] = EgpRecordPair(egp, allRecords[i].id);\n }\n\n // Bubble sort, cause why not\n uint256 n = bidsByEGP.length;\n for (uint256 i = 0; i < n - 1; i++) {\n for (uint256 j = i + 1; j < n; j++) {\n if (bidsByEGP[i].egp < bidsByEGP[j].egp) {\n EgpRecordPair memory temp = bidsByEGP[i];\n bidsByEGP[i] = bidsByEGP[j];\n bidsByEGP[j] = temp;\n }\n }\n }\n\n Suave.DataId[] memory alldataIds = new Suave.DataId[](allRecords.length);\n for (uint256 i = 0; i < bidsByEGP.length; i++) {\n alldataIds[i] = bidsByEGP[i].dataId;\n }\n\n return buildAndEmit(blockArgs, blockHeight, alldataIds, \"mevshare:v0\");\n }\n\n function buildFromPool(Suave.BuildBlockArgs memory blockArgs, uint64 blockHeight) public returns (bytes memory) {\n require(Suave.isConfidential());\n\n Suave.DataRecord[] memory allRecords = Suave.fetchDataRecords(blockHeight, \"default:v0:ethBundles\");\n if (allRecords.length == 0) {\n revert Suave.PeekerReverted(address(this), \"no data records\");\n }\n\n EgpRecordPair[] memory bidsByEGP = new EgpRecordPair[](allRecords.length);\n for (uint256 i = 0; i < allRecords.length; i++) {\n bytes memory simResults = Suave.confidentialRetrieve(allRecords[i].id, \"default:v0:ethBundleSimResults\");\n uint64 egp = abi.decode(simResults, (uint64));\n bidsByEGP[i] = EgpRecordPair(egp, allRecords[i].id);\n }\n\n // Bubble sort, cause why not\n uint256 n = bidsByEGP.length;\n for (uint256 i = 0; i < n - 1; i++) {\n for (uint256 j = i + 1; j < n; j++) {\n if (bidsByEGP[i].egp < bidsByEGP[j].egp) {\n EgpRecordPair memory temp = bidsByEGP[i];\n bidsByEGP[i] = bidsByEGP[j];\n bidsByEGP[j] = temp;\n }\n }\n }\n\n Suave.DataId[] memory alldataIds = new Suave.DataId[](allRecords.length);\n for (uint256 i = 0; i < bidsByEGP.length; i++) {\n alldataIds[i] = bidsByEGP[i].dataId;\n }\n\n return buildAndEmit(blockArgs, blockHeight, alldataIds, \"\");\n }\n\n function buildAndEmit(\n Suave.BuildBlockArgs memory blockArgs,\n uint64 blockHeight,\n Suave.DataId[] memory records,\n string memory namespace\n ) public virtual returns (bytes memory) {\n require(Suave.isConfidential());\n\n (Suave.DataRecord memory blockBid, bytes memory builderBid) =\n this.doBuild(blockArgs, blockHeight, records, namespace);\n\n emit BuilderBoostBidEvent(blockBid.id, builderBid);\n emit DataRecordEvent(blockBid.id, blockBid.decryptionCondition, blockBid.allowedPeekers);\n return bytes.concat(this.emitBuilderBidAndBid.selector, abi.encode(blockBid, builderBid));\n }\n\n function doBuild(\n Suave.BuildBlockArgs memory blockArgs,\n uint64 blockHeight,\n Suave.DataId[] memory records,\n string memory namespace\n ) public view returns (Suave.DataRecord memory, bytes memory) {\n address[] memory allowedPeekers = new address[](2);\n allowedPeekers[0] = address(this);\n allowedPeekers[1] = Suave.BUILD_ETH_BLOCK;\n\n Suave.DataRecord memory blockBid =\n Suave.newDataRecord(blockHeight, allowedPeekers, allowedPeekers, \"default:v0:mergedDataRecords\");\n Suave.confidentialStore(blockBid.id, \"default:v0:mergedDataRecords\", abi.encode(records));\n\n (bytes memory builderBid, bytes memory payload) = Suave.buildEthBlock(blockArgs, blockBid.id, namespace);\n Suave.confidentialStore(blockBid.id, \"default:v0:builderPayload\", payload); // only through this.unlock\n\n return (blockBid, builderBid);\n }\n\n function emitBuilderBidAndBid(Suave.DataRecord memory dataRecord, bytes memory builderBid)\n public\n returns (Suave.DataRecord memory, bytes memory)\n {\n emit BuilderBoostBidEvent(dataRecord.id, builderBid);\n emit DataRecordEvent(dataRecord.id, dataRecord.decryptionCondition, dataRecord.allowedPeekers);\n return (dataRecord, builderBid);\n }\n\n function unlock(Suave.DataId dataId, bytes memory signedBlindedHeader) public view returns (bytes memory) {\n require(Suave.isConfidential());\n\n // TODO: verify the header is correct\n // TODO: incorporate protocol name\n bytes memory payload = Suave.confidentialRetrieve(dataId, \"default:v0:builderPayload\");\n return payload;\n }\n}\n\ncontract EthBlockBidSenderContract is EthBlockContract {\n string boostRelayUrl;\n\n constructor(string memory boostRelayUrl_) {\n boostRelayUrl = boostRelayUrl_;\n }\n\n function buildAndEmit(\n Suave.BuildBlockArgs memory blockArgs,\n uint64 blockHeight,\n Suave.DataId[] memory dataRecords,\n string memory namespace\n ) public virtual override returns (bytes memory) {\n require(Suave.isConfidential());\n\n (Suave.DataRecord memory blockDataRecord, bytes memory builderBid) =\n this.doBuild(blockArgs, blockHeight, dataRecords, namespace);\n Suave.submitEthBlockBidToRelay(boostRelayUrl, builderBid);\n\n emit DataRecordEvent(blockDataRecord.id, blockDataRecord.decryptionCondition, blockDataRecord.allowedPeekers);\n return bytes.concat(this.emitDataRecord.selector, abi.encode(blockDataRecord));\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/tasks/build-blocks.ts b/tasks/build-blocks.ts index cee8654..962c4ca 100644 --- a/tasks/build-blocks.ts +++ b/tasks/build-blocks.ts @@ -160,7 +160,7 @@ function makeCalldata( iface?: ethers.utils.Interface, method?: string ) { - const fillPending = true + const fillPending = false const blockArgs = [ bbArgs.slot, bbArgs.proposerPubkey, @@ -171,6 +171,7 @@ function makeCalldata( bbArgs.random, bbArgs.withdrawals.map(w => [ w.index, w.validator, w.address, w.amount ]), ethers.constants.HashZero, + bbArgs.parentBeaconBlockRoot, fillPending, ] if (!method) @@ -190,6 +191,7 @@ export interface BuildBlockArgs { gasLimit: number; random: string; withdrawals: Withdrawal[]; + parentBeaconBlockRoot: string; } interface Withdrawal { @@ -217,6 +219,7 @@ export function makeBuildBlockArgs(beacon: BeaconEventData, validator: Validator feeRecipient: validator.feeRecipient, gasLimit: validator.gasLimit, proposerPubkey: validator.pubkey, + parentBeaconBlockRoot: beacon.payload_attributes.parent_beacon_block_root, } } @@ -229,7 +232,7 @@ export interface ITaskConfig { relayUrl: string, beaconUrl: string, buildOpts?: IBuildOptions, - resubmit: boolean, + resubmit?: boolean, } async function getConfig(hre: HRE, taskArgs: any): Promise { diff --git a/tasks/utils/beacon.ts b/tasks/utils/beacon.ts index a1232fc..8dacbb9 100644 --- a/tasks/utils/beacon.ts +++ b/tasks/utils/beacon.ts @@ -14,6 +14,7 @@ export interface PayloadAttributes { prev_randao: string; suggested_fee_recipient: string; withdrawals: Withdrawal[]; + parent_beacon_block_root: string; } export interface BeaconEventData { @@ -95,7 +96,8 @@ export class BeaconPAListener { validator_index: Number(w.validator_index), address: w.address, amount: Number(w.amount) - })) + })), + parent_beacon_block_root: parsed.data.payload_attributes.parent_beacon_block_root } } }