0 txs
0 calls
constructor
constructor(address authModule_, address tokenDeployerImplementation_)
functions
adminEpoch
viewfunction adminEpoch() view returns (uint256)
admins
viewfunction admins(uint256 epoch) view returns (address[] results)
adminThreshold
viewfunction adminThreshold(uint256 epoch) view returns (uint256)
allTokensFrozen
purefunction allTokensFrozen() pure returns (bool)
authModule
viewfunction authModule() view returns (address)
getAddress
viewfunction getAddress(bytes32 key) view returns (address)
getBool
viewfunction getBool(bytes32 key) view returns (bool)
getBytes
viewfunction getBytes(bytes32 key) view returns (bytes)
getInt
viewfunction getInt(bytes32 key) view returns (int256)
getString
viewfunction getString(bytes32 key) view returns (string)
getUint
viewfunction getUint(bytes32 key) view returns (uint256)
implementation
viewfunction implementation() view returns (address)
isCommandExecuted
viewfunction isCommandExecuted(bytes32 commandId) view returns (bool)
isContractCallAndMintApproved
viewfunction isContractCallAndMintApproved(bytes32 commandId, string sourceChain, string sourceAddress, address contractAddress, bytes32 payloadHash, string symbol, uint256 amount) view returns (bool)
isContractCallApproved
viewfunction isContractCallApproved(bytes32 commandId, string sourceChain, string sourceAddress, address contractAddress, bytes32 payloadHash) view returns (bool)
tokenAddresses
viewfunction tokenAddresses(string symbol) view returns (address)
tokenDeployer
viewfunction tokenDeployer() view returns (address)
tokenFrozen
purefunction tokenFrozen(string) pure returns (bool)
tokenMintAmount
viewfunction tokenMintAmount(string symbol) view returns (uint256)
tokenMintLimit
viewfunction tokenMintLimit(string symbol) view returns (uint256)
approveContractCall
nonpayablefunction approveContractCall(bytes params, bytes32 commandId)
approveContractCallWithMint
nonpayablefunction approveContractCallWithMint(bytes params, bytes32 commandId)
burnToken
nonpayablefunction burnToken(bytes params, bytes32)
callContract
nonpayablefunction callContract(string destinationChain, string destinationContractAddress, bytes payload)
callContractWithToken
nonpayablefunction callContractWithToken(string destinationChain, string destinationContractAddress, bytes payload, string symbol, uint256 amount)
deployToken
nonpayablefunction deployToken(bytes params, bytes32)
execute
nonpayablefunction execute(bytes input)
mintToken
nonpayablefunction mintToken(bytes params, bytes32)
sendToken
nonpayablefunction sendToken(string destinationChain, string destinationAddress, string symbol, uint256 amount)
setTokenMintLimits
nonpayablefunction setTokenMintLimits(string[] symbols, uint256[] limits)
setup
nonpayablefunction setup(bytes params)
transferOperatorship
nonpayablefunction transferOperatorship(bytes newOperatorsData, bytes32)
upgrade
nonpayablefunction upgrade(address newImplementation, bytes32 newImplementationCodeHash, bytes setupParams)
validateContractCall
nonpayablefunction validateContractCall(bytes32 commandId, string sourceChain, string sourceAddress, bytes32 payloadHash) returns (bool valid)
validateContractCallAndMint
nonpayablefunction validateContractCallAndMint(bytes32 commandId, string sourceChain, string sourceAddress, bytes32 payloadHash, string symbol, uint256 amount) returns (bool valid)
events
ContractCall
event ContractCall(address indexed sender, string destinationChain, string destinationContractAddress, bytes32 indexed payloadHash, bytes payload)
ContractCallApproved
event ContractCallApproved(bytes32 indexed commandId, string sourceChain, string sourceAddress, address indexed contractAddress, bytes32 indexed payloadHash, bytes32 sourceTxHash, uint256 sourceEventIndex)
ContractCallApprovedWithMint
event ContractCallApprovedWithMint(bytes32 indexed commandId, string sourceChain, string sourceAddress, address indexed contractAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, bytes32 sourceTxHash, uint256 sourceEventIndex)
ContractCallWithToken
event ContractCallWithToken(address indexed sender, string destinationChain, string destinationContractAddress, bytes32 indexed payloadHash, bytes payload, string symbol, uint256 amount)
Executed
event Executed(bytes32 indexed commandId)
OperatorshipTransferred
event OperatorshipTransferred(bytes newOperatorsData)
TokenDeployed
event TokenDeployed(string symbol, address tokenAddresses)
TokenMintLimitUpdated
event TokenMintLimitUpdated(string symbol, uint256 limit)
TokenSent
event TokenSent(address indexed sender, string destinationChain, string destinationAddress, string symbol, uint256 amount)
Upgraded
event Upgraded(address indexed implementation)
errors
AlreadyVoted
error AlreadyVoted()
BurnFailed
error BurnFailed(string symbol)
DuplicateAdmin
error DuplicateAdmin(address admin)
ExceedMintLimit
error ExceedMintLimit(string symbol)
InvalidAdmins
error InvalidAdmins()
InvalidAdminThreshold
error InvalidAdminThreshold()
InvalidAmount
error InvalidAmount()
InvalidAuthModule
error InvalidAuthModule()
InvalidChainId
error InvalidChainId()
InvalidCodeHash
error InvalidCodeHash()
InvalidCommands
error InvalidCommands()
InvalidSetMintLimitsParams
error InvalidSetMintLimitsParams()
InvalidTokenDeployer
error InvalidTokenDeployer()
MintFailed
error MintFailed(string symbol)
NotAdmin
error NotAdmin()
NotProxy
error NotProxy()
NotSelf
error NotSelf()
SetupFailed
error SetupFailed()
TokenAlreadyExists
error TokenAlreadyExists(string symbol)
TokenContractDoesNotExist
error TokenContractDoesNotExist(address token)
TokenDeployFailed
error TokenDeployFailed(string symbol)
TokenDoesNotExist
error TokenDoesNotExist(string symbol)
creation bytecode
0x60c06040523480156200001157600080fd5b506040516200482a3803806200482a8339810160408190526200003491620000bb565b6001600160a01b0382163b6200005d5760405163735326ab60e01b815260040160405180910390fd5b6001600160a01b0381163b6200008657604051630c84dabf60e31b815260040160405180910390fd5b6001600160a01b039182166080521660a052620000f3565b80516001600160a01b0381168114620000b657600080fd5b919050565b60008060408385031215620000cf57600080fd5b620000da836200009e565b9150620000ea602084016200009e565b90509250929050565b60805160a0516146f56200013560003960008181610344015261168b015260008181610404015281816105fb015281816118b80152611b8f01526146f56000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80637b1b769e11610145578063b5417084116100bd578063cec7b3591161008c578063dc97d96211610071578063dc97d9621461058a578063f6a5f9f5146105aa578063fbe0a31b146105bd57600080fd5b8063cec7b35914610564578063d26ff2101461057757600080fd5b8063b54170841461050b578063bc00c2161461051e578063bd02d0f514610531578063c031a1801461055157600080fd5b806397b87ba6116101145780639ded06df116100f95780639ded06df146104de578063a3499c73146104f1578063aa1e1f0a1461050457600080fd5b806397b87ba6146104ab578063986e791a146104be57600080fd5b80637b1b769e1461045e578063886a625d1461047257806388b3058714610485578063935b13f61461049857600080fd5b80632a2dae0a116101d85780635c60da1b116101a757806364940c561161018c57806364940c561461040257806367ace8eb146104285780637ae1cfca1461043b57600080fd5b80635c60da1b146103965780635f6970c3146103ef57600080fd5b80632a2dae0a14610342578063364940d8146103685780634656ae2e14610370578063585a9fd41461038357600080fd5b80631c92115f116102145780631c92115f146102ba57806321f8a721146102cd578063269eb65e1461030e57806326ef699d1461032f57600080fd5b806309c5eabe14610246578063146e2d781461025b57806314bfd6d01461026e5780631876eed914610297575b600080fd5b610259610254366004612f84565b6105d0565b005b610259610269366004612fc6565b610aea565b61028161027c366004613012565b610b33565b60405161028e919061302b565b60405180910390f35b6102aa6102a5366004613078565b610bdd565b604051901515815260200161028e565b6102596102c836600461312d565b610d11565b6102f66102db366004613012565b6000908152600260205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161028e565b61032161031c36600461328c565b610d7c565b60405190815260200161028e565b61025961033d3660046132c1565b610d90565b7f00000000000000000000000000000000000000000000000000000000000000006102f6565b610321610e28565b61025961037e366004612fc6565b610e80565b610259610391366004612fc6565b6111d4565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b03166102f6565b6102aa6103fd366004613364565b611282565b7f00000000000000000000000000000000000000000000000000000000000000006102f6565b61025961043636600461342b565b61133b565b6102aa610449366004613012565b60009081526004602052604090205460ff1690565b6102aa61046c36600461328c565b50600090565b610259610480366004612fc6565b6115b8565b610321610493366004613012565b611868565b6102f66104a636600461328c565b611873565b6102596104b9366004612fc6565b611881565b6104d16104cc366004613012565b61195f565b60405161028e91906134ef565b6102596104ec366004612f84565b611a01565b6102596104ff366004613517565b611c35565b60006102aa565b610259610519366004613567565b611f59565b6102aa61052c366004613633565b61200f565b61032161053f366004613012565b60009081526020819052604090205490565b6104d161055f366004613012565b6120e2565b61032161057236600461328c565b6120ff565b6102aa610585366004613012565b612119565b610321610598366004613012565b60009081526005602052604090205490565b6102aa6105b8366004613701565b612127565b6102596105cb366004612fc6565b6121b0565b6000806105df83850185613798565b9150915060006105f58380519060200120612250565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166373e3d66a83856040518363ffffffff1660e01b81526004016106479291906137fc565b602060405180830381600087803b15801561066157600080fd5b505af1158015610675573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610699919061382a565b905060006060806060878060200190518101906106b691906139ce565b929650909450925090504684146106f9576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825182518114158061070c575081518114155b15610743576040517fca9a28f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610adc57600085828151811061076257610762613ab8565b6020026020010151905061077581612119565b156107805750610acc565b60008086848151811061079557610795613ab8565b60200260200101516040516020016107ad9190613ace565b6040516020818303038152906040528051906020012090507f5763814b98a3aa86f212797af3273868b5dd6e2a532d764a79b98ca859e7bbad811415610815577f886a625d0000000000000000000000000000000000000000000000000000000091506109be565b7fec78d9c22c08bb9f0ecd5d95571ae83e3f22219c5a9278c3270691d50abfd91b811415610865577f146e2d780000000000000000000000000000000000000000000000000000000091506109be565b7f37ac16aabc4d87540e53151b2b716265cfd6b195db96a9daf8e893c829bbd2338114156108b5577ffbe0a31b0000000000000000000000000000000000000000000000000000000091506109be565b7ff41504255b911b3042ee4f8786fdf7cf4bcf24ace033fa16af3c8574e025e436811415610905577f585a9fd40000000000000000000000000000000000000000000000000000000091506109be565b7fda199c0e76f665e0450020791c7f8eacc75f3cdbace313272c28f93e5390b62c811415610955577f4656ae2e0000000000000000000000000000000000000000000000000000000091506109be565b7fb460dcb6fd5797fc0e7ea0f13406c80d30702ba7f73a42bd91394775dcbca7188114156109b6578961098a57505050610acc565b600099507f97b87ba60000000000000000000000000000000000000000000000000000000091506109be565b505050610acc565b6109c98360016122a4565b6000306001600160a01b0316838887815181106109e8576109e8613ab8565b602002602001015186604051602401610a02929190613aea565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610a409190613ace565b6000604051808303816000865af19150503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b505090508015610abc5760405184907fa74c8847d513feba22a0f0cb38d53081abf97562cdb293926ba243689e7c41ca90600090a2610ac7565b610ac78460006122a4565b505050505b610ad581613b22565b9050610746565b505050505050505050505050565b333014610b0a576040516314e1dbf760e11b815260040160405180910390fd5b60008080610b1a85870187613b48565b925092509250610b2b8383836122d0565b505050505050565b60606000610b408361246d565b90508067ffffffffffffffff811115610b5b57610b5b6131c7565b604051908082528060200260200182016040528015610b84578160200160208202803683370190505b50915060005b81811015610bd657610b9c848261247b565b838281518110610bae57610bae613ab8565b6001600160a01b0390921660209283029190910190910152610bcf81613b22565b9050610b8a565b5050919050565b600080610c8e8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525050604080516020601f8d018190048102820181019092528b81523393508d9250908c908c90819084018382808284376000920191909152508c9250612491915050565b60008181526004602052604090205460ff16925090508115610d03576000818152600460205260409020805460ff19169055610d0385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508791506122d09050565b509998505050505050505050565b8181604051610d21929190613ba2565b6040518091039020336001600160a01b03167f30ae6cc78c27e651745bf2ad08a11de83910ac1e347a52f7ac898c0fbef94dae888888888888604051610d6c96959493929190613bdb565b60405180910390a3505050505050565b6000610d8a61053f836124f5565b92915050565b610dd23384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061252a915050565b336001600160a01b03167f651d93f66c4329630e8d0f62488eff599e3be484da587335e8dc0fcf4606272688888888888888604051610e179796959493929190613c24565b60405180910390a250505050505050565b6000610e7b7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b905090565b333014610ea0576040516314e1dbf760e11b815260040160405180910390fd5b600080610eaf84860186613c75565b915091506000610ebe83611873565b90506001600160a01b038116610ef2578260405163395d09bf60e11b8152600401610ee991906134ef565b60405180910390fd5b6002610efd84612795565b6002811115610f0e57610f0e613cba565b141561117157600082604051610f2390612f2e565b8190604051809103906000f5905080158015610f43573d6000803e3d6000fd5b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830181905292935060009283929091631cff79cd91879163a9059cbb60e01b9130918416906370a082319060240160206040518083038186803b158015610fbd57600080fd5b505afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff59190613cd0565b6040516001600160a01b039092166024830152604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526110569291600401613ce9565b600060405180830381600087803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ac9190810190613d0b565b915091508115806110d957508051158015906110d95750808060200190518101906110d7919061382a565b155b156110f9578560405163e217b0ad60e01b8152600401610ee991906134ef565b6040517ef55d9d0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0384169062f55d9d90602401600060405180830381600087803b15801561115157600080fd5b505af1158015611165573d6000803e3d6000fd5b50505050505050610b2b565b6040516308a1eee160e01b8152600481018390526001600160a01b038216906308a1eee1906024015b600060405180830381600087803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050505050505050565b3330146111f4576040516314e1dbf760e11b815260040160405180910390fd5b6000808080808080806112098a8c018c613d4f565b97509750975097509750975097509750611228898989898989896127b4565b84866001600160a01b03168a7f9991faa1f435675159ffae64b66d7ecfdb55c29755869a18db8497b4392347e08b8b8989898960405161126d96959493929190613e0d565b60405180910390a45050505050505050505050565b6000806112fd8888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a91508990819084018382808284376000920191909152503392508991506127ea9050565b60008181526004602052604090205460ff16925090508115611330576000818152600460205260409020805460ff191690555b509695505050505050565b600061138e7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b905061139a8133612848565b6113b757604051637bfa4b9f60e01b815260040160405180910390fd5b600080366040516113c9929190613ba2565b604051809103902090506113de828233612857565b156113fc57604051637c9a1cf960e01b815260040160405180910390fd5b61140982823360016128d5565b600060016114178484612948565b6114219190613e65565b905061142e838383612957565b6114378361297c565b811015611446575050506115b2565b85841461147f576040517f14a2275f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8681101561156157600088888381811061149e5761149e613ab8565b90506020028101906114b09190613e7d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509394508a92508991508590508181106114fb576114fb613ab8565b90506020020135905060006001600160a01b031661151883611873565b6001600160a01b03161415611542578160405163395d09bf60e11b8152600401610ee991906134ef565b61154c828261298a565b5050808061155990613b22565b915050611482565b5061156e83836000612957565b60006115798461246d565b905060005b818110156115ac5761159c8585611595888561247b565b60006128d5565b6115a581613b22565b905061157e565b50505050505b50505050565b3330146115d8576040516314e1dbf760e11b815260040160405180910390fd5b600080808080806115eb888a018a613ec4565b95509550955095509550955060006001600160a01b031661160b86611873565b6001600160a01b03161461164d57846040517faa7e8b32000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b6001600160a01b0382166117b95760008560405160200161166e9190613ace565b6040516020818303038152906040528051906020012090506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636fc95b3460e01b8a8a8a8a886040516024016116d4959493929190613f67565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516117129190613ace565b600060405180830381855af49150503d806000811461174d576040519150601f19603f3d011682016040523d82523d6000602084013e611752565b606091505b50915091508161179057876040517f86d52743000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b808060200190518101906117a49190613fad565b94506117b18860016129d3565b505050611810565b6001600160a01b0382163b611805576040517fc5ccddde0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610ee9565b6118108560026129d3565b61181a8583612a03565b611824858261298a565b7fbf90b5a1ec9763e8bf4b9245cef0c28db92bab309fc2c5177f17814f382469388583604051611855929190613fca565b60405180910390a1505050505050505050565b6000610d8a8261297c565b6000610d8a6102db83612a45565b3330146118a1576040516314e1dbf760e11b815260040160405180910390fd5b60405163d289d1cb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d289d1cb906118ef9086908690600401613ff5565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b505050507f192e759e55f359cd9832b5c0c6e38e4b6df5c5ca33f3bd5c90738e865a5218728383604051611952929190613ff5565b60405180910390a1505050565b600081815260016020526040902080546060919061197c90614009565b80601f01602080910402602001604051908101604052809291908181526020018280546119a890614009565b80156119f55780601f106119ca576101008083540402835291602001916119f5565b820191906000526020600020905b8154815290600101906020018083116119d857829003601f168201915b50505050509050919050565b6000611a5d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b031690565b6001600160a01b03161415611a9e576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080611aae84860186614044565b92509250925060006001611b097fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b611b139190613e65565b9050611b66817fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc255565b611b71818585612a7d565b815115610b2b5760405163d289d1cb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d289d1cb90611bc49085906004016134ef565b600060405180830381600087803b158015611bde57600080fd5b505af1158015611bf2573d6000803e3d6000fd5b505050507f192e759e55f359cd9832b5c0c6e38e4b6df5c5ca33f3bd5c90738e865a52187282604051611c2591906134ef565b60405180910390a1505050505050565b6000611c887fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b9050611c948133612848565b611cb157604051637bfa4b9f60e01b815260040160405180910390fd5b60008036604051611cc3929190613ba2565b60405180910390209050611cd8828233612857565b15611cf657604051637c9a1cf960e01b815260040160405180910390fd5b611d0382823360016128d5565b60006001611d118484612948565b611d1b9190613e65565b9050611d28838383612957565b611d318361297c565b811015611d40575050506115b2565b866001600160a01b03163f8614611d83576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038816907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28315611e9f576000876001600160a01b0316639ded06df60e01b8787604051602401611de4929190613ff5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611e229190613ace565b600060405180830381855af49150503d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b5050905080611e9d576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b611f16877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831617905550565b611f2283836000612957565b6000611f2d8461246d565b905060005b818110156115ac57611f498585611595888561247b565b611f5281613b22565b9050611f32565b611f9b3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061252a915050565b8484604051611fab929190613ba2565b6040518091039020336001600160a01b03167f7e50569d26be643bda7757722291ec66b1be66d8283474ae3fab5a98f878a7a28b8b8b8b8b8b8b8b8b604051611ffc9998979695949392919061410f565b60405180910390a3505050505050505050565b60006120d36104498c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152508c9250612491915050565b9b9a5050505050505050505050565b600081815260036020526040902080546060919061197c90614009565b6000610d8a61053f8361211461546042614177565b612bb6565b6000610d8a61044983612c0b565b60006121a46104498989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a90819084018382808284376000920191909152508a92508991506127ea9050565b98975050505050505050565b3330146121d0576040516314e1dbf760e11b815260040160405180910390fd5b600080808080806121e3888a018a614199565b9550955095509550955095506121fc8787878787612c46565b82846001600160a01b0316887f44e4f8f6bd682c5a3aeba93601ab07cb4d1f21b2aab1ae4880d9577919309aa48989878760405161223d949392919061422b565b60405180910390a4505050505050505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c015b604051602081830303815290604052805190602001209050919050565b6122cc6122b083612c0b565b6000908152600460205260409020805460ff1916831515179055565b5050565b60006122db84611873565b90506001600160a01b038116612306578360405163395d09bf60e11b8152600401610ee991906134ef565b6123238483612314876120ff565b61231e9190613e65565b612c56565b600261232e85612795565b600281111561233f5761233f613cba565b14156123ec576040516001600160a01b0384166024820152604481018390526000906123ab90839063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612cd1565b9050806123e657846040517f90c52ed7000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b506115b2565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490528216906340c10f1990604401600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050505050505050565b6000610d8a61053f83612d7a565b600061248a6102db8484612db5565b9392505050565b60007fb7ad972b71475860613db3ba1fe699b886c878f9002a09250dc25e769eb19a10888888888888886040516020016124d2989796959493929190614264565b604051602081830303815290604052805190602001209050979650505050505050565b60007feee9348b4aaba3647b1612b2724f18e93b9299da26fb321c7b3fda135d7dea87826040516020016122879291906142d7565b600061253583611873565b90506001600160a01b038116612560578260405163395d09bf60e11b8152600401610ee991906134ef565b81612597576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006125a284612795565b9050600060028260028111156125ba576125ba613cba565b1415612618576040516001600160a01b0387166024820152306044820152606481018590526125f69084906323b872dd60e01b90608401612374565b905080610b2b578460405163e217b0ad60e01b8152600401610ee991906134ef565b600182600281111561262c5761262c613cba565b141561267b576040516001600160a01b0387166024820152604481018590526125f69084907f79cc67900000000000000000000000000000000000000000000000000000000090606401612374565b6040517f31eecaf4000000000000000000000000000000000000000000000000000000008152600060048201526127469084906323b872dd60e01b9089906001600160a01b038416906331eecaf49060240160206040518083038186803b1580156126e557600080fd5b505afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190613fad565b6040516001600160a01b0392831660248201529116604482015260648101889052608401612374565b905080612768578460405163e217b0ad60e01b8152600401610ee991906134ef565b6040516308a1eee160e01b8152600060048201526001600160a01b038416906308a1eee19060240161119a565b60006127a361053f83612df7565b6002811115610d8a57610d8a613cba565b6127e16127c688888888888888612491565b6000908152600460205260409020805460ff19166001179055565b50505050505050565b60007f07b0d4304f82012bd3b70b1d531c160e326067c90829e2a3d386722ad10b89c38686868686604051602001612827969594939291906142fd565b60405160208183030381529060405280519060200120905095945050505050565b600061248a6104498484612e2c565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c602080830191909152818301869052606080830186905284901b6bffffffffffffffffffffffff1916608083015282518083036074018152609490920190925280519101206000906128cd90610449565b949350505050565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c602080830191909152818301879052606080830187905285901b6bffffffffffffffffffffffff1916608083015282518083036074018152609490920190925280519101206115b2906122b0565b600061248a61053f8484612e7f565b6129776129648484612e7f565b8260009182526020829052604090912055565b505050565b6000610d8a61053f83612ec1565b612996612964836124f5565b7fd99446c1d76385bb5519ccfb5274abcfd5896dfc22405e40010fde217f018a1882826040516129c7929190613aea565b60405180910390a15050565b6122cc6129df83612df7565b8260028111156129f1576129f1613cba565b60009182526020829052604090912055565b6122cc612a0f83612a45565b6000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416179055565b60007fc4e632779a6a7838736dd7e5e6a0eadf171dd37dfb6230720e265576dfcf42bb826040516020016122879291906142d7565b50565b815181811015612aa05760405163f1965a0760e01b815260040160405180910390fd5b81612ad7576040517f1845300d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ae18483612efc565b612aeb8482612f08565b60005b81811015612baf576000848281518110612b0a57612b0a613ab8565b60200260200101519050612b1e8682612848565b15612b60576040517f424926de0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610ee9565b6001600160a01b038116612b875760405163f1965a0760e01b815260040160405180910390fd5b612b92868383612f14565b612b9e86826001612f21565b50612ba881613b22565b9050612aee565b5050505050565b60007f2f8851fe0d6d537e552a4f25b7a3167d48eb1292622c71d84630a2a44757bced8383604051602001612bed9392919061434d565b60405160208183030381529060405280519060200120905092915050565b604080517f957705a374326b30f4a1069c936d736cc9993ed6c820b4e0e2fd94a8beca0d1d6020820152908101829052600090606001612287565b612baf6127c686868686866127ea565b6000612c6183610d7c565b9050600081118015612c7257508082115b15612cab57826040517f037f60e5000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b612977612cbe8461211461546042614177565b8360009182526020829052604090912055565b60006001600160a01b0383163b612cea57506000610d8a565b600080846001600160a01b031684604051612d059190613ace565b6000604051808303816000865af19150503d8060008114612d42576040519150601f19603f3d011682016040523d82523d6000602084013e612d47565b606091505b5091509150818015612d71575080511580612d71575080806020019051810190612d71919061382a565b95945050505050565b604080517f05112ef894367de1270cfae12afcd2285c225830eb8f74e7e938f721bb510cba6020820152908101829052600090606001612287565b604080517ff23ec0bb4210edd5cba85afd05127efcd2fc6a781bfed49188da1081670b22d8602082015290810183905260608101829052600090608001612bed565b60007fa80d2259af55890618ec2eeb3ac72de4bdba22529bb14845d8a3d712d1c3f621826040516020016122879291906142d7565b604080517f63fa879cb478fddf1de08d49e29115fb768866711bc799ff9ab419a7f16c9afb6020820152908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401612bed565b604080517fbaea1c6c0f16a0a340b10a9e980806696a68ddbb5e8361fd64630dd21abf515f602082015290810183905260608101829052600090608001612bed565b604080517f79bd914addd90bd67ad800bf0230bb85ffdef5aeba5fd8249f116d3f17f4fb4b6020820152908101829052600090606001612287565b6122cc61296483612ec1565b6122cc61296483612d7a565b612977612a0f8484612db5565b6129776122b08484612e2c565b6103498061437783390190565b60008083601f840112612f4d57600080fd5b50813567ffffffffffffffff811115612f6557600080fd5b602083019150836020828501011115612f7d57600080fd5b9250929050565b60008060208385031215612f9757600080fd5b823567ffffffffffffffff811115612fae57600080fd5b612fba85828601612f3b565b90969095509350505050565b600080600060408486031215612fdb57600080fd5b833567ffffffffffffffff811115612ff257600080fd5b612ffe86828701612f3b565b909790965060209590950135949350505050565b60006020828403121561302457600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561306c5783516001600160a01b031683529284019291840191600101613047565b50909695505050505050565b600080600080600080600080600060c08a8c03121561309657600080fd5b8935985060208a013567ffffffffffffffff808211156130b557600080fd5b6130c18d838e01612f3b565b909a50985060408c01359150808211156130da57600080fd5b6130e68d838e01612f3b565b909850965060608c0135955060808c013591508082111561310657600080fd5b506131138c828d01612f3b565b9a9d999c50979a9699959894979660a00135949350505050565b6000806000806000806060878903121561314657600080fd5b863567ffffffffffffffff8082111561315e57600080fd5b61316a8a838b01612f3b565b9098509650602089013591508082111561318357600080fd5b61318f8a838b01612f3b565b909650945060408901359150808211156131a857600080fd5b506131b589828a01612f3b565b979a9699509497509295939492505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613206576132066131c7565b604052919050565b600067ffffffffffffffff821115613228576132286131c7565b50601f01601f191660200190565b600082601f83011261324757600080fd5b813561325a6132558261320e565b6131dd565b81815284602083860101111561326f57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561329e57600080fd5b813567ffffffffffffffff8111156132b557600080fd5b6128cd84828501613236565b60008060008060008060006080888a0312156132dc57600080fd5b873567ffffffffffffffff808211156132f457600080fd5b6133008b838c01612f3b565b909950975060208a013591508082111561331957600080fd5b6133258b838c01612f3b565b909750955060408a013591508082111561333e57600080fd5b5061334b8a828b01612f3b565b989b979a50959894979596606090950135949350505050565b6000806000806000806080878903121561337d57600080fd5b86359550602087013567ffffffffffffffff8082111561339c57600080fd5b6133a88a838b01612f3b565b909750955060408901359150808211156133c157600080fd5b506133ce89828a01612f3b565b979a9699509497949695606090950135949350505050565b60008083601f8401126133f857600080fd5b50813567ffffffffffffffff81111561341057600080fd5b6020830191508360208260051b8501011115612f7d57600080fd5b6000806000806040858703121561344157600080fd5b843567ffffffffffffffff8082111561345957600080fd5b613465888389016133e6565b9096509450602087013591508082111561347e57600080fd5b5061348b878288016133e6565b95989497509550505050565b60005b838110156134b257818101518382015260200161349a565b838111156115b25750506000910152565b600081518084526134db816020860160208601613497565b601f01601f19169290920160200192915050565b60208152600061248a60208301846134c3565b6001600160a01b0381168114612a7a57600080fd5b6000806000806060858703121561352d57600080fd5b843561353881613502565b935060208501359250604085013567ffffffffffffffff81111561355b57600080fd5b61348b87828801612f3b565b600080600080600080600080600060a08a8c03121561358557600080fd5b893567ffffffffffffffff8082111561359d57600080fd5b6135a98d838e01612f3b565b909b50995060208c01359150808211156135c257600080fd5b6135ce8d838e01612f3b565b909950975060408c01359150808211156135e757600080fd5b6135f38d838e01612f3b565b909750955060608c013591508082111561360c57600080fd5b506136198c828d01612f3b565b9a9d999c50979a9699959894979660800135949350505050565b60008060008060008060008060008060e08b8d03121561365257600080fd5b8a35995060208b013567ffffffffffffffff8082111561367157600080fd5b61367d8e838f01612f3b565b909b50995060408d013591508082111561369657600080fd5b6136a28e838f01612f3b565b909950975060608d013591506136b782613502565b90955060808c0135945060a08c013590808211156136d457600080fd5b506136e18d828e01612f3b565b9150809450508092505060c08b013590509295989b9194979a5092959850565b600080600080600080600060a0888a03121561371c57600080fd5b87359650602088013567ffffffffffffffff8082111561373b57600080fd5b6137478b838c01612f3b565b909850965060408a013591508082111561376057600080fd5b5061376d8a828b01612f3b565b909550935050606088013561378181613502565b809250506080880135905092959891949750929550565b600080604083850312156137ab57600080fd5b823567ffffffffffffffff808211156137c357600080fd5b6137cf86838701613236565b935060208501359150808211156137e557600080fd5b506137f285828601613236565b9150509250929050565b8281526040602082015260006128cd60408301846134c3565b8051801515811461382557600080fd5b919050565b60006020828403121561383c57600080fd5b61248a82613815565b600067ffffffffffffffff82111561385f5761385f6131c7565b5060051b60200190565b60006138776132558461320e565b905082815283838301111561388b57600080fd5b61248a836020830184613497565b600082601f8301126138aa57600080fd5b815160206138ba61325583613845565b82815260059290921b840181019181810190868411156138d957600080fd5b8286015b8481101561133057805167ffffffffffffffff8111156138fd5760008081fd5b8701603f8101891361390f5760008081fd5b613920898683015160408401613869565b8452509183019183016138dd565b600082601f83011261393f57600080fd5b61248a83835160208501613869565b600082601f83011261395f57600080fd5b8151602061396f61325583613845565b82815260059290921b8401810191818101908684111561398e57600080fd5b8286015b8481101561133057805167ffffffffffffffff8111156139b25760008081fd5b6139c08986838b010161392e565b845250918301918301613992565b600080600080608085870312156139e457600080fd5b8451935060208086015167ffffffffffffffff80821115613a0457600080fd5b818801915088601f830112613a1857600080fd5b8151613a2661325582613845565b81815260059190911b8301840190848101908b831115613a4557600080fd5b938501935b82851015613a6357845182529385019390850190613a4a565b60408b01519098509450505080831115613a7c57600080fd5b613a8889848a01613899565b94506060880151925080831115613a9e57600080fd5b5050613aac8782880161394e565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b60008251613ae0818460208701613497565b9190910192915050565b604081526000613afd60408301856134c3565b90508260208301529392505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3657613b36613b0c565b5060010190565b803561382581613502565b600080600060608486031215613b5d57600080fd5b833567ffffffffffffffff811115613b7457600080fd5b613b8086828701613236565b9350506020840135613b9181613502565b929592945050506040919091013590565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526000613bef60608301888a613bb2565b8281036020840152613c02818789613bb2565b90508281036040840152613c17818587613bb2565b9998505050505050505050565b608081526000613c3860808301898b613bb2565b8281036020840152613c4b81888a613bb2565b90508281036040840152613c60818688613bb2565b91505082606083015298975050505050505050565b60008060408385031215613c8857600080fd5b823567ffffffffffffffff811115613c9f57600080fd5b613cab85828601613236565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215613ce257600080fd5b5051919050565b6001600160a01b03831681526040602082015260006128cd60408301846134c3565b60008060408385031215613d1e57600080fd5b613d2783613815565b9150602083015167ffffffffffffffff811115613d4357600080fd5b6137f28582860161392e565b600080600080600080600080610100898b031215613d6c57600080fd5b883567ffffffffffffffff80821115613d8457600080fd5b613d908c838d01613236565b995060208b0135915080821115613da657600080fd5b613db28c838d01613236565b9850613dc060408c01613b3d565b975060608b0135965060808b0135915080821115613ddd57600080fd5b50613dea8b828c01613236565b989b979a50959894979660a0860135965060c08601359560e00135945092505050565b60c081526000613e2060c08301896134c3565b8281036020840152613e3281896134c3565b90508281036040840152613e4681886134c3565b60608401969096525050608081019290925260a0909101529392505050565b60008219821115613e7857613e78613b0c565b500190565b6000808335601e19843603018112613e9457600080fd5b83018035915067ffffffffffffffff821115613eaf57600080fd5b602001915036819003821315612f7d57600080fd5b60008060008060008060c08789031215613edd57600080fd5b863567ffffffffffffffff80821115613ef557600080fd5b613f018a838b01613236565b97506020890135915080821115613f1757600080fd5b50613f2489828a01613236565b955050604087013560ff81168114613f3b57600080fd5b9350606087013592506080870135613f5281613502565b8092505060a087013590509295509295509295565b60a081526000613f7a60a08301886134c3565b8281036020840152613f8c81886134c3565b60ff9690961660408401525050606081019290925260809091015292915050565b600060208284031215613fbf57600080fd5b815161248a81613502565b604081526000613fdd60408301856134c3565b90506001600160a01b03831660208301529392505050565b6020815260006128cd602083018486613bb2565b600181811c9082168061401d57607f821691505b6020821081141561403e57634e487b7160e01b600052602260045260246000fd5b50919050565b60008060006060848603121561405957600080fd5b833567ffffffffffffffff8082111561407157600080fd5b818601915086601f83011261408557600080fd5b8135602061409561325583613845565b82815260059290921b8401810191818101908a8411156140b457600080fd5b948201945b838610156140db5785356140cc81613502565b825294820194908201906140b9565b97505087013594505060408601359150808211156140f857600080fd5b5061410586828701613236565b9150509250925092565b60a08152600061412360a083018b8d613bb2565b8281036020840152614136818a8c613bb2565b9050828103604084015261414b81888a613bb2565b90508281036060840152614160818688613bb2565b9150508260808301529a9950505050505050505050565b60008261419457634e487b7160e01b600052601260045260246000fd5b500490565b60008060008060008060c087890312156141b257600080fd5b863567ffffffffffffffff808211156141ca57600080fd5b6141d68a838b01613236565b975060208901359150808211156141ec57600080fd5b506141f989828a01613236565b955050604087013561420a81613502565b959894975094956060810135955060808101359460a0909101359350915050565b60808152600061423e60808301876134c3565b828103602084015261425081876134c3565b604084019590955250506060015292915050565b60006101008a83528960208401528060408401526142848184018a6134c3565b9050828103606084015261429881896134c3565b90506001600160a01b03871660808401528560a084015282810360c08401526142c181866134c3565b9150508260e08301529998505050505050505050565b828152600082516142ef816020850160208701613497565b919091016020019392505050565b86815285602082015260c06040820152600061431c60c08301876134c3565b828103606084015261432e81876134c3565b6001600160a01b03959095166080840152505060a00152949350505050565b83815260606020820152600061436660608301856134c3565b905082604083015294935050505056fe6080604052600160005534801561001557600080fd5b50610324806100256000396000f3fe608060405234801561001057600080fd5b50600436106100355760003560e01c8062f55d9d1461003a5780631cff79cd1461004f575b600080fd5b61004d6100483660046101da565b610079565b005b61006261005d3660046101fc565b6100bb565b60405161007092919061027f565b60405180910390f35b6002600054141561009d5760405163caa30f5560e01b815260040160405180910390fd5b600260005573ffffffffffffffffffffffffffffffffffffffff8116ff5b60006060600260005414156100e35760405163caa30f5560e01b815260040160405180910390fd5b600260005573ffffffffffffffffffffffffffffffffffffffff85163b610136576040517f6f7c43f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16848460405161015d9291906102de565b6000604051808303816000865af19150503d806000811461019a576040519150601f19603f3d011682016040523d82523d6000602084013e61019f565b606091505b50600160005590969095509350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101d557600080fd5b919050565b6000602082840312156101ec57600080fd5b6101f5826101b1565b9392505050565b60008060006040848603121561021157600080fd5b61021a846101b1565b9250602084013567ffffffffffffffff8082111561023757600080fd5b818601915086601f83011261024b57600080fd5b81358181111561025a57600080fd5b87602082850101111561026c57600080fd5b6020830194508093505050509250925092565b821515815260006020604081840152835180604085015260005b818110156102b557858101830151858201606001528201610299565b818111156102c7576000606083870101525b50601f01601f191692909201606001949350505050565b818382376000910190815291905056fea264697066735822122032cb5e746816b7fac95205c068b30da37bd40119a57265be331c162cae74712464736f6c63430008090033a26469706673582212204998f838cdcafb3bed81b83a80af25a5eb3725a58bc3781fb9f68ff16718975664736f6c634300080900330000000000000000000000001a920b29ebd437074225caee44f78fc700b27a5d0000000000000000000000008a156bca562fb75385c4d41ea6903e270a34b727