diff --git a/v2/pkg/erc20custody.sol/erc20custody.go b/v2/pkg/erc20custody.sol/erc20custody.go index cecfec71..49348492 100644 --- a/v2/pkg/erc20custody.sol/erc20custody.go +++ b/v2/pkg/erc20custody.sol/erc20custody.go @@ -38,8 +38,8 @@ type RevertContext struct { // ERC20CustodyMetaData contains all meta data concerning the ERC20Custody contract. var ERC20CustodyMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"gateway_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tssAddress_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WHITELISTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gateway\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIGatewayEVM\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unwhitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndRevert\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x60a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"gateway_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tssAddress_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WHITELISTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gateway\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIGatewayEVM\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unwhitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndRevert\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x60a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a", } // ERC20CustodyABI is the input ABI used to generate the binding from. @@ -1840,27 +1840,27 @@ func (it *ERC20CustodyWithdrawnIterator) Close() error { // ERC20CustodyWithdrawn represents a Withdrawn event raised by the ERC20Custody contract. type ERC20CustodyWithdrawn struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterWithdrawn is a free log retrieval operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawn(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyWithdrawnIterator, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawn(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyWithdrawnIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20Custody.contract.FilterLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _ERC20Custody.contract.FilterLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -1869,19 +1869,19 @@ func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawn(opts *bind.FilterOpts // WatchWithdrawn is a free log subscription operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *ERC20CustodyWithdrawn, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *ERC20CustodyWithdrawn, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20Custody.contract.WatchLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _ERC20Custody.contract.WatchLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -1915,7 +1915,7 @@ func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawn(opts *bind.WatchOpts, // ParseWithdrawn is a log parse operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) func (_ERC20Custody *ERC20CustodyFilterer) ParseWithdrawn(log types.Log) (*ERC20CustodyWithdrawn, error) { event := new(ERC20CustodyWithdrawn) if err := _ERC20Custody.contract.UnpackLog(event, "Withdrawn", log); err != nil { @@ -1994,8 +1994,8 @@ func (it *ERC20CustodyWithdrawnAndCalledIterator) Close() error { // ERC20CustodyWithdrawnAndCalled represents a WithdrawnAndCalled event raised by the ERC20Custody contract. type ERC20CustodyWithdrawnAndCalled struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte Raw types.Log // Blockchain specific contextual infos @@ -2003,19 +2003,19 @@ type ERC20CustodyWithdrawnAndCalled struct { // FilterWithdrawnAndCalled is a free log retrieval operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyWithdrawnAndCalledIterator, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyWithdrawnAndCalledIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20Custody.contract.FilterLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _ERC20Custody.contract.FilterLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -2024,19 +2024,19 @@ func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawnAndCalled(opts *bind.F // WatchWithdrawnAndCalled is a free log subscription operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *ERC20CustodyWithdrawnAndCalled, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *ERC20CustodyWithdrawnAndCalled, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20Custody.contract.WatchLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _ERC20Custody.contract.WatchLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -2070,7 +2070,7 @@ func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawnAndCalled(opts *bind.Wa // ParseWithdrawnAndCalled is a log parse operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) func (_ERC20Custody *ERC20CustodyFilterer) ParseWithdrawnAndCalled(log types.Log) (*ERC20CustodyWithdrawnAndCalled, error) { event := new(ERC20CustodyWithdrawnAndCalled) if err := _ERC20Custody.contract.UnpackLog(event, "WithdrawnAndCalled", log); err != nil { @@ -2149,8 +2149,8 @@ func (it *ERC20CustodyWithdrawnAndRevertedIterator) Close() error { // ERC20CustodyWithdrawnAndReverted represents a WithdrawnAndReverted event raised by the ERC20Custody contract. type ERC20CustodyWithdrawnAndReverted struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte RevertContext RevertContext @@ -2159,19 +2159,19 @@ type ERC20CustodyWithdrawnAndReverted struct { // FilterWithdrawnAndReverted is a free log retrieval operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyWithdrawnAndRevertedIterator, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyWithdrawnAndRevertedIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20Custody.contract.FilterLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _ERC20Custody.contract.FilterLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -2180,19 +2180,19 @@ func (_ERC20Custody *ERC20CustodyFilterer) FilterWithdrawnAndReverted(opts *bind // WatchWithdrawnAndReverted is a free log subscription operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *ERC20CustodyWithdrawnAndReverted, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *ERC20CustodyWithdrawnAndReverted, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20Custody.contract.WatchLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _ERC20Custody.contract.WatchLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -2226,7 +2226,7 @@ func (_ERC20Custody *ERC20CustodyFilterer) WatchWithdrawnAndReverted(opts *bind. // ParseWithdrawnAndReverted is a log parse operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) func (_ERC20Custody *ERC20CustodyFilterer) ParseWithdrawnAndReverted(log types.Log) (*ERC20CustodyWithdrawnAndReverted, error) { event := new(ERC20CustodyWithdrawnAndReverted) if err := _ERC20Custody.contract.UnpackLog(event, "WithdrawnAndReverted", log); err != nil { diff --git a/v2/pkg/erc20custody.t.sol/erc20custodytest.go b/v2/pkg/erc20custody.t.sol/erc20custodytest.go index b47f2c98..895f9477 100644 --- a/v2/pkg/erc20custody.t.sol/erc20custodytest.go +++ b/v2/pkg/erc20custody.t.sol/erc20custodytest.go @@ -64,8 +64,8 @@ type StdInvariantFuzzSelector struct { // ERC20CustodyTestMetaData contains all meta data concerning the ERC20CustodyTest contract. var ERC20CustodyTestMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WHITELISTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20PartialThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20PartialThroughCustodyFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20PartialThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNoParamsThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testNewCustodyFailsIfAddressesAreZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUnwhitelist\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUnwhitelistFailsIfSenderIsNotWhitelister\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUnwhitelistFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWhitelist\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWhitelistFailsIfSenderIsNotWhitelister\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWhitelistFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustodyFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustodyFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5062010c35806200003e6000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c806385f438c111610191578063c713f827116100e3578063f0c8e7e011610097578063fa7626d411610071578063fa7626d414610533578063fb176c1214610540578063fe8e5f1b1461054857600080fd5b8063f0c8e7e01461051b578063f4221f0814610523578063fa2a70741461052b57600080fd5b8063e20c9f71116100c8578063e20c9f71146104e4578063e63ab1e9146104ec578063eb1ce7f91461051357600080fd5b8063c713f827146104d4578063cbd57e2f146104dc57600080fd5b8063a3f9d0e011610145578063b0464fdc1161011f578063b0464fdc146104ac578063b5508aa9146104b4578063ba414fa6146104bc57600080fd5b8063a3f9d0e014610475578063a4943deb1461047d578063a783c7891461048557600080fd5b8063916a17c611610176578063916a17c6146104505780639918c1c2146104655780639fc7fd551461046d57600080fd5b806385f438c1146104215780639158c6231461044857600080fd5b80633f7286f41161024a57806366d9a9a0116101fe5780637e91c50f116101d85780637e91c50f146103fc57806382c529921461040457806385226c811461040c57600080fd5b806366d9a9a0146103d75780636a621854146103ec57806371149c94146103f457600080fd5b806351ecdf3c1161022f57806351ecdf3c14610373578063570618e11461037b5780635d62c860146103b057600080fd5b80633f7286f4146103635780634b5838d21461036b57600080fd5b80632ade3880116102a15780633e5e3c23116102865780633e5e3c231461034b5780633e73ecb4146103535780633ee929231461035b57600080fd5b80632ade38801461032e5780632be6a1621461034357600080fd5b80631779672f116102d25780631779672f146103005780631ed7831c14610308578063284cb9291461032657600080fd5b80630a9254e4146102ee5780630eee72a9146102f8575b600080fd5b6102f6610550565b005b6102f6610f2b565b6102f66111d0565b610310611321565b60405161031d919061a725565b60405180910390f35b6102f6611383565b610336611680565b60405161031d919061a7c1565b6102f66117c2565b6103106119b4565b6102f6611a14565b6102f6611fa2565b610310612071565b6102f66120d1565b6102f66123ef565b6103a27f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60405190815260200161031d565b6103a27f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b6103df6125c0565b60405161031d919061a927565b6102f6612742565b6102f661280e565b6102f661306e565b6102f66131f9565b61041461346d565b60405161031d919061a9c5565b6103a27f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6102f661353d565b61045861360b565b60405161031d919061aa3c565b6102f6613706565b6102f6613a1b565b6102f6613ae9565b6102f6614123565b6103a27f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b61045861434b565b610414614446565b6104c4614516565b604051901515815260200161031d565b6102f66145ea565b6102f66152bf565b610310615380565b6103a27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6102f66153e0565b6102f66154ec565b6102f66156ae565b6102f661591b565b601f546104c49060ff1681565b6102f6615c12565b6102f66162c2565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880549091166156781790556040516105a29061a634565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f080158015610627573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560405161066c9061a634565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156106f0573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602854602654925190851660248201526044810193909352921660648201526107df919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526164c8565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560285460265460405192939182169291169061086b9061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156108a7573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460255460285460265460405193851694928316939183169216906109029061a650565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610946573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560405161098b9061a65e565b604051809103906000f0801580156109a7573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610a5357600080fd5b505af1158015610a67573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b158015610b5757600080fd5b505af1158015610b6b573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b158015610bd157600080fd5b505af1158015610be5573d6000803e3d6000fd5b5050602254602480546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639b19251a925001600060405180830381600087803b158015610c4a57600080fd5b505af1158015610c5e573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cc057600080fd5b505af1158015610cd4573d6000803e3d6000fd5b5050602480546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f4240938101939093521692506340c10f199150604401600060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b5050602480546022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a1209381019390935216925063a9059cbb91506044016020604051808303816000875af1158015610dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df3919061aad3565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610e7457600080fd5b505af1158015610e88573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b039081168252600160208084019182528451908101855260008152938301849052825160298054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602a90610f26908261abb8565b505050565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc513169100000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b15801561101057600080fd5b505af1158015611024573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061110f919060040161ac77565b600060405180830381600087803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f2945061119a9392831692909116908790879060040161ac8a565b600060405180830381600087803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b505050505050565b6024805460275460405160009381018490526001600160a01b03928316604482015291166064820152819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602854905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b5050604051630618f58760e51b81527f951e19ed000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e0915060240161110f565b6060601680548060200260200160405190810160405280929190818152602001828054801561137957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161135b575b5050505050905090565b6022546025546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600092919091169063d936547e90602401602060405180830381865afa1580156113ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611411919061aad3565b905061141e6000826164e7565b6022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156114ac57600080fd5b505af11580156114c0573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549150600090a260265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561155557600080fd5b505af1158015611569573d6000803e3d6000fd5b50506022546025546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639b19251a9150602401600060405180830381600087803b1580156115cf57600080fd5b505af11580156115e3573d6000803e3d6000fd5b50506022546025546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063d936547e9150602401602060405180830381865afa15801561164c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611670919061aad3565b905061167d6001826164e7565b50565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156117b957600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156117a25783829060005260206000200180546117159061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546117419061ab24565b801561178e5780601f106117635761010080835404028352916020019161178e565b820191906000526020600020905b81548152906001019060200180831161177157829003601f168201915b5050505050815260200190600101906116f6565b5050505081525050815260200190600101906116a4565b50505050905090565b60405163ca669fa760e01b81526101236004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b50506040805161012360248201527f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f0000000000000000000000000000000000000000000000000000000017905290517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611905919060040161ac77565b600060405180830381600087803b15801561191f57600080fd5b505af1158015611933573d6000803e3d6000fd5b50506022546025546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639b19251a91506024015b600060405180830381600087803b15801561199a57600080fd5b505af11580156119ae573d6000803e3d6000fd5b50505050565b60606018805480602002602001604051908101604052809291908181526020018280548015611379576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161135b575050505050905090565b602480546027546040516370a0823160e01b81526001600160a01b039182166004820152620186a09360009392909216916370a082319101602060405180830381865afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d919061acc1565b9050611a9a816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e919061acc1565b6027546040516001600160a01b0390911660248201526044810185905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391611bf1916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015611c0b57600080fd5b505af1158015611c1f573d6000803e3d6000fd5b50506022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015611cb157600080fd5b505af1158015611cc5573d6000803e3d6000fd5b50506024546027546040518881526001600160a01b039283169450911691507fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb9060200160405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611d6a57600080fd5b505af1158015611d7e573d6000803e3d6000fd5b5050602254602754602480546040517fd9caed120000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015290831691810191909152604481018990529116925063d9caed129150606401600060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061acc1565b9050611e8f8186616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f03919061acc1565b9050611f1881611f13888761ad31565b616569565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8c919061acc1565b9050611f99816000616569565b50505050505050565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401610ff6565b60606017805480602002602001604051908101604052809291908181526020018280548015611379576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161135b575050505050905090565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561213d57600080fd5b505af1158015612151573d6000803e3d6000fd5b5050602854602654604051600094508493506001600160a01b03928316929091169061217c9061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156121b8573d6000803e3d6000fd5b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561222857600080fd5b505af115801561223c573d6000803e3d6000fd5b50506020546026546040516001600160a01b039283169450600093509116906122649061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156122a0573d6000803e3d6000fd5b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561231057600080fd5b505af1158015612324573d6000803e3d6000fd5b50506020546028546040516001600160a01b0392831694509116915060009061234c9061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015612388573d6000803e3d6000fd5b506020546028546026546040519394506001600160a01b03928316939183169216906123b39061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610f26573d6000803e3d6000fd5b6024805460275460405160019381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602854905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156124d157600080fd5b505af11580156124e5573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b50506022546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321fc65f2935061119a9260009216908790879060040161ac8a565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156117b957838290600052602060002090600202016040518060400160405290816000820180546126179061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546126439061ab24565b80156126905780601f1061266557610100808354040283529160200191612690565b820191906000526020600020905b81548152906001019060200180831161267357829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561272a57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116126d75790505b505050505081525050815260200190600101906125e4565b6024805460275460405160009381018490526001600160a01b03928316604482015291166064820152819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc513169100000000000000000000000000000000000000000000000000000000179052602854905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401611298565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f1901815290829052602480546021546370a0823160e01b85526001600160a01b0390811660048601529294506000939216916370a082319101602060405180830381865afa1580156128a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c5919061acc1565b90506128d2816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015612922573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612946919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391612a29916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015612a4357600080fd5b505af1158015612a57573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612ae957600080fd5b505af1158015612afd573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e9350612b4192506001600160a01b039091169060299061ae19565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015612bd757600080fd5b505af1158015612beb573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690612c39908990899060299061ae3b565b60405180910390a36022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015612ccf57600080fd5b505af1158015612ce3573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b90612d31908990899060299061ae3b565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612d9257600080fd5b505af1158015612da6573d6000803e3d6000fd5b50506022546021546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c709ab6e9450612e069392831692909116908a908a9060299060040161ae66565b600060405180830381600087803b158015612e2057600080fd5b505af1158015612e34573d6000803e3d6000fd5b5050602480546021546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa158015612e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eab919061acc1565b9050612eb78187616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015612f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2b919061acc1565b9050612f3b81611f13898761ad31565b602480546020546021546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169381019390935260009291169063dd62ed3e90604401602060405180830381865afa158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd5919061acc1565b9050612fe2816000616569565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613032573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613056919061acc1565b9050613063816000616569565b505050505050505050565b6040517f68656c6c6f000000000000000000000000000000000000000000000000000000602082015260019060009060250160408051808303601f190181529082905260285463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561310757600080fd5b505af115801561311b573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561318b57600080fd5b505af115801561319f573d6000803e3d6000fd5b50506022546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c709ab6e935061119a9260009216908790879060299060040161ae66565b6028546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561326b57600080fd5b505af115801561327f573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b1580156132e457600080fd5b505af11580156132f8573d6000803e3d6000fd5b5050604051630618f58760e51b81527f584a7938000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b5050602254602754602480546040517fd9caed120000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015290831691810191909152600160448201529116925063d9caed129150606401600060405180830381600087803b1580156133f757600080fd5b505af115801561340b573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561199a57600080fd5b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156117b95783829060005260206000200180546134b09061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546134dc9061ab24565b80156135295780601f106134fe57610100808354040283529160200191613529565b820191906000526020600020905b81548152906001019060200180831161350c57829003601f168201915b505050505081526020019060010190613491565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b50506022546040517f9a590427000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b039091169250639a5904279150602401611980565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156117b95760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156136ee57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161369b5790505b5050505050815250508152602001906001019061362f565b602480546027546040516001938101939093526001600160a01b03918216604484015216606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a20000000000000000000000000000000000000000000000000000000017905260285490517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b15801561387a57600080fd5b505af115801561388e573d6000803e3d6000fd5b5050604051630618f58760e51b81527f584a7938000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156138fe57600080fd5b505af1158015613912573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f29450613970939283169290911690600190879060040161ac8a565b600060405180830381600087803b15801561398a57600080fd5b505af115801561399e573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a0057600080fd5b505af1158015613a14573d6000803e3d6000fd5b5050505050565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015613a8757600080fd5b505af1158015613a9b573d6000803e3d6000fd5b50506022546040517f9b19251a000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b039091169250639b19251a9150602401611980565b604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed7016900000000000000000000000000000000000000000000000000000000179052805460275494516370a0823160e01b81526001600160a01b0395861693810193909352620186a0946000939116916370a082319101602060405180830381865afa158015613b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb7919061acc1565b9050613bc4816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c38919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613d1b916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015613d3557600080fd5b505af1158015613d49573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613ddb57600080fd5b505af1158015613def573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613ec157600080fd5b505af1158015613ed5573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d590613f20908990899061aebb565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613f8157600080fd5b505af1158015613f95573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f29450613ff29392831692909116908a908a9060040161ac8a565b600060405180830381600087803b15801561400c57600080fd5b505af1158015614020573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015614072573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614096919061acc1565b90506140a3816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156140f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614117919061acc1565b9050612f3b8185616569565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f190181529082905260265463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156141be57600080fd5b505af11580156141d2573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506142bd919060040161ac77565b600060405180830381600087803b1580156142d757600080fd5b505af11580156142eb573d6000803e3d6000fd5b50506022546021546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c709ab6e945061119a9392831692909116908790879060299060040161ae66565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156117b95760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561442e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116143db5790505b5050505050815250508152602001906001019061436f565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156117b95783829060005260206000200180546144899061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546144b59061ab24565b80156145025780601f106144d757610100808354040283529160200191614502565b820191906000526020600020905b8154815290600101906020018083116144e557829003601f168201915b50505050508152602001906001019061446a565b60085460009060ff161561452e575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156145bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e3919061acc1565b1415905090565b60285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561464357600080fd5b505af1158015614657573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614742919060040161ac77565b600060405180830381600087803b15801561475c57600080fd5b505af1158015614770573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156147c457600080fd5b505af11580156147d8573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561483557600080fd5b505af1158015614849573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614934919060040161ac77565b600060405180830381600087803b15801561494e57600080fd5b505af1158015614962573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156149b657600080fd5b505af11580156149ca573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614a2757600080fd5b505af1158015614a3b573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614a8f57600080fd5b505af1158015614aa3573d6000803e3d6000fd5b505060248054602754604051620186a09381018490526001600160a01b039283166044820152911660648201529092506000915060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a20000000000000000000000000000000000000000000000000000000017905251630618f58760e51b81527fd93c0665000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015614b9f57600080fd5b505af1158015614bb3573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614c1057600080fd5b505af1158015614c24573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f29450614c819392831692909116908790879060040161ac8a565b600060405180830381600087803b158015614c9b57600080fd5b505af1158015614caf573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614d0c57600080fd5b505af1158015614d20573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614d7457600080fd5b505af1158015614d88573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa158015614ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dff919061acc1565b9050614e0c816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015614e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e80919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391614f63916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015614f7d57600080fd5b505af1158015614f91573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561502357600080fd5b505af1158015615037573d6000803e3d6000fd5b505060208054602454602754604080516001600160a01b0394851681529485018c905291831684830152919091166060830152517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609350908190036080019150a16022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561512657600080fd5b505af115801561513a573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d590615185908990899061aebb565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156151e657600080fd5b505af11580156151fa573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f294506152579392831692909116908a908a9060040161ac8a565b600060405180830381600087803b15801561527157600080fd5b505af1158015615285573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101612e6a565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a2000000000000000000000000000000000000000000000000000000001790526024805460275492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101614dbe565b60606015805480602002602001604051908101604052809291908181526020018280548015611379576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161135b575050505050905090565b600080604051602001615416907f68656c6c6f000000000000000000000000000000000000000000000000000000815260050190565b60408051808303601f190181529082905260285463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561547d57600080fd5b505af1158015615491573d6000803e3d6000fd5b5050604051630618f58760e51b81527f951e19ed000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024016142bd565b60405163ca669fa760e01b81526101236004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561553a57600080fd5b505af115801561554e573d6000803e3d6000fd5b50506040805161012360248201527f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f0000000000000000000000000000000000000000000000000000000017905290517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061562f919060040161ac77565b600060405180830381600087803b15801561564957600080fd5b505af115801561565d573d6000803e3d6000fd5b50506022546025546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639a5904279150602401611980565b602480546027546040516001938101939093526001600160a01b03918216604484015216606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a20000000000000000000000000000000000000000000000000000000017905260285490517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156157a957600080fd5b505af11580156157bd573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b15801561582257600080fd5b505af1158015615836573d6000803e3d6000fd5b5050604051630618f58760e51b81527f584a7938000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156158a657600080fd5b505af11580156158ba573d6000803e3d6000fd5b50506022546021546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c709ab6e9450613970939283169290911690600190879060299060040161ae66565b602254602480546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600093919091169163d936547e9101602060405180830381865afa158015615984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906159a8919061aad3565b90506159b56001826164e7565b6022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015615a4357600080fd5b505af1158015615a57573d6000803e3d6000fd5b50506024546040516001600160a01b0390911692507f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919150600090a260265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015615aec57600080fd5b505af1158015615b00573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b158015615b6557600080fd5b505af1158015615b79573d6000803e3d6000fd5b5050602254602480546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529216935063d936547e925001602060405180830381865afa158015615be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615c05919061aad3565b905061167d6000826164e7565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc5131691000000000000000000000000000000000000000000000000000000001790526024805460275492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015615ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615d0f919061acc1565b9050615d1c816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015615d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615d90919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391615e73916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015615e8d57600080fd5b505af1158015615ea1573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015615f3357600080fd5b505af1158015615f47573d6000803e3d6000fd5b50506020547f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af6092506001600160a01b03169050615f8560028861aed4565b602454602754604080516001600160a01b03958616815260208101949094529184168383015292909216606082015290519081900360800190a16022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561604d57600080fd5b505af1158015616061573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5906160ac908990899061aebb565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561610d57600080fd5b505af1158015616121573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f2945061617e9392831692909116908a908a9060040161ac8a565b600060405180830381600087803b15801561619857600080fd5b505af11580156161ac573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa1580156161fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616222919061acc1565b905061623381611f1360028961aed4565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015616283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906162a7919061acc1565b9050612f3b816162b860028a61aed4565b611f13908761ad31565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561632057600080fd5b505af1158015616334573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061641f919060040161ac77565b600060405180830381600087803b15801561643957600080fd5b505af115801561644d573d6000803e3d6000fd5b5050602254602754602480546040517fd9caed120000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015290831691810191909152604481018690529116925063d9caed129150606401600060405180830381600087803b158015613a0057600080fd5b60006164d261a66c565b6164dd8484836165c1565b9150505b92915050565b6040517ff7fe347700000000000000000000000000000000000000000000000000000000815282151560048201528115156024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f7fe3477906044015b60006040518083038186803b15801561655557600080fd5b505afa1580156111c8573d6000803e3d6000fd5b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440161653d565b6000806165ce858461663c565b90506166316040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f7879000000815250828660405160200161661c92919061af0f565b60405160208183030381529060405285616648565b9150505b9392505050565b60006166358383616676565b60c0810151516000901561666c5761666584848460c00151616691565b9050616635565b6166658484616837565b60006166828383616922565b61663583836020015184616648565b60008061669c616932565b905060006166aa8683616a05565b905060006166c18260600151836020015185616eab565b905060006166d1838389896170bd565b905060006166de82617f3a565b602081015181519192509060030b156167515789826040015160405160200161670892919061af31565b60408051601f19818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526167489160040161ac77565b60405180910390fd5b60006167946040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001618109565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906167e790849060040161ac77565b602060405180830381865afa158015616804573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616828919061afb2565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061688c90879060040161ac77565b600060405180830381865afa1580156168a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526168d1919081019061b094565b905060006168ff82856040516020016168eb92919061b0c9565b604051602081830303815290604052618309565b90506001600160a01b0381166164dd57848460405160200161670892919061b0f8565b61692e8282600061831c565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906169b990849060040161b1a3565b600060405180830381865afa1580156169d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526169fe919081019061b1ea565b9250505090565b616a376040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050616a826040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b616a8b8561841f565b60208201526000616a9b86618804565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015616add573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616b05919081019061b1ea565b86838560200151604051602001616b1f949392919061b233565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190616b7790859060040161ac77565b600060405180830381865afa158015616b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616bbc919081019061b1ea565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690616c0490849060040161b337565b602060405180830381865afa158015616c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616c45919061aad3565b616c5a5781604051602001616708919061b389565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890616c9f90849060040161b41b565b600060405180830381865afa158015616cbc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616ce4919081019061b1ea565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f690616d2b90849060040161b46d565b602060405180830381865afa158015616d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616d6c919061aad3565b15616e01576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890616db690849060040161b46d565b600060405180830381865afa158015616dd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616dfb919081019061b1ea565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001616e26919061b4bf565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401616e5292919061b52b565b600060405180830381865afa158015616e6f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616e97919081019061b1ea565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081616ec75790505090506040518060400160405280600481526020017f677265700000000000000000000000000000000000000000000000000000000081525081600081518110616f2757616f2761b550565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110616f7b57616f7b61b550565b602002602001018190525084604051602001616f97919061b57f565b60405160208183030381529060405281600281518110616fb957616fb961b550565b602002602001018190525082604051602001616fd5919061b5eb565b60405160208183030381529060405281600381518110616ff757616ff761b550565b6020026020010181905250600061700d82617f3a565b602080820151604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000818501908152825180840184526000808252908601528251808401909352905182529281019290925291925061709e9060408051808201825260008082526020918201528151808301909252845182528085019082015290618a87565b6170b35785604051602001616708919061b62c565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d901561710d565b511590565b617281578260200151156171c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401616748565b8260c0015115617281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401616748565b6040805160ff8082526120008201909252600091816020015b606081526020019060019003908161729a57905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806172f59061b6bd565b935060ff168151811061730a5761730a61b550565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e370000000000000000000000000000000000000081525060405160200161735b919061b6dc565b6040516020818303038152906040528282806173769061b6bd565b935060ff168151811061738b5761738b61b550565b60200260200101819052506040518060400160405280600681526020017f6465706c6f7900000000000000000000000000000000000000000000000000008152508282806173d89061b6bd565b935060ff16815181106173ed576173ed61b550565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061743a9061b6bd565b935060ff168151811061744f5761744f61b550565b6020026020010181905250876020015182828061746b9061b6bd565b935060ff16815181106174805761748061b550565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806174cd9061b6bd565b935060ff16815181106174e2576174e261b550565b6020908102919091010152875182826174fa8161b6bd565b935060ff168151811061750f5761750f61b550565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e4964000000000000000000000000000000000000000000000081525082828061755c9061b6bd565b935060ff16815181106175715761757161b550565b602002602001018190525061758546618ae8565b82826175908161b6bd565b935060ff16815181106175a5576175a561b550565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806175f29061b6bd565b935060ff16815181106176075761760761b550565b60200260200101819052508682828061761f9061b6bd565b935060ff16815181106176345761763461b550565b602090810291909101015285511561775b5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826176858161b6bd565b935060ff168151811061769a5761769a61b550565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906176ea90899060040161ac77565b600060405180830381865afa158015617707573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261772f919081019061b1ea565b828261773a8161b6bd565b935060ff168151811061774f5761774f61b550565b60200260200101819052505b84602001511561782b5760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826177a48161b6bd565b935060ff16815181106177b9576177b961b550565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806178069061b6bd565b935060ff168151811061781b5761781b61b550565b60200260200101819052506179f2565b6178636171088660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6178f65760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826178a68161b6bd565b935060ff16815181106178bb576178bb61b550565b60200260200101819052508460a001516040516020016178db919061b57f565b6040516020818303038152906040528282806178069061b6bd565b8460c0015115801561793957506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261793790511590565b155b156179f25760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261797d8161b6bd565b935060ff16815181106179925761799261b550565b60200260200101819052506179a688618b88565b6040516020016179b6919061b57f565b6040516020818303038152906040528282806179d19061b6bd565b935060ff16815181106179e6576179e661b550565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152617a2690511590565b617abb5760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282617a698161b6bd565b935060ff1681518110617a7e57617a7e61b550565b60200260200101819052508460400151828280617a9a9061b6bd565b935060ff1681518110617aaf57617aaf61b550565b60200260200101819052505b606085015115617bdc5760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282617b048161b6bd565b935060ff1681518110617b1957617b1961b550565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015617b88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617bb0919081019061b1ea565b8282617bbb8161b6bd565b935060ff1681518110617bd057617bd061b550565b60200260200101819052505b60e08501515115617c835760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282617c268161b6bd565b935060ff1681518110617c3b57617c3b61b550565b6020026020010181905250617c578560e0015160000151618ae8565b8282617c628161b6bd565b935060ff1681518110617c7757617c7761b550565b60200260200101819052505b60e08501516020015115617d2d5760408051808201909152600a81527f2d2d67617350726963650000000000000000000000000000000000000000000060208201528282617cd08161b6bd565b935060ff1681518110617ce557617ce561b550565b6020026020010181905250617d018560e0015160200151618ae8565b8282617d0c8161b6bd565b935060ff1681518110617d2157617d2161b550565b60200260200101819052505b60e08501516040015115617dd75760408051808201909152600e81527f2d2d6d617846656550657247617300000000000000000000000000000000000060208201528282617d7a8161b6bd565b935060ff1681518110617d8f57617d8f61b550565b6020026020010181905250617dab8560e0015160400151618ae8565b8282617db68161b6bd565b935060ff1681518110617dcb57617dcb61b550565b60200260200101819052505b60e08501516060015115617e815760408051808201909152601681527f2d2d6d61785072696f726974794665655065724761730000000000000000000060208201528282617e248161b6bd565b935060ff1681518110617e3957617e3961b550565b6020026020010181905250617e558560e0015160600151618ae8565b8282617e608161b6bd565b935060ff1681518110617e7557617e7561b550565b60200260200101819052505b60008160ff1667ffffffffffffffff811115617e9f57617e9f61aaf5565b604051908082528060200260200182016040528015617ed257816020015b6060815260200190600190039081617ebd5790505b50905060005b8260ff168160ff161015617f2b57838160ff1681518110617efb57617efb61b550565b6020026020010151828260ff1681518110617f1857617f1861b550565b6020908102919091010152600101617ed8565b5093505050505b949350505050565b617f616040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c91617fe79186910161b747565b600060405180830381865afa158015618004573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261802c919081019061b1ea565b9050600061803a8683619677565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b815260040161806a919061a9c5565b6000604051808303816000875af1158015618089573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526180b1919081019061b78e565b805190915060030b158015906180ca5750602081015151155b80156180d95750604081015151155b156170b357816000815181106180f1576180f161b550565b6020026020010151604051602001616708919061b844565b6060600061813e8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506181759082905b906197cc565b156182d25760006181f2826181ec846181e66181b88a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906197f3565b90619855565b604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506182569082906197cc565b156182c057604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526182bd905b82906198da565b90505b6182c981619900565b92505050616635565b82156182eb57848460405160200161670892919061ba30565b5050604080516020810190915260008152616635565b509392505050565b6000808251602084016000f09392505050565b8160a001511561832b57505050565b6000618338848484619969565b9050600061834582617f3a565b602081015181519192509060030b1580156183e15750604080518082018252600781527f5355434345535300000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526183e19060408051808201825260008082526020918201528151808301909252845182528085019082015261816f565b156183ee57505050505050565b6040820151511561840e578160400151604051602001616708919061bad7565b80604051602001616708919061bb35565b606060006184548360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506184b9905b8290618a87565b1561852857604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261663590618523908390619f04565b619900565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261858a905b8290619f8e565b60010361865757604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526185f0906182b6565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261663590618523905b83906198da565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526186b6906184b2565b156187ed57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061871e90839061a028565b905060008160018351618731919061ad31565b815181106187415761874161b550565b602002602001015190506187e46185236187b76040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290619f04565b95945050505050565b82604051602001616708919061bba0565b50919050565b606060006188398360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061889b906184b2565b156188a95761663581619900565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261890890618583565b60010361897257604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166359061852390618650565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526189d1906184b2565b156187ed57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290618a3990839061a028565b9050600181511115618a75578060028251618a54919061ad31565b81518110618a6457618a6461b550565b602002602001015192505050919050565b5082604051602001616708919061bba0565b805182516000911115618a9c575060006164e1565b81518351602085015160009291618ab29161bc7e565b618abc919061ad31565b905082602001518103618ad35760019150506164e1565b82516020840151819020912014905092915050565b60606000618af58361a0cd565b600101905060008167ffffffffffffffff811115618b1557618b1561aaf5565b6040519080825280601f01601f191660200182016040528015618b3f576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084618b4957509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091618c14905b829061a1af565b15618c5457505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618cb390618c0d565b15618cf357505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618d5290618c0d565b15618d9257505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618df190618c0d565b80618e565750604080518082018252601081527f47504c2d322e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618e5690618c0d565b15618e9657505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618ef590618c0d565b80618f5a5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618f5a90618c0d565b15618f9a57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618ff990618c0d565b8061905e5750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261905e90618c0d565b1561909e57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526190fd90618c0d565b806191625750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261916290618c0d565b156191a257505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261920190618c0d565b1561924157505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526192a090618c0d565b156192e057505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261933f90618c0d565b1561937f57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526193de90618c0d565b1561941e57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261947d90618c0d565b156194bd57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261951c90618c0d565b806195815750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261958190618c0d565b156195c157505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261962090618c0d565b1561966057505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151616708929060200161bc91565b60608060005b845181101561970257818582815181106196995761969961b550565b60200260200101516040516020016196b292919061b0c9565b6040516020818303038152906040529150600185516196d1919061ad31565b81146196fa57816040516020016196e8919061bdfa565b60405160208183030381529060405291505b60010161967d565b5060408051600380825260808201909252600091816020015b606081526020019060019003908161971b57905050905083816000815181106197465761974661b550565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061979a5761979a61b550565b602002602001018190525081816002815181106197b9576197b961b550565b6020908102919091010152949350505050565b60208083015183518351928401516000936197ea929184919061a1c3565b14159392505050565b60408051808201909152600080825260208201526000619825846000015185602001518560000151866020015161a2d4565b9050836020015181619837919061ad31565b8451859061984690839061ad31565b90525060208401525090919050565b604080518082019091526000808252602082015281518351101561987a5750816164e1565b60208083015190840151600191146198a15750815160208481015190840151829020919020145b80156198d2578251845185906198b890839061ad31565b90525082516020850180516198ce90839061bc7e565b9052505b509192915050565b60408051808201909152600080825260208201526198f983838361a3f4565b5092915050565b60606000826000015167ffffffffffffffff8111156199215761992161aaf5565b6040519080825280601f01601f19166020018201604052801561994b576020820181803683370190505b50905060006020820190506198f9818560200151866000015161a49f565b60606000619975616932565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161999257905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806199ed9061b6bd565b935060ff1681518110619a0257619a0261b550565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001619a53919061be3b565b604051602081830303815290604052828280619a6e9061b6bd565b935060ff1681518110619a8357619a8361b550565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280619ad09061b6bd565b935060ff1681518110619ae557619ae561b550565b602002602001018190525082604051602001619b01919061b5eb565b604051602081830303815290604052828280619b1c9061b6bd565b935060ff1681518110619b3157619b3161b550565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280619b7e9061b6bd565b935060ff1681518110619b9357619b9361b550565b6020026020010181905250619ba8878461a519565b8282619bb38161b6bd565b935060ff1681518110619bc857619bc861b550565b602090810291909101015285515115619c745760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282619c1a8161b6bd565b935060ff1681518110619c2f57619c2f61b550565b6020026020010181905250619c4886600001518461a519565b8282619c538161b6bd565b935060ff1681518110619c6857619c6861b550565b60200260200101819052505b856080015115619ce25760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282619cbd8161b6bd565b935060ff1681518110619cd257619cd261b550565b6020026020010181905250619d48565b8415619d485760408051808201909152601281527f2d2d726571756972655265666572656e6365000000000000000000000000000060208201528282619d278161b6bd565b935060ff1681518110619d3c57619d3c61b550565b60200260200101819052505b60408601515115619de45760408051808201909152600d81527f2d2d756e73616665416c6c6f770000000000000000000000000000000000000060208201528282619d928161b6bd565b935060ff1681518110619da757619da761b550565b60200260200101819052508560400151828280619dc39061b6bd565b935060ff1681518110619dd857619dd861b550565b60200260200101819052505b856060015115619e4e5760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282619e2d8161b6bd565b935060ff1681518110619e4257619e4261b550565b60200260200101819052505b60008160ff1667ffffffffffffffff811115619e6c57619e6c61aaf5565b604051908082528060200260200182016040528015619e9f57816020015b6060815260200190600190039081619e8a5790505b50905060005b8260ff168160ff161015619ef857838160ff1681518110619ec857619ec861b550565b6020026020010151828260ff1681518110619ee557619ee561b550565b6020908102919091010152600101619ea5565b50979650505050505050565b6040805180820190915260008082526020820152815183511015619f295750816164e1565b81518351602085015160009291619f3f9161bc7e565b619f49919061ad31565b60208401519091506001908214619f6a575082516020840151819020908220145b8015619f8557835185518690619f8190839061ad31565b9052505b50929392505050565b6000808260000151619fb2856000015186602001518660000151876020015161a2d4565b619fbc919061bc7e565b90505b83516020850151619fd0919061bc7e565b81116198f95781619fe08161be80565b925050826000015161a017856020015183619ffb919061ad31565b865161a007919061ad31565b838660000151876020015161a2d4565b61a021919061bc7e565b9050619fbf565b6060600061a0368484619f8e565b61a04190600161bc7e565b67ffffffffffffffff81111561a0595761a05961aaf5565b60405190808252806020026020018201604052801561a08c57816020015b606081526020019060019003908161a0775790505b50905060005b81518110156183015761a0a861852386866198da565b82828151811061a0ba5761a0ba61b550565b602090810291909101015260010161a092565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061a116577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061a142576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061a16057662386f26fc10000830492506010015b6305f5e100831061a178576305f5e100830492506008015b612710831061a18c57612710830492506004015b6064831061a19e576064830492506002015b600a83106164e15760010192915050565b600061a1bb838361a559565b159392505050565b60008085841161a2ca576020841161a276576000841561a20e57600161a1ea86602061ad31565b61a1f590600861be9a565b61a20090600261bf98565b61a20a919061ad31565b1990505b835181168561a21d898961bc7e565b61a227919061ad31565b805190935082165b81811461a2615787841161a2495787945050505050617f32565b8361a2538161bfa4565b94505082845116905061a22f565b61a26b878561bc7e565b945050505050617f32565b83832061a283858861ad31565b61a28d908761bc7e565b91505b85821061a2c85784822080820361a2b55761a2ab868461bc7e565b9350505050617f32565b61a2c060018461ad31565b92505061a290565b505b5092949350505050565b6000838186851161a3df576020851161a38e576000851561a32057600161a2fc87602061ad31565b61a30790600861be9a565b61a31290600261bf98565b61a31c919061ad31565b1990505b8451811660008761a3318b8b61bc7e565b61a33b919061ad31565b855190915083165b82811461a3805781861061a3685761a35b8b8b61bc7e565b9650505050505050617f32565b8561a3728161be80565b96505083865116905061a343565b859650505050505050617f32565b508383206000905b61a3a0868961ad31565b821161a3dd5785832080820361a3bc5783945050505050617f32565b61a3c760018561bc7e565b935050818061a3d59061be80565b92505061a396565b505b61a3e9878761bc7e565b979650505050505050565b6040805180820190915260008082526020820152600061a426856000015186602001518660000151876020015161a2d4565b60208087018051918601919091525190915061a442908261ad31565b83528451602086015161a455919061bc7e565b810361a464576000855261a496565b8351835161a472919061bc7e565b8551869061a48190839061ad31565b905250835161a490908261bc7e565b60208601525b50909392505050565b6020811061a4d7578151835261a4b660208461bc7e565b925061a4c360208361bc7e565b915061a4d060208261ad31565b905061a49f565b600019811561a50657600161a4ed83602061ad31565b61a4f99061010061bf98565b61a503919061ad31565b90505b9151835183169219169190911790915250565b6060600061a5278484616a05565b805160208083015160405193945061a5419390910161bfbb565b60405160208183030381529060405291505092915050565b815181516000919081111561a56c575081515b6020808501519084015160005b8381101561a625578251825180821461a5f557600019602087101561a5d45760018461a5a689602061ad31565b61a5b0919061bc7e565b61a5bb90600861be9a565b61a5c690600261bf98565b61a5d0919061ad31565b1990505b818116838216818103911461a5f25797506164e19650505050505050565b50505b61a60060208661bc7e565b945061a60d60208561bc7e565b9350505060208161a61e919061bc7e565b905061a579565b50845186516170b3919061c013565b610c9f806200c03483390190565b6119ca806200ccd383390190565b611783806200e69d83390190565b610de0806200fe2083390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161a6af61a6b4565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161a6af6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b8181101561a7665783516001600160a01b031683526020938401939092019160010161a73f565b509095945050505050565b60005b8381101561a78c57818101518382015260200161a774565b50506000910152565b6000815180845261a7ad81602086016020860161a771565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b8181101561a8a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261a88d84865161a795565b602095860195909450929092019160010161a853565b50919750505060209485019492909201915060010161a7e9565b50929695505050505050565b600081518084526020840193506020830160005b8281101561a91d5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161a8dd565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516040875261a993604088018261a795565b905060208201519150868103602088015261a9ae818361a8c9565b96505050602093840193919091019060010161a94f565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261aa2785835161a795565b9450602093840193919091019060010161a9ed565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b038151168652602081015190506040602087015261aabd604087018261a8c9565b955050602093840193919091019060010161aa64565b60006020828403121561aae557600080fd5b8151801515811461663557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c9082168061ab3857607f821691505b6020821081036187fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610f2657806000526020600020601f840160051c8101602085101561ab985750805b601f840160051c820191505b81811015613a14576000815560010161aba4565b815167ffffffffffffffff81111561abd25761abd261aaf5565b61abe68161abe0845461ab24565b8461ab71565b6020601f82116001811461ac1a576000831561ac025750848201515b600019600385901b1c1916600184901b178455613a14565b600084815260208120601f198516915b8281101561ac4a578785015182556020948501946001909201910161ac2a565b508482101561ac685786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b602081526000616635602083018461a795565b6001600160a01b03851681526001600160a01b03841660208201528260408201526080606082015260006170b3608083018461a795565b60006020828403121561acd357600080fd5b5051919050565b6001600160a01b03841681528260208201526060604082015260006187e4606083018461a795565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156164e1576164e161ad02565b600081546001600160a01b038116845267ffffffffffffffff8160a01c1660208501525060018201606060408501526000815461ad808161ab24565b806060880152600182166000811461ad9f576001811461add95761ae0d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b890101935061ae0d565b84600052602060002060005b8381101561ae045781548a82016080015260019091019060200161ade5565b89016080019450505b50919695505050505050565b6001600160a01b0383168152604060208201526000617f32604083018461ad44565b83815260606020820152600061ae54606083018561a795565b82810360408401526170b3818561ad44565b6001600160a01b03861681526001600160a01b038516602082015283604082015260a06060820152600061ae9d60a083018561a795565b828103608084015261aeaf818561ad44565b98975050505050505050565b828152604060208201526000617f32604083018461a795565b60008261af0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6001600160a01b0383168152604060208201526000617f32604083018461a795565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161af6981601a85016020880161a771565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161afa681601c84016020880161a771565b01601c01949350505050565b60006020828403121561afc457600080fd5b81516001600160a01b038116811461663557600080fd5b6040516060810167ffffffffffffffff8111828210171561affe5761affe61aaf5565b60405290565b60008067ffffffffffffffff84111561b01f5761b01f61aaf5565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561b04e5761b04e61aaf5565b60405283815290508082840185101561b06657600080fd5b61830184602083018561a771565b600082601f83011261b08557600080fd5b6166358383516020850161b004565b60006020828403121561b0a657600080fd5b815167ffffffffffffffff81111561b0bd57600080fd5b6164dd8482850161b074565b6000835161b0db81846020880161a771565b83519083019061b0ef81836020880161a771565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161b13081601a85016020880161a771565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161b16d81603384016020880161a771565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000616635608083018461a795565b60006020828403121561b1fc57600080fd5b815167ffffffffffffffff81111561b21357600080fd5b8201601f8101841361b22457600080fd5b6164dd8482516020840161b004565b6000855161b245818460208a0161a771565b7f2f00000000000000000000000000000000000000000000000000000000000000908301908152855161b27f816001840160208a0161a771565b7f2f0000000000000000000000000000000000000000000000000000000000000060019290910191820152845161b2bd81600284016020890161a771565b6001818301019150507f2f000000000000000000000000000000000000000000000000000000000000006001820152835161b2ff81600284016020880161a771565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b60408152600061b34a604083018461a795565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e206172746966616374200081526000825161b3c181601f85016020870161a771565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b60408152600061b42e604083018461a795565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b60408152600061b480604083018461a795565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b2700000000000000000000000081526000825161b4f781601485016020870161a771565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b60408152600061b53e604083018561a795565b8281036020840152616631818561a795565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f220000000000000000000000000000000000000000000000000000000000000081526000825161b5b781600185016020870161a771565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b6000825161b5fd81846020870161a771565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161b6b081604b85016020870161a771565b91909101604b0192915050565b600060ff821660ff810361b6d35761b6d361ad02565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161b73a81602985016020870161a771565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000616635608083018461a795565b60006020828403121561b7a057600080fd5b815167ffffffffffffffff81111561b7b757600080fd5b82016060818503121561b7c957600080fd5b61b7d161afdb565b81518060030b811461b7e257600080fd5b8152602082015167ffffffffffffffff81111561b7fe57600080fd5b61b80a8682850161b074565b602083015250604082015167ffffffffffffffff81111561b82a57600080fd5b61b8368682850161b074565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161b8a281602185016020870161a771565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161ba8e81602185016020880161a771565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161bacb81602e84016020880161a771565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161b73a81602985016020870161a771565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161bb9381602285016020870161a771565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161bbd881600e85016020870161a771565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b808201808211156164e1576164e161ad02565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161bcc981601885016020880161a771565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161bd0681601c84016020880161a771565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161be0c81846020870161a771565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161be7381601c85016020870161a771565b91909101601c0192915050565b6000600019820361be935761be9361ad02565b5060010190565b80820281158282048414176164e1576164e161ad02565b6001815b600184111561beec5780850481111561bed05761bed061ad02565b600184161561bede57908102905b60019390931c92800261beb5565b935093915050565b60008261bf03575060016164e1565b8161bf10575060006164e1565b816001811461bf26576002811461bf305761bf4c565b60019150506164e1565b60ff84111561bf415761bf4161ad02565b50506001821b6164e1565b5060208310610133831016604e8410600b841016171561bf6f575081810a6164e1565b61bf7c600019848461beb1565b806000190482111561bf905761bf9061ad02565b029392505050565b6000616635838361bef4565b60008161bfb35761bfb361ad02565b506000190190565b6000835161bfcd81846020880161a771565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161c00781600184016020880161a771565b01600101949350505050565b81810360008312801583831316838312821617156198f9576198f961ad0256fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220fbb0952871b3b2645a0a6a243168b521f2ab83f3d807c093dac597b9175e263864736f6c634300081a0033", + ABI: "[{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WHITELISTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20PartialThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20PartialThroughCustodyFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20PartialThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveERC20ThroughCustodyTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNoParamsThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testNewCustodyFailsIfAddressesAreZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUnwhitelist\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUnwhitelistFailsIfSenderIsNotWhitelister\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUnwhitelistFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWhitelist\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWhitelistFailsIfSenderIsNotWhitelister\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWhitelistFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustodyFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustodyFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawThroughCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawThroughCustodyFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5062010c35806200003e6000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c806385f438c111610191578063c713f827116100e3578063f0c8e7e011610097578063fa7626d411610071578063fa7626d414610533578063fb176c1214610540578063fe8e5f1b1461054857600080fd5b8063f0c8e7e01461051b578063f4221f0814610523578063fa2a70741461052b57600080fd5b8063e20c9f71116100c8578063e20c9f71146104e4578063e63ab1e9146104ec578063eb1ce7f91461051357600080fd5b8063c713f827146104d4578063cbd57e2f146104dc57600080fd5b8063a3f9d0e011610145578063b0464fdc1161011f578063b0464fdc146104ac578063b5508aa9146104b4578063ba414fa6146104bc57600080fd5b8063a3f9d0e014610475578063a4943deb1461047d578063a783c7891461048557600080fd5b8063916a17c611610176578063916a17c6146104505780639918c1c2146104655780639fc7fd551461046d57600080fd5b806385f438c1146104215780639158c6231461044857600080fd5b80633f7286f41161024a57806366d9a9a0116101fe5780637e91c50f116101d85780637e91c50f146103fc57806382c529921461040457806385226c811461040c57600080fd5b806366d9a9a0146103d75780636a621854146103ec57806371149c94146103f457600080fd5b806351ecdf3c1161022f57806351ecdf3c14610373578063570618e11461037b5780635d62c860146103b057600080fd5b80633f7286f4146103635780634b5838d21461036b57600080fd5b80632ade3880116102a15780633e5e3c23116102865780633e5e3c231461034b5780633e73ecb4146103535780633ee929231461035b57600080fd5b80632ade38801461032e5780632be6a1621461034357600080fd5b80631779672f116102d25780631779672f146103005780631ed7831c14610308578063284cb9291461032657600080fd5b80630a9254e4146102ee5780630eee72a9146102f8575b600080fd5b6102f6610550565b005b6102f6610f2b565b6102f66111d0565b610310611321565b60405161031d919061a725565b60405180910390f35b6102f6611383565b610336611680565b60405161031d919061a7c1565b6102f66117c2565b6103106119b4565b6102f6611a14565b6102f6611fa2565b610310612071565b6102f66120d1565b6102f66123ef565b6103a27f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60405190815260200161031d565b6103a27f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b6103df6125c0565b60405161031d919061a927565b6102f6612742565b6102f661280e565b6102f661306e565b6102f66131f9565b61041461346d565b60405161031d919061a9c5565b6103a27f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6102f661353d565b61045861360b565b60405161031d919061aa3c565b6102f6613706565b6102f6613a1b565b6102f6613ae9565b6102f6614123565b6103a27f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b61045861434b565b610414614446565b6104c4614516565b604051901515815260200161031d565b6102f66145ea565b6102f66152bf565b610310615380565b6103a27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6102f66153e0565b6102f66154ec565b6102f66156ae565b6102f661591b565b601f546104c49060ff1681565b6102f6615c12565b6102f66162c2565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880549091166156781790556040516105a29061a634565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f080158015610627573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560405161066c9061a634565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156106f0573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602854602654925190851660248201526044810193909352921660648201526107df919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526164c8565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560285460265460405192939182169291169061086b9061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156108a7573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460255460285460265460405193851694928316939183169216906109029061a650565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610946573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560405161098b9061a65e565b604051809103906000f0801580156109a7573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610a5357600080fd5b505af1158015610a67573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b158015610b5757600080fd5b505af1158015610b6b573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b158015610bd157600080fd5b505af1158015610be5573d6000803e3d6000fd5b5050602254602480546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639b19251a925001600060405180830381600087803b158015610c4a57600080fd5b505af1158015610c5e573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cc057600080fd5b505af1158015610cd4573d6000803e3d6000fd5b5050602480546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f4240938101939093521692506340c10f199150604401600060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b5050602480546022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a1209381019390935216925063a9059cbb91506044016020604051808303816000875af1158015610dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df3919061aad3565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610e7457600080fd5b505af1158015610e88573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b039081168252600160208084019182528451908101855260008152938301849052825160298054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602a90610f26908261abb8565b505050565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc513169100000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b15801561101057600080fd5b505af1158015611024573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061110f919060040161ac77565b600060405180830381600087803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f2945061119a9392831692909116908790879060040161ac8a565b600060405180830381600087803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b505050505050565b6024805460275460405160009381018490526001600160a01b03928316604482015291166064820152819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602854905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b5050604051630618f58760e51b81527f951e19ed000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e0915060240161110f565b6060601680548060200260200160405190810160405280929190818152602001828054801561137957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161135b575b5050505050905090565b6022546025546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600092919091169063d936547e90602401602060405180830381865afa1580156113ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611411919061aad3565b905061141e6000826164e7565b6022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156114ac57600080fd5b505af11580156114c0573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549150600090a260265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561155557600080fd5b505af1158015611569573d6000803e3d6000fd5b50506022546025546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639b19251a9150602401600060405180830381600087803b1580156115cf57600080fd5b505af11580156115e3573d6000803e3d6000fd5b50506022546025546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063d936547e9150602401602060405180830381865afa15801561164c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611670919061aad3565b905061167d6001826164e7565b50565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156117b957600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156117a25783829060005260206000200180546117159061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546117419061ab24565b801561178e5780601f106117635761010080835404028352916020019161178e565b820191906000526020600020905b81548152906001019060200180831161177157829003601f168201915b5050505050815260200190600101906116f6565b5050505081525050815260200190600101906116a4565b50505050905090565b60405163ca669fa760e01b81526101236004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b50506040805161012360248201527f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f0000000000000000000000000000000000000000000000000000000017905290517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611905919060040161ac77565b600060405180830381600087803b15801561191f57600080fd5b505af1158015611933573d6000803e3d6000fd5b50506022546025546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639b19251a91506024015b600060405180830381600087803b15801561199a57600080fd5b505af11580156119ae573d6000803e3d6000fd5b50505050565b60606018805480602002602001604051908101604052809291908181526020018280548015611379576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161135b575050505050905090565b602480546027546040516370a0823160e01b81526001600160a01b039182166004820152620186a09360009392909216916370a082319101602060405180830381865afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d919061acc1565b9050611a9a816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e919061acc1565b6027546040516001600160a01b0390911660248201526044810185905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391611bf1916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015611c0b57600080fd5b505af1158015611c1f573d6000803e3d6000fd5b50506022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015611cb157600080fd5b505af1158015611cc5573d6000803e3d6000fd5b50506024546027546040518881526001600160a01b039283169450911691507fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb9060200160405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611d6a57600080fd5b505af1158015611d7e573d6000803e3d6000fd5b5050602254602754602480546040517fd9caed120000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015290831691810191909152604481018990529116925063d9caed129150606401600060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061acc1565b9050611e8f8186616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f03919061acc1565b9050611f1881611f13888761ad31565b616569565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8c919061acc1565b9050611f99816000616569565b50505050505050565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401610ff6565b60606017805480602002602001604051908101604052809291908181526020018280548015611379576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161135b575050505050905090565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561213d57600080fd5b505af1158015612151573d6000803e3d6000fd5b5050602854602654604051600094508493506001600160a01b03928316929091169061217c9061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156121b8573d6000803e3d6000fd5b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561222857600080fd5b505af115801561223c573d6000803e3d6000fd5b50506020546026546040516001600160a01b039283169450600093509116906122649061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156122a0573d6000803e3d6000fd5b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561231057600080fd5b505af1158015612324573d6000803e3d6000fd5b50506020546028546040516001600160a01b0392831694509116915060009061234c9061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015612388573d6000803e3d6000fd5b506020546028546026546040519394506001600160a01b03928316939183169216906123b39061a642565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610f26573d6000803e3d6000fd5b6024805460275460405160019381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602854905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156124d157600080fd5b505af11580156124e5573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b50506022546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321fc65f2935061119a9260009216908790879060040161ac8a565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156117b957838290600052602060002090600202016040518060400160405290816000820180546126179061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546126439061ab24565b80156126905780601f1061266557610100808354040283529160200191612690565b820191906000526020600020905b81548152906001019060200180831161267357829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561272a57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116126d75790505b505050505081525050815260200190600101906125e4565b6024805460275460405160009381018490526001600160a01b03928316604482015291166064820152819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc513169100000000000000000000000000000000000000000000000000000000179052602854905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401611298565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f1901815290829052602480546021546370a0823160e01b85526001600160a01b0390811660048601529294506000939216916370a082319101602060405180830381865afa1580156128a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c5919061acc1565b90506128d2816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015612922573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612946919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391612a29916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015612a4357600080fd5b505af1158015612a57573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612ae957600080fd5b505af1158015612afd573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e9350612b4192506001600160a01b039091169060299061ae19565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015612bd757600080fd5b505af1158015612beb573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690612c39908990899060299061ae3b565b60405180910390a36022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015612ccf57600080fd5b505af1158015612ce3573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b90612d31908990899060299061ae3b565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612d9257600080fd5b505af1158015612da6573d6000803e3d6000fd5b50506022546021546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c709ab6e9450612e069392831692909116908a908a9060299060040161ae66565b600060405180830381600087803b158015612e2057600080fd5b505af1158015612e34573d6000803e3d6000fd5b5050602480546021546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa158015612e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eab919061acc1565b9050612eb78187616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015612f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2b919061acc1565b9050612f3b81611f13898761ad31565b602480546020546021546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169381019390935260009291169063dd62ed3e90604401602060405180830381865afa158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd5919061acc1565b9050612fe2816000616569565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613032573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613056919061acc1565b9050613063816000616569565b505050505050505050565b6040517f68656c6c6f000000000000000000000000000000000000000000000000000000602082015260019060009060250160408051808303601f190181529082905260285463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561310757600080fd5b505af115801561311b573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561318b57600080fd5b505af115801561319f573d6000803e3d6000fd5b50506022546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c709ab6e935061119a9260009216908790879060299060040161ae66565b6028546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561326b57600080fd5b505af115801561327f573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b1580156132e457600080fd5b505af11580156132f8573d6000803e3d6000fd5b5050604051630618f58760e51b81527f584a7938000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b5050602254602754602480546040517fd9caed120000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015290831691810191909152600160448201529116925063d9caed129150606401600060405180830381600087803b1580156133f757600080fd5b505af115801561340b573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561199a57600080fd5b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156117b95783829060005260206000200180546134b09061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546134dc9061ab24565b80156135295780601f106134fe57610100808354040283529160200191613529565b820191906000526020600020905b81548152906001019060200180831161350c57829003601f168201915b505050505081526020019060010190613491565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b50506022546040517f9a590427000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b039091169250639a5904279150602401611980565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156117b95760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156136ee57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161369b5790505b5050505050815250508152602001906001019061362f565b602480546027546040516001938101939093526001600160a01b03918216604484015216606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a20000000000000000000000000000000000000000000000000000000017905260285490517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b15801561387a57600080fd5b505af115801561388e573d6000803e3d6000fd5b5050604051630618f58760e51b81527f584a7938000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156138fe57600080fd5b505af1158015613912573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f29450613970939283169290911690600190879060040161ac8a565b600060405180830381600087803b15801561398a57600080fd5b505af115801561399e573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a0057600080fd5b505af1158015613a14573d6000803e3d6000fd5b5050505050565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015613a8757600080fd5b505af1158015613a9b573d6000803e3d6000fd5b50506022546040517f9b19251a000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b039091169250639b19251a9150602401611980565b604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed7016900000000000000000000000000000000000000000000000000000000179052805460275494516370a0823160e01b81526001600160a01b0395861693810193909352620186a0946000939116916370a082319101602060405180830381865afa158015613b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb7919061acc1565b9050613bc4816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c38919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613d1b916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015613d3557600080fd5b505af1158015613d49573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613ddb57600080fd5b505af1158015613def573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613ec157600080fd5b505af1158015613ed5573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d590613f20908990899061aebb565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613f8157600080fd5b505af1158015613f95573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f29450613ff29392831692909116908a908a9060040161ac8a565b600060405180830381600087803b15801561400c57600080fd5b505af1158015614020573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015614072573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614096919061acc1565b90506140a3816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156140f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614117919061acc1565b9050612f3b8185616569565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f190181529082905260265463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156141be57600080fd5b505af11580156141d2573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506142bd919060040161ac77565b600060405180830381600087803b1580156142d757600080fd5b505af11580156142eb573d6000803e3d6000fd5b50506022546021546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c709ab6e945061119a9392831692909116908790879060299060040161ae66565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156117b95760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561442e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116143db5790505b5050505050815250508152602001906001019061436f565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156117b95783829060005260206000200180546144899061ab24565b80601f01602080910402602001604051908101604052809291908181526020018280546144b59061ab24565b80156145025780601f106144d757610100808354040283529160200191614502565b820191906000526020600020905b8154815290600101906020018083116144e557829003601f168201915b50505050508152602001906001019061446a565b60085460009060ff161561452e575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156145bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e3919061acc1565b1415905090565b60285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561464357600080fd5b505af1158015614657573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614742919060040161ac77565b600060405180830381600087803b15801561475c57600080fd5b505af1158015614770573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156147c457600080fd5b505af11580156147d8573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561483557600080fd5b505af1158015614849573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614934919060040161ac77565b600060405180830381600087803b15801561494e57600080fd5b505af1158015614962573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156149b657600080fd5b505af11580156149ca573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614a2757600080fd5b505af1158015614a3b573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614a8f57600080fd5b505af1158015614aa3573d6000803e3d6000fd5b505060248054602754604051620186a09381018490526001600160a01b039283166044820152911660648201529092506000915060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a20000000000000000000000000000000000000000000000000000000017905251630618f58760e51b81527fd93c0665000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015614b9f57600080fd5b505af1158015614bb3573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614c1057600080fd5b505af1158015614c24573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f29450614c819392831692909116908790879060040161ac8a565b600060405180830381600087803b158015614c9b57600080fd5b505af1158015614caf573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614d0c57600080fd5b505af1158015614d20573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614d7457600080fd5b505af1158015614d88573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa158015614ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dff919061acc1565b9050614e0c816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015614e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e80919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391614f63916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015614f7d57600080fd5b505af1158015614f91573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561502357600080fd5b505af1158015615037573d6000803e3d6000fd5b505060208054602454602754604080516001600160a01b0394851681529485018c905291831684830152919091166060830152517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609350908190036080019150a16022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561512657600080fd5b505af115801561513a573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d590615185908990899061aebb565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156151e657600080fd5b505af11580156151fa573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f294506152579392831692909116908a908a9060040161ac8a565b600060405180830381600087803b15801561527157600080fd5b505af1158015615285573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101612e6a565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a2000000000000000000000000000000000000000000000000000000001790526024805460275492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101614dbe565b60606015805480602002602001604051908101604052809291908181526020018280548015611379576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161135b575050505050905090565b600080604051602001615416907f68656c6c6f000000000000000000000000000000000000000000000000000000815260050190565b60408051808303601f190181529082905260285463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561547d57600080fd5b505af1158015615491573d6000803e3d6000fd5b5050604051630618f58760e51b81527f951e19ed000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024016142bd565b60405163ca669fa760e01b81526101236004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561553a57600080fd5b505af115801561554e573d6000803e3d6000fd5b50506040805161012360248201527f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60448083019190915282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f0000000000000000000000000000000000000000000000000000000017905290517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061562f919060040161ac77565b600060405180830381600087803b15801561564957600080fd5b505af115801561565d573d6000803e3d6000fd5b50506022546025546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639a5904279150602401611980565b602480546027546040516001938101939093526001600160a01b03918216604484015216606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a20000000000000000000000000000000000000000000000000000000017905260285490517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156157a957600080fd5b505af11580156157bd573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b15801561582257600080fd5b505af1158015615836573d6000803e3d6000fd5b5050604051630618f58760e51b81527f584a7938000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156158a657600080fd5b505af11580156158ba573d6000803e3d6000fd5b50506022546021546024546040517fc709ab6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c709ab6e9450613970939283169290911690600190879060299060040161ae66565b602254602480546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600093919091169163d936547e9101602060405180830381865afa158015615984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906159a8919061aad3565b90506159b56001826164e7565b6022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015615a4357600080fd5b505af1158015615a57573d6000803e3d6000fd5b50506024546040516001600160a01b0390911692507f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919150600090a260265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015615aec57600080fd5b505af1158015615b00573d6000803e3d6000fd5b5050602254602480546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015292169350639a590427925001600060405180830381600087803b158015615b6557600080fd5b505af1158015615b79573d6000803e3d6000fd5b5050602254602480546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529216935063d936547e925001602060405180830381865afa158015615be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615c05919061aad3565b905061167d6000826164e7565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc5131691000000000000000000000000000000000000000000000000000000001790526024805460275492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015615ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615d0f919061acc1565b9050615d1c816000616569565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015615d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615d90919061acc1565b6020546040516001600160a01b0390911660248201526044810186905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391615e73916001600160a01b039190911690600090869060040161acda565b600060405180830381600087803b158015615e8d57600080fd5b505af1158015615ea1573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015615f3357600080fd5b505af1158015615f47573d6000803e3d6000fd5b50506020547f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af6092506001600160a01b03169050615f8560028861aed4565b602454602754604080516001600160a01b03958616815260208101949094529184168383015292909216606082015290519081900360800190a16022546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561604d57600080fd5b505af1158015616061573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5906160ac908990899061aebb565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561610d57600080fd5b505af1158015616121573d6000803e3d6000fd5b50506022546021546024546040517f21fc65f20000000000000000000000000000000000000000000000000000000081526001600160a01b0393841695506321fc65f2945061617e9392831692909116908a908a9060040161ac8a565b600060405180830381600087803b15801561619857600080fd5b505af11580156161ac573d6000803e3d6000fd5b5050602480546027546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa1580156161fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616222919061acc1565b905061623381611f1360028961aed4565b602480546022546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015616283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906162a7919061acc1565b9050612f3b816162b860028a61aed4565b611f13908761ad31565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561632057600080fd5b505af1158015616334573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061641f919060040161ac77565b600060405180830381600087803b15801561643957600080fd5b505af115801561644d573d6000803e3d6000fd5b5050602254602754602480546040517fd9caed120000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015290831691810191909152604481018690529116925063d9caed129150606401600060405180830381600087803b158015613a0057600080fd5b60006164d261a66c565b6164dd8484836165c1565b9150505b92915050565b6040517ff7fe347700000000000000000000000000000000000000000000000000000000815282151560048201528115156024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f7fe3477906044015b60006040518083038186803b15801561655557600080fd5b505afa1580156111c8573d6000803e3d6000fd5b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440161653d565b6000806165ce858461663c565b90506166316040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f7879000000815250828660405160200161661c92919061af0f565b60405160208183030381529060405285616648565b9150505b9392505050565b60006166358383616676565b60c0810151516000901561666c5761666584848460c00151616691565b9050616635565b6166658484616837565b60006166828383616922565b61663583836020015184616648565b60008061669c616932565b905060006166aa8683616a05565b905060006166c18260600151836020015185616eab565b905060006166d1838389896170bd565b905060006166de82617f3a565b602081015181519192509060030b156167515789826040015160405160200161670892919061af31565b60408051601f19818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526167489160040161ac77565b60405180910390fd5b60006167946040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001618109565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906167e790849060040161ac77565b602060405180830381865afa158015616804573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616828919061afb2565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061688c90879060040161ac77565b600060405180830381865afa1580156168a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526168d1919081019061b094565b905060006168ff82856040516020016168eb92919061b0c9565b604051602081830303815290604052618309565b90506001600160a01b0381166164dd57848460405160200161670892919061b0f8565b61692e8282600061831c565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906169b990849060040161b1a3565b600060405180830381865afa1580156169d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526169fe919081019061b1ea565b9250505090565b616a376040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050616a826040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b616a8b8561841f565b60208201526000616a9b86618804565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015616add573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616b05919081019061b1ea565b86838560200151604051602001616b1f949392919061b233565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190616b7790859060040161ac77565b600060405180830381865afa158015616b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616bbc919081019061b1ea565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690616c0490849060040161b337565b602060405180830381865afa158015616c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616c45919061aad3565b616c5a5781604051602001616708919061b389565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890616c9f90849060040161b41b565b600060405180830381865afa158015616cbc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616ce4919081019061b1ea565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f690616d2b90849060040161b46d565b602060405180830381865afa158015616d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616d6c919061aad3565b15616e01576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890616db690849060040161b46d565b600060405180830381865afa158015616dd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616dfb919081019061b1ea565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001616e26919061b4bf565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401616e5292919061b52b565b600060405180830381865afa158015616e6f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616e97919081019061b1ea565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081616ec75790505090506040518060400160405280600481526020017f677265700000000000000000000000000000000000000000000000000000000081525081600081518110616f2757616f2761b550565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110616f7b57616f7b61b550565b602002602001018190525084604051602001616f97919061b57f565b60405160208183030381529060405281600281518110616fb957616fb961b550565b602002602001018190525082604051602001616fd5919061b5eb565b60405160208183030381529060405281600381518110616ff757616ff761b550565b6020026020010181905250600061700d82617f3a565b602080820151604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000818501908152825180840184526000808252908601528251808401909352905182529281019290925291925061709e9060408051808201825260008082526020918201528151808301909252845182528085019082015290618a87565b6170b35785604051602001616708919061b62c565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d901561710d565b511590565b617281578260200151156171c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401616748565b8260c0015115617281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401616748565b6040805160ff8082526120008201909252600091816020015b606081526020019060019003908161729a57905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806172f59061b6bd565b935060ff168151811061730a5761730a61b550565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e370000000000000000000000000000000000000081525060405160200161735b919061b6dc565b6040516020818303038152906040528282806173769061b6bd565b935060ff168151811061738b5761738b61b550565b60200260200101819052506040518060400160405280600681526020017f6465706c6f7900000000000000000000000000000000000000000000000000008152508282806173d89061b6bd565b935060ff16815181106173ed576173ed61b550565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061743a9061b6bd565b935060ff168151811061744f5761744f61b550565b6020026020010181905250876020015182828061746b9061b6bd565b935060ff16815181106174805761748061b550565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806174cd9061b6bd565b935060ff16815181106174e2576174e261b550565b6020908102919091010152875182826174fa8161b6bd565b935060ff168151811061750f5761750f61b550565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e4964000000000000000000000000000000000000000000000081525082828061755c9061b6bd565b935060ff16815181106175715761757161b550565b602002602001018190525061758546618ae8565b82826175908161b6bd565b935060ff16815181106175a5576175a561b550565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806175f29061b6bd565b935060ff16815181106176075761760761b550565b60200260200101819052508682828061761f9061b6bd565b935060ff16815181106176345761763461b550565b602090810291909101015285511561775b5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826176858161b6bd565b935060ff168151811061769a5761769a61b550565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906176ea90899060040161ac77565b600060405180830381865afa158015617707573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261772f919081019061b1ea565b828261773a8161b6bd565b935060ff168151811061774f5761774f61b550565b60200260200101819052505b84602001511561782b5760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826177a48161b6bd565b935060ff16815181106177b9576177b961b550565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806178069061b6bd565b935060ff168151811061781b5761781b61b550565b60200260200101819052506179f2565b6178636171088660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6178f65760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826178a68161b6bd565b935060ff16815181106178bb576178bb61b550565b60200260200101819052508460a001516040516020016178db919061b57f565b6040516020818303038152906040528282806178069061b6bd565b8460c0015115801561793957506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261793790511590565b155b156179f25760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261797d8161b6bd565b935060ff16815181106179925761799261b550565b60200260200101819052506179a688618b88565b6040516020016179b6919061b57f565b6040516020818303038152906040528282806179d19061b6bd565b935060ff16815181106179e6576179e661b550565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152617a2690511590565b617abb5760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282617a698161b6bd565b935060ff1681518110617a7e57617a7e61b550565b60200260200101819052508460400151828280617a9a9061b6bd565b935060ff1681518110617aaf57617aaf61b550565b60200260200101819052505b606085015115617bdc5760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282617b048161b6bd565b935060ff1681518110617b1957617b1961b550565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015617b88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617bb0919081019061b1ea565b8282617bbb8161b6bd565b935060ff1681518110617bd057617bd061b550565b60200260200101819052505b60e08501515115617c835760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282617c268161b6bd565b935060ff1681518110617c3b57617c3b61b550565b6020026020010181905250617c578560e0015160000151618ae8565b8282617c628161b6bd565b935060ff1681518110617c7757617c7761b550565b60200260200101819052505b60e08501516020015115617d2d5760408051808201909152600a81527f2d2d67617350726963650000000000000000000000000000000000000000000060208201528282617cd08161b6bd565b935060ff1681518110617ce557617ce561b550565b6020026020010181905250617d018560e0015160200151618ae8565b8282617d0c8161b6bd565b935060ff1681518110617d2157617d2161b550565b60200260200101819052505b60e08501516040015115617dd75760408051808201909152600e81527f2d2d6d617846656550657247617300000000000000000000000000000000000060208201528282617d7a8161b6bd565b935060ff1681518110617d8f57617d8f61b550565b6020026020010181905250617dab8560e0015160400151618ae8565b8282617db68161b6bd565b935060ff1681518110617dcb57617dcb61b550565b60200260200101819052505b60e08501516060015115617e815760408051808201909152601681527f2d2d6d61785072696f726974794665655065724761730000000000000000000060208201528282617e248161b6bd565b935060ff1681518110617e3957617e3961b550565b6020026020010181905250617e558560e0015160600151618ae8565b8282617e608161b6bd565b935060ff1681518110617e7557617e7561b550565b60200260200101819052505b60008160ff1667ffffffffffffffff811115617e9f57617e9f61aaf5565b604051908082528060200260200182016040528015617ed257816020015b6060815260200190600190039081617ebd5790505b50905060005b8260ff168160ff161015617f2b57838160ff1681518110617efb57617efb61b550565b6020026020010151828260ff1681518110617f1857617f1861b550565b6020908102919091010152600101617ed8565b5093505050505b949350505050565b617f616040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c91617fe79186910161b747565b600060405180830381865afa158015618004573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261802c919081019061b1ea565b9050600061803a8683619677565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b815260040161806a919061a9c5565b6000604051808303816000875af1158015618089573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526180b1919081019061b78e565b805190915060030b158015906180ca5750602081015151155b80156180d95750604081015151155b156170b357816000815181106180f1576180f161b550565b6020026020010151604051602001616708919061b844565b6060600061813e8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506181759082905b906197cc565b156182d25760006181f2826181ec846181e66181b88a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906197f3565b90619855565b604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506182569082906197cc565b156182c057604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526182bd905b82906198da565b90505b6182c981619900565b92505050616635565b82156182eb57848460405160200161670892919061ba30565b5050604080516020810190915260008152616635565b509392505050565b6000808251602084016000f09392505050565b8160a001511561832b57505050565b6000618338848484619969565b9050600061834582617f3a565b602081015181519192509060030b1580156183e15750604080518082018252600781527f5355434345535300000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526183e19060408051808201825260008082526020918201528151808301909252845182528085019082015261816f565b156183ee57505050505050565b6040820151511561840e578160400151604051602001616708919061bad7565b80604051602001616708919061bb35565b606060006184548360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506184b9905b8290618a87565b1561852857604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261663590618523908390619f04565b619900565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261858a905b8290619f8e565b60010361865757604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526185f0906182b6565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261663590618523905b83906198da565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526186b6906184b2565b156187ed57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061871e90839061a028565b905060008160018351618731919061ad31565b815181106187415761874161b550565b602002602001015190506187e46185236187b76040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290619f04565b95945050505050565b82604051602001616708919061bba0565b50919050565b606060006188398360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061889b906184b2565b156188a95761663581619900565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261890890618583565b60010361897257604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166359061852390618650565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526189d1906184b2565b156187ed57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290618a3990839061a028565b9050600181511115618a75578060028251618a54919061ad31565b81518110618a6457618a6461b550565b602002602001015192505050919050565b5082604051602001616708919061bba0565b805182516000911115618a9c575060006164e1565b81518351602085015160009291618ab29161bc7e565b618abc919061ad31565b905082602001518103618ad35760019150506164e1565b82516020840151819020912014905092915050565b60606000618af58361a0cd565b600101905060008167ffffffffffffffff811115618b1557618b1561aaf5565b6040519080825280601f01601f191660200182016040528015618b3f576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084618b4957509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091618c14905b829061a1af565b15618c5457505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618cb390618c0d565b15618cf357505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618d5290618c0d565b15618d9257505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618df190618c0d565b80618e565750604080518082018252601081527f47504c2d322e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618e5690618c0d565b15618e9657505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618ef590618c0d565b80618f5a5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618f5a90618c0d565b15618f9a57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618ff990618c0d565b8061905e5750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261905e90618c0d565b1561909e57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526190fd90618c0d565b806191625750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261916290618c0d565b156191a257505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261920190618c0d565b1561924157505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526192a090618c0d565b156192e057505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261933f90618c0d565b1561937f57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526193de90618c0d565b1561941e57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261947d90618c0d565b156194bd57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261951c90618c0d565b806195815750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261958190618c0d565b156195c157505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261962090618c0d565b1561966057505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151616708929060200161bc91565b60608060005b845181101561970257818582815181106196995761969961b550565b60200260200101516040516020016196b292919061b0c9565b6040516020818303038152906040529150600185516196d1919061ad31565b81146196fa57816040516020016196e8919061bdfa565b60405160208183030381529060405291505b60010161967d565b5060408051600380825260808201909252600091816020015b606081526020019060019003908161971b57905050905083816000815181106197465761974661b550565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061979a5761979a61b550565b602002602001018190525081816002815181106197b9576197b961b550565b6020908102919091010152949350505050565b60208083015183518351928401516000936197ea929184919061a1c3565b14159392505050565b60408051808201909152600080825260208201526000619825846000015185602001518560000151866020015161a2d4565b9050836020015181619837919061ad31565b8451859061984690839061ad31565b90525060208401525090919050565b604080518082019091526000808252602082015281518351101561987a5750816164e1565b60208083015190840151600191146198a15750815160208481015190840151829020919020145b80156198d2578251845185906198b890839061ad31565b90525082516020850180516198ce90839061bc7e565b9052505b509192915050565b60408051808201909152600080825260208201526198f983838361a3f4565b5092915050565b60606000826000015167ffffffffffffffff8111156199215761992161aaf5565b6040519080825280601f01601f19166020018201604052801561994b576020820181803683370190505b50905060006020820190506198f9818560200151866000015161a49f565b60606000619975616932565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161999257905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806199ed9061b6bd565b935060ff1681518110619a0257619a0261b550565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001619a53919061be3b565b604051602081830303815290604052828280619a6e9061b6bd565b935060ff1681518110619a8357619a8361b550565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280619ad09061b6bd565b935060ff1681518110619ae557619ae561b550565b602002602001018190525082604051602001619b01919061b5eb565b604051602081830303815290604052828280619b1c9061b6bd565b935060ff1681518110619b3157619b3161b550565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280619b7e9061b6bd565b935060ff1681518110619b9357619b9361b550565b6020026020010181905250619ba8878461a519565b8282619bb38161b6bd565b935060ff1681518110619bc857619bc861b550565b602090810291909101015285515115619c745760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282619c1a8161b6bd565b935060ff1681518110619c2f57619c2f61b550565b6020026020010181905250619c4886600001518461a519565b8282619c538161b6bd565b935060ff1681518110619c6857619c6861b550565b60200260200101819052505b856080015115619ce25760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282619cbd8161b6bd565b935060ff1681518110619cd257619cd261b550565b6020026020010181905250619d48565b8415619d485760408051808201909152601281527f2d2d726571756972655265666572656e6365000000000000000000000000000060208201528282619d278161b6bd565b935060ff1681518110619d3c57619d3c61b550565b60200260200101819052505b60408601515115619de45760408051808201909152600d81527f2d2d756e73616665416c6c6f770000000000000000000000000000000000000060208201528282619d928161b6bd565b935060ff1681518110619da757619da761b550565b60200260200101819052508560400151828280619dc39061b6bd565b935060ff1681518110619dd857619dd861b550565b60200260200101819052505b856060015115619e4e5760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282619e2d8161b6bd565b935060ff1681518110619e4257619e4261b550565b60200260200101819052505b60008160ff1667ffffffffffffffff811115619e6c57619e6c61aaf5565b604051908082528060200260200182016040528015619e9f57816020015b6060815260200190600190039081619e8a5790505b50905060005b8260ff168160ff161015619ef857838160ff1681518110619ec857619ec861b550565b6020026020010151828260ff1681518110619ee557619ee561b550565b6020908102919091010152600101619ea5565b50979650505050505050565b6040805180820190915260008082526020820152815183511015619f295750816164e1565b81518351602085015160009291619f3f9161bc7e565b619f49919061ad31565b60208401519091506001908214619f6a575082516020840151819020908220145b8015619f8557835185518690619f8190839061ad31565b9052505b50929392505050565b6000808260000151619fb2856000015186602001518660000151876020015161a2d4565b619fbc919061bc7e565b90505b83516020850151619fd0919061bc7e565b81116198f95781619fe08161be80565b925050826000015161a017856020015183619ffb919061ad31565b865161a007919061ad31565b838660000151876020015161a2d4565b61a021919061bc7e565b9050619fbf565b6060600061a0368484619f8e565b61a04190600161bc7e565b67ffffffffffffffff81111561a0595761a05961aaf5565b60405190808252806020026020018201604052801561a08c57816020015b606081526020019060019003908161a0775790505b50905060005b81518110156183015761a0a861852386866198da565b82828151811061a0ba5761a0ba61b550565b602090810291909101015260010161a092565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061a116577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061a142576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061a16057662386f26fc10000830492506010015b6305f5e100831061a178576305f5e100830492506008015b612710831061a18c57612710830492506004015b6064831061a19e576064830492506002015b600a83106164e15760010192915050565b600061a1bb838361a559565b159392505050565b60008085841161a2ca576020841161a276576000841561a20e57600161a1ea86602061ad31565b61a1f590600861be9a565b61a20090600261bf98565b61a20a919061ad31565b1990505b835181168561a21d898961bc7e565b61a227919061ad31565b805190935082165b81811461a2615787841161a2495787945050505050617f32565b8361a2538161bfa4565b94505082845116905061a22f565b61a26b878561bc7e565b945050505050617f32565b83832061a283858861ad31565b61a28d908761bc7e565b91505b85821061a2c85784822080820361a2b55761a2ab868461bc7e565b9350505050617f32565b61a2c060018461ad31565b92505061a290565b505b5092949350505050565b6000838186851161a3df576020851161a38e576000851561a32057600161a2fc87602061ad31565b61a30790600861be9a565b61a31290600261bf98565b61a31c919061ad31565b1990505b8451811660008761a3318b8b61bc7e565b61a33b919061ad31565b855190915083165b82811461a3805781861061a3685761a35b8b8b61bc7e565b9650505050505050617f32565b8561a3728161be80565b96505083865116905061a343565b859650505050505050617f32565b508383206000905b61a3a0868961ad31565b821161a3dd5785832080820361a3bc5783945050505050617f32565b61a3c760018561bc7e565b935050818061a3d59061be80565b92505061a396565b505b61a3e9878761bc7e565b979650505050505050565b6040805180820190915260008082526020820152600061a426856000015186602001518660000151876020015161a2d4565b60208087018051918601919091525190915061a442908261ad31565b83528451602086015161a455919061bc7e565b810361a464576000855261a496565b8351835161a472919061bc7e565b8551869061a48190839061ad31565b905250835161a490908261bc7e565b60208601525b50909392505050565b6020811061a4d7578151835261a4b660208461bc7e565b925061a4c360208361bc7e565b915061a4d060208261ad31565b905061a49f565b600019811561a50657600161a4ed83602061ad31565b61a4f99061010061bf98565b61a503919061ad31565b90505b9151835183169219169190911790915250565b6060600061a5278484616a05565b805160208083015160405193945061a5419390910161bfbb565b60405160208183030381529060405291505092915050565b815181516000919081111561a56c575081515b6020808501519084015160005b8381101561a625578251825180821461a5f557600019602087101561a5d45760018461a5a689602061ad31565b61a5b0919061bc7e565b61a5bb90600861be9a565b61a5c690600261bf98565b61a5d0919061ad31565b1990505b818116838216818103911461a5f25797506164e19650505050505050565b50505b61a60060208661bc7e565b945061a60d60208561bc7e565b9350505060208161a61e919061bc7e565b905061a579565b50845186516170b3919061c013565b610c9f806200c03483390190565b6119ca806200ccd383390190565b611783806200e69d83390190565b610de0806200fe2083390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161a6af61a6b4565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161a6af6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b8181101561a7665783516001600160a01b031683526020938401939092019160010161a73f565b509095945050505050565b60005b8381101561a78c57818101518382015260200161a774565b50506000910152565b6000815180845261a7ad81602086016020860161a771565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b8181101561a8a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261a88d84865161a795565b602095860195909450929092019160010161a853565b50919750505060209485019492909201915060010161a7e9565b50929695505050505050565b600081518084526020840193506020830160005b8281101561a91d5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161a8dd565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516040875261a993604088018261a795565b905060208201519150868103602088015261a9ae818361a8c9565b96505050602093840193919091019060010161a94f565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261aa2785835161a795565b9450602093840193919091019060010161a9ed565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a8bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b038151168652602081015190506040602087015261aabd604087018261a8c9565b955050602093840193919091019060010161aa64565b60006020828403121561aae557600080fd5b8151801515811461663557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c9082168061ab3857607f821691505b6020821081036187fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610f2657806000526020600020601f840160051c8101602085101561ab985750805b601f840160051c820191505b81811015613a14576000815560010161aba4565b815167ffffffffffffffff81111561abd25761abd261aaf5565b61abe68161abe0845461ab24565b8461ab71565b6020601f82116001811461ac1a576000831561ac025750848201515b600019600385901b1c1916600184901b178455613a14565b600084815260208120601f198516915b8281101561ac4a578785015182556020948501946001909201910161ac2a565b508482101561ac685786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b602081526000616635602083018461a795565b6001600160a01b03851681526001600160a01b03841660208201528260408201526080606082015260006170b3608083018461a795565b60006020828403121561acd357600080fd5b5051919050565b6001600160a01b03841681528260208201526060604082015260006187e4606083018461a795565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156164e1576164e161ad02565b600081546001600160a01b038116845267ffffffffffffffff8160a01c1660208501525060018201606060408501526000815461ad808161ab24565b806060880152600182166000811461ad9f576001811461add95761ae0d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b890101935061ae0d565b84600052602060002060005b8381101561ae045781548a82016080015260019091019060200161ade5565b89016080019450505b50919695505050505050565b6001600160a01b0383168152604060208201526000617f32604083018461ad44565b83815260606020820152600061ae54606083018561a795565b82810360408401526170b3818561ad44565b6001600160a01b03861681526001600160a01b038516602082015283604082015260a06060820152600061ae9d60a083018561a795565b828103608084015261aeaf818561ad44565b98975050505050505050565b828152604060208201526000617f32604083018461a795565b60008261af0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6001600160a01b0383168152604060208201526000617f32604083018461a795565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161af6981601a85016020880161a771565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161afa681601c84016020880161a771565b01601c01949350505050565b60006020828403121561afc457600080fd5b81516001600160a01b038116811461663557600080fd5b6040516060810167ffffffffffffffff8111828210171561affe5761affe61aaf5565b60405290565b60008067ffffffffffffffff84111561b01f5761b01f61aaf5565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561b04e5761b04e61aaf5565b60405283815290508082840185101561b06657600080fd5b61830184602083018561a771565b600082601f83011261b08557600080fd5b6166358383516020850161b004565b60006020828403121561b0a657600080fd5b815167ffffffffffffffff81111561b0bd57600080fd5b6164dd8482850161b074565b6000835161b0db81846020880161a771565b83519083019061b0ef81836020880161a771565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161b13081601a85016020880161a771565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161b16d81603384016020880161a771565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000616635608083018461a795565b60006020828403121561b1fc57600080fd5b815167ffffffffffffffff81111561b21357600080fd5b8201601f8101841361b22457600080fd5b6164dd8482516020840161b004565b6000855161b245818460208a0161a771565b7f2f00000000000000000000000000000000000000000000000000000000000000908301908152855161b27f816001840160208a0161a771565b7f2f0000000000000000000000000000000000000000000000000000000000000060019290910191820152845161b2bd81600284016020890161a771565b6001818301019150507f2f000000000000000000000000000000000000000000000000000000000000006001820152835161b2ff81600284016020880161a771565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b60408152600061b34a604083018461a795565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e206172746966616374200081526000825161b3c181601f85016020870161a771565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b60408152600061b42e604083018461a795565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b60408152600061b480604083018461a795565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b2700000000000000000000000081526000825161b4f781601485016020870161a771565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b60408152600061b53e604083018561a795565b8281036020840152616631818561a795565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f220000000000000000000000000000000000000000000000000000000000000081526000825161b5b781600185016020870161a771565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b6000825161b5fd81846020870161a771565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161b6b081604b85016020870161a771565b91909101604b0192915050565b600060ff821660ff810361b6d35761b6d361ad02565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161b73a81602985016020870161a771565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000616635608083018461a795565b60006020828403121561b7a057600080fd5b815167ffffffffffffffff81111561b7b757600080fd5b82016060818503121561b7c957600080fd5b61b7d161afdb565b81518060030b811461b7e257600080fd5b8152602082015167ffffffffffffffff81111561b7fe57600080fd5b61b80a8682850161b074565b602083015250604082015167ffffffffffffffff81111561b82a57600080fd5b61b8368682850161b074565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161b8a281602185016020870161a771565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161ba8e81602185016020880161a771565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161bacb81602e84016020880161a771565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161b73a81602985016020870161a771565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161bb9381602285016020870161a771565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161bbd881600e85016020870161a771565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b808201808211156164e1576164e161ad02565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161bcc981601885016020880161a771565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161bd0681601c84016020880161a771565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161be0c81846020870161a771565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161be7381601c85016020870161a771565b91909101601c0192915050565b6000600019820361be935761be9361ad02565b5060010190565b80820281158282048414176164e1576164e161ad02565b6001815b600184111561beec5780850481111561bed05761bed061ad02565b600184161561bede57908102905b60019390931c92800261beb5565b935093915050565b60008261bf03575060016164e1565b8161bf10575060006164e1565b816001811461bf26576002811461bf305761bf4c565b60019150506164e1565b60ff84111561bf415761bf4161ad02565b50506001821b6164e1565b5060208310610133831016604e8410600b841016171561bf6f575081810a6164e1565b61bf7c600019848461beb1565b806000190482111561bf905761bf9061ad02565b029392505050565b6000616635838361bef4565b60008161bfb35761bfb361ad02565b506000190190565b6000835161bfcd81846020880161a771565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161c00781600184016020880161a771565b01600101949350505050565b81810360008312801583831316838312821617156198f9576198f961ad0256fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220035e6678edc671bce3f0b15fe808faceba5d224a4f73ed736bdbe7cfcca5f31664736f6c634300081a0033", } // ERC20CustodyTestABI is the input ABI used to generate the binding from. @@ -3115,27 +3115,27 @@ func (it *ERC20CustodyTestWithdrawnIterator) Close() error { // ERC20CustodyTestWithdrawn represents a Withdrawn event raised by the ERC20CustodyTest contract. type ERC20CustodyTestWithdrawn struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterWithdrawn is a free log retrieval operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyTestWithdrawnIterator, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyTestWithdrawnIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyTest.contract.FilterLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _ERC20CustodyTest.contract.FilterLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -3144,19 +3144,19 @@ func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawn(opts *bind.Fi // WatchWithdrawn is a free log subscription operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *ERC20CustodyTestWithdrawn, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *ERC20CustodyTestWithdrawn, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyTest.contract.WatchLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _ERC20CustodyTest.contract.WatchLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -3190,7 +3190,7 @@ func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawn(opts *bind.Wat // ParseWithdrawn is a log parse operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) func (_ERC20CustodyTest *ERC20CustodyTestFilterer) ParseWithdrawn(log types.Log) (*ERC20CustodyTestWithdrawn, error) { event := new(ERC20CustodyTestWithdrawn) if err := _ERC20CustodyTest.contract.UnpackLog(event, "Withdrawn", log); err != nil { @@ -3269,8 +3269,8 @@ func (it *ERC20CustodyTestWithdrawnAndCalledIterator) Close() error { // ERC20CustodyTestWithdrawnAndCalled represents a WithdrawnAndCalled event raised by the ERC20CustodyTest contract. type ERC20CustodyTestWithdrawnAndCalled struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte Raw types.Log // Blockchain specific contextual infos @@ -3278,19 +3278,19 @@ type ERC20CustodyTestWithdrawnAndCalled struct { // FilterWithdrawnAndCalled is a free log retrieval operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyTestWithdrawnAndCalledIterator, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyTestWithdrawnAndCalledIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyTest.contract.FilterLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _ERC20CustodyTest.contract.FilterLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -3299,19 +3299,19 @@ func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawnAndCalled(opts // WatchWithdrawnAndCalled is a free log subscription operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *ERC20CustodyTestWithdrawnAndCalled, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *ERC20CustodyTestWithdrawnAndCalled, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyTest.contract.WatchLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _ERC20CustodyTest.contract.WatchLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -3345,7 +3345,7 @@ func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawnAndCalled(opts // ParseWithdrawnAndCalled is a log parse operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) func (_ERC20CustodyTest *ERC20CustodyTestFilterer) ParseWithdrawnAndCalled(log types.Log) (*ERC20CustodyTestWithdrawnAndCalled, error) { event := new(ERC20CustodyTestWithdrawnAndCalled) if err := _ERC20CustodyTest.contract.UnpackLog(event, "WithdrawnAndCalled", log); err != nil { @@ -3424,8 +3424,8 @@ func (it *ERC20CustodyTestWithdrawnAndRevertedIterator) Close() error { // ERC20CustodyTestWithdrawnAndReverted represents a WithdrawnAndReverted event raised by the ERC20CustodyTest contract. type ERC20CustodyTestWithdrawnAndReverted struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte RevertContext RevertContext @@ -3434,19 +3434,19 @@ type ERC20CustodyTestWithdrawnAndReverted struct { // FilterWithdrawnAndReverted is a free log retrieval operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyTestWithdrawnAndRevertedIterator, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyTestWithdrawnAndRevertedIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyTest.contract.FilterLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _ERC20CustodyTest.contract.FilterLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -3455,19 +3455,19 @@ func (_ERC20CustodyTest *ERC20CustodyTestFilterer) FilterWithdrawnAndReverted(op // WatchWithdrawnAndReverted is a free log subscription operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *ERC20CustodyTestWithdrawnAndReverted, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *ERC20CustodyTestWithdrawnAndReverted, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyTest.contract.WatchLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _ERC20CustodyTest.contract.WatchLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -3501,7 +3501,7 @@ func (_ERC20CustodyTest *ERC20CustodyTestFilterer) WatchWithdrawnAndReverted(opt // ParseWithdrawnAndReverted is a log parse operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) func (_ERC20CustodyTest *ERC20CustodyTestFilterer) ParseWithdrawnAndReverted(log types.Log) (*ERC20CustodyTestWithdrawnAndReverted, error) { event := new(ERC20CustodyTestWithdrawnAndReverted) if err := _ERC20CustodyTest.contract.UnpackLog(event, "WithdrawnAndReverted", log); err != nil { diff --git a/v2/pkg/erc20custodyechidnatest.sol/erc20custodyechidnatest.go b/v2/pkg/erc20custodyechidnatest.sol/erc20custodyechidnatest.go index 4f0c189f..fb00b918 100644 --- a/v2/pkg/erc20custodyechidnatest.sol/erc20custodyechidnatest.go +++ b/v2/pkg/erc20custodyechidnatest.sol/erc20custodyechidnatest.go @@ -38,8 +38,8 @@ type RevertContext struct { // ERC20CustodyEchidnaTestMetaData contains all meta data concerning the ERC20CustodyEchidnaTest contract. var ERC20CustodyEchidnaTestMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WHITELISTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"echidnaCaller\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gateway\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIGatewayEVM\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testERC20\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractTestERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unwhitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndRevert\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x600580546001600160a01b03191633908117909155600e60a09081526d11d85d195dd85e5155934b9cdbdb60921b60c0526101049190915261012361012481905261014452606460e090815261016460405261010080516001600160e01b0390811663c0c53b8b60e01b1790915261007992919061029316565b600680546001600160a01b03929092166001600160a01b03199283168117909155600780549092161790553480156100b057600080fd5b5060075460055460016000556002805460ff191690556001600160a01b039182169116808215806100e857506001600160a01b038216155b806100fa57506001600160a01b038116155b156101185760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526101306000826102b2565b5061015b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a826102b2565b506101867f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4836102b2565b5061019f600080516020616e2c833981519152826102b2565b506101b8600080516020616e2c833981519152836102b2565b505050506040516101c89061383e565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f08015801561021a573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b0392831617815560075460405163ae7a3a6f60e01b815230928101929092529091169063ae7a3a6f90602401600060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506148bf565b600061029d61384b565b6102a8848483610345565b9150505b92915050565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1661033d5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016102ac565b5060006102ac565b60008061035285846103c1565b90506103b66040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016103a0929190613954565b60408051601f19818403018152919052856103cd565b9150505b9392505050565b60006103ba8383610401565b60c081015151600090156103f7576103f084848460c0015161042260201b60201c565b90506103ba565b6103f0848461059b565b600061040d8383610668565b6103ba838360200151846103cd60201b60201c565b60008061042d610678565b9050600061043b8683610712565b905060006104588260600151836020015185610b3560201b60201c565b9050600061046883838989610cea565b9050600061047582611966565b602081015181519192509060030b156104ce5789826040015160405160200161049f929190613978565b60408051601f198184030181529082905262461bcd60e51b82526104c5916004016139de565b60405180910390fd5b60006105176040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001611afd60201b60201c565b60405163c6ce059d60e01b8152909150600080516020616e0c8339815191529063c6ce059d9061054b9084906004016139de565b602060405180830381865afa158015610568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058c91906139f1565b9b9a5050505050505050505050565b604051638d1cc92560e01b81526000908190600080516020616e0c83398151915290638d1cc925906105d19087906004016139de565b600060405180830381865afa1580156105ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106169190810190613ae6565b905060006106458285604051602001610630929190613b1a565b60408051601f19818403018152919052611c9d565b90506001600160a01b0381166102a857848460405160200161049f929190613b49565b61067482826000611cb0565b5050565b60408051808201825260038152621bdd5d60ea1b602082015290516334515cdb60e21b8152606091600080516020616e0c83398151915291829063d145736c906106c6908490600401613bd8565b600060405180830381865afa1580156106e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261070b9190810190613c0d565b9250505090565b6107446040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000600080516020616e0c83398151915290506107896040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61079285611d8a565b602082015260006107a286611fdf565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080c9190810190613c0d565b868385602001516040516020016108269493929190613c55565b60408051601f19818403018152908290526360f9bb1160e01b825291506000906001600160a01b038616906360f9bb11906108659085906004016139de565b600060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108aa9190810190613c0d565b604051636da11afb60e11b81529091506001600160a01b0386169063db4235f6906108d9908490600401613ced565b602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190613d26565b61092f578160405160200161049f9190613d48565b6040516309389f5960e31b81526001600160a01b038616906349c4fac89061095b908490600401613dbf565b600060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a09190810190613c0d565b8452604051636da11afb60e11b81526001600160a01b0386169063db4235f6906109ce908490600401613e05565b602060405180830381865afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f9190613d26565b15610a8b576040516309389f5960e31b81526001600160a01b038616906349c4fac890610a40908490600401613e05565b600060405180830381865afa158015610a5d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a859190810190613c0d565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001610ab09190613e46565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610adc929190613ea1565b600060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b219190810190613c0d565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081610b51579050509050604051806040016040528060048152602001630677265760e41b81525081600081518110610b9857610b98613ec6565b6020026020010181905250604051806040016040528060038152602001620b5c9b60ea1b81525081600181518110610bd257610bd2613ec6565b602002602001018190525084604051602001610bee9190613edc565b60405160208183030381529060405281600281518110610c1057610c10613ec6565b602002602001018190525082604051602001610c2c9190613f11565b60405160208183030381529060405281600381518110610c4e57610c4e613ec6565b60209081029190910101526000610c6482611966565b9050600081602001519050610ccb610c9e60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b6040805180820182526000808252602091820152815180830190925284518252808501908201529061218f565b610ce0578560405160200161049f9190613f40565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090600080516020616e0c8339815191529015610d34565b511590565b610e5057826020015115610dc45760405162461bcd60e51b81526020600482015260586024820152600080516020616e4c83398151915260448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a4016104c5565b8260c0015115610e505760405162461bcd60e51b81526020600482015260536024820152600080516020616e4c83398151915260448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a4016104c5565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081610e695790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280610eaa90613fd5565b935060ff1681518110610ebf57610ebf613ec6565b60200260200101819052506040518060400160405280600d81526020016c302e302e312d616c7068612e3760981b815250604051602001610f009190613ff4565b604051602081830303815290604052828280610f1b90613fd5565b935060ff1681518110610f3057610f30613ec6565b6020026020010181905250604051806040016040528060068152602001656465706c6f7960d01b815250828280610f6690613fd5565b935060ff1681518110610f7b57610f7b613ec6565b60200260200101819052506040518060400160405280600e81526020016d2d2d636f6e74726163744e616d6560901b815250828280610fb990613fd5565b935060ff1681518110610fce57610fce613ec6565b60200260200101819052508760200151828280610fea90613fd5565b935060ff1681518110610fff57610fff613ec6565b60200260200101819052506040518060400160405280600e81526020016d05a5ac6dedce8e4c2c6e8a0c2e8d60931b81525082828061103d90613fd5565b935060ff168151811061105257611052613ec6565b60209081029190910101528751828261106a81613fd5565b935060ff168151811061107f5761107f613ec6565b6020026020010181905250604051806040016040528060098152602001680b4b58da185a5b925960ba1b8152508282806110b890613fd5565b935060ff16815181106110cd576110cd613ec6565b60209081029190910101526110e1466121f0565b82826110ec81613fd5565b935060ff168151811061110157611101613ec6565b60200260200101819052506040518060400160405280600f81526020016e2d2d6275696c64496e666f46696c6560881b81525082828061114090613fd5565b935060ff168151811061115557611155613ec6565b60200260200101819052508682828061116d90613fd5565b935060ff168151811061118257611182613ec6565b60209081029190910101528551156112905760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826111d381613fd5565b935060ff16815181106111e8576111e8613ec6565b60209081029190910101526040516371aad10d60e01b81526001600160a01b038416906371aad10d9061121f9089906004016139de565b600060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112649190810190613c0d565b828261126f81613fd5565b935060ff168151811061128457611284613ec6565b60200260200101819052505b84602001511561133d576040805180820190915260128152712d2d766572696679536f75726365436f646560701b602082015282826112ce81613fd5565b935060ff16815181106112e3576112e3613ec6565b60200260200101819052506040518060400160405280600581526020016466616c736560d81b81525082828061131890613fd5565b935060ff168151811061132d5761132d613ec6565b60200260200101819052506114a4565b611353610d2f8660a0015161216260201b60201c565b6113d65760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261138681613fd5565b935060ff168151811061139b5761139b613ec6565b60200260200101819052508460a001516040516020016113bb9190613edc565b60405160208183030381529060405282828061131890613fd5565b8460c001511580156113fb57506113f9610d2f896040015161216260201b60201c565b155b156114a45760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261142f81613fd5565b935060ff168151811061144457611444613ec6565b602090810291909101015261145888612282565b6040516020016114689190613edc565b60405160208183030381529060405282828061148390613fd5565b935060ff168151811061149857611498613ec6565b60200260200101819052505b6114ba610d2f866040015161216260201b60201c565b61153d5760408051808201909152600b81526a0b4b5c995b185e595c925960aa1b602082015282826114eb81613fd5565b935060ff168151811061150057611500613ec6565b6020026020010181905250846040015182828061151c90613fd5565b935060ff168151811061153157611531613ec6565b60200260200101819052505b60608501511561162e576040805180820190915260068152650b4b5cd85b1d60d21b6020820152828261156f81613fd5565b935060ff168151811061158457611584613ec6565b60209081029190910101526060850151604051631623433d60e31b815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156115da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116029190810190613c0d565b828261160d81613fd5565b935060ff168151811061162257611622613ec6565b60200260200101819052505b60e085015151156116c05760408051808201909152600a8152690b4b59d85cd31a5b5a5d60b21b6020820152828261166581613fd5565b935060ff168151811061167a5761167a613ec6565b602090810291909101015260e085015151611694906121f0565b828261169f81613fd5565b935060ff16815181106116b4576116b4613ec6565b60200260200101819052505b60e0850151602001511561175d5760408051808201909152600a8152692d2d676173507269636560b01b602082015282826116fa81613fd5565b935060ff168151811061170f5761170f613ec6565b60200260200101819052506117318560e00151602001516121f060201b60201c565b828261173c81613fd5565b935060ff168151811061175157611751613ec6565b60200260200101819052505b60e085015160400151156117fe5760408051808201909152600e81526d2d2d6d617846656550657247617360901b6020820152828261179b81613fd5565b935060ff16815181106117b0576117b0613ec6565b60200260200101819052506117d28560e00151604001516121f060201b60201c565b82826117dd81613fd5565b935060ff16815181106117f2576117f2613ec6565b60200260200101819052505b60e085015160600151156118ae5760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261184b81613fd5565b935060ff168151811061186057611860613ec6565b60200260200101819052506118828560e00151606001516121f060201b60201c565b828261188d81613fd5565b935060ff16815181106118a2576118a2613ec6565b60200260200101819052505b60008160ff166001600160401b038111156118cb576118cb613a1a565b6040519080825280602002602001820160405280156118fe57816020015b60608152602001906001900390816118e95790505b50905060005b8260ff168160ff16101561195757838160ff168151811061192757611927613ec6565b6020026020010151828260ff168151811061194457611944613ec6565b6020908102919091010152600101611904565b5093505050505b949350505050565b61198d6040518060600160405280600060030b815260200160608152602001606081525090565b6040805180820182526004808252630c4c2e6d60e31b602083015291516334515cdb60e21b8152600080516020616e0c83398151915292600091849163d145736c916119db9186910161404b565b600060405180830381865afa1580156119f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a209190810190613c0d565b90506000611a2e8683612938565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401611a5e9190614092565b6000604051808303816000875af1158015611a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aa591908101906140f7565b805190915060030b15801590611abe5750602081015151155b8015611acd5750604081015151155b15610ce05781600081518110611ae557611ae5613ec6565b602002602001015160405160200161049f91906141aa565b60606000611b328560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150611b699082905b90612a72565b15611c66576000611be682611be081611bda611bac8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90612a99565b90612af6565b9050611c1a611c13604051806040016040528060018152602001600560f91b81525061216260201b60201c565b8290612a72565b15611c5457611c51611c4a604051806040016040528060018152602001600560f91b81525061216260201b60201c565b8290612b7b565b90505b611c5d81612ba1565b925050506103ba565b8215611c7f57848460405160200161049f92919061437a565b50506040805160208101909152600081526103ba565b509392505050565b6000808251602084016000f09392505050565b8160a0015115611cbf57505050565b6000611ccc848484612c06565b90506000611cd982611966565b602081015181519192509060030b158015611d4c5750611d4c611d20604051806040016040528060078152602001665355434345535360c81b81525061216260201b60201c565b604080518082018252600080825260209182015281518083019092528451825280850190820152611b63565b15611d5957505050505050565b60408201515115611d7957816040015160405160200161049f91906143f5565b8060405160200161049f919061443f565b60606000611dbf8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050611df6611def604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b829061218f565b15611e38576103ba611e33611e2c604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b8390613119565b612ba1565b611e6a611e63604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b82906131a3565b600103611ed257611e9c611c4a604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b506103ba611e33611ecb604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b8390612b7b565b611f01611def60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b15611fce576000611f3982611f34604051806040016040528060018152602001602f60f81b81525061216260201b60201c565b613238565b905060008160018351611f4c919061448f565b81518110611f5c57611f5c613ec6565b60200260200101519050611fc5611e33611f9860405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b60408051808201825260008082526020918201528151808301909252855182528086019082015290613119565b95945050505050565b8260405160200161049f91906144a2565b606060006120148360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050612044611def604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b15612052576103ba81612ba1565b61207d611e63604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b6001036120b2576103ba611e33611ecb604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b6120e1611def60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b15611fce57600061211482611f34604051806040016040528060018152602001602f60f81b81525061216260201b60201c565b905060018151111561215057806002825161212f919061448f565b8151811061213f5761213f613ec6565b602002602001015192505050919050565b508260405160200161049f91906144a2565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b8051825160009111156121a4575060006102ac565b815183516020850151600092916121ba9161455c565b6121c4919061448f565b9050826020015181036121db5760019150506102ac565b82516020840151819020912014905092915050565b606060006121fd836132dc565b60010190506000816001600160401b0381111561221c5761221c613a1a565b6040519080825280601f01601f191660200182016040528015612246576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461225057509392505050565b60606000612299836040015161216260201b60201c565b90506122d66122cf6040518060400160405280600a8152602001691553931250d15394d15160b21b81525061216260201b60201c565b82906133be565b156122fd5750506040805180820190915260048152634e6f6e6560e01b6020820152919050565b6123306122cf60405180604001604052806009815260200168556e6c6963656e736560b81b81525061216260201b60201c565b1561235c575050604080518082019091526009815268556e6c6963656e736560b81b6020820152919050565b6123896122cf6040518060400160405280600381526020016213525560ea1b81525061216260201b60201c565b156123af57505060408051808201909152600381526213525560ea1b6020820152919050565b6123e56122cf6040518060400160405280600c81526020016b47504c2d322e302d6f6e6c7960a01b81525061216260201b60201c565b8061242557506124256122cf6040518060400160405280601081526020016f23a8261699171816b7b916b630ba32b960811b81525061216260201b60201c565b1561245157505060408051808201909152600981526823a72a9023a8263b1960b91b6020820152919050565b6124876122cf6040518060400160405280600c81526020016b47504c2d332e302d6f6e6c7960a01b81525061216260201b60201c565b806124c757506124c76122cf6040518060400160405280601081526020016f23a8261699971816b7b916b630ba32b960811b81525061216260201b60201c565b156124f3575050604080518082019091526009815268474e552047504c763360b81b6020820152919050565b61252a6122cf6040518060400160405280600d81526020016c4c47504c2d322e312d6f6e6c7960981b81525061216260201b60201c565b8061256b575061256b6122cf604051806040016040528060118152602001702623a8261699171896b7b916b630ba32b960791b81525061216260201b60201c565b1561259a57505060408051808201909152600c81526b474e55204c47504c76322e3160a01b6020820152919050565b6125d16122cf6040518060400160405280600d81526020016c4c47504c2d332e302d6f6e6c7960981b81525061216260201b60201c565b8061261257506126126122cf604051806040016040528060118152602001702623a8261699971816b7b916b630ba32b960791b81525061216260201b60201c565b1561263f57505060408051808201909152600a815269474e55204c47504c763360b01b6020820152919050565b6126756122cf6040518060400160405280600c81526020016b4253442d322d436c6175736560a01b81525061216260201b60201c565b156126a457505060408051808201909152600c81526b4253442d322d436c6175736560a01b6020820152919050565b6126da6122cf6040518060400160405280600c81526020016b4253442d332d436c6175736560a01b81525061216260201b60201c565b1561270957505060408051808201909152600c81526b4253442d332d436c6175736560a01b6020820152919050565b61273a6122cf6040518060400160405280600781526020016604d504c2d322e360cc1b81525061216260201b60201c565b1561276457505060408051808201909152600781526604d504c2d322e360cc1b6020820152919050565b6127956122cf6040518060400160405280600781526020016604f534c2d332e360cc1b81525061216260201b60201c565b156127bf57505060408051808201909152600781526604f534c2d332e360cc1b6020820152919050565b6127f36122cf6040518060400160405280600a81526020016904170616368652d322e360b41b81525061216260201b60201c565b1561282057505060408051808201909152600a81526904170616368652d322e360b41b6020820152919050565b6128576122cf6040518060400160405280600d81526020016c4147504c2d332e302d6f6e6c7960981b81525061216260201b60201c565b8061289857506128986122cf6040518060400160405280601181526020017020a3a8261699971816b7b916b630ba32b960791b81525061216260201b60201c565b156128c557505060408051808201909152600a815269474e55204147504c763360b01b6020820152919050565b6128f76122cf604051806040016040528060088152602001674255534c2d312e3160c01b81525061216260201b60201c565b1561292157505060408051808201909152600781526642534c20312e3160c81b6020820152919050565b6040808401518451915161049f929060200161456f565b60608060005b84518110156129c3578185828151811061295a5761295a613ec6565b6020026020010151604051602001612973929190613b1a565b604051602081830303815290604052915060018551612992919061448f565b81146129bb57816040516020016129a991906146bf565b60405160208183030381529060405291505b60010161293e565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816129dc5790505090508381600081518110612a0757612a07613ec6565b6020026020010181905250604051806040016040528060028152602001612d6360f01b81525081600181518110612a4057612a40613ec6565b60200260200101819052508181600281518110612a5f57612a5f613ec6565b6020908102919091010152949350505050565b6020808301518351835192840151600093612a9092918491906133d2565b14159392505050565b6040805180820190915260008082526020808301829052845185820151855192860151612ac693906134e3565b9050836020015181612ad8919061448f565b84518590612ae790839061448f565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015612b1b5750816102ac565b6020808301519084015160019114612b425750815160208481015190840151829020919020145b8015612b7357825184518590612b5990839061448f565b9052508251602085018051612b6f90839061455c565b9052505b509192915050565b6040805180820190915260008082526020820152612b9a838383613603565b5092915050565b6060600082600001516001600160401b03811115612bc157612bc1613a1a565b6040519080825280601f01601f191660200182016040528015612beb576020820181803683370190505b50602084810151855192935090830191612b9a9183916136a9565b60606000612c12610678565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081612c2f5790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280612c7090613fd5565b935060ff1681518110612c8557612c85613ec6565b6020026020010181905250604051806040016040528060078152602001665e312e33322e3360c81b815250604051602001612cc091906146e4565b604051602081830303815290604052828280612cdb90613fd5565b935060ff1681518110612cf057612cf0613ec6565b60200260200101819052506040518060400160405280600881526020016776616c696461746560c01b815250828280612d2890613fd5565b935060ff1681518110612d3d57612d3d613ec6565b602002602001018190525082604051602001612d599190613f11565b604051602081830303815290604052828280612d7490613fd5565b935060ff1681518110612d8957612d89613ec6565b60200260200101819052506040518060400160405280600a8152602001690b4b58dbdb9d1c9858dd60b21b815250828280612dc390613fd5565b935060ff1681518110612dd857612dd8613ec6565b6020908102919091010152612ded8784613723565b8282612df881613fd5565b935060ff1681518110612e0d57612e0d613ec6565b602090810291909101015285515115612ea55760408051808201909152600b81526a2d2d7265666572656e636560a81b60208201528282612e4d81613fd5565b935060ff1681518110612e6257612e62613ec6565b60209081029190910101528551612e799084613723565b8282612e8481613fd5565b935060ff1681518110612e9957612e99613ec6565b60200260200101819052505b856080015115612f135760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282612eee81613fd5565b935060ff1681518110612f0357612f03613ec6565b6020026020010181905250612f6e565b8415612f6e576040805180820190915260128152712d2d726571756972655265666572656e636560701b60208201528282612f4d81613fd5565b935060ff1681518110612f6257612f62613ec6565b60200260200101819052505b60408601515115612ffa5760408051808201909152600d81526c2d2d756e73616665416c6c6f7760981b60208201528282612fa881613fd5565b935060ff1681518110612fbd57612fbd613ec6565b60200260200101819052508560400151828280612fd990613fd5565b935060ff1681518110612fee57612fee613ec6565b60200260200101819052505b8560600151156130645760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261304381613fd5565b935060ff168151811061305857613058613ec6565b60200260200101819052505b60008160ff166001600160401b0381111561308157613081613a1a565b6040519080825280602002602001820160405280156130b457816020015b606081526020019060019003908161309f5790505b50905060005b8260ff168160ff16101561310d57838160ff16815181106130dd576130dd613ec6565b6020026020010151828260ff16815181106130fa576130fa613ec6565b60209081029190910101526001016130ba565b50979650505050505050565b604080518082019091526000808252602082015281518351101561313e5750816102ac565b815183516020850151600092916131549161455c565b61315e919061448f565b6020840151909150600190821461317f575082516020840151819020908220145b801561319a5783518551869061319690839061448f565b9052505b50929392505050565b8051825160208085015190840151600093849390926131c39284906134e3565b6131cd919061455c565b90505b835160208501516131e1919061455c565b8111612b9a57816131f181614729565b925050826000015161322785602001518361320c919061448f565b8651613218919061448f565b855160208701518591906134e3565b613231919061455c565b90506131d0565b6060600061324684846131a3565b61325190600161455c565b6001600160401b0381111561326857613268613a1a565b60405190808252806020026020018201604052801561329b57816020015b60608152602001906001900390816132865790505b50905060005b8151811015611c95576132b7611e338686612b7b565b8282815181106132c9576132c9613ec6565b60209081029190910101526001016132a1565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613325577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613351576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061336f57662386f26fc10000830492506010015b6305f5e1008310613387576305f5e100830492506008015b612710831061339b57612710830492506004015b606483106133ad576064830492506002015b600a83106102ac5760010192915050565b60006133ca8383613763565b159392505050565b6000808584116134d95760208411613485576000841561341d5760016133f986602061448f565b613404906008614742565b61340f906002614840565b613419919061448f565b1990505b835181168561342c898961455c565b613436919061448f565b805190935082165b81811461347057878411613458578794505050505061195e565b836134628161484c565b94505082845116905061343e565b61347a878561455c565b94505050505061195e565b838320613492858861448f565b61349c908761455c565b91505b8582106134d7578482208082036134c4576134ba868461455c565b935050505061195e565b6134cf60018461448f565b92505061349f565b505b5092949350505050565b600083818685116135ee576020851161359d576000851561352f57600161350b87602061448f565b613516906008614742565b613521906002614840565b61352b919061448f565b1990505b845181166000876135408b8b61455c565b61354a919061448f565b855190915083165b82811461358f578186106135775761356a8b8b61455c565b965050505050505061195e565b8561358181614729565b965050838651169050613552565b85965050505050505061195e565b508383206000905b6135af868961448f565b82116135ec578583208082036135cb578394505050505061195e565b6135d660018561455c565b93505081806135e490614729565b9250506135a5565b505b6135f8878761455c565b979650505050505050565b604080518082019091526000808252602080830182905285518682015186519287015161363093906134e3565b60208087018051918601919091525190915061364c908261448f565b83528451602086015161365f919061455c565b810361366e57600085526136a0565b8351835161367c919061455c565b8551869061368b90839061448f565b905250835161369a908261455c565b60208601525b50909392505050565b602081106136e157815183526136c060208461455c565b92506136cd60208361455c565b91506136da60208261448f565b90506136a9565b60001981156137105760016136f783602061448f565b61370390610100614840565b61370d919061448f565b90505b9151835183169219169190911790915250565b606060006137318484610712565b805160208083015160405193945061374b93909101614863565b60405160208183030381529060405291505092915050565b8151815160009190811115613776575081515b6020808501519084015160005b8381101561382f57825182518082146137ff5760001960208710156137de576001846137b089602061448f565b6137ba919061455c565b6137c5906008614742565b6137d0906002614840565b6137da919061448f565b1990505b81811683821681810391146137fc5797506102ac9650505050505050565b50505b61380a60208661455c565b945061381760208561455c565b93505050602081613828919061455c565b9050613783565b5084518651610ce0919061489f565b610c9f8061616d83390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161388e613893565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161388e6040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b8381101561391f578181015183820152602001613907565b50506000910152565b60008151808452613940816020860160208601613904565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061195e90830184613928565b7f4661696c656420746f206465706c6f7920636f6e7472616374200000000000008152600083516139b081601a850160208801613904565b6101d160f51b601a9184019182015283516139d281601c840160208801613904565b01601c01949350505050565b6020815260006103ba6020830184613928565b600060208284031215613a0357600080fd5b81516001600160a01b03811681146103ba57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613a5257613a52613a1a565b60405290565b6000806001600160401b03841115613a7257613a72613a1a565b50604051601f19601f85018116603f011681018181106001600160401b0382111715613aa057613aa0613a1a565b604052838152905080828401851015613ab857600080fd5b611c95846020830185613904565b600082601f830112613ad757600080fd5b6103ba83835160208501613a58565b600060208284031215613af857600080fd5b81516001600160401b03811115613b0e57600080fd5b6102a884828501613ac6565b60008351613b2c818460208801613904565b835190830190613b40818360208801613904565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351613b8181601a850160208801613904565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351613bbe816033840160208801613904565b601160f91b60339290910191820152603401949350505050565b60408152600b60408201526a1193d55391149657d3d55560aa1b60608201526080602082015260006103ba6080830184613928565b600060208284031215613c1f57600080fd5b81516001600160401b03811115613c3557600080fd5b8201601f81018413613c4657600080fd5b6102a884825160208401613a58565b60008551613c67818460208a01613904565b602f60f81b9083019081528551613c85816001840160208a01613904565b602f60f81b600192909101918201528451613ca7816002840160208901613904565b600181830101915050602f60f81b60018201528351613ccd816002840160208801613904565b64173539b7b760d91b600292909101918201526007019695505050505050565b604081526000613d006040830184613928565b828103602084015260048152630b985cdd60e21b60208201526040810191505092915050565b600060208284031215613d3857600080fd5b815180151581146103ba57600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251613d8081601f850160208701613904565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f939091019283015250611b5b60f21b603f820152604101919050565b604081526000613dd26040830184613928565b8281036020840152601181527005cc2e6e85cc2c4e6ded8eae8caa0c2e8d607b1b60208201526040810191505092915050565b604081526000613e186040830184613928565b8281036020840152600c81526b2e6173742e6c6963656e736560a01b60208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251613e7e816014850160208701613904565b6b13ae9735b2b1b1b0b5991a9b60a11b6014939091019283015250602001919050565b604081526000613eb46040830185613928565b82810360208401526103b68185613928565b634e487b7160e01b600052603260045260246000fd5b601160f91b81528151600090613ef9816001850160208701613904565b601160f91b6001939091019283015250600201919050565b60008251613f23818460208701613904565b6a2f6275696c642d696e666f60a81b920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201526a0391031b7b73a3930b1ba160ad1b604082015260008251613fb281604b850160208701613904565b91909101604b0192915050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8103613feb57613feb613fbf565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81526801a595b9d0b58db1a560be1b60208201526000825161403e816029850160208701613904565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006103ba6080830184613928565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156140eb57603f198786030184526140d6858351613928565b945060209384019391909101906001016140ba565b50929695505050505050565b60006020828403121561410957600080fd5b81516001600160401b0381111561411f57600080fd5b82016060818503121561413157600080fd5b614139613a30565b81518060030b811461414a57600080fd5b815260208201516001600160401b0381111561416557600080fd5b61417186828501613ac6565b60208301525060408201516001600160401b0381111561419057600080fd5b61419c86828501613ac6565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e642077697468208152601160f91b6020820152600082516141ec816021850160208701613904565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e65207769746820707265666978208152602760f81b6020820152600083516143bc816021850160208801613904565b6c0139034b71037baba383aba1d1609d1b60219184019182015283516143e981602e840160208801613904565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c815268034b230ba34b7b71d160bd1b60208201526000825161403e816029850160208701613904565b7f55706772616465207361666574792076616c69646174696f6e206661696c65648152611d0560f11b602082015260008251614482816022850160208701613904565b9190910160220192915050565b818103818111156102ac576102ac613fbf565b6d021b7b73a3930b1ba103730b6b2960951b8152600082516144cb81600e850160208701613904565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201526730b1ba173539b7b760c11b606e820152607601919050565b808201808211156102ac576102ac613fbf565b7f53504458206c6963656e7365206964656e7469666965722000000000000000008152600083516145a7816018850160208801613904565b6301034b7160e51b60189184019182015283516145cb81601c840160208801613904565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516146d1818460208701613904565b600160fd1b920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161471c81601c850160208701613904565b91909101601c0192915050565b60006001820161473b5761473b613fbf565b5060010190565b80820281158282048414176102ac576102ac613fbf565b6001815b60018411156147945780850481111561477857614778613fbf565b600184161561478657908102905b60019390931c92800261475d565b935093915050565b6000826147ab575060016102ac565b816147b8575060006102ac565b81600181146147ce57600281146147d8576147f4565b60019150506102ac565b60ff8411156147e9576147e9613fbf565b50506001821b6102ac565b5060208310610133831016604e8410600b8410161715614817575081810a6102ac565b6148246000198484614759565b806000190482111561483857614838613fbf565b029392505050565b60006103ba838361479c565b60008161485b5761485b613fbf565b506000190190565b60008351614875818460208801613904565b601d60f91b9083019081528351614893816001840160208801613904565b01600101949350505050565b8181036000831280158383131683831282161715612b9a57612b9a613fbf565b6080516118706148fd600039600081816101bf015281816105260152818161057b0152818161087201528181610b2c0152610b8101526118706000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806381100bf0116100e3578063a217fddf1161008c578063d936547e11610066578063d936547e14610395578063d9caed12146103b8578063e63ab1e9146103cb57600080fd5b8063a217fddf14610367578063c709ab6e1461036f578063d547741f1461038257600080fd5b806391d14854116100bd57806391d14854146103085780639a590427146103415780639b19251a1461035457600080fd5b806381100bf0146102c65780638456cb59146102d957806385f438c1146102e157600080fd5b806336568abe11610145578063570618e11161011f578063570618e1146102815780635c975abb146102a85780636133b4bb146102b357600080fd5b806336568abe146102535780633c2f05a8146102665780633f4ba83a1461027957600080fd5b806321fc65f21161017657806321fc65f2146101f9578063248a9ca31461020e5780632f2ff15d1461024057600080fd5b806301ffc9a714610192578063116191b6146101ba575b600080fd5b6101a56101a03660046112da565b6103f2565b60405190151581526020015b60405180910390f35b6101e17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b1565b61020c610207366004611381565b61048b565b005b61023261021c3660046113f0565b6000908152600160208190526040909120015490565b6040519081526020016101b1565b61020c61024e366004611409565b61064b565b61020c610261366004611409565b610677565b6004546101e1906001600160a01b031681565b61020c6106c8565b6102327f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff166101a5565b61020c6102c1366004611435565b6106fd565b6005546101e1906001600160a01b031681565b61020c6108f4565b6102327f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101a5610316366004611409565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61020c61034f36600461148f565b610926565b61020c61036236600461148f565b6109da565b610232600081565b61020c61037d3660046114aa565b610a91565b61020c610390366004611409565b610c56565b6101a56103a336600461148f565b60036020526000908152604090205460ff1681565b61020c6103c6366004611549565b610c7c565b6102327f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061048557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610493610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46104bd81610db7565b6104c5610dc1565b6001600160a01b03851660009081526003602052604090205460ff16610517576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61054b6001600160a01b0386167f000000000000000000000000000000000000000000000000000000000000000086610e00565b6040517f5131ab590000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635131ab59906105b89088908a908990899089906004016115cf565b600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b03167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063193929190611612565b60405180910390a3506106446001600055565b5050505050565b6000828152600160208190526040909120015461066781610db7565b6106718383610e80565b50505050565b6001600160a01b03811633146106b9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282610f13565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6106f281610db7565b6106fa610f9a565b50565b6004546001600160a01b03166340c10f193061071a866005611635565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561077857600080fd5b505af115801561078c573d6000803e3d6000fd5b5050600480546007546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093526005602484015216925063a9059cbb91506044016020604051808303816000875af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610824919061166f565b5060045461083e906001600160a01b03168585858561048b565b600480546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093529116906370a0823190602401602060405180830381865afa1580156108c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e79190611691565b15610671576106716116aa565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61091e81610db7565b6106fa610fec565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61095081610db7565b6001600160a01b038216610990576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a610a0481610db7565b6001600160a01b038216610a44576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b610a99610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610ac381610db7565b610acb610dc1565b6001600160a01b03861660009081526003602052604090205460ff16610b1d576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b516001600160a01b0387167f000000000000000000000000000000000000000000000000000000000000000087610e00565b6040517fd0b492c30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610bc09089908b908a908a908a908a90600401611788565b600060405180830381600087803b158015610bda57600080fd5b505af1158015610bee573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610c3b94939291906117df565b60405180910390a350610c4e6001600055565b505050505050565b60008281526001602081905260409091200154610c7281610db7565b6106718383610f13565b610c84610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610cae81610db7565b610cb6610dc1565b6001600160a01b03831660009081526003602052604090205460ff16610d08576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1c6001600160a01b0384168584610e00565b826001600160a01b0316846001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610d6191815260200190565b60405180910390a3506106c36001600055565b600260005403610db0576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6106fa8133611029565b60025460ff1615610dfe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106c39084906110a0565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff16610f0b5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610485565b506000610485565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1615610f0b5760008381526001602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610485565b610fa261111c565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ff4610dc1565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fcf3390565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff1661109c576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b60006110b56001600160a01b03841683611158565b905080516000141580156110da5750808060200190518101906110d8919061166f565b155b156106c3576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611093565b60025460ff16610dfe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606111668383600061116d565b9392505050565b6060814710156111ab576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611093565b600080856001600160a01b031684866040516111c7919061180b565b60006040518083038185875af1925050503d8060008114611204576040519150601f19603f3d011682016040523d82523d6000602084013e611209565b606091505b5091509150611219868383611223565b9695505050505050565b6060826112385761123382611298565b611166565b815115801561124f57506001600160a01b0384163b155b15611291576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611093565b5080611166565b8051156112a85780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156112ec57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461116657600080fd5b80356001600160a01b038116811461133357600080fd5b919050565b60008083601f84011261134a57600080fd5b50813567ffffffffffffffff81111561136257600080fd5b60208301915083602082850101111561137a57600080fd5b9250929050565b60008060008060006080868803121561139957600080fd5b6113a28661131c565b94506113b06020870161131c565b935060408601359250606086013567ffffffffffffffff8111156113d357600080fd5b6113df88828901611338565b969995985093965092949392505050565b60006020828403121561140257600080fd5b5035919050565b6000806040838503121561141c57600080fd5b8235915061142c6020840161131c565b90509250929050565b6000806000806060858703121561144b57600080fd5b6114548561131c565b935060208501359250604085013567ffffffffffffffff81111561147757600080fd5b61148387828801611338565b95989497509550505050565b6000602082840312156114a157600080fd5b6111668261131c565b60008060008060008060a087890312156114c357600080fd5b6114cc8761131c565b95506114da6020880161131c565b945060408701359350606087013567ffffffffffffffff8111156114fd57600080fd5b61150989828a01611338565b909450925050608087013567ffffffffffffffff81111561152957600080fd5b87016060818a03121561153b57600080fd5b809150509295509295509295565b60008060006060848603121561155e57600080fd5b6115678461131c565b92506115756020850161131c565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6001600160a01b03861681526001600160a01b0385166020820152836040820152608060608201526000611607608083018486611586565b979650505050505050565b83815260406020820152600061162c604083018486611586565b95945050505050565b80820180821115610485577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006020828403121561168157600080fd5b8151801515811461116657600080fd5b6000602082840312156116a357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6001600160a01b036116ea8261131c565b1682526000602082013567ffffffffffffffff811680821461170b57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261174757600080fd5b820160208101903567ffffffffffffffff81111561176457600080fd5b80360382131561177357600080fd5b6060604086015261162c606086018284611586565b6001600160a01b03871681526001600160a01b038616602082015284604082015260a0606082015260006117c060a083018587611586565b82810360808401526117d281856116d9565b9998505050505050505050565b8481526060602082015260006117f9606083018587611586565b828103604084015261160781856116d9565b6000825160005b8181101561182c5760208186018101518583015201611812565b50600092019182525091905056fea26469706673582212204c1c2270638065677fd67fe8597205e38b84acebefda4c164c4e3fead75d6f0364736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a00330000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f7420", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WHITELISTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"echidnaCaller\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gateway\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIGatewayEVM\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testERC20\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractTestERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unwhitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelist\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"whitelisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndRevert\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x600580546001600160a01b03191633908117909155600e60a09081526d11d85d195dd85e5155934b9cdbdb60921b60c0526101049190915261012361012481905261014452606460e090815261016460405261010080516001600160e01b0390811663c0c53b8b60e01b1790915261007992919061029316565b600680546001600160a01b03929092166001600160a01b03199283168117909155600780549092161790553480156100b057600080fd5b5060075460055460016000556002805460ff191690556001600160a01b039182169116808215806100e857506001600160a01b038216155b806100fa57506001600160a01b038116155b156101185760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526101306000826102b2565b5061015b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a826102b2565b506101867f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4836102b2565b5061019f600080516020616e2c833981519152826102b2565b506101b8600080516020616e2c833981519152836102b2565b505050506040516101c89061383e565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f08015801561021a573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b0392831617815560075460405163ae7a3a6f60e01b815230928101929092529091169063ae7a3a6f90602401600060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506148bf565b600061029d61384b565b6102a8848483610345565b9150505b92915050565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1661033d5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016102ac565b5060006102ac565b60008061035285846103c1565b90506103b66040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016103a0929190613954565b60408051601f19818403018152919052856103cd565b9150505b9392505050565b60006103ba8383610401565b60c081015151600090156103f7576103f084848460c0015161042260201b60201c565b90506103ba565b6103f0848461059b565b600061040d8383610668565b6103ba838360200151846103cd60201b60201c565b60008061042d610678565b9050600061043b8683610712565b905060006104588260600151836020015185610b3560201b60201c565b9050600061046883838989610cea565b9050600061047582611966565b602081015181519192509060030b156104ce5789826040015160405160200161049f929190613978565b60408051601f198184030181529082905262461bcd60e51b82526104c5916004016139de565b60405180910390fd5b60006105176040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001611afd60201b60201c565b60405163c6ce059d60e01b8152909150600080516020616e0c8339815191529063c6ce059d9061054b9084906004016139de565b602060405180830381865afa158015610568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058c91906139f1565b9b9a5050505050505050505050565b604051638d1cc92560e01b81526000908190600080516020616e0c83398151915290638d1cc925906105d19087906004016139de565b600060405180830381865afa1580156105ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106169190810190613ae6565b905060006106458285604051602001610630929190613b1a565b60408051601f19818403018152919052611c9d565b90506001600160a01b0381166102a857848460405160200161049f929190613b49565b61067482826000611cb0565b5050565b60408051808201825260038152621bdd5d60ea1b602082015290516334515cdb60e21b8152606091600080516020616e0c83398151915291829063d145736c906106c6908490600401613bd8565b600060405180830381865afa1580156106e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261070b9190810190613c0d565b9250505090565b6107446040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000600080516020616e0c83398151915290506107896040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61079285611d8a565b602082015260006107a286611fdf565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080c9190810190613c0d565b868385602001516040516020016108269493929190613c55565b60408051601f19818403018152908290526360f9bb1160e01b825291506000906001600160a01b038616906360f9bb11906108659085906004016139de565b600060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108aa9190810190613c0d565b604051636da11afb60e11b81529091506001600160a01b0386169063db4235f6906108d9908490600401613ced565b602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190613d26565b61092f578160405160200161049f9190613d48565b6040516309389f5960e31b81526001600160a01b038616906349c4fac89061095b908490600401613dbf565b600060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a09190810190613c0d565b8452604051636da11afb60e11b81526001600160a01b0386169063db4235f6906109ce908490600401613e05565b602060405180830381865afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f9190613d26565b15610a8b576040516309389f5960e31b81526001600160a01b038616906349c4fac890610a40908490600401613e05565b600060405180830381865afa158015610a5d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a859190810190613c0d565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001610ab09190613e46565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610adc929190613ea1565b600060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b219190810190613c0d565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081610b51579050509050604051806040016040528060048152602001630677265760e41b81525081600081518110610b9857610b98613ec6565b6020026020010181905250604051806040016040528060038152602001620b5c9b60ea1b81525081600181518110610bd257610bd2613ec6565b602002602001018190525084604051602001610bee9190613edc565b60405160208183030381529060405281600281518110610c1057610c10613ec6565b602002602001018190525082604051602001610c2c9190613f11565b60405160208183030381529060405281600381518110610c4e57610c4e613ec6565b60209081029190910101526000610c6482611966565b9050600081602001519050610ccb610c9e60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b6040805180820182526000808252602091820152815180830190925284518252808501908201529061218f565b610ce0578560405160200161049f9190613f40565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090600080516020616e0c8339815191529015610d34565b511590565b610e5057826020015115610dc45760405162461bcd60e51b81526020600482015260586024820152600080516020616e4c83398151915260448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a4016104c5565b8260c0015115610e505760405162461bcd60e51b81526020600482015260536024820152600080516020616e4c83398151915260448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a4016104c5565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081610e695790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280610eaa90613fd5565b935060ff1681518110610ebf57610ebf613ec6565b60200260200101819052506040518060400160405280600d81526020016c302e302e312d616c7068612e3760981b815250604051602001610f009190613ff4565b604051602081830303815290604052828280610f1b90613fd5565b935060ff1681518110610f3057610f30613ec6565b6020026020010181905250604051806040016040528060068152602001656465706c6f7960d01b815250828280610f6690613fd5565b935060ff1681518110610f7b57610f7b613ec6565b60200260200101819052506040518060400160405280600e81526020016d2d2d636f6e74726163744e616d6560901b815250828280610fb990613fd5565b935060ff1681518110610fce57610fce613ec6565b60200260200101819052508760200151828280610fea90613fd5565b935060ff1681518110610fff57610fff613ec6565b60200260200101819052506040518060400160405280600e81526020016d05a5ac6dedce8e4c2c6e8a0c2e8d60931b81525082828061103d90613fd5565b935060ff168151811061105257611052613ec6565b60209081029190910101528751828261106a81613fd5565b935060ff168151811061107f5761107f613ec6565b6020026020010181905250604051806040016040528060098152602001680b4b58da185a5b925960ba1b8152508282806110b890613fd5565b935060ff16815181106110cd576110cd613ec6565b60209081029190910101526110e1466121f0565b82826110ec81613fd5565b935060ff168151811061110157611101613ec6565b60200260200101819052506040518060400160405280600f81526020016e2d2d6275696c64496e666f46696c6560881b81525082828061114090613fd5565b935060ff168151811061115557611155613ec6565b60200260200101819052508682828061116d90613fd5565b935060ff168151811061118257611182613ec6565b60209081029190910101528551156112905760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826111d381613fd5565b935060ff16815181106111e8576111e8613ec6565b60209081029190910101526040516371aad10d60e01b81526001600160a01b038416906371aad10d9061121f9089906004016139de565b600060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112649190810190613c0d565b828261126f81613fd5565b935060ff168151811061128457611284613ec6565b60200260200101819052505b84602001511561133d576040805180820190915260128152712d2d766572696679536f75726365436f646560701b602082015282826112ce81613fd5565b935060ff16815181106112e3576112e3613ec6565b60200260200101819052506040518060400160405280600581526020016466616c736560d81b81525082828061131890613fd5565b935060ff168151811061132d5761132d613ec6565b60200260200101819052506114a4565b611353610d2f8660a0015161216260201b60201c565b6113d65760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261138681613fd5565b935060ff168151811061139b5761139b613ec6565b60200260200101819052508460a001516040516020016113bb9190613edc565b60405160208183030381529060405282828061131890613fd5565b8460c001511580156113fb57506113f9610d2f896040015161216260201b60201c565b155b156114a45760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261142f81613fd5565b935060ff168151811061144457611444613ec6565b602090810291909101015261145888612282565b6040516020016114689190613edc565b60405160208183030381529060405282828061148390613fd5565b935060ff168151811061149857611498613ec6565b60200260200101819052505b6114ba610d2f866040015161216260201b60201c565b61153d5760408051808201909152600b81526a0b4b5c995b185e595c925960aa1b602082015282826114eb81613fd5565b935060ff168151811061150057611500613ec6565b6020026020010181905250846040015182828061151c90613fd5565b935060ff168151811061153157611531613ec6565b60200260200101819052505b60608501511561162e576040805180820190915260068152650b4b5cd85b1d60d21b6020820152828261156f81613fd5565b935060ff168151811061158457611584613ec6565b60209081029190910101526060850151604051631623433d60e31b815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156115da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116029190810190613c0d565b828261160d81613fd5565b935060ff168151811061162257611622613ec6565b60200260200101819052505b60e085015151156116c05760408051808201909152600a8152690b4b59d85cd31a5b5a5d60b21b6020820152828261166581613fd5565b935060ff168151811061167a5761167a613ec6565b602090810291909101015260e085015151611694906121f0565b828261169f81613fd5565b935060ff16815181106116b4576116b4613ec6565b60200260200101819052505b60e0850151602001511561175d5760408051808201909152600a8152692d2d676173507269636560b01b602082015282826116fa81613fd5565b935060ff168151811061170f5761170f613ec6565b60200260200101819052506117318560e00151602001516121f060201b60201c565b828261173c81613fd5565b935060ff168151811061175157611751613ec6565b60200260200101819052505b60e085015160400151156117fe5760408051808201909152600e81526d2d2d6d617846656550657247617360901b6020820152828261179b81613fd5565b935060ff16815181106117b0576117b0613ec6565b60200260200101819052506117d28560e00151604001516121f060201b60201c565b82826117dd81613fd5565b935060ff16815181106117f2576117f2613ec6565b60200260200101819052505b60e085015160600151156118ae5760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261184b81613fd5565b935060ff168151811061186057611860613ec6565b60200260200101819052506118828560e00151606001516121f060201b60201c565b828261188d81613fd5565b935060ff16815181106118a2576118a2613ec6565b60200260200101819052505b60008160ff166001600160401b038111156118cb576118cb613a1a565b6040519080825280602002602001820160405280156118fe57816020015b60608152602001906001900390816118e95790505b50905060005b8260ff168160ff16101561195757838160ff168151811061192757611927613ec6565b6020026020010151828260ff168151811061194457611944613ec6565b6020908102919091010152600101611904565b5093505050505b949350505050565b61198d6040518060600160405280600060030b815260200160608152602001606081525090565b6040805180820182526004808252630c4c2e6d60e31b602083015291516334515cdb60e21b8152600080516020616e0c83398151915292600091849163d145736c916119db9186910161404b565b600060405180830381865afa1580156119f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a209190810190613c0d565b90506000611a2e8683612938565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401611a5e9190614092565b6000604051808303816000875af1158015611a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aa591908101906140f7565b805190915060030b15801590611abe5750602081015151155b8015611acd5750604081015151155b15610ce05781600081518110611ae557611ae5613ec6565b602002602001015160405160200161049f91906141aa565b60606000611b328560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150611b699082905b90612a72565b15611c66576000611be682611be081611bda611bac8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90612a99565b90612af6565b9050611c1a611c13604051806040016040528060018152602001600560f91b81525061216260201b60201c565b8290612a72565b15611c5457611c51611c4a604051806040016040528060018152602001600560f91b81525061216260201b60201c565b8290612b7b565b90505b611c5d81612ba1565b925050506103ba565b8215611c7f57848460405160200161049f92919061437a565b50506040805160208101909152600081526103ba565b509392505050565b6000808251602084016000f09392505050565b8160a0015115611cbf57505050565b6000611ccc848484612c06565b90506000611cd982611966565b602081015181519192509060030b158015611d4c5750611d4c611d20604051806040016040528060078152602001665355434345535360c81b81525061216260201b60201c565b604080518082018252600080825260209182015281518083019092528451825280850190820152611b63565b15611d5957505050505050565b60408201515115611d7957816040015160405160200161049f91906143f5565b8060405160200161049f919061443f565b60606000611dbf8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050611df6611def604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b829061218f565b15611e38576103ba611e33611e2c604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b8390613119565b612ba1565b611e6a611e63604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b82906131a3565b600103611ed257611e9c611c4a604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b506103ba611e33611ecb604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b8390612b7b565b611f01611def60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b15611fce576000611f3982611f34604051806040016040528060018152602001602f60f81b81525061216260201b60201c565b613238565b905060008160018351611f4c919061448f565b81518110611f5c57611f5c613ec6565b60200260200101519050611fc5611e33611f9860405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b60408051808201825260008082526020918201528151808301909252855182528086019082015290613119565b95945050505050565b8260405160200161049f91906144a2565b606060006120148360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050612044611def604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b15612052576103ba81612ba1565b61207d611e63604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b6001036120b2576103ba611e33611ecb604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b6120e1611def60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b15611fce57600061211482611f34604051806040016040528060018152602001602f60f81b81525061216260201b60201c565b905060018151111561215057806002825161212f919061448f565b8151811061213f5761213f613ec6565b602002602001015192505050919050565b508260405160200161049f91906144a2565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b8051825160009111156121a4575060006102ac565b815183516020850151600092916121ba9161455c565b6121c4919061448f565b9050826020015181036121db5760019150506102ac565b82516020840151819020912014905092915050565b606060006121fd836132dc565b60010190506000816001600160401b0381111561221c5761221c613a1a565b6040519080825280601f01601f191660200182016040528015612246576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461225057509392505050565b60606000612299836040015161216260201b60201c565b90506122d66122cf6040518060400160405280600a8152602001691553931250d15394d15160b21b81525061216260201b60201c565b82906133be565b156122fd5750506040805180820190915260048152634e6f6e6560e01b6020820152919050565b6123306122cf60405180604001604052806009815260200168556e6c6963656e736560b81b81525061216260201b60201c565b1561235c575050604080518082019091526009815268556e6c6963656e736560b81b6020820152919050565b6123896122cf6040518060400160405280600381526020016213525560ea1b81525061216260201b60201c565b156123af57505060408051808201909152600381526213525560ea1b6020820152919050565b6123e56122cf6040518060400160405280600c81526020016b47504c2d322e302d6f6e6c7960a01b81525061216260201b60201c565b8061242557506124256122cf6040518060400160405280601081526020016f23a8261699171816b7b916b630ba32b960811b81525061216260201b60201c565b1561245157505060408051808201909152600981526823a72a9023a8263b1960b91b6020820152919050565b6124876122cf6040518060400160405280600c81526020016b47504c2d332e302d6f6e6c7960a01b81525061216260201b60201c565b806124c757506124c76122cf6040518060400160405280601081526020016f23a8261699971816b7b916b630ba32b960811b81525061216260201b60201c565b156124f3575050604080518082019091526009815268474e552047504c763360b81b6020820152919050565b61252a6122cf6040518060400160405280600d81526020016c4c47504c2d322e312d6f6e6c7960981b81525061216260201b60201c565b8061256b575061256b6122cf604051806040016040528060118152602001702623a8261699171896b7b916b630ba32b960791b81525061216260201b60201c565b1561259a57505060408051808201909152600c81526b474e55204c47504c76322e3160a01b6020820152919050565b6125d16122cf6040518060400160405280600d81526020016c4c47504c2d332e302d6f6e6c7960981b81525061216260201b60201c565b8061261257506126126122cf604051806040016040528060118152602001702623a8261699971816b7b916b630ba32b960791b81525061216260201b60201c565b1561263f57505060408051808201909152600a815269474e55204c47504c763360b01b6020820152919050565b6126756122cf6040518060400160405280600c81526020016b4253442d322d436c6175736560a01b81525061216260201b60201c565b156126a457505060408051808201909152600c81526b4253442d322d436c6175736560a01b6020820152919050565b6126da6122cf6040518060400160405280600c81526020016b4253442d332d436c6175736560a01b81525061216260201b60201c565b1561270957505060408051808201909152600c81526b4253442d332d436c6175736560a01b6020820152919050565b61273a6122cf6040518060400160405280600781526020016604d504c2d322e360cc1b81525061216260201b60201c565b1561276457505060408051808201909152600781526604d504c2d322e360cc1b6020820152919050565b6127956122cf6040518060400160405280600781526020016604f534c2d332e360cc1b81525061216260201b60201c565b156127bf57505060408051808201909152600781526604f534c2d332e360cc1b6020820152919050565b6127f36122cf6040518060400160405280600a81526020016904170616368652d322e360b41b81525061216260201b60201c565b1561282057505060408051808201909152600a81526904170616368652d322e360b41b6020820152919050565b6128576122cf6040518060400160405280600d81526020016c4147504c2d332e302d6f6e6c7960981b81525061216260201b60201c565b8061289857506128986122cf6040518060400160405280601181526020017020a3a8261699971816b7b916b630ba32b960791b81525061216260201b60201c565b156128c557505060408051808201909152600a815269474e55204147504c763360b01b6020820152919050565b6128f76122cf604051806040016040528060088152602001674255534c2d312e3160c01b81525061216260201b60201c565b1561292157505060408051808201909152600781526642534c20312e3160c81b6020820152919050565b6040808401518451915161049f929060200161456f565b60608060005b84518110156129c3578185828151811061295a5761295a613ec6565b6020026020010151604051602001612973929190613b1a565b604051602081830303815290604052915060018551612992919061448f565b81146129bb57816040516020016129a991906146bf565b60405160208183030381529060405291505b60010161293e565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816129dc5790505090508381600081518110612a0757612a07613ec6565b6020026020010181905250604051806040016040528060028152602001612d6360f01b81525081600181518110612a4057612a40613ec6565b60200260200101819052508181600281518110612a5f57612a5f613ec6565b6020908102919091010152949350505050565b6020808301518351835192840151600093612a9092918491906133d2565b14159392505050565b6040805180820190915260008082526020808301829052845185820151855192860151612ac693906134e3565b9050836020015181612ad8919061448f565b84518590612ae790839061448f565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015612b1b5750816102ac565b6020808301519084015160019114612b425750815160208481015190840151829020919020145b8015612b7357825184518590612b5990839061448f565b9052508251602085018051612b6f90839061455c565b9052505b509192915050565b6040805180820190915260008082526020820152612b9a838383613603565b5092915050565b6060600082600001516001600160401b03811115612bc157612bc1613a1a565b6040519080825280601f01601f191660200182016040528015612beb576020820181803683370190505b50602084810151855192935090830191612b9a9183916136a9565b60606000612c12610678565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081612c2f5790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280612c7090613fd5565b935060ff1681518110612c8557612c85613ec6565b6020026020010181905250604051806040016040528060078152602001665e312e33322e3360c81b815250604051602001612cc091906146e4565b604051602081830303815290604052828280612cdb90613fd5565b935060ff1681518110612cf057612cf0613ec6565b60200260200101819052506040518060400160405280600881526020016776616c696461746560c01b815250828280612d2890613fd5565b935060ff1681518110612d3d57612d3d613ec6565b602002602001018190525082604051602001612d599190613f11565b604051602081830303815290604052828280612d7490613fd5565b935060ff1681518110612d8957612d89613ec6565b60200260200101819052506040518060400160405280600a8152602001690b4b58dbdb9d1c9858dd60b21b815250828280612dc390613fd5565b935060ff1681518110612dd857612dd8613ec6565b6020908102919091010152612ded8784613723565b8282612df881613fd5565b935060ff1681518110612e0d57612e0d613ec6565b602090810291909101015285515115612ea55760408051808201909152600b81526a2d2d7265666572656e636560a81b60208201528282612e4d81613fd5565b935060ff1681518110612e6257612e62613ec6565b60209081029190910101528551612e799084613723565b8282612e8481613fd5565b935060ff1681518110612e9957612e99613ec6565b60200260200101819052505b856080015115612f135760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282612eee81613fd5565b935060ff1681518110612f0357612f03613ec6565b6020026020010181905250612f6e565b8415612f6e576040805180820190915260128152712d2d726571756972655265666572656e636560701b60208201528282612f4d81613fd5565b935060ff1681518110612f6257612f62613ec6565b60200260200101819052505b60408601515115612ffa5760408051808201909152600d81526c2d2d756e73616665416c6c6f7760981b60208201528282612fa881613fd5565b935060ff1681518110612fbd57612fbd613ec6565b60200260200101819052508560400151828280612fd990613fd5565b935060ff1681518110612fee57612fee613ec6565b60200260200101819052505b8560600151156130645760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261304381613fd5565b935060ff168151811061305857613058613ec6565b60200260200101819052505b60008160ff166001600160401b0381111561308157613081613a1a565b6040519080825280602002602001820160405280156130b457816020015b606081526020019060019003908161309f5790505b50905060005b8260ff168160ff16101561310d57838160ff16815181106130dd576130dd613ec6565b6020026020010151828260ff16815181106130fa576130fa613ec6565b60209081029190910101526001016130ba565b50979650505050505050565b604080518082019091526000808252602082015281518351101561313e5750816102ac565b815183516020850151600092916131549161455c565b61315e919061448f565b6020840151909150600190821461317f575082516020840151819020908220145b801561319a5783518551869061319690839061448f565b9052505b50929392505050565b8051825160208085015190840151600093849390926131c39284906134e3565b6131cd919061455c565b90505b835160208501516131e1919061455c565b8111612b9a57816131f181614729565b925050826000015161322785602001518361320c919061448f565b8651613218919061448f565b855160208701518591906134e3565b613231919061455c565b90506131d0565b6060600061324684846131a3565b61325190600161455c565b6001600160401b0381111561326857613268613a1a565b60405190808252806020026020018201604052801561329b57816020015b60608152602001906001900390816132865790505b50905060005b8151811015611c95576132b7611e338686612b7b565b8282815181106132c9576132c9613ec6565b60209081029190910101526001016132a1565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613325577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613351576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061336f57662386f26fc10000830492506010015b6305f5e1008310613387576305f5e100830492506008015b612710831061339b57612710830492506004015b606483106133ad576064830492506002015b600a83106102ac5760010192915050565b60006133ca8383613763565b159392505050565b6000808584116134d95760208411613485576000841561341d5760016133f986602061448f565b613404906008614742565b61340f906002614840565b613419919061448f565b1990505b835181168561342c898961455c565b613436919061448f565b805190935082165b81811461347057878411613458578794505050505061195e565b836134628161484c565b94505082845116905061343e565b61347a878561455c565b94505050505061195e565b838320613492858861448f565b61349c908761455c565b91505b8582106134d7578482208082036134c4576134ba868461455c565b935050505061195e565b6134cf60018461448f565b92505061349f565b505b5092949350505050565b600083818685116135ee576020851161359d576000851561352f57600161350b87602061448f565b613516906008614742565b613521906002614840565b61352b919061448f565b1990505b845181166000876135408b8b61455c565b61354a919061448f565b855190915083165b82811461358f578186106135775761356a8b8b61455c565b965050505050505061195e565b8561358181614729565b965050838651169050613552565b85965050505050505061195e565b508383206000905b6135af868961448f565b82116135ec578583208082036135cb578394505050505061195e565b6135d660018561455c565b93505081806135e490614729565b9250506135a5565b505b6135f8878761455c565b979650505050505050565b604080518082019091526000808252602080830182905285518682015186519287015161363093906134e3565b60208087018051918601919091525190915061364c908261448f565b83528451602086015161365f919061455c565b810361366e57600085526136a0565b8351835161367c919061455c565b8551869061368b90839061448f565b905250835161369a908261455c565b60208601525b50909392505050565b602081106136e157815183526136c060208461455c565b92506136cd60208361455c565b91506136da60208261448f565b90506136a9565b60001981156137105760016136f783602061448f565b61370390610100614840565b61370d919061448f565b90505b9151835183169219169190911790915250565b606060006137318484610712565b805160208083015160405193945061374b93909101614863565b60405160208183030381529060405291505092915050565b8151815160009190811115613776575081515b6020808501519084015160005b8381101561382f57825182518082146137ff5760001960208710156137de576001846137b089602061448f565b6137ba919061455c565b6137c5906008614742565b6137d0906002614840565b6137da919061448f565b1990505b81811683821681810391146137fc5797506102ac9650505050505050565b50505b61380a60208661455c565b945061381760208561455c565b93505050602081613828919061455c565b9050613783565b5084518651610ce0919061489f565b610c9f8061616d83390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161388e613893565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161388e6040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b8381101561391f578181015183820152602001613907565b50506000910152565b60008151808452613940816020860160208601613904565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061195e90830184613928565b7f4661696c656420746f206465706c6f7920636f6e7472616374200000000000008152600083516139b081601a850160208801613904565b6101d160f51b601a9184019182015283516139d281601c840160208801613904565b01601c01949350505050565b6020815260006103ba6020830184613928565b600060208284031215613a0357600080fd5b81516001600160a01b03811681146103ba57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613a5257613a52613a1a565b60405290565b6000806001600160401b03841115613a7257613a72613a1a565b50604051601f19601f85018116603f011681018181106001600160401b0382111715613aa057613aa0613a1a565b604052838152905080828401851015613ab857600080fd5b611c95846020830185613904565b600082601f830112613ad757600080fd5b6103ba83835160208501613a58565b600060208284031215613af857600080fd5b81516001600160401b03811115613b0e57600080fd5b6102a884828501613ac6565b60008351613b2c818460208801613904565b835190830190613b40818360208801613904565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351613b8181601a850160208801613904565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351613bbe816033840160208801613904565b601160f91b60339290910191820152603401949350505050565b60408152600b60408201526a1193d55391149657d3d55560aa1b60608201526080602082015260006103ba6080830184613928565b600060208284031215613c1f57600080fd5b81516001600160401b03811115613c3557600080fd5b8201601f81018413613c4657600080fd5b6102a884825160208401613a58565b60008551613c67818460208a01613904565b602f60f81b9083019081528551613c85816001840160208a01613904565b602f60f81b600192909101918201528451613ca7816002840160208901613904565b600181830101915050602f60f81b60018201528351613ccd816002840160208801613904565b64173539b7b760d91b600292909101918201526007019695505050505050565b604081526000613d006040830184613928565b828103602084015260048152630b985cdd60e21b60208201526040810191505092915050565b600060208284031215613d3857600080fd5b815180151581146103ba57600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251613d8081601f850160208701613904565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f939091019283015250611b5b60f21b603f820152604101919050565b604081526000613dd26040830184613928565b8281036020840152601181527005cc2e6e85cc2c4e6ded8eae8caa0c2e8d607b1b60208201526040810191505092915050565b604081526000613e186040830184613928565b8281036020840152600c81526b2e6173742e6c6963656e736560a01b60208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251613e7e816014850160208701613904565b6b13ae9735b2b1b1b0b5991a9b60a11b6014939091019283015250602001919050565b604081526000613eb46040830185613928565b82810360208401526103b68185613928565b634e487b7160e01b600052603260045260246000fd5b601160f91b81528151600090613ef9816001850160208701613904565b601160f91b6001939091019283015250600201919050565b60008251613f23818460208701613904565b6a2f6275696c642d696e666f60a81b920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201526a0391031b7b73a3930b1ba160ad1b604082015260008251613fb281604b850160208701613904565b91909101604b0192915050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8103613feb57613feb613fbf565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81526801a595b9d0b58db1a560be1b60208201526000825161403e816029850160208701613904565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006103ba6080830184613928565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156140eb57603f198786030184526140d6858351613928565b945060209384019391909101906001016140ba565b50929695505050505050565b60006020828403121561410957600080fd5b81516001600160401b0381111561411f57600080fd5b82016060818503121561413157600080fd5b614139613a30565b81518060030b811461414a57600080fd5b815260208201516001600160401b0381111561416557600080fd5b61417186828501613ac6565b60208301525060408201516001600160401b0381111561419057600080fd5b61419c86828501613ac6565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e642077697468208152601160f91b6020820152600082516141ec816021850160208701613904565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e65207769746820707265666978208152602760f81b6020820152600083516143bc816021850160208801613904565b6c0139034b71037baba383aba1d1609d1b60219184019182015283516143e981602e840160208801613904565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c815268034b230ba34b7b71d160bd1b60208201526000825161403e816029850160208701613904565b7f55706772616465207361666574792076616c69646174696f6e206661696c65648152611d0560f11b602082015260008251614482816022850160208701613904565b9190910160220192915050565b818103818111156102ac576102ac613fbf565b6d021b7b73a3930b1ba103730b6b2960951b8152600082516144cb81600e850160208701613904565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201526730b1ba173539b7b760c11b606e820152607601919050565b808201808211156102ac576102ac613fbf565b7f53504458206c6963656e7365206964656e7469666965722000000000000000008152600083516145a7816018850160208801613904565b6301034b7160e51b60189184019182015283516145cb81601c840160208801613904565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516146d1818460208701613904565b600160fd1b920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161471c81601c850160208701613904565b91909101601c0192915050565b60006001820161473b5761473b613fbf565b5060010190565b80820281158282048414176102ac576102ac613fbf565b6001815b60018411156147945780850481111561477857614778613fbf565b600184161561478657908102905b60019390931c92800261475d565b935093915050565b6000826147ab575060016102ac565b816147b8575060006102ac565b81600181146147ce57600281146147d8576147f4565b60019150506102ac565b60ff8411156147e9576147e9613fbf565b50506001821b6102ac565b5060208310610133831016604e8410600b8410161715614817575081810a6102ac565b6148246000198484614759565b806000190482111561483857614838613fbf565b029392505050565b60006103ba838361479c565b60008161485b5761485b613fbf565b506000190190565b60008351614875818460208801613904565b601d60f91b9083019081528351614893816001840160208801613904565b01600101949350505050565b8181036000831280158383131683831282161715612b9a57612b9a613fbf565b6080516118706148fd600039600081816101bf015281816105260152818161057b0152818161087201528181610b2c0152610b8101526118706000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806381100bf0116100e3578063a217fddf1161008c578063d936547e11610066578063d936547e14610395578063d9caed12146103b8578063e63ab1e9146103cb57600080fd5b8063a217fddf14610367578063c709ab6e1461036f578063d547741f1461038257600080fd5b806391d14854116100bd57806391d14854146103085780639a590427146103415780639b19251a1461035457600080fd5b806381100bf0146102c65780638456cb59146102d957806385f438c1146102e157600080fd5b806336568abe11610145578063570618e11161011f578063570618e1146102815780635c975abb146102a85780636133b4bb146102b357600080fd5b806336568abe146102535780633c2f05a8146102665780633f4ba83a1461027957600080fd5b806321fc65f21161017657806321fc65f2146101f9578063248a9ca31461020e5780632f2ff15d1461024057600080fd5b806301ffc9a714610192578063116191b6146101ba575b600080fd5b6101a56101a03660046112da565b6103f2565b60405190151581526020015b60405180910390f35b6101e17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b1565b61020c610207366004611381565b61048b565b005b61023261021c3660046113f0565b6000908152600160208190526040909120015490565b6040519081526020016101b1565b61020c61024e366004611409565b61064b565b61020c610261366004611409565b610677565b6004546101e1906001600160a01b031681565b61020c6106c8565b6102327f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff166101a5565b61020c6102c1366004611435565b6106fd565b6005546101e1906001600160a01b031681565b61020c6108f4565b6102327f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101a5610316366004611409565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61020c61034f36600461148f565b610926565b61020c61036236600461148f565b6109da565b610232600081565b61020c61037d3660046114aa565b610a91565b61020c610390366004611409565b610c56565b6101a56103a336600461148f565b60036020526000908152604090205460ff1681565b61020c6103c6366004611549565b610c7c565b6102327f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061048557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610493610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46104bd81610db7565b6104c5610dc1565b6001600160a01b03851660009081526003602052604090205460ff16610517576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61054b6001600160a01b0386167f000000000000000000000000000000000000000000000000000000000000000086610e00565b6040517f5131ab590000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635131ab59906105b89088908a908990899089906004016115cf565b600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b03167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063193929190611612565b60405180910390a3506106446001600055565b5050505050565b6000828152600160208190526040909120015461066781610db7565b6106718383610e80565b50505050565b6001600160a01b03811633146106b9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282610f13565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6106f281610db7565b6106fa610f9a565b50565b6004546001600160a01b03166340c10f193061071a866005611635565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561077857600080fd5b505af115801561078c573d6000803e3d6000fd5b5050600480546007546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093526005602484015216925063a9059cbb91506044016020604051808303816000875af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610824919061166f565b5060045461083e906001600160a01b03168585858561048b565b600480546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093529116906370a0823190602401602060405180830381865afa1580156108c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e79190611691565b15610671576106716116aa565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61091e81610db7565b6106fa610fec565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61095081610db7565b6001600160a01b038216610990576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a610a0481610db7565b6001600160a01b038216610a44576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b610a99610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610ac381610db7565b610acb610dc1565b6001600160a01b03861660009081526003602052604090205460ff16610b1d576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b516001600160a01b0387167f000000000000000000000000000000000000000000000000000000000000000087610e00565b6040517fd0b492c30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610bc09089908b908a908a908a908a90600401611788565b600060405180830381600087803b158015610bda57600080fd5b505af1158015610bee573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610c3b94939291906117df565b60405180910390a350610c4e6001600055565b505050505050565b60008281526001602081905260409091200154610c7281610db7565b6106718383610f13565b610c84610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610cae81610db7565b610cb6610dc1565b6001600160a01b03831660009081526003602052604090205460ff16610d08576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1c6001600160a01b0384168584610e00565b826001600160a01b0316846001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610d6191815260200190565b60405180910390a3506106c36001600055565b600260005403610db0576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6106fa8133611029565b60025460ff1615610dfe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106c39084906110a0565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff16610f0b5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610485565b506000610485565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1615610f0b5760008381526001602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610485565b610fa261111c565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ff4610dc1565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fcf3390565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff1661109c576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b60006110b56001600160a01b03841683611158565b905080516000141580156110da5750808060200190518101906110d8919061166f565b155b156106c3576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611093565b60025460ff16610dfe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606111668383600061116d565b9392505050565b6060814710156111ab576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611093565b600080856001600160a01b031684866040516111c7919061180b565b60006040518083038185875af1925050503d8060008114611204576040519150601f19603f3d011682016040523d82523d6000602084013e611209565b606091505b5091509150611219868383611223565b9695505050505050565b6060826112385761123382611298565b611166565b815115801561124f57506001600160a01b0384163b155b15611291576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611093565b5080611166565b8051156112a85780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156112ec57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461116657600080fd5b80356001600160a01b038116811461133357600080fd5b919050565b60008083601f84011261134a57600080fd5b50813567ffffffffffffffff81111561136257600080fd5b60208301915083602082850101111561137a57600080fd5b9250929050565b60008060008060006080868803121561139957600080fd5b6113a28661131c565b94506113b06020870161131c565b935060408601359250606086013567ffffffffffffffff8111156113d357600080fd5b6113df88828901611338565b969995985093965092949392505050565b60006020828403121561140257600080fd5b5035919050565b6000806040838503121561141c57600080fd5b8235915061142c6020840161131c565b90509250929050565b6000806000806060858703121561144b57600080fd5b6114548561131c565b935060208501359250604085013567ffffffffffffffff81111561147757600080fd5b61148387828801611338565b95989497509550505050565b6000602082840312156114a157600080fd5b6111668261131c565b60008060008060008060a087890312156114c357600080fd5b6114cc8761131c565b95506114da6020880161131c565b945060408701359350606087013567ffffffffffffffff8111156114fd57600080fd5b61150989828a01611338565b909450925050608087013567ffffffffffffffff81111561152957600080fd5b87016060818a03121561153b57600080fd5b809150509295509295509295565b60008060006060848603121561155e57600080fd5b6115678461131c565b92506115756020850161131c565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6001600160a01b03861681526001600160a01b0385166020820152836040820152608060608201526000611607608083018486611586565b979650505050505050565b83815260406020820152600061162c604083018486611586565b95945050505050565b80820180821115610485577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006020828403121561168157600080fd5b8151801515811461116657600080fd5b6000602082840312156116a357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6001600160a01b036116ea8261131c565b1682526000602082013567ffffffffffffffff811680821461170b57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261174757600080fd5b820160208101903567ffffffffffffffff81111561176457600080fd5b80360382131561177357600080fd5b6060604086015261162c606086018284611586565b6001600160a01b03871681526001600160a01b038616602082015284604082015260a0606082015260006117c060a083018587611586565b82810360808401526117d281856116d9565b9998505050505050505050565b8481526060602082015260006117f9606083018587611586565b828103604084015261160781856116d9565b6000825160005b8181101561182c5760208186018101518583015201611812565b50600092019182525091905056fea264697066735822122061cd549824825890a13a467c67a5cc641b8194ac645882f08a0554f2b93702ee64736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a00330000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f7420", } // ERC20CustodyEchidnaTestABI is the input ABI used to generate the binding from. @@ -1923,27 +1923,27 @@ func (it *ERC20CustodyEchidnaTestWithdrawnIterator) Close() error { // ERC20CustodyEchidnaTestWithdrawn represents a Withdrawn event raised by the ERC20CustodyEchidnaTest contract. type ERC20CustodyEchidnaTestWithdrawn struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterWithdrawn is a free log retrieval operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyEchidnaTestWithdrawnIterator, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyEchidnaTestWithdrawnIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyEchidnaTest.contract.FilterLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _ERC20CustodyEchidnaTest.contract.FilterLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -1952,19 +1952,19 @@ func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawn // WatchWithdrawn is a free log subscription operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *ERC20CustodyEchidnaTestWithdrawn, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *ERC20CustodyEchidnaTestWithdrawn, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyEchidnaTest.contract.WatchLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _ERC20CustodyEchidnaTest.contract.WatchLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -1998,7 +1998,7 @@ func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawn( // ParseWithdrawn is a log parse operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) ParseWithdrawn(log types.Log) (*ERC20CustodyEchidnaTestWithdrawn, error) { event := new(ERC20CustodyEchidnaTestWithdrawn) if err := _ERC20CustodyEchidnaTest.contract.UnpackLog(event, "Withdrawn", log); err != nil { @@ -2077,8 +2077,8 @@ func (it *ERC20CustodyEchidnaTestWithdrawnAndCalledIterator) Close() error { // ERC20CustodyEchidnaTestWithdrawnAndCalled represents a WithdrawnAndCalled event raised by the ERC20CustodyEchidnaTest contract. type ERC20CustodyEchidnaTestWithdrawnAndCalled struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte Raw types.Log // Blockchain specific contextual infos @@ -2086,19 +2086,19 @@ type ERC20CustodyEchidnaTestWithdrawnAndCalled struct { // FilterWithdrawnAndCalled is a free log retrieval operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyEchidnaTestWithdrawnAndCalledIterator, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyEchidnaTestWithdrawnAndCalledIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyEchidnaTest.contract.FilterLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _ERC20CustodyEchidnaTest.contract.FilterLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -2107,19 +2107,19 @@ func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawn // WatchWithdrawnAndCalled is a free log subscription operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *ERC20CustodyEchidnaTestWithdrawnAndCalled, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *ERC20CustodyEchidnaTestWithdrawnAndCalled, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyEchidnaTest.contract.WatchLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _ERC20CustodyEchidnaTest.contract.WatchLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -2153,7 +2153,7 @@ func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawnA // ParseWithdrawnAndCalled is a log parse operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) ParseWithdrawnAndCalled(log types.Log) (*ERC20CustodyEchidnaTestWithdrawnAndCalled, error) { event := new(ERC20CustodyEchidnaTestWithdrawnAndCalled) if err := _ERC20CustodyEchidnaTest.contract.UnpackLog(event, "WithdrawnAndCalled", log); err != nil { @@ -2232,8 +2232,8 @@ func (it *ERC20CustodyEchidnaTestWithdrawnAndRevertedIterator) Close() error { // ERC20CustodyEchidnaTestWithdrawnAndReverted represents a WithdrawnAndReverted event raised by the ERC20CustodyEchidnaTest contract. type ERC20CustodyEchidnaTestWithdrawnAndReverted struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte RevertContext RevertContext @@ -2242,19 +2242,19 @@ type ERC20CustodyEchidnaTestWithdrawnAndReverted struct { // FilterWithdrawnAndReverted is a free log retrieval operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*ERC20CustodyEchidnaTestWithdrawnAndRevertedIterator, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*ERC20CustodyEchidnaTestWithdrawnAndRevertedIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyEchidnaTest.contract.FilterLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _ERC20CustodyEchidnaTest.contract.FilterLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -2263,19 +2263,19 @@ func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) FilterWithdrawn // WatchWithdrawnAndReverted is a free log subscription operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *ERC20CustodyEchidnaTestWithdrawnAndReverted, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *ERC20CustodyEchidnaTestWithdrawnAndReverted, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _ERC20CustodyEchidnaTest.contract.WatchLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _ERC20CustodyEchidnaTest.contract.WatchLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -2309,7 +2309,7 @@ func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) WatchWithdrawnA // ParseWithdrawnAndReverted is a log parse operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) func (_ERC20CustodyEchidnaTest *ERC20CustodyEchidnaTestFilterer) ParseWithdrawnAndReverted(log types.Log) (*ERC20CustodyEchidnaTestWithdrawnAndReverted, error) { event := new(ERC20CustodyEchidnaTestWithdrawnAndReverted) if err := _ERC20CustodyEchidnaTest.contract.UnpackLog(event, "WithdrawnAndReverted", log); err != nil { diff --git a/v2/pkg/gatewayevm.sol/gatewayevm.go b/v2/pkg/gatewayevm.sol/gatewayevm.go index 814ae6d0..c20f933d 100644 --- a/v2/pkg/gatewayevm.sol/gatewayevm.go +++ b/v2/pkg/gatewayevm.sol/gatewayevm.go @@ -47,7 +47,7 @@ type RevertOptions struct { // GatewayEVMMetaData contains all meta data concerning the GatewayEVM contract. var GatewayEVMMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"custody\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"executeWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"tssAddress_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"zetaToken_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revertWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setConnector\",\"inputs\":[{\"name\":\"zetaConnector_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCustody\",\"inputs\":[{\"name\":\"custody_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tssAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"zetaConnector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"zetaToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516136da6100fd60003960008181611f3d01528181611f6601526123f201526136da6000f3fe6080604052600436106101e35760003560e01c8063616e877a11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461063b578063e63ab1e91461065b578063f7ad60db1461068f578063fc93baef146106a257600080fd5b8063ae7a3a6f146105bb578063c0c53b8b146105db578063d0b492c3146105fb578063d547741f1461061b57600080fd5b806391d14854116100d157806391d14854146104c4578063a217fddf14610529578063a783c7891461053e578063ad3cb1cc1461057257600080fd5b8063616e877a1461045c57806370f23f881461047c5780638456cb591461048f578063870de27a146104a457600080fd5b806345ac7a8d1161017a57806357bec62f1161014957806357bec62f146103b15780635b112591146103d15780635c975abb146103f15780635d62c8601461042857600080fd5b806345ac7a8d146103495780634f1ef286146103695780635131ab591461037c57806352d1902d1461039c57600080fd5b8063248a9ca3116101b6578063248a9ca3146102975780632f2ff15d146102f457806336568abe146103145780633f4ba83a1461033457600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631cff79cd1461023f57806321e093b11461025f575b600080fd5b3480156101f457600080fd5b50610208610203366004612d1f565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612d7d565b61074e565b005b61025261024d366004612de1565b610842565b6040516102149190612ea2565b34801561026b57600080fd5b5060035461027f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102a357600080fd5b506102e66102b2366004612eb5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b34801561030057600080fd5b5061023d61030f366004612ece565b610945565b34801561032057600080fd5b5061023d61032f366004612ece565b61098f565b34801561034057600080fd5b5061023d6109e0565b34801561035557600080fd5b5061023d610364366004612f12565b610a15565b61023d610377366004612fc0565b610add565b34801561038857600080fd5b5061023d6103973660046130c7565b610afc565b3480156103a857600080fd5b506102e6610e15565b3480156103bd57600080fd5b5060025461027f906001600160a01b031681565b3480156103dd57600080fd5b5060015461027f906001600160a01b031681565b3480156103fd57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561043457600080fd5b506102e67f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561046857600080fd5b5061023d610477366004613136565b610e44565b61023d61048a366004613186565b610f20565b34801561049b57600080fd5b5061023d6110b1565b3480156104b057600080fd5b5061023d6104bf3660046131d4565b6110e3565b3480156104d057600080fd5b506102086104df366004612ece565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561053557600080fd5b506102e6600081565b34801561054a57600080fd5b506102e67f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057e57600080fd5b506102526040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105c757600080fd5b5061023d6105d6366004612d7d565b6111f4565b3480156105e757600080fd5b5061023d6105f636600461326c565b6112e8565b34801561060757600080fd5b5061023d6106163660046132c1565b61159d565b34801561062757600080fd5b5061023d610636366004612ece565b61175f565b34801561064757600080fd5b5060005461027f906001600160a01b031681565b34801561066757600080fd5b506102e67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d61069d36600461334c565b6117a3565b61023d6106b0366004612f12565b6119a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611b39565b6001600160a01b038216610799576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b0316156107dc576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61086e81611b39565b610876611c30565b61087e611c8e565b6001600160a01b0385166108be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108cb868686611d0f565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f34878760405161090a93929190613408565b60405180910390a2915061093d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461097f81611b39565b6109898383611b43565b50505050565b6001600160a01b03811633146109d1576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db8282611dde565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0a81611b39565b610a12611ea2565b50565b610a1d611c30565b610a25611c8e565b6001600160a01b038416610a65576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610aac939291906134fb565b60405180910390a361098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ae5611f32565b610aee82612002565b610af8828261200d565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610b2681611b39565b610b2e611c30565b610b36611c8e565b83600003610b70576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610bb0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bba8686612131565b610bf0576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613521565b610cb2576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbd858484611d0f565b50610cc88686612131565b610cfe576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d82919061353e565b90508015610d9457610d9487826121c1565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610ddb93929190613408565b60405180910390a350610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610e1f6123e7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610e4c611c30565b610e54611c8e565b82600003610e8e576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610ece576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed9338385612449565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610aac93929190613557565b610f28611c30565b610f30611c8e565b34600003610f6a576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610faa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b5050905080611037576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161107f93929190613557565b60405180910390a350610af860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110db81611b39565b610a12612686565b6110eb611c30565b6110f3611c8e565b8460000361112d576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661116d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611178338587612449565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd87878787876040516111c395949392919061358d565b60405180910390a3610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006111ff81611b39565b6001600160a01b03821661123f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031615611282576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ac7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113335750825b905060008267ffffffffffffffff1660011480156113505750303b155b90508115801561135e575080155b15611395576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141357506001600160a01b038716155b1561144a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114526126ff565b61145a612707565b6114626126ff565b61146a612717565b611475600087611b43565b506114a07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b43565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114fe7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b43565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115935784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96115c781611b39565b6115cf611c30565b6115d7611c8e565b84600003611611576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611651576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116656001600160a01b0388168787612727565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906116aa90859060040161362e565b600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b1436878787876040516117259493929190613641565b60405180910390a361175660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461179981611b39565b6109898383611dde565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6117cd81611b39565b6117d5611c30565b6117dd611c8e565b6001600160a01b03851661181d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d806000811461186a576040519150601f19603f3d011682016040523d82523d6000602084013e61186f565b606091505b50509050806118aa576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906118ef90869060040161362e565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14363488888860405161196b9493929190613641565b60405180910390a35061199d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6119ac611c30565b6119b4611c8e565b346000036119ee576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611a2e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611abb576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611b0795949392919061358d565b60405180910390a35061098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610a12813361279b565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c26576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bdc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c8c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d09576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611d2f929190613678565b60006040518083038185875af1925050503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b509150915081611dad576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c26576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611eaa612828565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fbf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610af881611b39565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612085575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120829181019061353e565b60015b6120cb576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612127576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120c2565b6109db8383612883565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190613521565b6003546001600160a01b0390811690831603612310576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613521565b61229d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122fc57600080fd5b505af1158015610e0d573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613521565b6123cd576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610af8906001600160a01b03848116911683612727565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b03908116908316036125ad576124746001600160a01b0383168430846128d9565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613521565b61253a576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561259957600080fd5b505af1158015611756573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190613521565b61266a576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546109db906001600160a01b0384811691869116846128d9565b61268e611c30565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611f14565b611c8c612912565b61270f612912565b611c8c612979565b61271f612912565b611c8c612981565b6040516001600160a01b038381166024830152604482018390526109db91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d2565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610af8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120c2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c8c576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61288c82612a4e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128d1576109db8282612af6565b610af8612b6c565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401612754565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c8c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db8612912565b612989612912565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60006129e76001600160a01b03841683612ba4565b90508051600014158015612a0c575080806020019051810190612a0a9190613521565b155b156109db576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120c2565b806001600160a01b03163b600003612a9d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120c2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b139190613688565b600060405180830381855af49150503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b63858383612bb2565b95945050505050565b3415611c8c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611db183836000612c27565b606082612bc757612bc282612cdd565b611db1565b8151158015612bde57506001600160a01b0384163b155b15612c20576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120c2565b5080611db1565b606081471015612c65576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120c2565b600080856001600160a01b03168486604051612c819190613688565b60006040518083038185875af1925050503d8060008114612cbe576040519150601f19603f3d011682016040523d82523d6000602084013e612cc3565b606091505b5091509150612cd3868383612bb2565b9695505050505050565b805115612ced5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611db157600080fd5b80356001600160a01b0381168114612d7857600080fd5b919050565b600060208284031215612d8f57600080fd5b611db182612d61565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b602083019150836020828501011115612dda57600080fd5b9250929050565b600080600060408486031215612df657600080fd5b612dff84612d61565b9250602084013567ffffffffffffffff811115612e1b57600080fd5b612e2786828701612d98565b9497909650939450505050565b60005b83811015612e4f578181015183820152602001612e37565b50506000910152565b60008151808452612e70816020860160208601612e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db16020830184612e58565b600060208284031215612ec757600080fd5b5035919050565b60008060408385031215612ee157600080fd5b82359150612ef160208401612d61565b90509250929050565b600060808284031215612f0c57600080fd5b50919050565b60008060008060608587031215612f2857600080fd5b612f3185612d61565b9350602085013567ffffffffffffffff811115612f4d57600080fd5b612f5987828801612d98565b909450925050604085013567ffffffffffffffff811115612f7957600080fd5b612f8587828801612efa565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612fd357600080fd5b612fdc83612d61565b9150602083013567ffffffffffffffff811115612ff857600080fd5b8301601f8101851361300957600080fd5b803567ffffffffffffffff81111561302357613023612f91565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561308f5761308f612f91565b6040528181528282016020018710156130a757600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156130df57600080fd5b6130e886612d61565b94506130f660208701612d61565b935060408601359250606086013567ffffffffffffffff81111561311957600080fd5b61312588828901612d98565b969995985093965092949392505050565b6000806000806080858703121561314c57600080fd5b61315585612d61565b93506020850135925061316a60408601612d61565b9150606085013567ffffffffffffffff811115612f7957600080fd5b6000806040838503121561319957600080fd5b6131a283612d61565b9150602083013567ffffffffffffffff8111156131be57600080fd5b6131ca85828601612efa565b9150509250929050565b60008060008060008060a087890312156131ed57600080fd5b6131f687612d61565b95506020870135945061320b60408801612d61565b9350606087013567ffffffffffffffff81111561322757600080fd5b61323389828a01612d98565b909450925050608087013567ffffffffffffffff81111561325357600080fd5b61325f89828a01612efa565b9150509295509295509295565b60008060006060848603121561328157600080fd5b61328a84612d61565b925061329860208501612d61565b91506132a660408501612d61565b90509250925092565b600060608284031215612f0c57600080fd5b60008060008060008060a087890312156132da57600080fd5b6132e387612d61565b95506132f160208801612d61565b945060408701359350606087013567ffffffffffffffff81111561331457600080fd5b61332089828a01612d98565b909450925050608087013567ffffffffffffffff81111561334057600080fd5b61325f89828a016132af565b6000806000806060858703121561336257600080fd5b61336b85612d61565b9350602085013567ffffffffffffffff81111561338757600080fd5b61339387828801612d98565b909450925050604085013567ffffffffffffffff8111156133b357600080fd5b612f85878288016132af565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612b636040830184866133bf565b8015158114610a1257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261346557600080fd5b830160208101925035905067ffffffffffffffff81111561348557600080fd5b803603821315612dda57600080fd5b6001600160a01b036134a582612d61565b168252600060208201356134b881613422565b151560208401526001600160a01b036134d360408401612d61565b1660408401526134e66060830183613430565b60806060860152612b636080860182846133bf565b60408152600061350f6040830185876133bf565b8281036020840152612cd38185613494565b60006020828403121561353357600080fd5b8151611db181613422565b60006020828403121561355057600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612b6360a0830184613494565b8581526001600160a01b03851660208201526080604082015260006135b66080830185876133bf565b82810360608401526135c88185613494565b98975050505050505050565b6001600160a01b036135e582612d61565b1682526000602082013567ffffffffffffffff811680821461360657600080fd5b6020850152506136196040830183613430565b60606040860152612b636060860182846133bf565b602081526000611db160208301846135d4565b84815260606020820152600061365b6060830185876133bf565b828103604084015261366d81856135d4565b979650505050505050565b8183823760009101908152919050565b6000825161369a818460208701612e34565b919091019291505056fea264697066735822122071702af8bdf05199e035af91efa1102a44c9575903879de2e187094ab4253c8164736f6c634300081a0033", + Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516136da6100fd60003960008181611f3d01528181611f6601526123f201526136da6000f3fe6080604052600436106101e35760003560e01c8063616e877a11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461063b578063e63ab1e91461065b578063f7ad60db1461068f578063fc93baef146106a257600080fd5b8063ae7a3a6f146105bb578063c0c53b8b146105db578063d0b492c3146105fb578063d547741f1461061b57600080fd5b806391d14854116100d157806391d14854146104c4578063a217fddf14610529578063a783c7891461053e578063ad3cb1cc1461057257600080fd5b8063616e877a1461045c57806370f23f881461047c5780638456cb591461048f578063870de27a146104a457600080fd5b806345ac7a8d1161017a57806357bec62f1161014957806357bec62f146103b15780635b112591146103d15780635c975abb146103f15780635d62c8601461042857600080fd5b806345ac7a8d146103495780634f1ef286146103695780635131ab591461037c57806352d1902d1461039c57600080fd5b8063248a9ca3116101b6578063248a9ca3146102975780632f2ff15d146102f457806336568abe146103145780633f4ba83a1461033457600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631cff79cd1461023f57806321e093b11461025f575b600080fd5b3480156101f457600080fd5b50610208610203366004612d1f565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612d7d565b61074e565b005b61025261024d366004612de1565b610842565b6040516102149190612ea2565b34801561026b57600080fd5b5060035461027f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102a357600080fd5b506102e66102b2366004612eb5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b34801561030057600080fd5b5061023d61030f366004612ece565b610945565b34801561032057600080fd5b5061023d61032f366004612ece565b61098f565b34801561034057600080fd5b5061023d6109e0565b34801561035557600080fd5b5061023d610364366004612f12565b610a15565b61023d610377366004612fc0565b610add565b34801561038857600080fd5b5061023d6103973660046130c7565b610afc565b3480156103a857600080fd5b506102e6610e15565b3480156103bd57600080fd5b5060025461027f906001600160a01b031681565b3480156103dd57600080fd5b5060015461027f906001600160a01b031681565b3480156103fd57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561043457600080fd5b506102e67f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561046857600080fd5b5061023d610477366004613136565b610e44565b61023d61048a366004613186565b610f20565b34801561049b57600080fd5b5061023d6110b1565b3480156104b057600080fd5b5061023d6104bf3660046131d4565b6110e3565b3480156104d057600080fd5b506102086104df366004612ece565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561053557600080fd5b506102e6600081565b34801561054a57600080fd5b506102e67f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057e57600080fd5b506102526040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105c757600080fd5b5061023d6105d6366004612d7d565b6111f4565b3480156105e757600080fd5b5061023d6105f636600461326c565b6112e8565b34801561060757600080fd5b5061023d6106163660046132c1565b61159d565b34801561062757600080fd5b5061023d610636366004612ece565b61175f565b34801561064757600080fd5b5060005461027f906001600160a01b031681565b34801561066757600080fd5b506102e67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d61069d36600461334c565b6117a3565b61023d6106b0366004612f12565b6119a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611b39565b6001600160a01b038216610799576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b0316156107dc576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61086e81611b39565b610876611c30565b61087e611c8e565b6001600160a01b0385166108be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108cb868686611d0f565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f34878760405161090a93929190613408565b60405180910390a2915061093d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461097f81611b39565b6109898383611b43565b50505050565b6001600160a01b03811633146109d1576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db8282611dde565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0a81611b39565b610a12611ea2565b50565b610a1d611c30565b610a25611c8e565b6001600160a01b038416610a65576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610aac939291906134fb565b60405180910390a361098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ae5611f32565b610aee82612002565b610af8828261200d565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610b2681611b39565b610b2e611c30565b610b36611c8e565b83600003610b70576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610bb0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bba8686612131565b610bf0576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613521565b610cb2576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbd858484611d0f565b50610cc88686612131565b610cfe576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d82919061353e565b90508015610d9457610d9487826121c1565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610ddb93929190613408565b60405180910390a350610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610e1f6123e7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610e4c611c30565b610e54611c8e565b82600003610e8e576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610ece576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed9338385612449565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610aac93929190613557565b610f28611c30565b610f30611c8e565b34600003610f6a576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610faa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b5050905080611037576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161107f93929190613557565b60405180910390a350610af860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110db81611b39565b610a12612686565b6110eb611c30565b6110f3611c8e565b8460000361112d576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661116d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611178338587612449565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd87878787876040516111c395949392919061358d565b60405180910390a3610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006111ff81611b39565b6001600160a01b03821661123f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031615611282576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ac7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113335750825b905060008267ffffffffffffffff1660011480156113505750303b155b90508115801561135e575080155b15611395576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141357506001600160a01b038716155b1561144a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114526126ff565b61145a612707565b6114626126ff565b61146a612717565b611475600087611b43565b506114a07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b43565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114fe7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b43565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115935784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96115c781611b39565b6115cf611c30565b6115d7611c8e565b84600003611611576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611651576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116656001600160a01b0388168787612727565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906116aa90859060040161362e565b600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b1436878787876040516117259493929190613641565b60405180910390a361175660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461179981611b39565b6109898383611dde565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6117cd81611b39565b6117d5611c30565b6117dd611c8e565b6001600160a01b03851661181d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d806000811461186a576040519150601f19603f3d011682016040523d82523d6000602084013e61186f565b606091505b50509050806118aa576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906118ef90869060040161362e565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14363488888860405161196b9493929190613641565b60405180910390a35061199d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6119ac611c30565b6119b4611c8e565b346000036119ee576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611a2e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611abb576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611b0795949392919061358d565b60405180910390a35061098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610a12813361279b565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c26576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bdc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c8c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d09576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611d2f929190613678565b60006040518083038185875af1925050503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b509150915081611dad576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c26576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611eaa612828565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fbf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610af881611b39565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612085575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120829181019061353e565b60015b6120cb576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612127576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120c2565b6109db8383612883565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190613521565b6003546001600160a01b0390811690831603612310576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613521565b61229d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122fc57600080fd5b505af1158015610e0d573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613521565b6123cd576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610af8906001600160a01b03848116911683612727565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b03908116908316036125ad576124746001600160a01b0383168430846128d9565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613521565b61253a576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561259957600080fd5b505af1158015611756573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190613521565b61266a576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546109db906001600160a01b0384811691869116846128d9565b61268e611c30565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611f14565b611c8c612912565b61270f612912565b611c8c612979565b61271f612912565b611c8c612981565b6040516001600160a01b038381166024830152604482018390526109db91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d2565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610af8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120c2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c8c576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61288c82612a4e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128d1576109db8282612af6565b610af8612b6c565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401612754565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c8c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db8612912565b612989612912565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60006129e76001600160a01b03841683612ba4565b90508051600014158015612a0c575080806020019051810190612a0a9190613521565b155b156109db576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120c2565b806001600160a01b03163b600003612a9d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120c2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b139190613688565b600060405180830381855af49150503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b63858383612bb2565b95945050505050565b3415611c8c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611db183836000612c27565b606082612bc757612bc282612cdd565b611db1565b8151158015612bde57506001600160a01b0384163b155b15612c20576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120c2565b5080611db1565b606081471015612c65576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120c2565b600080856001600160a01b03168486604051612c819190613688565b60006040518083038185875af1925050503d8060008114612cbe576040519150601f19603f3d011682016040523d82523d6000602084013e612cc3565b606091505b5091509150612cd3868383612bb2565b9695505050505050565b805115612ced5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611db157600080fd5b80356001600160a01b0381168114612d7857600080fd5b919050565b600060208284031215612d8f57600080fd5b611db182612d61565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b602083019150836020828501011115612dda57600080fd5b9250929050565b600080600060408486031215612df657600080fd5b612dff84612d61565b9250602084013567ffffffffffffffff811115612e1b57600080fd5b612e2786828701612d98565b9497909650939450505050565b60005b83811015612e4f578181015183820152602001612e37565b50506000910152565b60008151808452612e70816020860160208601612e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db16020830184612e58565b600060208284031215612ec757600080fd5b5035919050565b60008060408385031215612ee157600080fd5b82359150612ef160208401612d61565b90509250929050565b600060808284031215612f0c57600080fd5b50919050565b60008060008060608587031215612f2857600080fd5b612f3185612d61565b9350602085013567ffffffffffffffff811115612f4d57600080fd5b612f5987828801612d98565b909450925050604085013567ffffffffffffffff811115612f7957600080fd5b612f8587828801612efa565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612fd357600080fd5b612fdc83612d61565b9150602083013567ffffffffffffffff811115612ff857600080fd5b8301601f8101851361300957600080fd5b803567ffffffffffffffff81111561302357613023612f91565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561308f5761308f612f91565b6040528181528282016020018710156130a757600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156130df57600080fd5b6130e886612d61565b94506130f660208701612d61565b935060408601359250606086013567ffffffffffffffff81111561311957600080fd5b61312588828901612d98565b969995985093965092949392505050565b6000806000806080858703121561314c57600080fd5b61315585612d61565b93506020850135925061316a60408601612d61565b9150606085013567ffffffffffffffff811115612f7957600080fd5b6000806040838503121561319957600080fd5b6131a283612d61565b9150602083013567ffffffffffffffff8111156131be57600080fd5b6131ca85828601612efa565b9150509250929050565b60008060008060008060a087890312156131ed57600080fd5b6131f687612d61565b95506020870135945061320b60408801612d61565b9350606087013567ffffffffffffffff81111561322757600080fd5b61323389828a01612d98565b909450925050608087013567ffffffffffffffff81111561325357600080fd5b61325f89828a01612efa565b9150509295509295509295565b60008060006060848603121561328157600080fd5b61328a84612d61565b925061329860208501612d61565b91506132a660408501612d61565b90509250925092565b600060608284031215612f0c57600080fd5b60008060008060008060a087890312156132da57600080fd5b6132e387612d61565b95506132f160208801612d61565b945060408701359350606087013567ffffffffffffffff81111561331457600080fd5b61332089828a01612d98565b909450925050608087013567ffffffffffffffff81111561334057600080fd5b61325f89828a016132af565b6000806000806060858703121561336257600080fd5b61336b85612d61565b9350602085013567ffffffffffffffff81111561338757600080fd5b61339387828801612d98565b909450925050604085013567ffffffffffffffff8111156133b357600080fd5b612f85878288016132af565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612b636040830184866133bf565b8015158114610a1257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261346557600080fd5b830160208101925035905067ffffffffffffffff81111561348557600080fd5b803603821315612dda57600080fd5b6001600160a01b036134a582612d61565b168252600060208201356134b881613422565b151560208401526001600160a01b036134d360408401612d61565b1660408401526134e66060830183613430565b60806060860152612b636080860182846133bf565b60408152600061350f6040830185876133bf565b8281036020840152612cd38185613494565b60006020828403121561353357600080fd5b8151611db181613422565b60006020828403121561355057600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612b6360a0830184613494565b8581526001600160a01b03851660208201526080604082015260006135b66080830185876133bf565b82810360608401526135c88185613494565b98975050505050505050565b6001600160a01b036135e582612d61565b1682526000602082013567ffffffffffffffff811680821461360657600080fd5b6020850152506136196040830183613430565b60606040860152612b636060860182846133bf565b602081526000611db160208301846135d4565b84815260606020820152600061365b6060830185876133bf565b828103604084015261366d81856135d4565b979650505050505050565b8183823760009101908152919050565b6000825161369a818460208701612e34565b919091019291505056fea26469706673582212203b8368ea9f86c48250158fbefa10354ff79bda36471e56e56adf2940d977abbb64736f6c634300081a0033", } // GatewayEVMABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/gatewayevm.t.sol/gatewayevminboundtest.go b/v2/pkg/gatewayevm.t.sol/gatewayevminboundtest.go index b3a3024e..c4b20f4a 100644 --- a/v2/pkg/gatewayevm.t.sol/gatewayevminboundtest.go +++ b/v2/pkg/gatewayevm.t.sol/gatewayevminboundtest.go @@ -65,7 +65,7 @@ type StdInvariantFuzzSelector struct { // GatewayEVMInboundTestMetaData contains all meta data concerning the GatewayEVMInboundTest contract. var GatewayEVMInboundTestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testCallWithPayload\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testCallWithPayloadFailsIfDestinationIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositERC20ToCustody\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositERC20ToCustodyFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositERC20ToCustodyWithPayload\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositERC20ToCustodyWithPayloadFailsIfTokenIsNotWhitelisted\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositEthToTss\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositEthToTssWithPayload\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZetaToConnector\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositERC20ToCustodyIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositERC20ToCustodyIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositERC20ToCustodyWithPayloadIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositERC20ToCustodyWithPayloadIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositEthToTssIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositEthToTssIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositEthToTssWithPayloadIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testFailDepositEthToTssWithPayloadIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055620f4240602b55348015603357600080fd5b5061e431806100436000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063916a17c611610104578063bb93f11e116100a2578063e306a97811610071578063e306a9781461030b578063e85c5a0714610313578063f96c02df1461031b578063fa7626d41461032357600080fd5b8063bb93f11e146102eb578063c13d738f146102f3578063d896e261146102fb578063e20c9f711461030357600080fd5b8063b0464fdc116100de578063b0464fdc146102bb578063b2849063146102c3578063b5508aa9146102cb578063ba414fa6146102d357600080fd5b8063916a17c6146102965780639fd1e597146102ab578063aa030c1c146102b357600080fd5b806330f7c04f1161017c5780636459542a1161014b5780636459542a1461025c57806366d9a9a0146102645780637478fda01461027957806385226c811461028157600080fd5b806330f7c04f1461023c5780633e5e3c23146102445780633f7286f41461024c57806351da903d1461025457600080fd5b80630a9254e4116101b85780630a9254e4146101f95780631806a9a5146102015780631ed7831c146102095780632ade38801461022757600080fd5b806305a898e2146101df57806306978ca3146101e95780630724d8e3146101f1575b600080fd5b6101e7610330565b005b6101e76104e7565b6101e76105ff565b6101e76107b3565b6101e7611209565b610211611306565b60405161021e9190617a2b565b60405180910390f35b61022f611368565b60405161021e9190617ac7565b6101e76114aa565b61021161191d565b61021161197d565b6101e76119dd565b6101e7611b6c565b61026c611f65565b60405161021e9190617c2d565b6101e76120e7565b6102896121ea565b60405161021e9190617ccb565b61029e6122ba565b60405161021e9190617d42565b6101e76123b5565b6101e76125d7565b61029e612794565b6101e761288f565b610289612b23565b6102db612bf3565b604051901515815260200161021e565b6101e7612cc7565b6101e7612e4a565b6101e7612ffc565b610211613177565b6101e76131d7565b6101e761349a565b6101e761371b565b601f546102db9060ff1681565b6026546040516001600160a01b03909116602482015260019060009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390610428906004016020808252600b908201527f5a65726f41646472657373000000000000000000000000000000000000000000604082015260600190565b600060405180830381600087803b15801561044257600080fd5b505af1158015610456573d6000803e3d6000fd5b50506020546023546040517f870de27a0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063870de27a93506104b19260009288929116908790602890600401617f09565b600060405180830381600087803b1580156104cb57600080fd5b505af11580156104df573d6000803e3d6000fd5b505050505050565b6040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f496e73756666696369656e74455448416d6f756e7400000000000000000000006044820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b50506020546026546040517f70f23f880000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506370f23f88935085926105e6921690602890600401617f5e565b6000604051808303818588803b1580156104cb57600080fd5b6027546020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039182166084820152620186a092919091163190737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561069b57600080fd5b505af11580156106af573d6000803e3d6000fd5b50506026546025546040516001600160a01b039283169450911691507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd906106fe908690600090602890617f80565b60405180910390a36020546026546040517f70f23f880000000000000000000000000000000000000000000000000000000081526001600160a01b03928316926370f23f889286926107599290911690602890600401617f5e565b6000604051808303818588803b15801561077257600080fd5b505af1158015610786573d6000803e3d6000fd5b50506027546001600160a01b03163192506107ae91506107a890508484617fe5565b82613831565b505050565b602580547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602680548216611234179055602780549091166156781790556040516108059061793e565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f08015801561088a573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560275460405191169081906108d39061794b565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610906573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602754602554925190861694810194909452604484019290925290921660648201526109f7919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526138b0565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155602754602554604051929391821692911690610a8390617958565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610abf573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556020546024546027546025546040519385169492831693918316921690610b1a90617965565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610b5e573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556027546040517fca669fa700000000000000000000000000000000000000000000000000000000815291166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015610bfc57600080fd5b505af1158015610c10573d6000803e3d6000fd5b5050602480546027546022546040517f15d57fd40000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216938101939093521692506315d57fd49150604401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610da557600080fd5b505af1158015610db9573d6000803e3d6000fd5b50506020546021546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b158015610e1f57600080fd5b505af1158015610e33573d6000803e3d6000fd5b50506020546022546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b158015610e9957600080fd5b505af1158015610ead573d6000803e3d6000fd5b50506021546023546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639b19251a9150602401600060405180830381600087803b158015610f1357600080fd5b505af1158015610f27573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f8957600080fd5b505af1158015610f9d573d6000803e3d6000fd5b5050602354602554602b546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810191909152911692506340c10f199150604401600060405180830381600087803b15801561100e57600080fd5b505af1158015611022573d6000803e3d6000fd5b50506027546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561109857600080fd5b505af11580156110ac573d6000803e3d6000fd5b5050602254602554602b546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810191909152600060448201529116925063106e62909150606401600060405180830381600087803b15801561112457600080fd5b505af1158015611138573d6000803e3d6000fd5b50506040805160808101825261032180825260016020808401918252838501928352845190810190945260008452606083018490528251602880549251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009093166001600160a01b0392831617929092178255915160298054919093167fffffffffffffffffffffffff000000000000000000000000000000000000000091909116179091559093509150602a906107ae908261806e565b6040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a65726f416464726573730000000000000000000000000000000000000000006044820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401600060405180830381600087803b15801561129f57600080fd5b505af11580156112b3573d6000803e3d6000fd5b50506020546040517f70f23f880000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506370f23f88915083906105e690600090602890600401617f5e565b6060601680548060200260200160405190810160405280929190818152602001828054801561135e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611340575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156114a157600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b8282101561148a5783829060005260206000200180546113fd90617dd9565b80601f016020809104026020016040519081016040528092919081815260200182805461142990617dd9565b80156114765780601f1061144b57610100808354040283529160200191611476565b820191906000526020600020905b81548152906001019060200180831161145957829003601f168201915b5050505050815260200190600101906113de565b50505050815250508152602001906001019061138c565b50505050905090565b6023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09260009216906370a0823190602401602060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a919061812d565b9050611547600082613831565b6026546040516001600160a01b03909116602482015260009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052602354905491517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101879052929350169063095ea7b3906044016020604051808303816000875af115801561162a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164e9190618146565b506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156116dd57600080fd5b505af11580156116f1573d6000803e3d6000fd5b50506026546025546023546040516001600160a01b03938416955091831693507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd92611747928992909116908790602890618168565b60405180910390a36020546026546023546040517f870de27a0000000000000000000000000000000000000000000000000000000081526001600160a01b039384169363870de27a936117ab93908216928992909116908790602890600401617f09565b600060405180830381600087803b1580156117c557600080fd5b505af11580156117d9573d6000803e3d6000fd5b50506023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611845573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611869919061812d565b90506118758482613831565b6023546025546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611903919061812d565b905061191685602b546107a891906181a2565b5050505050565b6060601880548060200260200160405190810160405280929190818152602001828054801561135e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611340575050505050905090565b6060601780548060200260200160405190810160405280929190818152602001828054801561135e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611340575050505050905090565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015611ad757600080fd5b505af1158015611aeb573d6000803e3d6000fd5b50506020546040517f45ac7a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506345ac7a8d9150611b3e9060009085906028906004016181b5565b600060405180830381600087803b158015611b5857600080fd5b505af1158015611916573d6000803e3d6000fd5b6023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09260009216906370a0823190602401602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc919061812d565b9050611c09600082613831565b6023546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af1158015611c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9b9190618146565b506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611d2a57600080fd5b505af1158015611d3e573d6000803e3d6000fd5b50506026546025546023546040516001600160a01b03938416955091831693507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd92611d9292889290911690602890617f80565b60405180910390a36020546026546023546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b039384169363616e877a93611df493908216928892909116906028906004016181e9565b600060405180830381600087803b158015611e0e57600080fd5b505af1158015611e22573d6000803e3d6000fd5b50506023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb2919061812d565b9050611ebe8382613831565b6023546025546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4c919061812d565b9050611f5f84602b546107a891906181a2565b50505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156114a15783829060005260206000209060020201604051806040016040529081600082018054611fbc90617dd9565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe890617dd9565b80156120355780601f1061200a57610100808354040283529160200191612035565b820191906000526020600020905b81548152906001019060200180831161201857829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156120cf57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161207c5790505b50505050508152505081526020019060010190611f89565b6040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a65726f416464726573730000000000000000000000000000000000000000006044820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401600060405180830381600087803b15801561217d57600080fd5b505af1158015612191573d6000803e3d6000fd5b50506020546023546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063616e877a9350611b3e9260009287929116906028906004016181e9565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156114a157838290600052602060002001805461222d90617dd9565b80601f016020809104026020016040519081016040528092919081815260200182805461225990617dd9565b80156122a65780601f1061227b576101008083540402835291602001916122a6565b820191906000526020600020905b81548152906001019060200180831161228957829003601f168201915b50505050508152602001906001019061220e565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156114a15760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561239d57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161234a5790505b505050505081525050815260200190600101906122de565b6027546026546040516001600160a01b039182166024820152620186a09291909116319060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156124c657600080fd5b505af11580156124da573d6000803e3d6000fd5b50506026546025546040516001600160a01b039283169450911691507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd9061252b9087906000908790602890618168565b60405180910390a36020546026546040517ffc93baef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169263fc93baef928792612588929091169086906028906004016181b5565b6000604051808303818588803b1580156125a157600080fd5b505af11580156125b5573d6000803e3d6000fd5b50506027546001600160a01b0316319250611f5f91506107a890508585617fe5565b6026546040516001600160a01b03909116602482015260009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156126da57600080fd5b505af11580156126ee573d6000803e3d6000fd5b50506026546025546040516001600160a01b039283169450911691507f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae1139061273a908590602890618220565b60405180910390a36020546026546040517f45ac7a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316926345ac7a8d92611b3e9291169085906028906004016181b5565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156114a15760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561287757602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116128245790505b505050505081525050815260200190600101906127b8565b6023546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a06024820181905292919091169063095ea7b3906044016020604051808303816000875af1158015612904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129289190618146565b506025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561299b57600080fd5b505af11580156129af573d6000803e3d6000fd5b50506021546023546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639a5904279150602401600060405180830381600087803b158015612a1557600080fd5b505af1158015612a29573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fac2175f1000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b50506020546026546023546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063616e877a9450611b3e9392831692879216906028906004016181e9565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156114a1578382906000526020600020018054612b6690617dd9565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9290617dd9565b8015612bdf5780601f10612bb457610100808354040283529160200191612bdf565b820191906000526020600020905b815481529060010190602001808311612bc257829003601f168201915b505050505081526020019060010190612b47565b60085460009060ff1615612c0b575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015612c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc0919061812d565b1415905090565b6026546040516001600160a01b039091166024820152600090819060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390612dbe9060040160208082526017908201527f496e73756666696369656e744552433230416d6f756e74000000000000000000604082015260600190565b600060405180830381600087803b158015612dd857600080fd5b505af1158015612dec573d6000803e3d6000fd5b50506020546026546023546040517f870de27a0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063870de27a94506104b19392831692889216908790602890600401617f09565b6026546040516001600160a01b039091166024820152600090819060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390612f419060040160208082526015908201527f496e73756666696369656e74455448416d6f756e740000000000000000000000604082015260600190565b600060405180830381600087803b158015612f5b57600080fd5b505af1158015612f6f573d6000803e3d6000fd5b50506020546026546040517ffc93baef0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063fc93baef93508692612fc692169086906028906004016181b5565b6000604051808303818588803b158015612fdf57600080fd5b505af1158015612ff3573d6000803e3d6000fd5b50505050505050565b6026546040516001600160a01b03909116602482015260019060009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb3906130f4906004016020808252600b908201527f5a65726f41646472657373000000000000000000000000000000000000000000604082015260600190565b600060405180830381600087803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50506020546040517ffc93baef0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116925063fc93baef91508490612fc69060009086906028906004016181b5565b6060601580548060200260200160405190810160405280929190818152602001828054801561135e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611340575050505050905090565b602480546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a093810184905291169063095ea7b3906044016020604051808303816000875af1158015613249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326d9190618146565b506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156132fc57600080fd5b505af1158015613310573d6000803e3d6000fd5b50506026546025546024546040516001600160a01b03938416955091831693507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd9261336492879290911690602890617f80565b60405180910390a36020546026546024546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b039384169363616e877a936133c693908216928792909116906028906004016181e9565b600060405180830381600087803b1580156133e057600080fd5b505af11580156133f4573d6000803e3d6000fd5b5050602480546025546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa15801561345f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613483919061812d565b905061349682602b546107a891906181a2565b5050565b6026546040516001600160a01b039091166024820152620186a09060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052602354905491517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101869052929350169063095ea7b3906044016020604051808303816000875af1158015613582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a69190618146565b506025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561361957600080fd5b505af115801561362d573d6000803e3d6000fd5b50506021546023546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639a5904279150602401600060405180830381600087803b15801561369357600080fd5b505af11580156136a7573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fac2175f1000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401612dbe565b6023546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260006024820181905292919091169063095ea7b3906044016020604051808303816000875af115801561378e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b29190618146565b506040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e73756666696369656e744552433230416d6f756e740000000000000000006044820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401612a99565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561389c57600080fd5b505afa1580156104df573d6000803e3d6000fd5b60006138ba617972565b6138c58484836138cf565b9150505b92915050565b6000806138dc858461394a565b905061393f6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f7879000000815250828660405160200161392a929190618245565b60405160208183030381529060405285613956565b9150505b9392505050565b60006139438383613984565b60c0810151516000901561397a5761397384848460c0015161399f565b9050613943565b6139738484613b45565b60006139908383613c30565b61394383836020015184613956565b6000806139aa613c3c565b905060006139b88683613d0f565b905060006139cf82606001518360200151856141b5565b905060006139df838389896143c7565b905060006139ec82615244565b602081015181519192509060030b15613a5f57898260400151604051602001613a16929190618267565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252613a56916004016182e8565b60405180910390fd5b6000613aa26040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001615413565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90613af59084906004016182e8565b602060405180830381865afa158015613b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3691906182fb565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590613b9a9087906004016182e8565b600060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613bdf91908101906183dd565b90506000613c0d8285604051602001613bf9929190618412565b604051602081830303815290604052615613565b90506001600160a01b0381166138c5578484604051602001613a16929190618441565b61349682826000615626565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90613cc39084906004016184ec565b600060405180830381865afa158015613ce0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d089190810190618533565b9250505090565b613d416040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050613d8c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b613d9585615729565b60208201526000613da586615b0e565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015613de7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e0f9190810190618533565b86838560200151604051602001613e29949392919061857c565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190613e819085906004016182e8565b600060405180830381865afa158015613e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ec69190810190618533565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690613f0e908490600401618680565b602060405180830381865afa158015613f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4f9190618146565b613f645781604051602001613a1691906186d2565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890613fa9908490600401618764565b600060405180830381865afa158015613fc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fee9190810190618533565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f6906140359084906004016187b6565b602060405180830381865afa158015614052573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140769190618146565b1561410b576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906140c09084906004016187b6565b600060405180830381865afa1580156140dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141059190810190618533565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016141309190618808565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161415c929190618874565b600060405180830381865afa158015614179573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141a19190810190618533565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816141d15790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061423157614231618899565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061428557614285618899565b6020026020010181905250846040516020016142a191906188c8565b604051602081830303815290604052816002815181106142c3576142c3618899565b6020026020010181905250826040516020016142df9190618934565b6040516020818303038152906040528160038151811061430157614301618899565b6020026020010181905250600061431782615244565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506143a89060408051808201825260008082526020918201528151808301909252845182528085019082015290615d91565b6143bd5785604051602001613a169190618975565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015614417565b511590565b61458b578260200151156144d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401613a56565b8260c001511561458b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401613a56565b6040805160ff8082526120008201909252600091816020015b60608152602001906001900390816145a457905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806145ff90618a06565b935060ff168151811061461457614614618899565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e37000000000000000000000000000000000000008152506040516020016146659190618a25565b60405160208183030381529060405282828061468090618a06565b935060ff168151811061469557614695618899565b60200260200101819052506040518060400160405280600681526020017f6465706c6f7900000000000000000000000000000000000000000000000000008152508282806146e290618a06565b935060ff16815181106146f7576146f7618899565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061474490618a06565b935060ff168151811061475957614759618899565b6020026020010181905250876020015182828061477590618a06565b935060ff168151811061478a5761478a618899565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806147d790618a06565b935060ff16815181106147ec576147ec618899565b60209081029190910101528751828261480481618a06565b935060ff168151811061481957614819618899565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e4964000000000000000000000000000000000000000000000081525082828061486690618a06565b935060ff168151811061487b5761487b618899565b602002602001018190525061488f46615df2565b828261489a81618a06565b935060ff16815181106148af576148af618899565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806148fc90618a06565b935060ff168151811061491157614911618899565b60200260200101819052508682828061492990618a06565b935060ff168151811061493e5761493e618899565b6020908102919091010152855115614a655760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261498f81618a06565b935060ff16815181106149a4576149a4618899565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906149f49089906004016182e8565b600060405180830381865afa158015614a11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614a399190810190618533565b8282614a4481618a06565b935060ff1681518110614a5957614a59618899565b60200260200101819052505b846020015115614b355760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282614aae81618a06565b935060ff1681518110614ac357614ac3618899565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280614b1090618a06565b935060ff1681518110614b2557614b25618899565b6020026020010181905250614cfc565b614b6d6144128660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b614c005760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614bb081618a06565b935060ff1681518110614bc557614bc5618899565b60200260200101819052508460a00151604051602001614be591906188c8565b604051602081830303815290604052828280614b1090618a06565b8460c00151158015614c43575060408089015181518083018352600080825260209182015282518084019093528151835290810190820152614c4190511590565b155b15614cfc5760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614c8781618a06565b935060ff1681518110614c9c57614c9c618899565b6020026020010181905250614cb088615e92565b604051602001614cc091906188c8565b604051602081830303815290604052828280614cdb90618a06565b935060ff1681518110614cf057614cf0618899565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152614d3090511590565b614dc55760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282614d7381618a06565b935060ff1681518110614d8857614d88618899565b60200260200101819052508460400151828280614da490618a06565b935060ff1681518110614db957614db9618899565b60200260200101819052505b606085015115614ee65760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282614e0e81618a06565b935060ff1681518110614e2357614e23618899565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015614e92573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614eba9190810190618533565b8282614ec581618a06565b935060ff1681518110614eda57614eda618899565b60200260200101819052505b60e08501515115614f8d5760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282614f3081618a06565b935060ff1681518110614f4557614f45618899565b6020026020010181905250614f618560e0015160000151615df2565b8282614f6c81618a06565b935060ff1681518110614f8157614f81618899565b60200260200101819052505b60e085015160200151156150375760408051808201909152600a81527f2d2d67617350726963650000000000000000000000000000000000000000000060208201528282614fda81618a06565b935060ff1681518110614fef57614fef618899565b602002602001018190525061500b8560e0015160200151615df2565b828261501681618a06565b935060ff168151811061502b5761502b618899565b60200260200101819052505b60e085015160400151156150e15760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261508481618a06565b935060ff168151811061509957615099618899565b60200260200101819052506150b58560e0015160400151615df2565b82826150c081618a06565b935060ff16815181106150d5576150d5618899565b60200260200101819052505b60e0850151606001511561518b5760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261512e81618a06565b935060ff168151811061514357615143618899565b602002602001018190525061515f8560e0015160600151615df2565b828261516a81618a06565b935060ff168151811061517f5761517f618899565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156151a9576151a9617ff8565b6040519080825280602002602001820160405280156151dc57816020015b60608152602001906001900390816151c75790505b50905060005b8260ff168160ff16101561523557838160ff168151811061520557615205618899565b6020026020010151828260ff168151811061522257615222618899565b60209081029190910101526001016151e2565b5093505050505b949350505050565b61526b6040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916152f191869101618a90565b600060405180830381865afa15801561530e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153369190810190618533565b905060006153448683616981565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016153749190617ccb565b6000604051808303816000875af1158015615393573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153bb9190810190618ad7565b805190915060030b158015906153d45750602081015151155b80156153e35750604081015151155b156143bd57816000815181106153fb576153fb618899565b6020026020010151604051602001613a169190618b8d565b606060006154488560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252865182528087019082015290915061547f9082905b90616ad6565b156155dc5760006154fc826154f6846154f06154c28a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90616afd565b90616b5f565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615560908290616ad6565b156155ca57604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526155c7905b8290616be4565b90505b6155d381616c0a565b92505050613943565b82156155f5578484604051602001613a16929190618d79565b5050604080516020810190915260008152613943565b509392505050565b6000808251602084016000f09392505050565b8160a001511561563557505050565b6000615642848484616c73565b9050600061564f82615244565b602081015181519192509060030b1580156156eb5750604080518082018252600781527f5355434345535300000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526156eb90604080518082018252600080825260209182015281518083019092528451825280850190820152615479565b156156f857505050505050565b60408201515115615718578160400151604051602001613a169190618e20565b80604051602001613a169190618e7e565b6060600061575e8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506157c3905b8290615d91565b1561583257604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139439061582d90839061720e565b616c0a565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615894905b8290617298565b60010361596157604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526158fa906155c0565b50604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139439061582d905b8390616be4565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526159c0906157bc565b15615af757604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615a28908390617332565b905060008160018351615a3b91906181a2565b81518110615a4b57615a4b618899565b60200260200101519050615aee61582d615ac16040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925285518252808601908201529061720e565b95945050505050565b82604051602001613a169190618ee9565b50919050565b60606000615b438360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615ba5906157bc565b15615bb35761394381616c0a565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615c129061588d565b600103615c7c57604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139439061582d9061595a565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615cdb906157bc565b15615af757604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615d43908390617332565b9050600181511115615d7f578060028251615d5e91906181a2565b81518110615d6e57615d6e618899565b602002602001015192505050919050565b5082604051602001613a169190618ee9565b805182516000911115615da6575060006138c9565b81518351602085015160009291615dbc91617fe5565b615dc691906181a2565b905082602001518103615ddd5760019150506138c9565b82516020840151819020912014905092915050565b60606000615dff836173d7565b600101905060008167ffffffffffffffff811115615e1f57615e1f617ff8565b6040519080825280601f01601f191660200182016040528015615e49576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084615e5357509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091615f1e905b82906174b9565b15615f5e57505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615fbd90615f17565b15615ffd57505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d495400000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261605c90615f17565b1561609c57505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526160fb90615f17565b806161605750604080518082018252601081527f47504c2d322e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261616090615f17565b156161a057505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526161ff90615f17565b806162645750604080518082018252601081527f47504c2d332e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261626490615f17565b156162a457505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261630390615f17565b806163685750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261636890615f17565b156163a857505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261640790615f17565b8061646c5750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261646c90615f17565b156164ac57505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261650b90615f17565b1561654b57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526165aa90615f17565b156165ea57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261664990615f17565b1561668957505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166e890615f17565b1561672857505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261678790615f17565b156167c757505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261682690615f17565b8061688b5750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261688b90615f17565b156168cb57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261692a90615f17565b1561696a57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151613a169290602001618fc7565b60608060005b8451811015616a0c57818582815181106169a3576169a3618899565b60200260200101516040516020016169bc929190618412565b6040516020818303038152906040529150600185516169db91906181a2565b8114616a0457816040516020016169f29190619130565b60405160208183030381529060405291505b600101616987565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081616a255790505090508381600081518110616a5057616a50618899565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110616aa457616aa4618899565b60200260200101819052508181600281518110616ac357616ac3618899565b6020908102919091010152949350505050565b6020808301518351835192840151600093616af492918491906174cd565b14159392505050565b60408051808201909152600080825260208201526000616b2f84600001518560200151856000015186602001516175de565b9050836020015181616b4191906181a2565b84518590616b509083906181a2565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015616b845750816138c9565b6020808301519084015160019114616bab5750815160208481015190840151829020919020145b8015616bdc57825184518590616bc29083906181a2565b9052508251602085018051616bd8908390617fe5565b9052505b509192915050565b6040805180820190915260008082526020820152616c038383836176fe565b5092915050565b60606000826000015167ffffffffffffffff811115616c2b57616c2b617ff8565b6040519080825280601f01601f191660200182016040528015616c55576020820181803683370190505b5090506000602082019050616c0381856020015186600001516177a9565b60606000616c7f613c3c565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081616c9c57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280616cf790618a06565b935060ff1681518110616d0c57616d0c618899565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001616d5d9190619171565b604051602081830303815290604052828280616d7890618a06565b935060ff1681518110616d8d57616d8d618899565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280616dda90618a06565b935060ff1681518110616def57616def618899565b602002602001018190525082604051602001616e0b9190618934565b604051602081830303815290604052828280616e2690618a06565b935060ff1681518110616e3b57616e3b618899565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280616e8890618a06565b935060ff1681518110616e9d57616e9d618899565b6020026020010181905250616eb28784617823565b8282616ebd81618a06565b935060ff1681518110616ed257616ed2618899565b602090810291909101015285515115616f7e5760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282616f2481618a06565b935060ff1681518110616f3957616f39618899565b6020026020010181905250616f52866000015184617823565b8282616f5d81618a06565b935060ff1681518110616f7257616f72618899565b60200260200101819052505b856080015115616fec5760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282616fc781618a06565b935060ff1681518110616fdc57616fdc618899565b6020026020010181905250617052565b84156170525760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261703181618a06565b935060ff168151811061704657617046618899565b60200260200101819052505b604086015151156170ee5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261709c81618a06565b935060ff16815181106170b1576170b1618899565b602002602001018190525085604001518282806170cd90618a06565b935060ff16815181106170e2576170e2618899565b60200260200101819052505b8560600151156171585760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261713781618a06565b935060ff168151811061714c5761714c618899565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561717657617176617ff8565b6040519080825280602002602001820160405280156171a957816020015b60608152602001906001900390816171945790505b50905060005b8260ff168160ff16101561720257838160ff16815181106171d2576171d2618899565b6020026020010151828260ff16815181106171ef576171ef618899565b60209081029190910101526001016171af565b50979650505050505050565b60408051808201909152600080825260208201528151835110156172335750816138c9565b8151835160208501516000929161724991617fe5565b61725391906181a2565b60208401519091506001908214617274575082516020840151819020908220145b801561728f5783518551869061728b9083906181a2565b9052505b50929392505050565b60008082600001516172bc85600001518660200151866000015187602001516175de565b6172c69190617fe5565b90505b835160208501516172da9190617fe5565b8111616c0357816172ea816191b6565b925050826000015161732185602001518361730591906181a2565b865161731191906181a2565b83866000015187602001516175de565b61732b9190617fe5565b90506172c9565b606060006173408484617298565b61734b906001617fe5565b67ffffffffffffffff81111561736357617363617ff8565b60405190808252806020026020018201604052801561739657816020015b60608152602001906001900390816173815790505b50905060005b815181101561560b576173b261582d8686616be4565b8282815181106173c4576173c4618899565b602090810291909101015260010161739c565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310617420577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061744c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061746a57662386f26fc10000830492506010015b6305f5e1008310617482576305f5e100830492506008015b612710831061749657612710830492506004015b606483106174a8576064830492506002015b600a83106138c95760010192915050565b60006174c58383617863565b159392505050565b6000808584116175d4576020841161758057600084156175185760016174f48660206181a2565b6174ff9060086191d0565b61750a9060026192ce565b61751491906181a2565b1990505b83518116856175278989617fe5565b61753191906181a2565b805190935082165b81811461756b57878411617553578794505050505061523c565b8361755d816192da565b945050828451169050617539565b6175758785617fe5565b94505050505061523c565b83832061758d85886181a2565b6175979087617fe5565b91505b8582106175d2578482208082036175bf576175b58684617fe5565b935050505061523c565b6175ca6001846181a2565b92505061759a565b505b5092949350505050565b600083818685116176e95760208511617698576000851561762a5760016176068760206181a2565b6176119060086191d0565b61761c9060026192ce565b61762691906181a2565b1990505b8451811660008761763b8b8b617fe5565b61764591906181a2565b855190915083165b82811461768a57818610617672576176658b8b617fe5565b965050505050505061523c565b8561767c816191b6565b96505083865116905061764d565b85965050505050505061523c565b508383206000905b6176aa86896181a2565b82116176e7578583208082036176c6578394505050505061523c565b6176d1600185617fe5565b93505081806176df906191b6565b9250506176a0565b505b6176f38787617fe5565b979650505050505050565b6040805180820190915260008082526020820152600061773085600001518660200151866000015187602001516175de565b60208087018051918601919091525190915061774c90826181a2565b83528451602086015161775f9190617fe5565b810361776e57600085526177a0565b8351835161777c9190617fe5565b8551869061778b9083906181a2565b905250835161779a9082617fe5565b60208601525b50909392505050565b602081106177e157815183526177c0602084617fe5565b92506177cd602083617fe5565b91506177da6020826181a2565b90506177a9565b60001981156178105760016177f78360206181a2565b617803906101006192ce565b61780d91906181a2565b90505b9151835183169219169190911790915250565b606060006178318484613d0f565b805160208083015160405193945061784b939091016192f1565b60405160208183030381529060405291505092915050565b8151815160009190811115617876575081515b6020808501519084015160005b8381101561792f57825182518082146178ff5760001960208710156178de576001846178b08960206181a2565b6178ba9190617fe5565b6178c59060086191d0565b6178d09060026192ce565b6178da91906181a2565b1990505b81811683821681810391146178fc5797506138c99650505050505050565b50505b61790a602086617fe5565b9450617917602085617fe5565b935050506020816179289190617fe5565b9050617883565b50845186516143bd9190619349565b610c9f8061936a83390190565b6112a68061a00983390190565b6119ca8061b2af83390190565b6117838061cc7983390190565b6040518060e001604052806060815260200160608152602001606081526020016000151581526020016000151581526020016000151581526020016179b56179ba565b905290565b604051806101000160405280600015158152602001600015158152602001606081526020016000801916815260200160608152602001606081526020016000151581526020016179b56040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015617a6c5783516001600160a01b0316835260209384019390920191600101617a45565b509095945050505050565b60005b83811015617a92578181015183820152602001617a7a565b50506000910152565b60008151808452617ab3816020860160208601617a77565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015617ba9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018352617b93848651617a9b565b6020958601959094509290920191600101617b59565b509197505050602094850194929092019150600101617aef565b50929695505050505050565b600081518084526020840193506020830160005b82811015617c235781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101617be3565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752617c996040880182617a9b565b9050602082015191508681036020880152617cb48183617bcf565b965050506020938401939190910190600101617c55565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452617d2d858351617a9b565b94506020938401939190910190600101617cf3565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152617dc36040870182617bcf565b9550506020938401939190910190600101617d6a565b600181811c90821680617ded57607f821691505b602082108103615b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546001600160a01b038116845260ff8160a01c1615156020850152506001600160a01b036001830154166040840152600282016080606085015260008154617e7081617dd9565b8060808801526001821660008114617e8f5760018114617ec957617efd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00831660a089015260a082151560051b8901019350617efd565b84600052602060002060005b83811015617ef45781548a820160a00152600190910190602001617ed5565b890160a0019450505b50919695505050505050565b6001600160a01b03861681528460208201526001600160a01b038416604082015260a060608201526000617f4060a0830185617a9b565b8281036080840152617f528185617e26565b98975050505050505050565b6001600160a01b038316815260406020820152600061523c6040830184617e26565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000615aee60a0830184617e26565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156138c9576138c9617fb6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f8211156107ae57806000526020600020601f840160051c8101602085101561804e5750805b601f840160051c820191505b81811015611916576000815560010161805a565b815167ffffffffffffffff81111561808857618088617ff8565b61809c816180968454617dd9565b84618027565b6020601f8211600181146180d057600083156180b85750848201515b600019600385901b1c1916600184901b178455611916565b600084815260208120601f198516915b8281101561810057878501518255602094850194600190920191016180e0565b508482101561811e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561813f57600080fd5b5051919050565b60006020828403121561815857600080fd5b8151801515811461394357600080fd5b8481526001600160a01b03841660208201526080604082015260006181906080830185617a9b565b82810360608401526176f38185617e26565b818103818111156138c9576138c9617fb6565b6001600160a01b03841681526060602082015260006181d76060830185617a9b565b82810360408401526143bd8185617e26565b6001600160a01b03851681528360208201526001600160a01b03831660408201526080606082015260006143bd6080830184617e26565b6040815260006182336040830185617a9b565b828103602084015261393f8185617e26565b6001600160a01b038316815260406020820152600061523c6040830184617a9b565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161829f81601a850160208801617a77565b7f3a20000000000000000000000000000000000000000000000000000000000000601a9184019182015283516182dc81601c840160208801617a77565b01601c01949350505050565b6020815260006139436020830184617a9b565b60006020828403121561830d57600080fd5b81516001600160a01b038116811461394357600080fd5b6040516060810167ffffffffffffffff8111828210171561834757618347617ff8565b60405290565b60008067ffffffffffffffff84111561836857618368617ff8565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561839757618397617ff8565b6040528381529050808284018510156183af57600080fd5b61560b846020830185617a77565b600082601f8301126183ce57600080fd5b6139438383516020850161834d565b6000602082840312156183ef57600080fd5b815167ffffffffffffffff81111561840657600080fd5b6138c5848285016183bd565b60008351618424818460208801617a77565b835190830190618438818360208801617a77565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161847981601a850160208801617a77565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a9184019182015283516184b6816033840160208801617a77565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f555400000000000000000000000000000000000000000060608201526080602082015260006139436080830184617a9b565b60006020828403121561854557600080fd5b815167ffffffffffffffff81111561855c57600080fd5b8201601f8101841361856d57600080fd5b6138c58482516020840161834d565b6000855161858e818460208a01617a77565b7f2f0000000000000000000000000000000000000000000000000000000000000090830190815285516185c8816001840160208a01617a77565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451618606816002840160208901617a77565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351618648816002840160208801617a77565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b6040815260006186936040830184617a9b565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e206172746966616374200081526000825161870a81601f850160208701617a77565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b6040815260006187776040830184617a9b565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b6040815260006187c96040830184617a9b565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251618840816014850160208701617a77565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b6040815260006188876040830185617a9b565b828103602084015261393f8185617a9b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251618900816001850160208701617a77565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251618946818460208701617a77565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e7472616374200000000000000000000000000000000000000000006040820152600082516189f981604b850160208701617a77565b91909101604b0192915050565b600060ff821660ff8103618a1c57618a1c617fb6565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251618a83816029850160208701617a77565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006139436080830184617a9b565b600060208284031215618ae957600080fd5b815167ffffffffffffffff811115618b0057600080fd5b820160608185031215618b1257600080fd5b618b1a618324565b81518060030b8114618b2b57600080fd5b8152602082015167ffffffffffffffff811115618b4757600080fd5b618b53868285016183bd565b602083015250604082015167ffffffffffffffff811115618b7357600080fd5b618b7f868285016183bd565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f2200000000000000000000000000000000000000000000000000000000000000602082015260008251618beb816021850160208701617a77565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f2700000000000000000000000000000000000000000000000000000000000000602082015260008351618dd7816021850160208801617a77565b7f2720696e206f75747075743a20000000000000000000000000000000000000006021918401918201528351618e1481602e840160208801617a77565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251618a83816029850160208701617a77565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a000000000000000000000000000000000000000000000000000000000000602082015260008251618edc816022850160208701617a77565b9190910160220192915050565b7f436f6e7472616374206e616d6520000000000000000000000000000000000000815260008251618f2181600e850160208701617a77565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351618fff816018850160208801617a77565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161903c81601c840160208801617a77565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b60008251619142818460208701617a77565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f726540000000008152600082516191a981601c850160208701617a77565b91909101601c0192915050565b600060001982036191c9576191c9617fb6565b5060010190565b80820281158282048414176138c9576138c9617fb6565b6001815b60018411156192225780850481111561920657619206617fb6565b600184161561921457908102905b60019390931c9280026191eb565b935093915050565b600082619239575060016138c9565b81619246575060006138c9565b816001811461925c576002811461926657619282565b60019150506138c9565b60ff84111561927757619277617fb6565b50506001821b6138c9565b5060208310610133831016604e8410600b84101617156192a5575081810a6138c9565b6192b260001984846191e7565b80600019048211156192c6576192c6617fb6565b029392505050565b6000613943838361922a565b6000816192e9576192e9617fb6565b506000190190565b60008351619303818460208801617a77565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161933d816001840160208801617a77565b01600101949350505050565b8181036000831280158383131683831282161715616c0357616c03617fb656fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a0033608060405234801561001057600080fd5b506040516112a63803806112a683398101604081905261002f91610110565b604051806040016040528060048152602001635a65746160e01b815250604051806040016040528060048152602001635a45544160e01b815250816003908161007891906101e2565b50600461008582826101e2565b5050506001600160a01b03821615806100a557506001600160a01b038116155b156100c35760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b039384166001600160a01b031991821617909155600780549290931691161790556102a0565b80516001600160a01b038116811461010b57600080fd5b919050565b6000806040838503121561012357600080fd5b61012c836100f4565b915061013a602084016100f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061016d57607f821691505b60208210810361018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101dd57806000526020600020601f840160051c810160208510156101ba5750805b601f840160051c820191505b818110156101da57600081556001016101c6565b50505b505050565b81516001600160401b038111156101fb576101fb610143565b61020f816102098454610159565b84610193565b6020601f821160018114610243576000831561022b5750848201515b600019600385901b1c1916600184901b1784556101da565b600084815260208120601f198516915b828110156102735787850151825560209485019460019092019101610253565b50848210156102915786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610ff7806102af6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806379cc679011610081578063a9059cbb11610066578063a9059cbb1461028e578063bff9662a146102a1578063dd62ed3e146102c157600080fd5b806379cc67901461027357806395d89b411461028657600080fd5b806342966c68146102025780635b1125911461021557806370a0823114610235578063779e3b631461026b57600080fd5b80631e458bee116100ee5780631e458bee1461018857806323b872dd1461019b578063313ce567146101ae578063328a01d0146101bd57600080fd5b806306fdde0314610120578063095ea7b31461013e57806315d57fd41461016157806318160ddd14610176575b600080fd5b610128610307565b6040516101359190610d97565b60405180910390f35b61015161014c366004610e2c565b610399565b6040519015158152602001610135565b61017461016f366004610e56565b6103b3565b005b6002545b604051908152602001610135565b610174610196366004610e89565b61057e565b6101516101a9366004610ebc565b610631565b60405160128152602001610135565b6007546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610174610210366004610ef9565b610655565b6006546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a610243366004610f12565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610174610662565b610174610281366004610e2c565b610786565b610128610837565b61015161029c366004610e2c565b610846565b6005546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a6102cf366004610e56565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461031690610f34565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610f34565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b5050505050905090565b6000336103a7818585610854565b60019150505b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1633148015906103f3575060065473ffffffffffffffffffffffffffffffffffffffff163314155b15610431576040517fcdfcef970000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82161580610468575073ffffffffffffffffffffffffffffffffffffffff8116155b1561049f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560058054918516919092161790556040805133815260208101929092527fe79965b5c67dcfb2cf5fe152715e4a7256cee62a3d5dd8484fd8a8539eb8beff910160405180910390a16040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201527f1b9352454524a57a51f24f67dc66d898f616922cd1f7a12d73570ece12b1975c910160405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146105d1576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6105db8383610866565b808373ffffffffffffffffffffffffffffffffffffffff167fc263b302aec62d29105026245f19e16f8e0137066ccd4a8bd941f716bd4096bb8460405161062491815260200190565b60405180910390a3505050565b60003361063f8582856108c6565b61064a858585610995565b506001949350505050565b61065f3382610a40565b50565b60075473ffffffffffffffffffffffffffffffffffffffff1633146106b5576040517fe700765e000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b60065473ffffffffffffffffffffffffffffffffffffffff16610704576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040805133815260208101929092527f5104c9abdc7d111c2aeb4ce890ac70274a4be2ee83f46a62551be5e6ebc82dd0910160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6107e38282610a9c565b8173ffffffffffffffffffffffffffffffffffffffff167f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b18260405161082b91815260200190565b60405180910390a25050565b60606004805461031690610f34565b6000336103a7818585610995565b6108618383836001610ab1565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166108b6576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c260008383610bf9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f5781811015610980576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610428565b61098f84848484036000610ab1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166109e5576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8216610a35576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b610861838383610bf9565b73ffffffffffffffffffffffffffffffffffffffff8216610a90576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c282600083610bf9565b610aa78233836108c6565b6108c28282610a40565b73ffffffffffffffffffffffffffffffffffffffff8416610b01576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8316610b51576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561098f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610beb91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c31578060026000828254610c269190610f87565b90915550610ce39050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cb7576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610428565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610d0c57600280548290039055610d38565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161062491815260200190565b602081526000825180602084015260005b81811015610dc55760208186018101516040868401015201610da8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e2757600080fd5b919050565b60008060408385031215610e3f57600080fd5b610e4883610e03565b946020939093013593505050565b60008060408385031215610e6957600080fd5b610e7283610e03565b9150610e8060208401610e03565b90509250929050565b600080600060608486031215610e9e57600080fd5b610ea784610e03565b95602085013595506040909401359392505050565b600080600060608486031215610ed157600080fd5b610eda84610e03565b9250610ee860208501610e03565b929592945050506040919091013590565b600060208284031215610f0b57600080fd5b5035919050565b600060208284031215610f2457600080fd5b610f2d82610e03565b9392505050565b600181811c90821680610f4857607f821691505b602082108103610f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156103ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220085f01204b33dc17013c78c74fbca32a3da2c0b384ce7c8878c889551af28c6164736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a0033a2646970667358221220dc7c2296952c358fb8eb08a35a151e9c71b5431e044665bfd2fefea5ff0988e064736f6c634300081a0033", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055620f4240602b55348015603357600080fd5b5061e431806100436000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063916a17c611610104578063bb93f11e116100a2578063e306a97811610071578063e306a9781461030b578063e85c5a0714610313578063f96c02df1461031b578063fa7626d41461032357600080fd5b8063bb93f11e146102eb578063c13d738f146102f3578063d896e261146102fb578063e20c9f711461030357600080fd5b8063b0464fdc116100de578063b0464fdc146102bb578063b2849063146102c3578063b5508aa9146102cb578063ba414fa6146102d357600080fd5b8063916a17c6146102965780639fd1e597146102ab578063aa030c1c146102b357600080fd5b806330f7c04f1161017c5780636459542a1161014b5780636459542a1461025c57806366d9a9a0146102645780637478fda01461027957806385226c811461028157600080fd5b806330f7c04f1461023c5780633e5e3c23146102445780633f7286f41461024c57806351da903d1461025457600080fd5b80630a9254e4116101b85780630a9254e4146101f95780631806a9a5146102015780631ed7831c146102095780632ade38801461022757600080fd5b806305a898e2146101df57806306978ca3146101e95780630724d8e3146101f1575b600080fd5b6101e7610330565b005b6101e76104e7565b6101e76105ff565b6101e76107b3565b6101e7611209565b610211611306565b60405161021e9190617a2b565b60405180910390f35b61022f611368565b60405161021e9190617ac7565b6101e76114aa565b61021161191d565b61021161197d565b6101e76119dd565b6101e7611b6c565b61026c611f65565b60405161021e9190617c2d565b6101e76120e7565b6102896121ea565b60405161021e9190617ccb565b61029e6122ba565b60405161021e9190617d42565b6101e76123b5565b6101e76125d7565b61029e612794565b6101e761288f565b610289612b23565b6102db612bf3565b604051901515815260200161021e565b6101e7612cc7565b6101e7612e4a565b6101e7612ffc565b610211613177565b6101e76131d7565b6101e761349a565b6101e761371b565b601f546102db9060ff1681565b6026546040516001600160a01b03909116602482015260019060009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390610428906004016020808252600b908201527f5a65726f41646472657373000000000000000000000000000000000000000000604082015260600190565b600060405180830381600087803b15801561044257600080fd5b505af1158015610456573d6000803e3d6000fd5b50506020546023546040517f870de27a0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063870de27a93506104b19260009288929116908790602890600401617f09565b600060405180830381600087803b1580156104cb57600080fd5b505af11580156104df573d6000803e3d6000fd5b505050505050565b6040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f496e73756666696369656e74455448416d6f756e7400000000000000000000006044820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b50506020546026546040517f70f23f880000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506370f23f88935085926105e6921690602890600401617f5e565b6000604051808303818588803b1580156104cb57600080fd5b6027546020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039182166084820152620186a092919091163190737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561069b57600080fd5b505af11580156106af573d6000803e3d6000fd5b50506026546025546040516001600160a01b039283169450911691507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd906106fe908690600090602890617f80565b60405180910390a36020546026546040517f70f23f880000000000000000000000000000000000000000000000000000000081526001600160a01b03928316926370f23f889286926107599290911690602890600401617f5e565b6000604051808303818588803b15801561077257600080fd5b505af1158015610786573d6000803e3d6000fd5b50506027546001600160a01b03163192506107ae91506107a890508484617fe5565b82613831565b505050565b602580547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602680548216611234179055602780549091166156781790556040516108059061793e565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f08015801561088a573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560275460405191169081906108d39061794b565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610906573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602754602554925190861694810194909452604484019290925290921660648201526109f7919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526138b0565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155602754602554604051929391821692911690610a8390617958565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610abf573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556020546024546027546025546040519385169492831693918316921690610b1a90617965565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610b5e573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556027546040517fca669fa700000000000000000000000000000000000000000000000000000000815291166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015610bfc57600080fd5b505af1158015610c10573d6000803e3d6000fd5b5050602480546027546022546040517f15d57fd40000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216938101939093521692506315d57fd49150604401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610da557600080fd5b505af1158015610db9573d6000803e3d6000fd5b50506020546021546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b158015610e1f57600080fd5b505af1158015610e33573d6000803e3d6000fd5b50506020546022546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b158015610e9957600080fd5b505af1158015610ead573d6000803e3d6000fd5b50506021546023546040517f9b19251a0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639b19251a9150602401600060405180830381600087803b158015610f1357600080fd5b505af1158015610f27573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f8957600080fd5b505af1158015610f9d573d6000803e3d6000fd5b5050602354602554602b546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810191909152911692506340c10f199150604401600060405180830381600087803b15801561100e57600080fd5b505af1158015611022573d6000803e3d6000fd5b50506027546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561109857600080fd5b505af11580156110ac573d6000803e3d6000fd5b5050602254602554602b546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810191909152600060448201529116925063106e62909150606401600060405180830381600087803b15801561112457600080fd5b505af1158015611138573d6000803e3d6000fd5b50506040805160808101825261032180825260016020808401918252838501928352845190810190945260008452606083018490528251602880549251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009093166001600160a01b0392831617929092178255915160298054919093167fffffffffffffffffffffffff000000000000000000000000000000000000000091909116179091559093509150602a906107ae908261806e565b6040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a65726f416464726573730000000000000000000000000000000000000000006044820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401600060405180830381600087803b15801561129f57600080fd5b505af11580156112b3573d6000803e3d6000fd5b50506020546040517f70f23f880000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506370f23f88915083906105e690600090602890600401617f5e565b6060601680548060200260200160405190810160405280929190818152602001828054801561135e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611340575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156114a157600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b8282101561148a5783829060005260206000200180546113fd90617dd9565b80601f016020809104026020016040519081016040528092919081815260200182805461142990617dd9565b80156114765780601f1061144b57610100808354040283529160200191611476565b820191906000526020600020905b81548152906001019060200180831161145957829003601f168201915b5050505050815260200190600101906113de565b50505050815250508152602001906001019061138c565b50505050905090565b6023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09260009216906370a0823190602401602060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a919061812d565b9050611547600082613831565b6026546040516001600160a01b03909116602482015260009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052602354905491517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101879052929350169063095ea7b3906044016020604051808303816000875af115801561162a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164e9190618146565b506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156116dd57600080fd5b505af11580156116f1573d6000803e3d6000fd5b50506026546025546023546040516001600160a01b03938416955091831693507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd92611747928992909116908790602890618168565b60405180910390a36020546026546023546040517f870de27a0000000000000000000000000000000000000000000000000000000081526001600160a01b039384169363870de27a936117ab93908216928992909116908790602890600401617f09565b600060405180830381600087803b1580156117c557600080fd5b505af11580156117d9573d6000803e3d6000fd5b50506023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611845573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611869919061812d565b90506118758482613831565b6023546025546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611903919061812d565b905061191685602b546107a891906181a2565b5050505050565b6060601880548060200260200160405190810160405280929190818152602001828054801561135e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611340575050505050905090565b6060601780548060200260200160405190810160405280929190818152602001828054801561135e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611340575050505050905090565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015611ad757600080fd5b505af1158015611aeb573d6000803e3d6000fd5b50506020546040517f45ac7a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506345ac7a8d9150611b3e9060009085906028906004016181b5565b600060405180830381600087803b158015611b5857600080fd5b505af1158015611916573d6000803e3d6000fd5b6023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09260009216906370a0823190602401602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc919061812d565b9050611c09600082613831565b6023546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af1158015611c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9b9190618146565b506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611d2a57600080fd5b505af1158015611d3e573d6000803e3d6000fd5b50506026546025546023546040516001600160a01b03938416955091831693507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd92611d9292889290911690602890617f80565b60405180910390a36020546026546023546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b039384169363616e877a93611df493908216928892909116906028906004016181e9565b600060405180830381600087803b158015611e0e57600080fd5b505af1158015611e22573d6000803e3d6000fd5b50506023546021546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb2919061812d565b9050611ebe8382613831565b6023546025546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4c919061812d565b9050611f5f84602b546107a891906181a2565b50505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156114a15783829060005260206000209060020201604051806040016040529081600082018054611fbc90617dd9565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe890617dd9565b80156120355780601f1061200a57610100808354040283529160200191612035565b820191906000526020600020905b81548152906001019060200180831161201857829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156120cf57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161207c5790505b50505050508152505081526020019060010190611f89565b6040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a65726f416464726573730000000000000000000000000000000000000000006044820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401600060405180830381600087803b15801561217d57600080fd5b505af1158015612191573d6000803e3d6000fd5b50506020546023546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063616e877a9350611b3e9260009287929116906028906004016181e9565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156114a157838290600052602060002001805461222d90617dd9565b80601f016020809104026020016040519081016040528092919081815260200182805461225990617dd9565b80156122a65780601f1061227b576101008083540402835291602001916122a6565b820191906000526020600020905b81548152906001019060200180831161228957829003601f168201915b50505050508152602001906001019061220e565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156114a15760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561239d57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161234a5790505b505050505081525050815260200190600101906122de565b6027546026546040516001600160a01b039182166024820152620186a09291909116319060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156124c657600080fd5b505af11580156124da573d6000803e3d6000fd5b50506026546025546040516001600160a01b039283169450911691507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd9061252b9087906000908790602890618168565b60405180910390a36020546026546040517ffc93baef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169263fc93baef928792612588929091169086906028906004016181b5565b6000604051808303818588803b1580156125a157600080fd5b505af11580156125b5573d6000803e3d6000fd5b50506027546001600160a01b0316319250611f5f91506107a890508585617fe5565b6026546040516001600160a01b03909116602482015260009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156126da57600080fd5b505af11580156126ee573d6000803e3d6000fd5b50506026546025546040516001600160a01b039283169450911691507f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae1139061273a908590602890618220565b60405180910390a36020546026546040517f45ac7a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316926345ac7a8d92611b3e9291169085906028906004016181b5565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156114a15760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561287757602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116128245790505b505050505081525050815260200190600101906127b8565b6023546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a06024820181905292919091169063095ea7b3906044016020604051808303816000875af1158015612904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129289190618146565b506025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561299b57600080fd5b505af11580156129af573d6000803e3d6000fd5b50506021546023546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639a5904279150602401600060405180830381600087803b158015612a1557600080fd5b505af1158015612a29573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fac2175f1000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b50506020546026546023546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063616e877a9450611b3e9392831692879216906028906004016181e9565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156114a1578382906000526020600020018054612b6690617dd9565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9290617dd9565b8015612bdf5780601f10612bb457610100808354040283529160200191612bdf565b820191906000526020600020905b815481529060010190602001808311612bc257829003601f168201915b505050505081526020019060010190612b47565b60085460009060ff1615612c0b575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015612c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc0919061812d565b1415905090565b6026546040516001600160a01b039091166024820152600090819060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390612dbe9060040160208082526017908201527f496e73756666696369656e744552433230416d6f756e74000000000000000000604082015260600190565b600060405180830381600087803b158015612dd857600080fd5b505af1158015612dec573d6000803e3d6000fd5b50506020546026546023546040517f870de27a0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063870de27a94506104b19392831692889216908790602890600401617f09565b6026546040516001600160a01b039091166024820152600090819060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390612f419060040160208082526015908201527f496e73756666696369656e74455448416d6f756e740000000000000000000000604082015260600190565b600060405180830381600087803b158015612f5b57600080fd5b505af1158015612f6f573d6000803e3d6000fd5b50506020546026546040517ffc93baef0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063fc93baef93508692612fc692169086906028906004016181b5565b6000604051808303818588803b158015612fdf57600080fd5b505af1158015612ff3573d6000803e3d6000fd5b50505050505050565b6026546040516001600160a01b03909116602482015260019060009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb3906130f4906004016020808252600b908201527f5a65726f41646472657373000000000000000000000000000000000000000000604082015260600190565b600060405180830381600087803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50506020546040517ffc93baef0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116925063fc93baef91508490612fc69060009086906028906004016181b5565b6060601580548060200260200160405190810160405280929190818152602001828054801561135e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611340575050505050905090565b602480546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a093810184905291169063095ea7b3906044016020604051808303816000875af1158015613249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326d9190618146565b506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156132fc57600080fd5b505af1158015613310573d6000803e3d6000fd5b50506026546025546024546040516001600160a01b03938416955091831693507f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd9261336492879290911690602890617f80565b60405180910390a36020546026546024546040517f616e877a0000000000000000000000000000000000000000000000000000000081526001600160a01b039384169363616e877a936133c693908216928792909116906028906004016181e9565b600060405180830381600087803b1580156133e057600080fd5b505af11580156133f4573d6000803e3d6000fd5b5050602480546025546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa15801561345f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613483919061812d565b905061349682602b546107a891906181a2565b5050565b6026546040516001600160a01b039091166024820152620186a09060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052602354905491517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101869052929350169063095ea7b3906044016020604051808303816000875af1158015613582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a69190618146565b506025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561361957600080fd5b505af115801561362d573d6000803e3d6000fd5b50506021546023546040517f9a5904270000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291169250639a5904279150602401600060405180830381600087803b15801561369357600080fd5b505af11580156136a7573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fac2175f1000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401612dbe565b6023546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260006024820181905292919091169063095ea7b3906044016020604051808303816000875af115801561378e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b29190618146565b506040517ff28dceb300000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e73756666696369656e744552433230416d6f756e740000000000000000006044820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f28dceb390606401612a99565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561389c57600080fd5b505afa1580156104df573d6000803e3d6000fd5b60006138ba617972565b6138c58484836138cf565b9150505b92915050565b6000806138dc858461394a565b905061393f6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f7879000000815250828660405160200161392a929190618245565b60405160208183030381529060405285613956565b9150505b9392505050565b60006139438383613984565b60c0810151516000901561397a5761397384848460c0015161399f565b9050613943565b6139738484613b45565b60006139908383613c30565b61394383836020015184613956565b6000806139aa613c3c565b905060006139b88683613d0f565b905060006139cf82606001518360200151856141b5565b905060006139df838389896143c7565b905060006139ec82615244565b602081015181519192509060030b15613a5f57898260400151604051602001613a16929190618267565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252613a56916004016182e8565b60405180910390fd5b6000613aa26040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001615413565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90613af59084906004016182e8565b602060405180830381865afa158015613b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3691906182fb565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590613b9a9087906004016182e8565b600060405180830381865afa158015613bb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613bdf91908101906183dd565b90506000613c0d8285604051602001613bf9929190618412565b604051602081830303815290604052615613565b90506001600160a01b0381166138c5578484604051602001613a16929190618441565b61349682826000615626565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90613cc39084906004016184ec565b600060405180830381865afa158015613ce0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d089190810190618533565b9250505090565b613d416040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050613d8c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b613d9585615729565b60208201526000613da586615b0e565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015613de7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e0f9190810190618533565b86838560200151604051602001613e29949392919061857c565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190613e819085906004016182e8565b600060405180830381865afa158015613e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ec69190810190618533565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690613f0e908490600401618680565b602060405180830381865afa158015613f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4f9190618146565b613f645781604051602001613a1691906186d2565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890613fa9908490600401618764565b600060405180830381865afa158015613fc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fee9190810190618533565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f6906140359084906004016187b6565b602060405180830381865afa158015614052573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140769190618146565b1561410b576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906140c09084906004016187b6565b600060405180830381865afa1580156140dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141059190810190618533565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016141309190618808565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161415c929190618874565b600060405180830381865afa158015614179573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141a19190810190618533565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816141d15790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061423157614231618899565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061428557614285618899565b6020026020010181905250846040516020016142a191906188c8565b604051602081830303815290604052816002815181106142c3576142c3618899565b6020026020010181905250826040516020016142df9190618934565b6040516020818303038152906040528160038151811061430157614301618899565b6020026020010181905250600061431782615244565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506143a89060408051808201825260008082526020918201528151808301909252845182528085019082015290615d91565b6143bd5785604051602001613a169190618975565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015614417565b511590565b61458b578260200151156144d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401613a56565b8260c001511561458b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401613a56565b6040805160ff8082526120008201909252600091816020015b60608152602001906001900390816145a457905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806145ff90618a06565b935060ff168151811061461457614614618899565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e37000000000000000000000000000000000000008152506040516020016146659190618a25565b60405160208183030381529060405282828061468090618a06565b935060ff168151811061469557614695618899565b60200260200101819052506040518060400160405280600681526020017f6465706c6f7900000000000000000000000000000000000000000000000000008152508282806146e290618a06565b935060ff16815181106146f7576146f7618899565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061474490618a06565b935060ff168151811061475957614759618899565b6020026020010181905250876020015182828061477590618a06565b935060ff168151811061478a5761478a618899565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806147d790618a06565b935060ff16815181106147ec576147ec618899565b60209081029190910101528751828261480481618a06565b935060ff168151811061481957614819618899565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e4964000000000000000000000000000000000000000000000081525082828061486690618a06565b935060ff168151811061487b5761487b618899565b602002602001018190525061488f46615df2565b828261489a81618a06565b935060ff16815181106148af576148af618899565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806148fc90618a06565b935060ff168151811061491157614911618899565b60200260200101819052508682828061492990618a06565b935060ff168151811061493e5761493e618899565b6020908102919091010152855115614a655760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261498f81618a06565b935060ff16815181106149a4576149a4618899565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906149f49089906004016182e8565b600060405180830381865afa158015614a11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614a399190810190618533565b8282614a4481618a06565b935060ff1681518110614a5957614a59618899565b60200260200101819052505b846020015115614b355760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282614aae81618a06565b935060ff1681518110614ac357614ac3618899565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280614b1090618a06565b935060ff1681518110614b2557614b25618899565b6020026020010181905250614cfc565b614b6d6144128660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b614c005760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614bb081618a06565b935060ff1681518110614bc557614bc5618899565b60200260200101819052508460a00151604051602001614be591906188c8565b604051602081830303815290604052828280614b1090618a06565b8460c00151158015614c43575060408089015181518083018352600080825260209182015282518084019093528151835290810190820152614c4190511590565b155b15614cfc5760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614c8781618a06565b935060ff1681518110614c9c57614c9c618899565b6020026020010181905250614cb088615e92565b604051602001614cc091906188c8565b604051602081830303815290604052828280614cdb90618a06565b935060ff1681518110614cf057614cf0618899565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152614d3090511590565b614dc55760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282614d7381618a06565b935060ff1681518110614d8857614d88618899565b60200260200101819052508460400151828280614da490618a06565b935060ff1681518110614db957614db9618899565b60200260200101819052505b606085015115614ee65760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282614e0e81618a06565b935060ff1681518110614e2357614e23618899565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015614e92573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614eba9190810190618533565b8282614ec581618a06565b935060ff1681518110614eda57614eda618899565b60200260200101819052505b60e08501515115614f8d5760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282614f3081618a06565b935060ff1681518110614f4557614f45618899565b6020026020010181905250614f618560e0015160000151615df2565b8282614f6c81618a06565b935060ff1681518110614f8157614f81618899565b60200260200101819052505b60e085015160200151156150375760408051808201909152600a81527f2d2d67617350726963650000000000000000000000000000000000000000000060208201528282614fda81618a06565b935060ff1681518110614fef57614fef618899565b602002602001018190525061500b8560e0015160200151615df2565b828261501681618a06565b935060ff168151811061502b5761502b618899565b60200260200101819052505b60e085015160400151156150e15760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261508481618a06565b935060ff168151811061509957615099618899565b60200260200101819052506150b58560e0015160400151615df2565b82826150c081618a06565b935060ff16815181106150d5576150d5618899565b60200260200101819052505b60e0850151606001511561518b5760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261512e81618a06565b935060ff168151811061514357615143618899565b602002602001018190525061515f8560e0015160600151615df2565b828261516a81618a06565b935060ff168151811061517f5761517f618899565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156151a9576151a9617ff8565b6040519080825280602002602001820160405280156151dc57816020015b60608152602001906001900390816151c75790505b50905060005b8260ff168160ff16101561523557838160ff168151811061520557615205618899565b6020026020010151828260ff168151811061522257615222618899565b60209081029190910101526001016151e2565b5093505050505b949350505050565b61526b6040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916152f191869101618a90565b600060405180830381865afa15801561530e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153369190810190618533565b905060006153448683616981565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016153749190617ccb565b6000604051808303816000875af1158015615393573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153bb9190810190618ad7565b805190915060030b158015906153d45750602081015151155b80156153e35750604081015151155b156143bd57816000815181106153fb576153fb618899565b6020026020010151604051602001613a169190618b8d565b606060006154488560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252865182528087019082015290915061547f9082905b90616ad6565b156155dc5760006154fc826154f6846154f06154c28a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90616afd565b90616b5f565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615560908290616ad6565b156155ca57604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526155c7905b8290616be4565b90505b6155d381616c0a565b92505050613943565b82156155f5578484604051602001613a16929190618d79565b5050604080516020810190915260008152613943565b509392505050565b6000808251602084016000f09392505050565b8160a001511561563557505050565b6000615642848484616c73565b9050600061564f82615244565b602081015181519192509060030b1580156156eb5750604080518082018252600781527f5355434345535300000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526156eb90604080518082018252600080825260209182015281518083019092528451825280850190820152615479565b156156f857505050505050565b60408201515115615718578160400151604051602001613a169190618e20565b80604051602001613a169190618e7e565b6060600061575e8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506157c3905b8290615d91565b1561583257604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139439061582d90839061720e565b616c0a565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615894905b8290617298565b60010361596157604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526158fa906155c0565b50604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139439061582d905b8390616be4565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526159c0906157bc565b15615af757604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615a28908390617332565b905060008160018351615a3b91906181a2565b81518110615a4b57615a4b618899565b60200260200101519050615aee61582d615ac16040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925285518252808601908201529061720e565b95945050505050565b82604051602001613a169190618ee9565b50919050565b60606000615b438360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615ba5906157bc565b15615bb35761394381616c0a565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615c129061588d565b600103615c7c57604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139439061582d9061595a565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615cdb906157bc565b15615af757604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615d43908390617332565b9050600181511115615d7f578060028251615d5e91906181a2565b81518110615d6e57615d6e618899565b602002602001015192505050919050565b5082604051602001613a169190618ee9565b805182516000911115615da6575060006138c9565b81518351602085015160009291615dbc91617fe5565b615dc691906181a2565b905082602001518103615ddd5760019150506138c9565b82516020840151819020912014905092915050565b60606000615dff836173d7565b600101905060008167ffffffffffffffff811115615e1f57615e1f617ff8565b6040519080825280601f01601f191660200182016040528015615e49576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084615e5357509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091615f1e905b82906174b9565b15615f5e57505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615fbd90615f17565b15615ffd57505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d495400000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261605c90615f17565b1561609c57505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526160fb90615f17565b806161605750604080518082018252601081527f47504c2d322e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261616090615f17565b156161a057505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526161ff90615f17565b806162645750604080518082018252601081527f47504c2d332e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261626490615f17565b156162a457505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261630390615f17565b806163685750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261636890615f17565b156163a857505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261640790615f17565b8061646c5750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261646c90615f17565b156164ac57505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261650b90615f17565b1561654b57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526165aa90615f17565b156165ea57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261664990615f17565b1561668957505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166e890615f17565b1561672857505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261678790615f17565b156167c757505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261682690615f17565b8061688b5750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261688b90615f17565b156168cb57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261692a90615f17565b1561696a57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151613a169290602001618fc7565b60608060005b8451811015616a0c57818582815181106169a3576169a3618899565b60200260200101516040516020016169bc929190618412565b6040516020818303038152906040529150600185516169db91906181a2565b8114616a0457816040516020016169f29190619130565b60405160208183030381529060405291505b600101616987565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081616a255790505090508381600081518110616a5057616a50618899565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110616aa457616aa4618899565b60200260200101819052508181600281518110616ac357616ac3618899565b6020908102919091010152949350505050565b6020808301518351835192840151600093616af492918491906174cd565b14159392505050565b60408051808201909152600080825260208201526000616b2f84600001518560200151856000015186602001516175de565b9050836020015181616b4191906181a2565b84518590616b509083906181a2565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015616b845750816138c9565b6020808301519084015160019114616bab5750815160208481015190840151829020919020145b8015616bdc57825184518590616bc29083906181a2565b9052508251602085018051616bd8908390617fe5565b9052505b509192915050565b6040805180820190915260008082526020820152616c038383836176fe565b5092915050565b60606000826000015167ffffffffffffffff811115616c2b57616c2b617ff8565b6040519080825280601f01601f191660200182016040528015616c55576020820181803683370190505b5090506000602082019050616c0381856020015186600001516177a9565b60606000616c7f613c3c565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081616c9c57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280616cf790618a06565b935060ff1681518110616d0c57616d0c618899565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001616d5d9190619171565b604051602081830303815290604052828280616d7890618a06565b935060ff1681518110616d8d57616d8d618899565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280616dda90618a06565b935060ff1681518110616def57616def618899565b602002602001018190525082604051602001616e0b9190618934565b604051602081830303815290604052828280616e2690618a06565b935060ff1681518110616e3b57616e3b618899565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280616e8890618a06565b935060ff1681518110616e9d57616e9d618899565b6020026020010181905250616eb28784617823565b8282616ebd81618a06565b935060ff1681518110616ed257616ed2618899565b602090810291909101015285515115616f7e5760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282616f2481618a06565b935060ff1681518110616f3957616f39618899565b6020026020010181905250616f52866000015184617823565b8282616f5d81618a06565b935060ff1681518110616f7257616f72618899565b60200260200101819052505b856080015115616fec5760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282616fc781618a06565b935060ff1681518110616fdc57616fdc618899565b6020026020010181905250617052565b84156170525760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261703181618a06565b935060ff168151811061704657617046618899565b60200260200101819052505b604086015151156170ee5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261709c81618a06565b935060ff16815181106170b1576170b1618899565b602002602001018190525085604001518282806170cd90618a06565b935060ff16815181106170e2576170e2618899565b60200260200101819052505b8560600151156171585760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261713781618a06565b935060ff168151811061714c5761714c618899565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561717657617176617ff8565b6040519080825280602002602001820160405280156171a957816020015b60608152602001906001900390816171945790505b50905060005b8260ff168160ff16101561720257838160ff16815181106171d2576171d2618899565b6020026020010151828260ff16815181106171ef576171ef618899565b60209081029190910101526001016171af565b50979650505050505050565b60408051808201909152600080825260208201528151835110156172335750816138c9565b8151835160208501516000929161724991617fe5565b61725391906181a2565b60208401519091506001908214617274575082516020840151819020908220145b801561728f5783518551869061728b9083906181a2565b9052505b50929392505050565b60008082600001516172bc85600001518660200151866000015187602001516175de565b6172c69190617fe5565b90505b835160208501516172da9190617fe5565b8111616c0357816172ea816191b6565b925050826000015161732185602001518361730591906181a2565b865161731191906181a2565b83866000015187602001516175de565b61732b9190617fe5565b90506172c9565b606060006173408484617298565b61734b906001617fe5565b67ffffffffffffffff81111561736357617363617ff8565b60405190808252806020026020018201604052801561739657816020015b60608152602001906001900390816173815790505b50905060005b815181101561560b576173b261582d8686616be4565b8282815181106173c4576173c4618899565b602090810291909101015260010161739c565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310617420577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061744c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061746a57662386f26fc10000830492506010015b6305f5e1008310617482576305f5e100830492506008015b612710831061749657612710830492506004015b606483106174a8576064830492506002015b600a83106138c95760010192915050565b60006174c58383617863565b159392505050565b6000808584116175d4576020841161758057600084156175185760016174f48660206181a2565b6174ff9060086191d0565b61750a9060026192ce565b61751491906181a2565b1990505b83518116856175278989617fe5565b61753191906181a2565b805190935082165b81811461756b57878411617553578794505050505061523c565b8361755d816192da565b945050828451169050617539565b6175758785617fe5565b94505050505061523c565b83832061758d85886181a2565b6175979087617fe5565b91505b8582106175d2578482208082036175bf576175b58684617fe5565b935050505061523c565b6175ca6001846181a2565b92505061759a565b505b5092949350505050565b600083818685116176e95760208511617698576000851561762a5760016176068760206181a2565b6176119060086191d0565b61761c9060026192ce565b61762691906181a2565b1990505b8451811660008761763b8b8b617fe5565b61764591906181a2565b855190915083165b82811461768a57818610617672576176658b8b617fe5565b965050505050505061523c565b8561767c816191b6565b96505083865116905061764d565b85965050505050505061523c565b508383206000905b6176aa86896181a2565b82116176e7578583208082036176c6578394505050505061523c565b6176d1600185617fe5565b93505081806176df906191b6565b9250506176a0565b505b6176f38787617fe5565b979650505050505050565b6040805180820190915260008082526020820152600061773085600001518660200151866000015187602001516175de565b60208087018051918601919091525190915061774c90826181a2565b83528451602086015161775f9190617fe5565b810361776e57600085526177a0565b8351835161777c9190617fe5565b8551869061778b9083906181a2565b905250835161779a9082617fe5565b60208601525b50909392505050565b602081106177e157815183526177c0602084617fe5565b92506177cd602083617fe5565b91506177da6020826181a2565b90506177a9565b60001981156178105760016177f78360206181a2565b617803906101006192ce565b61780d91906181a2565b90505b9151835183169219169190911790915250565b606060006178318484613d0f565b805160208083015160405193945061784b939091016192f1565b60405160208183030381529060405291505092915050565b8151815160009190811115617876575081515b6020808501519084015160005b8381101561792f57825182518082146178ff5760001960208710156178de576001846178b08960206181a2565b6178ba9190617fe5565b6178c59060086191d0565b6178d09060026192ce565b6178da91906181a2565b1990505b81811683821681810391146178fc5797506138c99650505050505050565b50505b61790a602086617fe5565b9450617917602085617fe5565b935050506020816179289190617fe5565b9050617883565b50845186516143bd9190619349565b610c9f8061936a83390190565b6112a68061a00983390190565b6119ca8061b2af83390190565b6117838061cc7983390190565b6040518060e001604052806060815260200160608152602001606081526020016000151581526020016000151581526020016000151581526020016179b56179ba565b905290565b604051806101000160405280600015158152602001600015158152602001606081526020016000801916815260200160608152602001606081526020016000151581526020016179b56040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015617a6c5783516001600160a01b0316835260209384019390920191600101617a45565b509095945050505050565b60005b83811015617a92578181015183820152602001617a7a565b50506000910152565b60008151808452617ab3816020860160208601617a77565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015617ba9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018352617b93848651617a9b565b6020958601959094509290920191600101617b59565b509197505050602094850194929092019150600101617aef565b50929695505050505050565b600081518084526020840193506020830160005b82811015617c235781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101617be3565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752617c996040880182617a9b565b9050602082015191508681036020880152617cb48183617bcf565b965050506020938401939190910190600101617c55565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452617d2d858351617a9b565b94506020938401939190910190600101617cf3565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617bc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152617dc36040870182617bcf565b9550506020938401939190910190600101617d6a565b600181811c90821680617ded57607f821691505b602082108103615b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546001600160a01b038116845260ff8160a01c1615156020850152506001600160a01b036001830154166040840152600282016080606085015260008154617e7081617dd9565b8060808801526001821660008114617e8f5760018114617ec957617efd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00831660a089015260a082151560051b8901019350617efd565b84600052602060002060005b83811015617ef45781548a820160a00152600190910190602001617ed5565b890160a0019450505b50919695505050505050565b6001600160a01b03861681528460208201526001600160a01b038416604082015260a060608201526000617f4060a0830185617a9b565b8281036080840152617f528185617e26565b98975050505050505050565b6001600160a01b038316815260406020820152600061523c6040830184617e26565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000615aee60a0830184617e26565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156138c9576138c9617fb6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f8211156107ae57806000526020600020601f840160051c8101602085101561804e5750805b601f840160051c820191505b81811015611916576000815560010161805a565b815167ffffffffffffffff81111561808857618088617ff8565b61809c816180968454617dd9565b84618027565b6020601f8211600181146180d057600083156180b85750848201515b600019600385901b1c1916600184901b178455611916565b600084815260208120601f198516915b8281101561810057878501518255602094850194600190920191016180e0565b508482101561811e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561813f57600080fd5b5051919050565b60006020828403121561815857600080fd5b8151801515811461394357600080fd5b8481526001600160a01b03841660208201526080604082015260006181906080830185617a9b565b82810360608401526176f38185617e26565b818103818111156138c9576138c9617fb6565b6001600160a01b03841681526060602082015260006181d76060830185617a9b565b82810360408401526143bd8185617e26565b6001600160a01b03851681528360208201526001600160a01b03831660408201526080606082015260006143bd6080830184617e26565b6040815260006182336040830185617a9b565b828103602084015261393f8185617e26565b6001600160a01b038316815260406020820152600061523c6040830184617a9b565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161829f81601a850160208801617a77565b7f3a20000000000000000000000000000000000000000000000000000000000000601a9184019182015283516182dc81601c840160208801617a77565b01601c01949350505050565b6020815260006139436020830184617a9b565b60006020828403121561830d57600080fd5b81516001600160a01b038116811461394357600080fd5b6040516060810167ffffffffffffffff8111828210171561834757618347617ff8565b60405290565b60008067ffffffffffffffff84111561836857618368617ff8565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561839757618397617ff8565b6040528381529050808284018510156183af57600080fd5b61560b846020830185617a77565b600082601f8301126183ce57600080fd5b6139438383516020850161834d565b6000602082840312156183ef57600080fd5b815167ffffffffffffffff81111561840657600080fd5b6138c5848285016183bd565b60008351618424818460208801617a77565b835190830190618438818360208801617a77565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161847981601a850160208801617a77565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a9184019182015283516184b6816033840160208801617a77565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f555400000000000000000000000000000000000000000060608201526080602082015260006139436080830184617a9b565b60006020828403121561854557600080fd5b815167ffffffffffffffff81111561855c57600080fd5b8201601f8101841361856d57600080fd5b6138c58482516020840161834d565b6000855161858e818460208a01617a77565b7f2f0000000000000000000000000000000000000000000000000000000000000090830190815285516185c8816001840160208a01617a77565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451618606816002840160208901617a77565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351618648816002840160208801617a77565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b6040815260006186936040830184617a9b565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e206172746966616374200081526000825161870a81601f850160208701617a77565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b6040815260006187776040830184617a9b565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b6040815260006187c96040830184617a9b565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251618840816014850160208701617a77565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b6040815260006188876040830185617a9b565b828103602084015261393f8185617a9b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251618900816001850160208701617a77565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251618946818460208701617a77565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e7472616374200000000000000000000000000000000000000000006040820152600082516189f981604b850160208701617a77565b91909101604b0192915050565b600060ff821660ff8103618a1c57618a1c617fb6565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251618a83816029850160208701617a77565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006139436080830184617a9b565b600060208284031215618ae957600080fd5b815167ffffffffffffffff811115618b0057600080fd5b820160608185031215618b1257600080fd5b618b1a618324565b81518060030b8114618b2b57600080fd5b8152602082015167ffffffffffffffff811115618b4757600080fd5b618b53868285016183bd565b602083015250604082015167ffffffffffffffff811115618b7357600080fd5b618b7f868285016183bd565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f2200000000000000000000000000000000000000000000000000000000000000602082015260008251618beb816021850160208701617a77565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f2700000000000000000000000000000000000000000000000000000000000000602082015260008351618dd7816021850160208801617a77565b7f2720696e206f75747075743a20000000000000000000000000000000000000006021918401918201528351618e1481602e840160208801617a77565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251618a83816029850160208701617a77565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a000000000000000000000000000000000000000000000000000000000000602082015260008251618edc816022850160208701617a77565b9190910160220192915050565b7f436f6e7472616374206e616d6520000000000000000000000000000000000000815260008251618f2181600e850160208701617a77565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351618fff816018850160208801617a77565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161903c81601c840160208801617a77565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b60008251619142818460208701617a77565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f726540000000008152600082516191a981601c850160208701617a77565b91909101601c0192915050565b600060001982036191c9576191c9617fb6565b5060010190565b80820281158282048414176138c9576138c9617fb6565b6001815b60018411156192225780850481111561920657619206617fb6565b600184161561921457908102905b60019390931c9280026191eb565b935093915050565b600082619239575060016138c9565b81619246575060006138c9565b816001811461925c576002811461926657619282565b60019150506138c9565b60ff84111561927757619277617fb6565b50506001821b6138c9565b5060208310610133831016604e8410600b84101617156192a5575081810a6138c9565b6192b260001984846191e7565b80600019048211156192c6576192c6617fb6565b029392505050565b6000613943838361922a565b6000816192e9576192e9617fb6565b506000190190565b60008351619303818460208801617a77565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161933d816001840160208801617a77565b01600101949350505050565b8181036000831280158383131683831282161715616c0357616c03617fb656fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a0033608060405234801561001057600080fd5b506040516112a63803806112a683398101604081905261002f91610110565b604051806040016040528060048152602001635a65746160e01b815250604051806040016040528060048152602001635a45544160e01b815250816003908161007891906101e2565b50600461008582826101e2565b5050506001600160a01b03821615806100a557506001600160a01b038116155b156100c35760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b039384166001600160a01b031991821617909155600780549290931691161790556102a0565b80516001600160a01b038116811461010b57600080fd5b919050565b6000806040838503121561012357600080fd5b61012c836100f4565b915061013a602084016100f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061016d57607f821691505b60208210810361018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101dd57806000526020600020601f840160051c810160208510156101ba5750805b601f840160051c820191505b818110156101da57600081556001016101c6565b50505b505050565b81516001600160401b038111156101fb576101fb610143565b61020f816102098454610159565b84610193565b6020601f821160018114610243576000831561022b5750848201515b600019600385901b1c1916600184901b1784556101da565b600084815260208120601f198516915b828110156102735787850151825560209485019460019092019101610253565b50848210156102915786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610ff7806102af6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806379cc679011610081578063a9059cbb11610066578063a9059cbb1461028e578063bff9662a146102a1578063dd62ed3e146102c157600080fd5b806379cc67901461027357806395d89b411461028657600080fd5b806342966c68146102025780635b1125911461021557806370a0823114610235578063779e3b631461026b57600080fd5b80631e458bee116100ee5780631e458bee1461018857806323b872dd1461019b578063313ce567146101ae578063328a01d0146101bd57600080fd5b806306fdde0314610120578063095ea7b31461013e57806315d57fd41461016157806318160ddd14610176575b600080fd5b610128610307565b6040516101359190610d97565b60405180910390f35b61015161014c366004610e2c565b610399565b6040519015158152602001610135565b61017461016f366004610e56565b6103b3565b005b6002545b604051908152602001610135565b610174610196366004610e89565b61057e565b6101516101a9366004610ebc565b610631565b60405160128152602001610135565b6007546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610174610210366004610ef9565b610655565b6006546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a610243366004610f12565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610174610662565b610174610281366004610e2c565b610786565b610128610837565b61015161029c366004610e2c565b610846565b6005546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a6102cf366004610e56565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461031690610f34565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610f34565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b5050505050905090565b6000336103a7818585610854565b60019150505b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1633148015906103f3575060065473ffffffffffffffffffffffffffffffffffffffff163314155b15610431576040517fcdfcef970000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82161580610468575073ffffffffffffffffffffffffffffffffffffffff8116155b1561049f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560058054918516919092161790556040805133815260208101929092527fe79965b5c67dcfb2cf5fe152715e4a7256cee62a3d5dd8484fd8a8539eb8beff910160405180910390a16040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201527f1b9352454524a57a51f24f67dc66d898f616922cd1f7a12d73570ece12b1975c910160405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146105d1576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6105db8383610866565b808373ffffffffffffffffffffffffffffffffffffffff167fc263b302aec62d29105026245f19e16f8e0137066ccd4a8bd941f716bd4096bb8460405161062491815260200190565b60405180910390a3505050565b60003361063f8582856108c6565b61064a858585610995565b506001949350505050565b61065f3382610a40565b50565b60075473ffffffffffffffffffffffffffffffffffffffff1633146106b5576040517fe700765e000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b60065473ffffffffffffffffffffffffffffffffffffffff16610704576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040805133815260208101929092527f5104c9abdc7d111c2aeb4ce890ac70274a4be2ee83f46a62551be5e6ebc82dd0910160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6107e38282610a9c565b8173ffffffffffffffffffffffffffffffffffffffff167f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b18260405161082b91815260200190565b60405180910390a25050565b60606004805461031690610f34565b6000336103a7818585610995565b6108618383836001610ab1565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166108b6576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c260008383610bf9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f5781811015610980576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610428565b61098f84848484036000610ab1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166109e5576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8216610a35576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b610861838383610bf9565b73ffffffffffffffffffffffffffffffffffffffff8216610a90576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c282600083610bf9565b610aa78233836108c6565b6108c28282610a40565b73ffffffffffffffffffffffffffffffffffffffff8416610b01576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8316610b51576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561098f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610beb91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c31578060026000828254610c269190610f87565b90915550610ce39050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cb7576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610428565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610d0c57600280548290039055610d38565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161062491815260200190565b602081526000825180602084015260005b81811015610dc55760208186018101516040868401015201610da8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e2757600080fd5b919050565b60008060408385031215610e3f57600080fd5b610e4883610e03565b946020939093013593505050565b60008060408385031215610e6957600080fd5b610e7283610e03565b9150610e8060208401610e03565b90509250929050565b600080600060608486031215610e9e57600080fd5b610ea784610e03565b95602085013595506040909401359392505050565b600080600060608486031215610ed157600080fd5b610eda84610e03565b9250610ee860208501610e03565b929592945050506040919091013590565b600060208284031215610f0b57600080fd5b5035919050565b600060208284031215610f2457600080fd5b610f2d82610e03565b9392505050565b600181811c90821680610f4857607f821691505b602082108103610f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156103ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220085f01204b33dc17013c78c74fbca32a3da2c0b384ce7c8878c889551af28c6164736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a0033a264697066735822122072bfa1953067da5bd3fcd1139a032829a7335782abd54cef06ab20c3a5740fbb64736f6c634300081a0033", } // GatewayEVMInboundTestABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/gatewayevm.t.sol/gatewayevmtest.go b/v2/pkg/gatewayevm.t.sol/gatewayevmtest.go index 87b42aac..0002277e 100644 --- a/v2/pkg/gatewayevm.t.sol/gatewayevmtest.go +++ b/v2/pkg/gatewayevm.t.sol/gatewayevmtest.go @@ -64,8 +64,8 @@ type StdInvariantFuzzSelector struct { // GatewayEVMTestMetaData contains all meta data concerning the GatewayEVMTest contract. var GatewayEVMTestMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfDestinationIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevert\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertFailsIfSenderIsNotTSS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteWithERC20FailsIfNotCustodyOrConnector\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNoParams\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNoParamsTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNonPayable\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNonPayableFailsIfSenderIsNotTSS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceivePayable\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testRevertWithERC20FailsIfNotCustodyOrConnector\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetConnectorFailsIfSenderIsNotAdmin\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetConnectorFailsIfSet\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetConnectorFailsIfZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetCustodyFailsIfSenderIsNotAdmin\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetCustodyFailsIfSet\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetCustodyFailsIfZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b506201001a806200003e6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c8063a217fddf11610145578063cebad2a6116100bd578063e6afc7901161008c578063fa18c09b11610071578063fa18c09b1461042c578063fa7626d414610434578063fe7bdbb21461044157600080fd5b8063e6afc7901461041c578063f68bd1c01461042457600080fd5b8063cebad2a6146103dd578063dd51e82f146103e5578063e20c9f71146103ed578063e63ab1e9146103f557600080fd5b8063b124dbf511610114578063ba414fa6116100f9578063ba414fa6146103b5578063ccf20616146103cd578063ce5871e1146103d557600080fd5b8063b124dbf5146103a5578063b5508aa9146103ad57600080fd5b8063a217fddf14610366578063a56f7a4b1461036e578063a783c78914610376578063b0464fdc1461039d57600080fd5b806344671b94116101d85780637d7f772a116101a757806385226c811161018c57806385226c811461031557806385f438c11461032a578063916a17c61461035157600080fd5b80637d7f772a146103055780637ebf744f1461030d57600080fd5b806344671b94146102ab57806351010e49146102b35780635d62c860146102bb57806366d9a9a0146102f057600080fd5b80631ed7831c116102145780631ed7831c146102685780632ade3880146102865780633e5e3c231461029b5780633f7286f4146102a357600080fd5b806304b974f9146102465780630a9254e4146102505780631226c655146102585780631855c33714610260575b600080fd5b61024e610449565b005b61024e610656565b61024e611054565b61024e6111f5565b61027061136a565b60405161027d9190618768565b60405180910390f35b61028e6113cc565b60405161027d9190618804565b61027061150e565b61027061156e565b61024e6115ce565b61024e61194d565b6102e27f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b60405190815260200161027d565b6102f8611b29565b60405161027d919061896a565b61024e611cab565b61024e61200e565b61031d612183565b60405161027d9190618a64565b6102e27f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b610359612253565b60405161027d9190618a77565b6102e2600081565b61024e61234e565b6102e27f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6103596124a0565b61024e61259b565b61031d612842565b6103bd612912565b604051901515815260200161027d565b61024e6129e6565b61024e612b38565b61024e612ca9565b61024e612ecd565b6102706136c2565b6102e27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61024e613722565b61024e613990565b61024e613d85565b601f546103bd9060ff1681565b61024e6140e7565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed7016900000000000000000000000000000000000000000000000000000000179052602854925163ca669fa760e01b81529192737109709ecfa91a80626ff3989d68f67f5b1dd12d9263ca669fa7926104f0926001600160a01b031691016001600160a01b0391909116815260200190565b600060405180830381600087803b15801561050a57600080fd5b505af115801561051e573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156105a757600080fd5b505af11580156105bb573d6000803e3d6000fd5b50506020546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169250631cff79cd915061060b906000908590600401618b0e565b6000604051808303816000875af115801561062a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106529190810190618c18565b5050565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880549091166156781790556040516106a890618669565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f08015801561072d573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055602854604051911690819061077690618677565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156107a9573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600e81527f4761746577617945564d2e736f6c000000000000000000000000000000000000602082015260285460265492519085166024820152604481019390935292166064820152610898919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b0000000000000000000000000000000000000000000000000000000017905261455c565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560285460265460405192939182169291169061092490618685565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610960573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460255460285460265460405193851694928316939183169216906109bb90618693565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f0801580156109ff573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560285460405163ca669fa760e01b815291166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015610a8457600080fd5b505af1158015610a98573d6000803e3d6000fd5b50506025546028546023546040517f15d57fd40000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082166024820152911692506315d57fd49150604401600060405180830381600087803b158015610b0957600080fd5b505af1158015610b1d573d6000803e3d6000fd5b50505050604051610b2d906186a1565b604051809103906000f080158015610b49573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610bf557600080fd5b505af1158015610c09573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b158015610cf957600080fd5b505af1158015610d0d573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610de957600080fd5b505af1158015610dfd573d6000803e3d6000fd5b5050602480546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f4240938101939093521692506340c10f199150604401600060405180830381600087803b158015610e6e57600080fd5b505af1158015610e82573d6000803e3d6000fd5b5050602480546022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a1209381019390935216925063a9059cbb91506044016020604051808303816000875af1158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c9190618c4d565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b0390811682526001602080840191825284519081018552600081529383018490528251602c8054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602d9061104f9082618d03565b505050565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561116357600080fd5b505af1158015611177573d6000803e3d6000fd5b50506020546040517fae7a3a6f000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b03909116925063ae7a3a6f91506024015b600060405180830381600087803b1580156111db57600080fd5b505af11580156111ef573d6000803e3d6000fd5b50505050565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561126757600080fd5b505af115801561127b573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fb337f378000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b15801561130557600080fd5b505af1158015611319573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f91506024016111c1565b606060168054806020026020016040519081016040528092919081815260200182805480156113c257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113a4575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b8282101561150557600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156114ee57838290600052602060002001805461146190618c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461148d90618c6f565b80156114da5780601f106114af576101008083540402835291602001916114da565b820191906000526020600020905b8154815290600101906020018083116114bd57829003601f168201915b505050505081526020019060010190611442565b5050505081525050815260200190600101906113f0565b50505050905090565b606060188054806020026020016040519081016040528092919081815260200182805480156113c2576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113a4575050505050905090565b606060178054806020026020016040519081016040528092919081815260200182805480156113c2576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113a4575050505050905090565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed701690000000000000000000000000000000000000000000000000000000017905260215492517ff30c7ba30000000000000000000000000000000000000000000000000000000081529192737109709ecfa91a80626ff3989d68f67f5b1dd12d9263f30c7ba392611684926001600160a01b031691600091879101618dc2565b600060405180830381600087803b15801561169e57600080fd5b505af11580156116b2573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561182a57600080fd5b505af115801561183e573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150611884906000908590618dea565b60405180910390a260285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156118e557600080fd5b505af11580156118f9573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935061060b92909116908590600401618b0e565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152670de0b6b3a76400009060009060250160408051808303601f190181529082905260285463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015611a8a57600080fd5b505af1158015611a9e573d6000803e3d6000fd5b50506020546040517ff7ad60db0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116925063f7ad60db91508490611af3906000908690602c90600401618ed8565b6000604051808303818588803b158015611b0c57600080fd5b505af1158015611b20573d6000803e3d6000fd5b50505050505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156115055783829060005260206000209060020201604051806040016040529081600082018054611b8090618c6f565b80601f0160208091040260200160405190810160405280929190818152602001828054611bac90618c6f565b8015611bf95780601f10611bce57610100808354040283529160200191611bf9565b820191906000526020600020905b815481529060010190602001808311611bdc57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611c9357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611c405790505b50505050508152505081526020019060010190611b4d565b604080516001808252818301909252600091816020015b6060815260200190600190039081611cc25790505090506040518060400160405280600f81526020017f48656c6c6f2c20466f756e64727921000000000000000000000000000000000081525081600081518110611d2257611d22618f0c565b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050602a81600081518110611d6657611d66618f0c565b6020908102919091010152604051600190600090611d8c90859085908590602401618f6d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff05b6abf00000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611e3f57600080fd5b505af1158015611e53573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611f3e9190600401618fa5565b600060405180830381600087803b158015611f5857600080fd5b505af1158015611f6c573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd9350611fc092909116908590600401618b0e565b6000604051808303816000875af1158015611fdf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120079190810190618c18565b5050505050565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561208057600080fd5b505af1158015612094573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f0c8dc016000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b15801561211e57600080fd5b505af1158015612132573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef91506024016111c1565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156115055783829060005260206000200180546121c690618c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546121f290618c6f565b801561223f5780601f106122145761010080835404028352916020019161223f565b820191906000526020600020905b81548152906001019060200180831161222257829003601f168201915b5050505050815260200190600101906121a7565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156115055760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561233657602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116122e35790505b50505050508152505081526020019060010190612277565b6028546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156123c057600080fd5b505af11580156123d4573d6000803e3d6000fd5b5050602854604080516001600160a01b039092166024830152600060448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506112eb9190600401618fa5565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156115055760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561258357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116125305790505b505050505081525050815260200190600101906124c4565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b960448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061277e9190600401618fa5565b600060405180830381600087803b15801561279857600080fd5b505af11580156127ac573d6000803e3d6000fd5b50506020546024546027546040517fd0b492c30000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063d0b492c3945061280c93928316929091169087908790602c90600401618fb8565b600060405180830381600087803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b505050505050565b60606019805480602002602001604051908101604052809291908181526020016000905b8282101561150557838290600052602060002001805461288590618c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546128b190618c6f565b80156128fe5780601f106128d3576101008083540402835291602001916128fe565b820191906000526020600020905b8154815290600101906020018083116128e157829003601f168201915b505050505081526020019060010190612866565b60085460009060ff161561292a575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156129bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129df919061900d565b1415905090565b6028546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015612a5857600080fd5b505af1158015612a6c573d6000803e3d6000fd5b5050602854604080516001600160a01b039092166024830152600060448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506121049190600401618fa5565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015612baa57600080fd5b505af1158015612bbe573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612c4757600080fd5b505af1158015612c5b573d6000803e3d6000fd5b50506020546040517f10188aef000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b0390911692506310188aef91506024016111c1565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152670de0b6b3a76400009060009060250160408051808303601f190181529082905260265463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250612e489190600401618fa5565b600060405180830381600087803b158015612e6257600080fd5b505af1158015612e76573d6000803e3d6000fd5b50506020546021546040517ff7ad60db0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063f7ad60db93508692611af39216908690602c90600401618ed8565b60285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612f2657600080fd5b505af1158015612f3a573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506130259190600401618fa5565b600060405180830381600087803b15801561303f57600080fd5b505af1158015613053573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156130a757600080fd5b505af11580156130bb573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506132179190600401618fa5565b600060405180830381600087803b15801561323157600080fd5b505af1158015613245573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561329957600080fd5b505af11580156132ad573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561330a57600080fd5b505af115801561331e573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561337257600080fd5b505af1158015613386573d6000803e3d6000fd5b5050604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed701690000000000000000000000000000000000000000000000000000000017905292517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd93c06650000000000000000000000000000000000000000000000000000000091810191909152909350737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09101600060405180830381600087803b15801561346857600080fd5b505af115801561347c573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935061354192909116908590600401618b0e565b6000604051808303816000875af1158015613560573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135889190810190618c18565b5060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156135e257600080fd5b505af11580156135f6573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561364a57600080fd5b505af115801561365e573d6000803e3d6000fd5b50506021546040517ff30c7ba3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f30c7ba39250611684916001600160a01b0316906000908690600401618dc2565b606060158054806020026020016040519081016040528092919081815260200182805480156113c2576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113a4575050505050905090565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561380657600080fd5b505af115801561381a573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b960448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506139059190600401618fa5565b600060405180830381600087803b15801561391f57600080fd5b505af1158015613933573d6000803e3d6000fd5b50506020546024546027546040517f5131ab590000000000000000000000000000000000000000000000000000000081526001600160a01b039384169550635131ab59945061280c93928316929091169087908790600401619026565b604080516001808252818301909252600091816020015b60608152602001906001900390816139a75790505090506040518060400160405280600f81526020017f48656c6c6f2c20466f756e64727921000000000000000000000000000000000081525081600081518110613a0757613a07618f0c565b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050602a81600081518110613a4b57613a4b618f0c565b6020908102919091010152604051600190600090613a7190859085908590602401618f6d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff05b6abf0000000000000000000000000000000000000000000000000000000017905260215490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613b2e916001600160a01b0391909116906000908690600401618dc2565b600060405180830381600087803b158015613b4857600080fd5b505af1158015613b5c573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613bee57600080fd5b505af1158015613c02573d6000803e3d6000fd5b50506020546040517f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1469350613c4992506001600160a01b039091169087908790879061905d565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613cdf57600080fd5b505af1158015613cf3573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150613d39906000908590618dea565b60405180910390a260285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401611f3e565b604080517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152815160058183030181526025909101909152602154670de0b6b3a764000091906001600160a01b031631613de481600061457b565b6021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613e7257600080fd5b505af1158015613e86573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e9350613eca92506001600160a01b0390911690602c906190a5565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613f6057600080fd5b505af1158015613f74573d6000803e3d6000fd5b5050602154604051600093506001600160a01b0390911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690613fc790670de0b6b3a7640000908790602c906190c7565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561402857600080fd5b505af115801561403c573d6000803e3d6000fd5b50506020546021546040517ff7ad60db0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063f7ad60db935087926140939216908790602c90600401618ed8565b6000604051808303818588803b1580156140ac57600080fd5b505af11580156140c0573d6000803e3d6000fd5b50506021546001600160a01b03163192506111ef9150829050670de0b6b3a764000061457b565b60408051808201909152600f81527f48656c6c6f2c20466f756e6472792100000000000000000000000000000000006020820152602154602a90600190670de0b6b3a764000090614144906000906001600160a01b03163161457b565b600084848460405160240161415b939291906190e0565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260215490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba39161421f916001600160a01b039190911690670de0b6b3a7640000908690600401618dc2565b600060405180830381600087803b15801561423957600080fd5b505af115801561424d573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156142df57600080fd5b505af11580156142f3573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa935061433c92506001600160a01b0390911690859089908990899061910a565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f915061443390670de0b6b3a7640000908590618dea565b60405180910390a260285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561449457600080fd5b505af11580156144a8573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935086926144fc9216908690600401618b0e565b60006040518083038185885af115801561451a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526145439190810190618c18565b506021546120079083906001600160a01b03163161457b565b60006145666186af565b6145718484836145fa565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b1580156145e657600080fd5b505afa15801561283a573d6000803e3d6000fd5b6000806146078584614675565b905061466a6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614655929190618b0e565b60405160208183030381529060405285614681565b9150505b9392505050565b600061466e83836146af565b60c081015151600090156146a55761469e84848460c001516146ca565b905061466e565b61469e8484614870565b60006146bb838361495b565b61466e83836020015184614681565b6000806146d5614967565b905060006146e38683614a3a565b905060006146fa8260600151836020015185614ee0565b9050600061470a838389896150f2565b9050600061471782615f6f565b602081015181519192509060030b1561478a5789826040015160405160200161474192919061914b565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261478191600401618fa5565b60405180910390fd5b60006147cd6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a20000000000000000000000081525083600161613e565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90614820908490600401618fa5565b602060405180830381865afa15801561483d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486191906191cc565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906148c5908790600401618fa5565b600060405180830381865afa1580156148e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261490a9190810190618c18565b9050600061493882856040516020016149249291906191f5565b60405160208183030381529060405261633e565b90506001600160a01b038116614571578484604051602001614741929190619224565b61065282826000616351565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906149ee9084906004016192cf565b600060405180830381865afa158015614a0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614a339190810190619316565b9250505090565b614a6c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050614ab76040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b614ac085616454565b60208201526000614ad086616839565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015614b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614b3a9190810190619316565b86838560200151604051602001614b54949392919061935f565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190614bac908590600401618fa5565b600060405180830381865afa158015614bc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614bf19190810190619316565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690614c39908490600401619463565b602060405180830381865afa158015614c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7a9190618c4d565b614c8f578160405160200161474191906194b5565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614cd4908490600401619547565b600060405180830381865afa158015614cf1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614d199190810190619316565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f690614d60908490600401619599565b602060405180830381865afa158015614d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614da19190618c4d565b15614e36576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614deb908490600401619599565b600060405180830381865afa158015614e08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614e309190810190619316565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001614e5b91906195eb565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401614e87929190619657565b600060405180830381865afa158015614ea4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614ecc9190810190619316565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081614efc5790505090506040518060400160405280600481526020017f677265700000000000000000000000000000000000000000000000000000000081525081600081518110614f5c57614f5c618f0c565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110614fb057614fb0618f0c565b602002602001018190525084604051602001614fcc919061967c565b60405160208183030381529060405281600281518110614fee57614fee618f0c565b60200260200101819052508260405160200161500a91906196e8565b6040516020818303038152906040528160038151811061502c5761502c618f0c565b6020026020010181905250600061504282615f6f565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506150d39060408051808201825260008082526020918201528151808301909252845182528085019082015290616abc565b6150e857856040516020016147419190619729565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615142565b511590565b6152b6578260200151156151fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401614781565b8260c00151156152b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401614781565b6040805160ff8082526120008201909252600091816020015b60608152602001906001900390816152cf57905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061532a906197e9565b935060ff168151811061533f5761533f618f0c565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e37000000000000000000000000000000000000008152506040516020016153909190619808565b6040516020818303038152906040528282806153ab906197e9565b935060ff16815181106153c0576153c0618f0c565b60200260200101819052506040518060400160405280600681526020017f6465706c6f79000000000000000000000000000000000000000000000000000081525082828061540d906197e9565b935060ff168151811061542257615422618f0c565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061546f906197e9565b935060ff168151811061548457615484618f0c565b602002602001018190525087602001518282806154a0906197e9565b935060ff16815181106154b5576154b5618f0c565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615502906197e9565b935060ff168151811061551757615517618f0c565b60209081029190910101528751828261552f816197e9565b935060ff168151811061554457615544618f0c565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615591906197e9565b935060ff16815181106155a6576155a6618f0c565b60200260200101819052506155ba46616b1d565b82826155c5816197e9565b935060ff16815181106155da576155da618f0c565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615627906197e9565b935060ff168151811061563c5761563c618f0c565b602002602001018190525086828280615654906197e9565b935060ff168151811061566957615669618f0c565b60209081029190910101528551156157905760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826156ba816197e9565b935060ff16815181106156cf576156cf618f0c565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d9061571f908990600401618fa5565b600060405180830381865afa15801561573c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157649190810190619316565b828261576f816197e9565b935060ff168151811061578457615784618f0c565b60200260200101819052505b8460200151156158605760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826157d9816197e9565b935060ff16815181106157ee576157ee618f0c565b60200260200101819052506040518060400160405280600581526020017f66616c736500000000000000000000000000000000000000000000000000000081525082828061583b906197e9565b935060ff168151811061585057615850618f0c565b6020026020010181905250615a27565b61589861513d8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61592b5760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826158db816197e9565b935060ff16815181106158f0576158f0618f0c565b60200260200101819052508460a00151604051602001615910919061967c565b60405160208183030381529060405282828061583b906197e9565b8460c0015115801561596e57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261596c90511590565b155b15615a275760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826159b2816197e9565b935060ff16815181106159c7576159c7618f0c565b60200260200101819052506159db88616bbd565b6040516020016159eb919061967c565b604051602081830303815290604052828280615a06906197e9565b935060ff1681518110615a1b57615a1b618f0c565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152615a5b90511590565b615af05760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282615a9e816197e9565b935060ff1681518110615ab357615ab3618f0c565b60200260200101819052508460400151828280615acf906197e9565b935060ff1681518110615ae457615ae4618f0c565b60200260200101819052505b606085015115615c115760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282615b39816197e9565b935060ff1681518110615b4e57615b4e618f0c565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015615bbd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615be59190810190619316565b8282615bf0816197e9565b935060ff1681518110615c0557615c05618f0c565b60200260200101819052505b60e08501515115615cb85760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282615c5b816197e9565b935060ff1681518110615c7057615c70618f0c565b6020026020010181905250615c8c8560e0015160000151616b1d565b8282615c97816197e9565b935060ff1681518110615cac57615cac618f0c565b60200260200101819052505b60e08501516020015115615d625760408051808201909152600a81527f2d2d67617350726963650000000000000000000000000000000000000000000060208201528282615d05816197e9565b935060ff1681518110615d1a57615d1a618f0c565b6020026020010181905250615d368560e0015160200151616b1d565b8282615d41816197e9565b935060ff1681518110615d5657615d56618f0c565b60200260200101819052505b60e08501516040015115615e0c5760408051808201909152600e81527f2d2d6d617846656550657247617300000000000000000000000000000000000060208201528282615daf816197e9565b935060ff1681518110615dc457615dc4618f0c565b6020026020010181905250615de08560e0015160400151616b1d565b8282615deb816197e9565b935060ff1681518110615e0057615e00618f0c565b60200260200101819052505b60e08501516060015115615eb65760408051808201909152601681527f2d2d6d61785072696f726974794665655065724761730000000000000000000060208201528282615e59816197e9565b935060ff1681518110615e6e57615e6e618f0c565b6020026020010181905250615e8a8560e0015160600151616b1d565b8282615e95816197e9565b935060ff1681518110615eaa57615eaa618f0c565b60200260200101819052505b60008160ff1667ffffffffffffffff811115615ed457615ed4618b30565b604051908082528060200260200182016040528015615f0757816020015b6060815260200190600190039081615ef25790505b50905060005b8260ff168160ff161015615f6057838160ff1681518110615f3057615f30618f0c565b6020026020010151828260ff1681518110615f4d57615f4d618f0c565b6020908102919091010152600101615f0d565b5093505050505b949350505050565b615f966040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161601c91869101619873565b600060405180830381865afa158015616039573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526160619190810190619316565b9050600061606f86836176ac565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b815260040161609f9190618a64565b6000604051808303816000875af11580156160be573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526160e691908101906198ba565b805190915060030b158015906160ff5750602081015151155b801561610e5750604081015151155b156150e8578160008151811061612657616126618f0c565b60200260200101516040516020016147419190619970565b606060006161738560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506161aa9082905b90617801565b15616307576000616227826162218461621b6161ed8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90617828565b9061788a565b604080518082018252600181527f0a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061628b908290617801565b156162f557604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526162f2905b829061790f565b90505b6162fe81617935565b9250505061466e565b8215616320578484604051602001614741929190619b5c565b505060408051602081019091526000815261466e565b509392505050565b6000808251602084016000f09392505050565b8160a001511561636057505050565b600061636d84848461799e565b9050600061637a82615f6f565b602081015181519192509060030b1580156164165750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616416906040805180820182526000808252602091820152815180830190925284518252808501908201526161a4565b1561642357505050505050565b604082015151156164435781604001516040516020016147419190619c03565b806040516020016147419190619c61565b606060006164898360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506164ee905b8290616abc565b1561655d57604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261466e90616558908390617f39565b617935565b604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526165bf905b8290617fc3565b60010361668c57604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616625906162eb565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261466e90616558905b839061790f565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166eb906164e7565b1561682257604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061675390839061805d565b9050600081600183516167669190619ccc565b8151811061677657616776618f0c565b602002602001015190506168196165586167ec6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290617f39565b95945050505050565b826040516020016147419190619cdf565b50919050565b6060600061686e8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506168d0906164e7565b156168de5761466e81617935565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261693d906165b8565b6001036169a757604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261466e9061655890616685565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a06906164e7565b1561682257604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616a6e90839061805d565b9050600181511115616aaa578060028251616a899190619ccc565b81518110616a9957616a99618f0c565b602002602001015192505050919050565b50826040516020016147419190619cdf565b805182516000911115616ad157506000614575565b81518351602085015160009291616ae791619dbd565b616af19190619ccc565b905082602001518103616b08576001915050614575565b82516020840151819020912014905092915050565b60606000616b2a83618102565b600101905060008167ffffffffffffffff811115616b4a57616b4a618b30565b6040519080825280601f01601f191660200182016040528015616b74576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084616b7e57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091616c49905b82906181e4565b15616c8957505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ce890616c42565b15616d2857505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d8790616c42565b15616dc757505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e2690616c42565b80616e8b5750604080518082018252601081527f47504c2d322e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e8b90616c42565b15616ecb57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f2a90616c42565b80616f8f5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f8f90616c42565b15616fcf57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261702e90616c42565b806170935750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261709390616c42565b156170d357505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261713290616c42565b806171975750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261719790616c42565b156171d757505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261723690616c42565b1561727657505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526172d590616c42565b1561731557505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261737490616c42565b156173b457505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261741390616c42565b1561745357505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e3000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526174b290616c42565b156174f257505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261755190616c42565b806175b65750604080518082018252601181527f4147504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175b690616c42565b156175f657505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261765590616c42565b1561769557505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b604080840151845191516147419290602001619dd0565b60608060005b845181101561773757818582815181106176ce576176ce618f0c565b60200260200101516040516020016176e79291906191f5565b6040516020818303038152906040529150600185516177069190619ccc565b811461772f578160405160200161771d9190619f39565b60405160208183030381529060405291505b6001016176b2565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081617750579050509050838160008151811061777b5761777b618f0c565b60200260200101819052506040518060400160405280600281526020017f2d63000000000000000000000000000000000000000000000000000000000000815250816001815181106177cf576177cf618f0c565b602002602001018190525081816002815181106177ee576177ee618f0c565b6020908102919091010152949350505050565b602080830151835183519284015160009361781f92918491906181f8565b14159392505050565b6040805180820190915260008082526020820152600061785a8460000151856020015185600001518660200151618309565b905083602001518161786c9190619ccc565b8451859061787b908390619ccc565b90525060208401525090919050565b60408051808201909152600080825260208201528151835110156178af575081614575565b60208083015190840151600191146178d65750815160208481015190840151829020919020145b8015617907578251845185906178ed908390619ccc565b9052508251602085018051617903908390619dbd565b9052505b509192915050565b604080518082019091526000808252602082015261792e838383618429565b5092915050565b60606000826000015167ffffffffffffffff81111561795657617956618b30565b6040519080825280601f01601f191660200182016040528015617980576020820181803683370190505b509050600060208201905061792e81856020015186600001516184d4565b606060006179aa614967565b6040805160ff808252612000820190925291925060009190816020015b60608152602001906001900390816179c757905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280617a22906197e9565b935060ff1681518110617a3757617a37618f0c565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001617a889190619f7a565b604051602081830303815290604052828280617aa3906197e9565b935060ff1681518110617ab857617ab8618f0c565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280617b05906197e9565b935060ff1681518110617b1a57617b1a618f0c565b602002602001018190525082604051602001617b3691906196e8565b604051602081830303815290604052828280617b51906197e9565b935060ff1681518110617b6657617b66618f0c565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280617bb3906197e9565b935060ff1681518110617bc857617bc8618f0c565b6020026020010181905250617bdd878461854e565b8282617be8816197e9565b935060ff1681518110617bfd57617bfd618f0c565b602090810291909101015285515115617ca95760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282617c4f816197e9565b935060ff1681518110617c6457617c64618f0c565b6020026020010181905250617c7d86600001518461854e565b8282617c88816197e9565b935060ff1681518110617c9d57617c9d618f0c565b60200260200101819052505b856080015115617d175760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282617cf2816197e9565b935060ff1681518110617d0757617d07618f0c565b6020026020010181905250617d7d565b8415617d7d5760408051808201909152601281527f2d2d726571756972655265666572656e6365000000000000000000000000000060208201528282617d5c816197e9565b935060ff1681518110617d7157617d71618f0c565b60200260200101819052505b60408601515115617e195760408051808201909152600d81527f2d2d756e73616665416c6c6f770000000000000000000000000000000000000060208201528282617dc7816197e9565b935060ff1681518110617ddc57617ddc618f0c565b60200260200101819052508560400151828280617df8906197e9565b935060ff1681518110617e0d57617e0d618f0c565b60200260200101819052505b856060015115617e835760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282617e62816197e9565b935060ff1681518110617e7757617e77618f0c565b60200260200101819052505b60008160ff1667ffffffffffffffff811115617ea157617ea1618b30565b604051908082528060200260200182016040528015617ed457816020015b6060815260200190600190039081617ebf5790505b50905060005b8260ff168160ff161015617f2d57838160ff1681518110617efd57617efd618f0c565b6020026020010151828260ff1681518110617f1a57617f1a618f0c565b6020908102919091010152600101617eda565b50979650505050505050565b6040805180820190915260008082526020820152815183511015617f5e575081614575565b81518351602085015160009291617f7491619dbd565b617f7e9190619ccc565b60208401519091506001908214617f9f575082516020840151819020908220145b8015617fba57835185518690617fb6908390619ccc565b9052505b50929392505050565b6000808260000151617fe78560000151866020015186600001518760200151618309565b617ff19190619dbd565b90505b835160208501516180059190619dbd565b811161792e578161801581619fbf565b925050826000015161804c8560200151836180309190619ccc565b865161803c9190619ccc565b8386600001518760200151618309565b6180569190619dbd565b9050617ff4565b6060600061806b8484617fc3565b618076906001619dbd565b67ffffffffffffffff81111561808e5761808e618b30565b6040519080825280602002602001820160405280156180c157816020015b60608152602001906001900390816180ac5790505b50905060005b8151811015616336576180dd616558868661790f565b8282815181106180ef576180ef618f0c565b60209081029190910101526001016180c7565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061814b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310618177576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061819557662386f26fc10000830492506010015b6305f5e10083106181ad576305f5e100830492506008015b61271083106181c157612710830492506004015b606483106181d3576064830492506002015b600a83106145755760010192915050565b60006181f0838361858e565b159392505050565b6000808584116182ff57602084116182ab576000841561824357600161821f866020619ccc565b61822a906008619fd9565b61823590600261a0d7565b61823f9190619ccc565b1990505b83518116856182528989619dbd565b61825c9190619ccc565b805190935082165b8181146182965787841161827e5787945050505050615f67565b836182888161a0e3565b945050828451169050618264565b6182a08785619dbd565b945050505050615f67565b8383206182b88588619ccc565b6182c29087619dbd565b91505b8582106182fd578482208082036182ea576182e08684619dbd565b9350505050615f67565b6182f5600184619ccc565b9250506182c5565b505b5092949350505050565b6000838186851161841457602085116183c35760008515618355576001618331876020619ccc565b61833c906008619fd9565b61834790600261a0d7565b6183519190619ccc565b1990505b845181166000876183668b8b619dbd565b6183709190619ccc565b855190915083165b8281146183b55781861061839d576183908b8b619dbd565b9650505050505050615f67565b856183a781619fbf565b965050838651169050618378565b859650505050505050615f67565b508383206000905b6183d58689619ccc565b8211618412578583208082036183f15783945050505050615f67565b6183fc600185619dbd565b935050818061840a90619fbf565b9250506183cb565b505b61841e8787619dbd565b979650505050505050565b6040805180820190915260008082526020820152600061845b8560000151866020015186600001518760200151618309565b6020808701805191860191909152519091506184779082619ccc565b83528451602086015161848a9190619dbd565b810361849957600085526184cb565b835183516184a79190619dbd565b855186906184b6908390619ccc565b90525083516184c59082619dbd565b60208601525b50909392505050565b6020811061850c57815183526184eb602084619dbd565b92506184f8602083619dbd565b9150618505602082619ccc565b90506184d4565b600019811561853b576001618522836020619ccc565b61852e9061010061a0d7565b6185389190619ccc565b90505b9151835183169219169190911790915250565b6060600061855c8484614a3a565b80516020808301516040519394506185769390910161a0fa565b60405160208183030381529060405291505092915050565b81518151600091908111156185a1575081515b6020808501519084015160005b8381101561865a578251825180821461862a576000196020871015618609576001846185db896020619ccc565b6185e59190619dbd565b6185f0906008619fd9565b6185fb90600261a0d7565b6186059190619ccc565b1990505b81811683821681810391146186275797506145759650505050505050565b50505b618635602086619dbd565b9450618642602085619dbd565b935050506020816186539190619dbd565b90506185ae565b50845186516150e8919061a152565b610c9f806200a17383390190565b6112a6806200ae1283390190565b6119ca806200c0b883390190565b611783806200da8283390190565b610de0806200f20583390190565b6040518060e001604052806060815260200160608152602001606081526020016000151581526020016000151581526020016000151581526020016186f26186f7565b905290565b604051806101000160405280600015158152602001600015158152602001606081526020016000801916815260200160608152602001606081526020016000151581526020016186f26040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b818110156187a95783516001600160a01b0316835260209384019390920191600101618782565b509095945050505050565b60005b838110156187cf5781810151838201526020016187b7565b50506000910152565b600081518084526187f08160208601602086016187b4565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618900577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b818110156188e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a85030183526188d08486516187d8565b6020958601959094509290920191600101618896565b50919750505060209485019492909201915060010161882c565b50929695505050505050565b600081518084526020840193506020830160005b828110156189605781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101618920565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618900577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526189d660408801826187d8565b90506020820151915086810360208801526189f1818361890c565b965050506020938401939190910190600101618992565b600082825180855260208501945060208160051b8301016020850160005b83811015618a5857601f19858403018852618a428383516187d8565b6020988901989093509190910190600101618a26565b50909695505050505050565b60208152600061466e6020830184618a08565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618900577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152618af8604087018261890c565b9550506020938401939190910190600101618a9f565b6001600160a01b0383168152604060208201526000615f6760408301846187d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715618b8257618b82618b30565b60405290565b60008067ffffffffffffffff841115618ba357618ba3618b30565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715618bd257618bd2618b30565b604052838152905080828401851015618bea57600080fd5b6163368460208301856187b4565b600082601f830112618c0957600080fd5b61466e83835160208501618b88565b600060208284031215618c2a57600080fd5b815167ffffffffffffffff811115618c4157600080fd5b61457184828501618bf8565b600060208284031215618c5f57600080fd5b8151801515811461466e57600080fd5b600181811c90821680618c8357607f821691505b602082108103616833577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561104f57806000526020600020601f840160051c81016020851015618ce35750805b601f840160051c820191505b818110156120075760008155600101618cef565b815167ffffffffffffffff811115618d1d57618d1d618b30565b618d3181618d2b8454618c6f565b84618cbc565b6020601f821160018114618d655760008315618d4d5750848201515b600019600385901b1c1916600184901b178455612007565b600084815260208120601f198516915b82811015618d955787850151825560209485019460019092019101618d75565b5084821015618db35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b038416815282602082015260606040820152600061681960608301846187d8565b828152604060208201526000615f6760408301846187d8565b600081546001600160a01b038116845267ffffffffffffffff8160a01c16602085015250600182016060604085015260008154618e3f81618c6f565b8060608801526001821660008114618e5e5760018114618e9857618ecc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b8901019350618ecc565b84600052602060002060005b83811015618ec35781548a820160800152600190910190602001618ea4565b89016080019450505b50919695505050505050565b6001600160a01b0384168152606060208201526000618efa60608301856187d8565b82810360408401526150e88185618e03565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081518084526020840193506020830160005b82811015618960578151865260209586019590910190600101618f4f565b606081526000618f806060830186618a08565b8281036020840152618f928186618f3b565b9150508215156040830152949350505050565b60208152600061466e60208301846187d8565b6001600160a01b03861681526001600160a01b038516602082015283604082015260a060608201526000618fef60a08301856187d8565b82810360808401526190018185618e03565b98975050505050505050565b60006020828403121561901f57600080fd5b5051919050565b6001600160a01b03851681526001600160a01b03841660208201528260408201526080606082015260006150e860808301846187d8565b6001600160a01b038516815260806020820152600061907f6080830186618a08565b82810360408401526190918186618f3b565b915050821515606083015295945050505050565b6001600160a01b0383168152604060208201526000615f676040830184618e03565b838152606060208201526000618efa60608301856187d8565b6060815260006190f360608301866187d8565b602083019490945250901515604090910152919050565b6001600160a01b038616815284602082015260a06040820152600061913260a08301866187d8565b6060830194909452509015156080909101529392505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161918381601a8501602088016187b4565b7f3a20000000000000000000000000000000000000000000000000000000000000601a9184019182015283516191c081601c8401602088016187b4565b01601c01949350505050565b6000602082840312156191de57600080fd5b81516001600160a01b038116811461466e57600080fd5b600083516192078184602088016187b4565b83519083019061921b8183602088016187b4565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161925c81601a8501602088016187b4565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a9184019182015283516192998160338401602088016187b4565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f5554000000000000000000000000000000000000000000606082015260806020820152600061466e60808301846187d8565b60006020828403121561932857600080fd5b815167ffffffffffffffff81111561933f57600080fd5b8201601f8101841361935057600080fd5b61457184825160208401618b88565b60008551619371818460208a016187b4565b7f2f0000000000000000000000000000000000000000000000000000000000000090830190815285516193ab816001840160208a016187b4565b7f2f000000000000000000000000000000000000000000000000000000000000006001929091019182015284516193e98160028401602089016187b4565b6001818301019150507f2f000000000000000000000000000000000000000000000000000000000000006001820152835161942b8160028401602088016187b4565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b60408152600061947660408301846187d8565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e20617274696661637420008152600082516194ed81601f8501602087016187b4565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b60408152600061955a60408301846187d8565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b6040815260006195ac60408301846187d8565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b270000000000000000000000008152600082516196238160148501602087016187b4565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b60408152600061966a60408301856187d8565b828103602084015261466a81856187d8565b7f22000000000000000000000000000000000000000000000000000000000000008152600082516196b48160018501602087016187b4565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b600082516196fa8184602087016187b4565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e7472616374200000000000000000000000000000000000000000006040820152600082516197ad81604b8501602087016187b4565b91909101604b0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff81036197ff576197ff6197ba565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c694000000000000000000000000000000000000000000000006020820152600082516198668160298501602087016187b4565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f5041544800000000000000000000606082015260806020820152600061466e60808301846187d8565b6000602082840312156198cc57600080fd5b815167ffffffffffffffff8111156198e357600080fd5b8201606081850312156198f557600080fd5b6198fd618b5f565b81518060030b811461990e57600080fd5b8152602082015167ffffffffffffffff81111561992a57600080fd5b61993686828501618bf8565b602083015250604082015167ffffffffffffffff81111561995657600080fd5b61996286828501618bf8565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f22000000000000000000000000000000000000000000000000000000000000006020820152600082516199ce8160218501602087016187b4565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f2700000000000000000000000000000000000000000000000000000000000000602082015260008351619bba8160218501602088016187b4565b7f2720696e206f75747075743a20000000000000000000000000000000000000006021918401918201528351619bf781602e8401602088016187b4565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a2000000000000000000000000000000000000000000000006020820152600082516198668160298501602087016187b4565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a000000000000000000000000000000000000000000000000000000000000602082015260008251619cbf8160228501602087016187b4565b9190910160220192915050565b81810381811115614575576145756197ba565b7f436f6e7472616374206e616d6520000000000000000000000000000000000000815260008251619d1781600e8501602087016187b4565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b80820180821115614575576145756197ba565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351619e088160188501602088016187b4565b7f20696e20000000000000000000000000000000000000000000000000000000006018918401918201528351619e4581601c8401602088016187b4565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b60008251619f4b8184602087016187b4565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f72654000000000815260008251619fb281601c8501602087016187b4565b91909101601c0192915050565b60006000198203619fd257619fd26197ba565b5060010190565b8082028115828204841417614575576145756197ba565b6001815b600184111561a02b5780850481111561a00f5761a00f6197ba565b600184161561a01d57908102905b60019390931c928002619ff4565b935093915050565b60008261a04257506001614575565b8161a04f57506000614575565b816001811461a065576002811461a06f5761a08b565b6001915050614575565b60ff84111561a0805761a0806197ba565b50506001821b614575565b5060208310610133831016604e8410600b841016171561a0ae575081810a614575565b61a0bb6000198484619ff0565b806000190482111561a0cf5761a0cf6197ba565b029392505050565b600061466e838361a033565b60008161a0f25761a0f26197ba565b506000190190565b6000835161a10c8184602088016187b4565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a1468160018401602088016187b4565b01600101949350505050565b818103600083128015838313168383128216171561792e5761792e6197ba56fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a0033608060405234801561001057600080fd5b506040516112a63803806112a683398101604081905261002f91610110565b604051806040016040528060048152602001635a65746160e01b815250604051806040016040528060048152602001635a45544160e01b815250816003908161007891906101e2565b50600461008582826101e2565b5050506001600160a01b03821615806100a557506001600160a01b038116155b156100c35760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b039384166001600160a01b031991821617909155600780549290931691161790556102a0565b80516001600160a01b038116811461010b57600080fd5b919050565b6000806040838503121561012357600080fd5b61012c836100f4565b915061013a602084016100f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061016d57607f821691505b60208210810361018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101dd57806000526020600020601f840160051c810160208510156101ba5750805b601f840160051c820191505b818110156101da57600081556001016101c6565b50505b505050565b81516001600160401b038111156101fb576101fb610143565b61020f816102098454610159565b84610193565b6020601f821160018114610243576000831561022b5750848201515b600019600385901b1c1916600184901b1784556101da565b600084815260208120601f198516915b828110156102735787850151825560209485019460019092019101610253565b50848210156102915786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610ff7806102af6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806379cc679011610081578063a9059cbb11610066578063a9059cbb1461028e578063bff9662a146102a1578063dd62ed3e146102c157600080fd5b806379cc67901461027357806395d89b411461028657600080fd5b806342966c68146102025780635b1125911461021557806370a0823114610235578063779e3b631461026b57600080fd5b80631e458bee116100ee5780631e458bee1461018857806323b872dd1461019b578063313ce567146101ae578063328a01d0146101bd57600080fd5b806306fdde0314610120578063095ea7b31461013e57806315d57fd41461016157806318160ddd14610176575b600080fd5b610128610307565b6040516101359190610d97565b60405180910390f35b61015161014c366004610e2c565b610399565b6040519015158152602001610135565b61017461016f366004610e56565b6103b3565b005b6002545b604051908152602001610135565b610174610196366004610e89565b61057e565b6101516101a9366004610ebc565b610631565b60405160128152602001610135565b6007546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610174610210366004610ef9565b610655565b6006546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a610243366004610f12565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610174610662565b610174610281366004610e2c565b610786565b610128610837565b61015161029c366004610e2c565b610846565b6005546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a6102cf366004610e56565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461031690610f34565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610f34565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b5050505050905090565b6000336103a7818585610854565b60019150505b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1633148015906103f3575060065473ffffffffffffffffffffffffffffffffffffffff163314155b15610431576040517fcdfcef970000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82161580610468575073ffffffffffffffffffffffffffffffffffffffff8116155b1561049f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560058054918516919092161790556040805133815260208101929092527fe79965b5c67dcfb2cf5fe152715e4a7256cee62a3d5dd8484fd8a8539eb8beff910160405180910390a16040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201527f1b9352454524a57a51f24f67dc66d898f616922cd1f7a12d73570ece12b1975c910160405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146105d1576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6105db8383610866565b808373ffffffffffffffffffffffffffffffffffffffff167fc263b302aec62d29105026245f19e16f8e0137066ccd4a8bd941f716bd4096bb8460405161062491815260200190565b60405180910390a3505050565b60003361063f8582856108c6565b61064a858585610995565b506001949350505050565b61065f3382610a40565b50565b60075473ffffffffffffffffffffffffffffffffffffffff1633146106b5576040517fe700765e000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b60065473ffffffffffffffffffffffffffffffffffffffff16610704576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040805133815260208101929092527f5104c9abdc7d111c2aeb4ce890ac70274a4be2ee83f46a62551be5e6ebc82dd0910160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6107e38282610a9c565b8173ffffffffffffffffffffffffffffffffffffffff167f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b18260405161082b91815260200190565b60405180910390a25050565b60606004805461031690610f34565b6000336103a7818585610995565b6108618383836001610ab1565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166108b6576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c260008383610bf9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f5781811015610980576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610428565b61098f84848484036000610ab1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166109e5576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8216610a35576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b610861838383610bf9565b73ffffffffffffffffffffffffffffffffffffffff8216610a90576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c282600083610bf9565b610aa78233836108c6565b6108c28282610a40565b73ffffffffffffffffffffffffffffffffffffffff8416610b01576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8316610b51576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561098f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610beb91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c31578060026000828254610c269190610f87565b90915550610ce39050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cb7576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610428565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610d0c57600280548290039055610d38565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161062491815260200190565b602081526000825180602084015260005b81811015610dc55760208186018101516040868401015201610da8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e2757600080fd5b919050565b60008060408385031215610e3f57600080fd5b610e4883610e03565b946020939093013593505050565b60008060408385031215610e6957600080fd5b610e7283610e03565b9150610e8060208401610e03565b90509250929050565b600080600060608486031215610e9e57600080fd5b610ea784610e03565b95602085013595506040909401359392505050565b600080600060608486031215610ed157600080fd5b610eda84610e03565b9250610ee860208501610e03565b929592945050506040919091013590565b600060208284031215610f0b57600080fd5b5035919050565b600060208284031215610f2457600080fd5b610f2d82610e03565b9392505050565b600181811c90821680610f4857607f821691505b602082108103610f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156103ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220085f01204b33dc17013c78c74fbca32a3da2c0b384ce7c8878c889551af28c6164736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220a899c3f0708c19eebe196d006bd882d57cb4bc74ec0d7f2dc84f9eefde085baf64736f6c634300081a0033", + ABI: "[{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfDestinationIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevert\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertFailsIfSenderIsNotTSS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteWithERC20FailsIfNotCustodyOrConnector\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNoParams\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNoParamsTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNonPayable\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceiveNonPayableFailsIfSenderIsNotTSS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testForwardCallToReceivePayable\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testRevertWithERC20FailsIfNotCustodyOrConnector\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetConnectorFailsIfSenderIsNotAdmin\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetConnectorFailsIfSet\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetConnectorFailsIfZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetCustodyFailsIfSenderIsNotAdmin\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetCustodyFailsIfSet\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testSetCustodyFailsIfZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b506201001a806200003e6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c8063a217fddf11610145578063cebad2a6116100bd578063e6afc7901161008c578063fa18c09b11610071578063fa18c09b1461042c578063fa7626d414610434578063fe7bdbb21461044157600080fd5b8063e6afc7901461041c578063f68bd1c01461042457600080fd5b8063cebad2a6146103dd578063dd51e82f146103e5578063e20c9f71146103ed578063e63ab1e9146103f557600080fd5b8063b124dbf511610114578063ba414fa6116100f9578063ba414fa6146103b5578063ccf20616146103cd578063ce5871e1146103d557600080fd5b8063b124dbf5146103a5578063b5508aa9146103ad57600080fd5b8063a217fddf14610366578063a56f7a4b1461036e578063a783c78914610376578063b0464fdc1461039d57600080fd5b806344671b94116101d85780637d7f772a116101a757806385226c811161018c57806385226c811461031557806385f438c11461032a578063916a17c61461035157600080fd5b80637d7f772a146103055780637ebf744f1461030d57600080fd5b806344671b94146102ab57806351010e49146102b35780635d62c860146102bb57806366d9a9a0146102f057600080fd5b80631ed7831c116102145780631ed7831c146102685780632ade3880146102865780633e5e3c231461029b5780633f7286f4146102a357600080fd5b806304b974f9146102465780630a9254e4146102505780631226c655146102585780631855c33714610260575b600080fd5b61024e610449565b005b61024e610656565b61024e611054565b61024e6111f5565b61027061136a565b60405161027d9190618768565b60405180910390f35b61028e6113cc565b60405161027d9190618804565b61027061150e565b61027061156e565b61024e6115ce565b61024e61194d565b6102e27f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b60405190815260200161027d565b6102f8611b29565b60405161027d919061896a565b61024e611cab565b61024e61200e565b61031d612183565b60405161027d9190618a64565b6102e27f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b610359612253565b60405161027d9190618a77565b6102e2600081565b61024e61234e565b6102e27f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6103596124a0565b61024e61259b565b61031d612842565b6103bd612912565b604051901515815260200161027d565b61024e6129e6565b61024e612b38565b61024e612ca9565b61024e612ecd565b6102706136c2565b6102e27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61024e613722565b61024e613990565b61024e613d85565b601f546103bd9060ff1681565b61024e6140e7565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed7016900000000000000000000000000000000000000000000000000000000179052602854925163ca669fa760e01b81529192737109709ecfa91a80626ff3989d68f67f5b1dd12d9263ca669fa7926104f0926001600160a01b031691016001600160a01b0391909116815260200190565b600060405180830381600087803b15801561050a57600080fd5b505af115801561051e573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156105a757600080fd5b505af11580156105bb573d6000803e3d6000fd5b50506020546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169250631cff79cd915061060b906000908590600401618b0e565b6000604051808303816000875af115801561062a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106529190810190618c18565b5050565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880549091166156781790556040516106a890618669565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f08015801561072d573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055602854604051911690819061077690618677565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156107a9573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600e81527f4761746577617945564d2e736f6c000000000000000000000000000000000000602082015260285460265492519085166024820152604481019390935292166064820152610898919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b0000000000000000000000000000000000000000000000000000000017905261455c565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560285460265460405192939182169291169061092490618685565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610960573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460255460285460265460405193851694928316939183169216906109bb90618693565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f0801580156109ff573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560285460405163ca669fa760e01b815291166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015610a8457600080fd5b505af1158015610a98573d6000803e3d6000fd5b50506025546028546023546040517f15d57fd40000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082166024820152911692506315d57fd49150604401600060405180830381600087803b158015610b0957600080fd5b505af1158015610b1d573d6000803e3d6000fd5b50505050604051610b2d906186a1565b604051809103906000f080158015610b49573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610bf557600080fd5b505af1158015610c09573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b158015610cf957600080fd5b505af1158015610d0d573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610de957600080fd5b505af1158015610dfd573d6000803e3d6000fd5b5050602480546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f4240938101939093521692506340c10f199150604401600060405180830381600087803b158015610e6e57600080fd5b505af1158015610e82573d6000803e3d6000fd5b5050602480546022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a1209381019390935216925063a9059cbb91506044016020604051808303816000875af1158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c9190618c4d565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b0390811682526001602080840191825284519081018552600081529383018490528251602c8054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602d9061104f9082618d03565b505050565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561116357600080fd5b505af1158015611177573d6000803e3d6000fd5b50506020546040517fae7a3a6f000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b03909116925063ae7a3a6f91506024015b600060405180830381600087803b1580156111db57600080fd5b505af11580156111ef573d6000803e3d6000fd5b50505050565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561126757600080fd5b505af115801561127b573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fb337f378000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b15801561130557600080fd5b505af1158015611319573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f91506024016111c1565b606060168054806020026020016040519081016040528092919081815260200182805480156113c257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113a4575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b8282101561150557600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156114ee57838290600052602060002001805461146190618c6f565b80601f016020809104026020016040519081016040528092919081815260200182805461148d90618c6f565b80156114da5780601f106114af576101008083540402835291602001916114da565b820191906000526020600020905b8154815290600101906020018083116114bd57829003601f168201915b505050505081526020019060010190611442565b5050505081525050815260200190600101906113f0565b50505050905090565b606060188054806020026020016040519081016040528092919081815260200182805480156113c2576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113a4575050505050905090565b606060178054806020026020016040519081016040528092919081815260200182805480156113c2576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113a4575050505050905090565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed701690000000000000000000000000000000000000000000000000000000017905260215492517ff30c7ba30000000000000000000000000000000000000000000000000000000081529192737109709ecfa91a80626ff3989d68f67f5b1dd12d9263f30c7ba392611684926001600160a01b031691600091879101618dc2565b600060405180830381600087803b15801561169e57600080fd5b505af11580156116b2573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561182a57600080fd5b505af115801561183e573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150611884906000908590618dea565b60405180910390a260285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156118e557600080fd5b505af11580156118f9573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935061060b92909116908590600401618b0e565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152670de0b6b3a76400009060009060250160408051808303601f190181529082905260285463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015611a8a57600080fd5b505af1158015611a9e573d6000803e3d6000fd5b50506020546040517ff7ad60db0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116925063f7ad60db91508490611af3906000908690602c90600401618ed8565b6000604051808303818588803b158015611b0c57600080fd5b505af1158015611b20573d6000803e3d6000fd5b50505050505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156115055783829060005260206000209060020201604051806040016040529081600082018054611b8090618c6f565b80601f0160208091040260200160405190810160405280929190818152602001828054611bac90618c6f565b8015611bf95780601f10611bce57610100808354040283529160200191611bf9565b820191906000526020600020905b815481529060010190602001808311611bdc57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611c9357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611c405790505b50505050508152505081526020019060010190611b4d565b604080516001808252818301909252600091816020015b6060815260200190600190039081611cc25790505090506040518060400160405280600f81526020017f48656c6c6f2c20466f756e64727921000000000000000000000000000000000081525081600081518110611d2257611d22618f0c565b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050602a81600081518110611d6657611d66618f0c565b6020908102919091010152604051600190600090611d8c90859085908590602401618f6d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff05b6abf00000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611e3f57600080fd5b505af1158015611e53573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611f3e9190600401618fa5565b600060405180830381600087803b158015611f5857600080fd5b505af1158015611f6c573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd9350611fc092909116908590600401618b0e565b6000604051808303816000875af1158015611fdf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120079190810190618c18565b5050505050565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b15801561208057600080fd5b505af1158015612094573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f0c8dc016000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b15801561211e57600080fd5b505af1158015612132573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef91506024016111c1565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156115055783829060005260206000200180546121c690618c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546121f290618c6f565b801561223f5780601f106122145761010080835404028352916020019161223f565b820191906000526020600020905b81548152906001019060200180831161222257829003601f168201915b5050505050815260200190600101906121a7565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156115055760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561233657602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116122e35790505b50505050508152505081526020019060010190612277565b6028546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156123c057600080fd5b505af11580156123d4573d6000803e3d6000fd5b5050602854604080516001600160a01b039092166024830152600060448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506112eb9190600401618fa5565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156115055760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561258357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116125305790505b505050505081525050815260200190600101906124c4565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b960448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061277e9190600401618fa5565b600060405180830381600087803b15801561279857600080fd5b505af11580156127ac573d6000803e3d6000fd5b50506020546024546027546040517fd0b492c30000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063d0b492c3945061280c93928316929091169087908790602c90600401618fb8565b600060405180830381600087803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b505050505050565b60606019805480602002602001604051908101604052809291908181526020016000905b8282101561150557838290600052602060002001805461288590618c6f565b80601f01602080910402602001604051908101604052809291908181526020018280546128b190618c6f565b80156128fe5780601f106128d3576101008083540402835291602001916128fe565b820191906000526020600020905b8154815290600101906020018083116128e157829003601f168201915b505050505081526020019060010190612866565b60085460009060ff161561292a575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156129bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129df919061900d565b1415905090565b6028546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015612a5857600080fd5b505af1158015612a6c573d6000803e3d6000fd5b5050602854604080516001600160a01b039092166024830152600060448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506121049190600401618fa5565b6026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015612baa57600080fd5b505af1158015612bbe573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612c4757600080fd5b505af1158015612c5b573d6000803e3d6000fd5b50506020546040517f10188aef000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b0390911692506310188aef91506024016111c1565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152670de0b6b3a76400009060009060250160408051808303601f190181529082905260265463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250612e489190600401618fa5565b600060405180830381600087803b158015612e6257600080fd5b505af1158015612e76573d6000803e3d6000fd5b50506020546021546040517ff7ad60db0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063f7ad60db93508692611af39216908690602c90600401618ed8565b60285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612f2657600080fd5b505af1158015612f3a573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506130259190600401618fa5565b600060405180830381600087803b15801561303f57600080fd5b505af1158015613053573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156130a757600080fd5b505af11580156130bb573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b5050602854604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506132179190600401618fa5565b600060405180830381600087803b15801561323157600080fd5b505af1158015613245573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561329957600080fd5b505af11580156132ad573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561330a57600080fd5b505af115801561331e573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561337257600080fd5b505af1158015613386573d6000803e3d6000fd5b5050604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed701690000000000000000000000000000000000000000000000000000000017905292517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd93c06650000000000000000000000000000000000000000000000000000000091810191909152909350737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09101600060405180830381600087803b15801561346857600080fd5b505af115801561347c573d6000803e3d6000fd5b505060285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935061354192909116908590600401618b0e565b6000604051808303816000875af1158015613560573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135889190810190618c18565b5060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156135e257600080fd5b505af11580156135f6573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561364a57600080fd5b505af115801561365e573d6000803e3d6000fd5b50506021546040517ff30c7ba3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f30c7ba39250611684916001600160a01b0316906000908690600401618dc2565b606060158054806020026020016040519081016040528092919081815260200182805480156113c2576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113a4575050505050905090565b60248054602754604051620186a09381018490526001600160a01b0392831660448201529116606482015260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602654905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561380657600080fd5b505af115801561381a573d6000803e3d6000fd5b5050602654604080516001600160a01b0390921660248301527f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b960448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506139059190600401618fa5565b600060405180830381600087803b15801561391f57600080fd5b505af1158015613933573d6000803e3d6000fd5b50506020546024546027546040517f5131ab590000000000000000000000000000000000000000000000000000000081526001600160a01b039384169550635131ab59945061280c93928316929091169087908790600401619026565b604080516001808252818301909252600091816020015b60608152602001906001900390816139a75790505090506040518060400160405280600f81526020017f48656c6c6f2c20466f756e64727921000000000000000000000000000000000081525081600081518110613a0757613a07618f0c565b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050602a81600081518110613a4b57613a4b618f0c565b6020908102919091010152604051600190600090613a7190859085908590602401618f6d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff05b6abf0000000000000000000000000000000000000000000000000000000017905260215490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613b2e916001600160a01b0391909116906000908690600401618dc2565b600060405180830381600087803b158015613b4857600080fd5b505af1158015613b5c573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613bee57600080fd5b505af1158015613c02573d6000803e3d6000fd5b50506020546040517f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1469350613c4992506001600160a01b039091169087908790879061905d565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613cdf57600080fd5b505af1158015613cf3573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150613d39906000908590618dea565b60405180910390a260285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401611f3e565b604080517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152815160058183030181526025909101909152602154670de0b6b3a764000091906001600160a01b031631613de481600061457b565b6021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613e7257600080fd5b505af1158015613e86573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e9350613eca92506001600160a01b0390911690602c906190a5565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613f6057600080fd5b505af1158015613f74573d6000803e3d6000fd5b5050602154604051600093506001600160a01b0390911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690613fc790670de0b6b3a7640000908790602c906190c7565b60405180910390a360285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561402857600080fd5b505af115801561403c573d6000803e3d6000fd5b50506020546021546040517ff7ad60db0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063f7ad60db935087926140939216908790602c90600401618ed8565b6000604051808303818588803b1580156140ac57600080fd5b505af11580156140c0573d6000803e3d6000fd5b50506021546001600160a01b03163192506111ef9150829050670de0b6b3a764000061457b565b60408051808201909152600f81527f48656c6c6f2c20466f756e6472792100000000000000000000000000000000006020820152602154602a90600190670de0b6b3a764000090614144906000906001600160a01b03163161457b565b600084848460405160240161415b939291906190e0565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260215490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba39161421f916001600160a01b039190911690670de0b6b3a7640000908690600401618dc2565b600060405180830381600087803b15801561423957600080fd5b505af115801561424d573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156142df57600080fd5b505af11580156142f3573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa935061433c92506001600160a01b0390911690859089908990899061910a565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f915061443390670de0b6b3a7640000908590618dea565b60405180910390a260285460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561449457600080fd5b505af11580156144a8573d6000803e3d6000fd5b50506020546021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935086926144fc9216908690600401618b0e565b60006040518083038185885af115801561451a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526145439190810190618c18565b506021546120079083906001600160a01b03163161457b565b60006145666186af565b6145718484836145fa565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b1580156145e657600080fd5b505afa15801561283a573d6000803e3d6000fd5b6000806146078584614675565b905061466a6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614655929190618b0e565b60405160208183030381529060405285614681565b9150505b9392505050565b600061466e83836146af565b60c081015151600090156146a55761469e84848460c001516146ca565b905061466e565b61469e8484614870565b60006146bb838361495b565b61466e83836020015184614681565b6000806146d5614967565b905060006146e38683614a3a565b905060006146fa8260600151836020015185614ee0565b9050600061470a838389896150f2565b9050600061471782615f6f565b602081015181519192509060030b1561478a5789826040015160405160200161474192919061914b565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261478191600401618fa5565b60405180910390fd5b60006147cd6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a20000000000000000000000081525083600161613e565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90614820908490600401618fa5565b602060405180830381865afa15801561483d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486191906191cc565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906148c5908790600401618fa5565b600060405180830381865afa1580156148e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261490a9190810190618c18565b9050600061493882856040516020016149249291906191f5565b60405160208183030381529060405261633e565b90506001600160a01b038116614571578484604051602001614741929190619224565b61065282826000616351565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906149ee9084906004016192cf565b600060405180830381865afa158015614a0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614a339190810190619316565b9250505090565b614a6c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050614ab76040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b614ac085616454565b60208201526000614ad086616839565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015614b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614b3a9190810190619316565b86838560200151604051602001614b54949392919061935f565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190614bac908590600401618fa5565b600060405180830381865afa158015614bc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614bf19190810190619316565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690614c39908490600401619463565b602060405180830381865afa158015614c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7a9190618c4d565b614c8f578160405160200161474191906194b5565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614cd4908490600401619547565b600060405180830381865afa158015614cf1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614d199190810190619316565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f690614d60908490600401619599565b602060405180830381865afa158015614d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614da19190618c4d565b15614e36576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614deb908490600401619599565b600060405180830381865afa158015614e08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614e309190810190619316565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001614e5b91906195eb565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401614e87929190619657565b600060405180830381865afa158015614ea4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614ecc9190810190619316565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081614efc5790505090506040518060400160405280600481526020017f677265700000000000000000000000000000000000000000000000000000000081525081600081518110614f5c57614f5c618f0c565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110614fb057614fb0618f0c565b602002602001018190525084604051602001614fcc919061967c565b60405160208183030381529060405281600281518110614fee57614fee618f0c565b60200260200101819052508260405160200161500a91906196e8565b6040516020818303038152906040528160038151811061502c5761502c618f0c565b6020026020010181905250600061504282615f6f565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506150d39060408051808201825260008082526020918201528151808301909252845182528085019082015290616abc565b6150e857856040516020016147419190619729565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615142565b511590565b6152b6578260200151156151fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401614781565b8260c00151156152b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401614781565b6040805160ff8082526120008201909252600091816020015b60608152602001906001900390816152cf57905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061532a906197e9565b935060ff168151811061533f5761533f618f0c565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e37000000000000000000000000000000000000008152506040516020016153909190619808565b6040516020818303038152906040528282806153ab906197e9565b935060ff16815181106153c0576153c0618f0c565b60200260200101819052506040518060400160405280600681526020017f6465706c6f79000000000000000000000000000000000000000000000000000081525082828061540d906197e9565b935060ff168151811061542257615422618f0c565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061546f906197e9565b935060ff168151811061548457615484618f0c565b602002602001018190525087602001518282806154a0906197e9565b935060ff16815181106154b5576154b5618f0c565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615502906197e9565b935060ff168151811061551757615517618f0c565b60209081029190910101528751828261552f816197e9565b935060ff168151811061554457615544618f0c565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615591906197e9565b935060ff16815181106155a6576155a6618f0c565b60200260200101819052506155ba46616b1d565b82826155c5816197e9565b935060ff16815181106155da576155da618f0c565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615627906197e9565b935060ff168151811061563c5761563c618f0c565b602002602001018190525086828280615654906197e9565b935060ff168151811061566957615669618f0c565b60209081029190910101528551156157905760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826156ba816197e9565b935060ff16815181106156cf576156cf618f0c565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d9061571f908990600401618fa5565b600060405180830381865afa15801561573c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157649190810190619316565b828261576f816197e9565b935060ff168151811061578457615784618f0c565b60200260200101819052505b8460200151156158605760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826157d9816197e9565b935060ff16815181106157ee576157ee618f0c565b60200260200101819052506040518060400160405280600581526020017f66616c736500000000000000000000000000000000000000000000000000000081525082828061583b906197e9565b935060ff168151811061585057615850618f0c565b6020026020010181905250615a27565b61589861513d8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61592b5760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826158db816197e9565b935060ff16815181106158f0576158f0618f0c565b60200260200101819052508460a00151604051602001615910919061967c565b60405160208183030381529060405282828061583b906197e9565b8460c0015115801561596e57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261596c90511590565b155b15615a275760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826159b2816197e9565b935060ff16815181106159c7576159c7618f0c565b60200260200101819052506159db88616bbd565b6040516020016159eb919061967c565b604051602081830303815290604052828280615a06906197e9565b935060ff1681518110615a1b57615a1b618f0c565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152615a5b90511590565b615af05760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282615a9e816197e9565b935060ff1681518110615ab357615ab3618f0c565b60200260200101819052508460400151828280615acf906197e9565b935060ff1681518110615ae457615ae4618f0c565b60200260200101819052505b606085015115615c115760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282615b39816197e9565b935060ff1681518110615b4e57615b4e618f0c565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015615bbd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615be59190810190619316565b8282615bf0816197e9565b935060ff1681518110615c0557615c05618f0c565b60200260200101819052505b60e08501515115615cb85760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282615c5b816197e9565b935060ff1681518110615c7057615c70618f0c565b6020026020010181905250615c8c8560e0015160000151616b1d565b8282615c97816197e9565b935060ff1681518110615cac57615cac618f0c565b60200260200101819052505b60e08501516020015115615d625760408051808201909152600a81527f2d2d67617350726963650000000000000000000000000000000000000000000060208201528282615d05816197e9565b935060ff1681518110615d1a57615d1a618f0c565b6020026020010181905250615d368560e0015160200151616b1d565b8282615d41816197e9565b935060ff1681518110615d5657615d56618f0c565b60200260200101819052505b60e08501516040015115615e0c5760408051808201909152600e81527f2d2d6d617846656550657247617300000000000000000000000000000000000060208201528282615daf816197e9565b935060ff1681518110615dc457615dc4618f0c565b6020026020010181905250615de08560e0015160400151616b1d565b8282615deb816197e9565b935060ff1681518110615e0057615e00618f0c565b60200260200101819052505b60e08501516060015115615eb65760408051808201909152601681527f2d2d6d61785072696f726974794665655065724761730000000000000000000060208201528282615e59816197e9565b935060ff1681518110615e6e57615e6e618f0c565b6020026020010181905250615e8a8560e0015160600151616b1d565b8282615e95816197e9565b935060ff1681518110615eaa57615eaa618f0c565b60200260200101819052505b60008160ff1667ffffffffffffffff811115615ed457615ed4618b30565b604051908082528060200260200182016040528015615f0757816020015b6060815260200190600190039081615ef25790505b50905060005b8260ff168160ff161015615f6057838160ff1681518110615f3057615f30618f0c565b6020026020010151828260ff1681518110615f4d57615f4d618f0c565b6020908102919091010152600101615f0d565b5093505050505b949350505050565b615f966040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161601c91869101619873565b600060405180830381865afa158015616039573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526160619190810190619316565b9050600061606f86836176ac565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b815260040161609f9190618a64565b6000604051808303816000875af11580156160be573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526160e691908101906198ba565b805190915060030b158015906160ff5750602081015151155b801561610e5750604081015151155b156150e8578160008151811061612657616126618f0c565b60200260200101516040516020016147419190619970565b606060006161738560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506161aa9082905b90617801565b15616307576000616227826162218461621b6161ed8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90617828565b9061788a565b604080518082018252600181527f0a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061628b908290617801565b156162f557604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526162f2905b829061790f565b90505b6162fe81617935565b9250505061466e565b8215616320578484604051602001614741929190619b5c565b505060408051602081019091526000815261466e565b509392505050565b6000808251602084016000f09392505050565b8160a001511561636057505050565b600061636d84848461799e565b9050600061637a82615f6f565b602081015181519192509060030b1580156164165750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616416906040805180820182526000808252602091820152815180830190925284518252808501908201526161a4565b1561642357505050505050565b604082015151156164435781604001516040516020016147419190619c03565b806040516020016147419190619c61565b606060006164898360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506164ee905b8290616abc565b1561655d57604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261466e90616558908390617f39565b617935565b604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526165bf905b8290617fc3565b60010361668c57604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616625906162eb565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261466e90616558905b839061790f565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166eb906164e7565b1561682257604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061675390839061805d565b9050600081600183516167669190619ccc565b8151811061677657616776618f0c565b602002602001015190506168196165586167ec6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290617f39565b95945050505050565b826040516020016147419190619cdf565b50919050565b6060600061686e8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506168d0906164e7565b156168de5761466e81617935565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261693d906165b8565b6001036169a757604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261466e9061655890616685565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a06906164e7565b1561682257604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616a6e90839061805d565b9050600181511115616aaa578060028251616a899190619ccc565b81518110616a9957616a99618f0c565b602002602001015192505050919050565b50826040516020016147419190619cdf565b805182516000911115616ad157506000614575565b81518351602085015160009291616ae791619dbd565b616af19190619ccc565b905082602001518103616b08576001915050614575565b82516020840151819020912014905092915050565b60606000616b2a83618102565b600101905060008167ffffffffffffffff811115616b4a57616b4a618b30565b6040519080825280601f01601f191660200182016040528015616b74576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084616b7e57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091616c49905b82906181e4565b15616c8957505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ce890616c42565b15616d2857505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d8790616c42565b15616dc757505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e2690616c42565b80616e8b5750604080518082018252601081527f47504c2d322e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e8b90616c42565b15616ecb57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f2a90616c42565b80616f8f5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f8f90616c42565b15616fcf57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261702e90616c42565b806170935750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261709390616c42565b156170d357505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261713290616c42565b806171975750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261719790616c42565b156171d757505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261723690616c42565b1561727657505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526172d590616c42565b1561731557505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261737490616c42565b156173b457505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261741390616c42565b1561745357505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e3000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526174b290616c42565b156174f257505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261755190616c42565b806175b65750604080518082018252601181527f4147504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175b690616c42565b156175f657505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261765590616c42565b1561769557505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b604080840151845191516147419290602001619dd0565b60608060005b845181101561773757818582815181106176ce576176ce618f0c565b60200260200101516040516020016176e79291906191f5565b6040516020818303038152906040529150600185516177069190619ccc565b811461772f578160405160200161771d9190619f39565b60405160208183030381529060405291505b6001016176b2565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081617750579050509050838160008151811061777b5761777b618f0c565b60200260200101819052506040518060400160405280600281526020017f2d63000000000000000000000000000000000000000000000000000000000000815250816001815181106177cf576177cf618f0c565b602002602001018190525081816002815181106177ee576177ee618f0c565b6020908102919091010152949350505050565b602080830151835183519284015160009361781f92918491906181f8565b14159392505050565b6040805180820190915260008082526020820152600061785a8460000151856020015185600001518660200151618309565b905083602001518161786c9190619ccc565b8451859061787b908390619ccc565b90525060208401525090919050565b60408051808201909152600080825260208201528151835110156178af575081614575565b60208083015190840151600191146178d65750815160208481015190840151829020919020145b8015617907578251845185906178ed908390619ccc565b9052508251602085018051617903908390619dbd565b9052505b509192915050565b604080518082019091526000808252602082015261792e838383618429565b5092915050565b60606000826000015167ffffffffffffffff81111561795657617956618b30565b6040519080825280601f01601f191660200182016040528015617980576020820181803683370190505b509050600060208201905061792e81856020015186600001516184d4565b606060006179aa614967565b6040805160ff808252612000820190925291925060009190816020015b60608152602001906001900390816179c757905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280617a22906197e9565b935060ff1681518110617a3757617a37618f0c565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001617a889190619f7a565b604051602081830303815290604052828280617aa3906197e9565b935060ff1681518110617ab857617ab8618f0c565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280617b05906197e9565b935060ff1681518110617b1a57617b1a618f0c565b602002602001018190525082604051602001617b3691906196e8565b604051602081830303815290604052828280617b51906197e9565b935060ff1681518110617b6657617b66618f0c565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280617bb3906197e9565b935060ff1681518110617bc857617bc8618f0c565b6020026020010181905250617bdd878461854e565b8282617be8816197e9565b935060ff1681518110617bfd57617bfd618f0c565b602090810291909101015285515115617ca95760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282617c4f816197e9565b935060ff1681518110617c6457617c64618f0c565b6020026020010181905250617c7d86600001518461854e565b8282617c88816197e9565b935060ff1681518110617c9d57617c9d618f0c565b60200260200101819052505b856080015115617d175760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282617cf2816197e9565b935060ff1681518110617d0757617d07618f0c565b6020026020010181905250617d7d565b8415617d7d5760408051808201909152601281527f2d2d726571756972655265666572656e6365000000000000000000000000000060208201528282617d5c816197e9565b935060ff1681518110617d7157617d71618f0c565b60200260200101819052505b60408601515115617e195760408051808201909152600d81527f2d2d756e73616665416c6c6f770000000000000000000000000000000000000060208201528282617dc7816197e9565b935060ff1681518110617ddc57617ddc618f0c565b60200260200101819052508560400151828280617df8906197e9565b935060ff1681518110617e0d57617e0d618f0c565b60200260200101819052505b856060015115617e835760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282617e62816197e9565b935060ff1681518110617e7757617e77618f0c565b60200260200101819052505b60008160ff1667ffffffffffffffff811115617ea157617ea1618b30565b604051908082528060200260200182016040528015617ed457816020015b6060815260200190600190039081617ebf5790505b50905060005b8260ff168160ff161015617f2d57838160ff1681518110617efd57617efd618f0c565b6020026020010151828260ff1681518110617f1a57617f1a618f0c565b6020908102919091010152600101617eda565b50979650505050505050565b6040805180820190915260008082526020820152815183511015617f5e575081614575565b81518351602085015160009291617f7491619dbd565b617f7e9190619ccc565b60208401519091506001908214617f9f575082516020840151819020908220145b8015617fba57835185518690617fb6908390619ccc565b9052505b50929392505050565b6000808260000151617fe78560000151866020015186600001518760200151618309565b617ff19190619dbd565b90505b835160208501516180059190619dbd565b811161792e578161801581619fbf565b925050826000015161804c8560200151836180309190619ccc565b865161803c9190619ccc565b8386600001518760200151618309565b6180569190619dbd565b9050617ff4565b6060600061806b8484617fc3565b618076906001619dbd565b67ffffffffffffffff81111561808e5761808e618b30565b6040519080825280602002602001820160405280156180c157816020015b60608152602001906001900390816180ac5790505b50905060005b8151811015616336576180dd616558868661790f565b8282815181106180ef576180ef618f0c565b60209081029190910101526001016180c7565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061814b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310618177576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061819557662386f26fc10000830492506010015b6305f5e10083106181ad576305f5e100830492506008015b61271083106181c157612710830492506004015b606483106181d3576064830492506002015b600a83106145755760010192915050565b60006181f0838361858e565b159392505050565b6000808584116182ff57602084116182ab576000841561824357600161821f866020619ccc565b61822a906008619fd9565b61823590600261a0d7565b61823f9190619ccc565b1990505b83518116856182528989619dbd565b61825c9190619ccc565b805190935082165b8181146182965787841161827e5787945050505050615f67565b836182888161a0e3565b945050828451169050618264565b6182a08785619dbd565b945050505050615f67565b8383206182b88588619ccc565b6182c29087619dbd565b91505b8582106182fd578482208082036182ea576182e08684619dbd565b9350505050615f67565b6182f5600184619ccc565b9250506182c5565b505b5092949350505050565b6000838186851161841457602085116183c35760008515618355576001618331876020619ccc565b61833c906008619fd9565b61834790600261a0d7565b6183519190619ccc565b1990505b845181166000876183668b8b619dbd565b6183709190619ccc565b855190915083165b8281146183b55781861061839d576183908b8b619dbd565b9650505050505050615f67565b856183a781619fbf565b965050838651169050618378565b859650505050505050615f67565b508383206000905b6183d58689619ccc565b8211618412578583208082036183f15783945050505050615f67565b6183fc600185619dbd565b935050818061840a90619fbf565b9250506183cb565b505b61841e8787619dbd565b979650505050505050565b6040805180820190915260008082526020820152600061845b8560000151866020015186600001518760200151618309565b6020808701805191860191909152519091506184779082619ccc565b83528451602086015161848a9190619dbd565b810361849957600085526184cb565b835183516184a79190619dbd565b855186906184b6908390619ccc565b90525083516184c59082619dbd565b60208601525b50909392505050565b6020811061850c57815183526184eb602084619dbd565b92506184f8602083619dbd565b9150618505602082619ccc565b90506184d4565b600019811561853b576001618522836020619ccc565b61852e9061010061a0d7565b6185389190619ccc565b90505b9151835183169219169190911790915250565b6060600061855c8484614a3a565b80516020808301516040519394506185769390910161a0fa565b60405160208183030381529060405291505092915050565b81518151600091908111156185a1575081515b6020808501519084015160005b8381101561865a578251825180821461862a576000196020871015618609576001846185db896020619ccc565b6185e59190619dbd565b6185f0906008619fd9565b6185fb90600261a0d7565b6186059190619ccc565b1990505b81811683821681810391146186275797506145759650505050505050565b50505b618635602086619dbd565b9450618642602085619dbd565b935050506020816186539190619dbd565b90506185ae565b50845186516150e8919061a152565b610c9f806200a17383390190565b6112a6806200ae1283390190565b6119ca806200c0b883390190565b611783806200da8283390190565b610de0806200f20583390190565b6040518060e001604052806060815260200160608152602001606081526020016000151581526020016000151581526020016000151581526020016186f26186f7565b905290565b604051806101000160405280600015158152602001600015158152602001606081526020016000801916815260200160608152602001606081526020016000151581526020016186f26040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b818110156187a95783516001600160a01b0316835260209384019390920191600101618782565b509095945050505050565b60005b838110156187cf5781810151838201526020016187b7565b50506000910152565b600081518084526187f08160208601602086016187b4565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618900577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b818110156188e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a85030183526188d08486516187d8565b6020958601959094509290920191600101618896565b50919750505060209485019492909201915060010161882c565b50929695505050505050565b600081518084526020840193506020830160005b828110156189605781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101618920565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618900577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526189d660408801826187d8565b90506020820151915086810360208801526189f1818361890c565b965050506020938401939190910190600101618992565b600082825180855260208501945060208160051b8301016020850160005b83811015618a5857601f19858403018852618a428383516187d8565b6020988901989093509190910190600101618a26565b50909695505050505050565b60208152600061466e6020830184618a08565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618900577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152618af8604087018261890c565b9550506020938401939190910190600101618a9f565b6001600160a01b0383168152604060208201526000615f6760408301846187d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715618b8257618b82618b30565b60405290565b60008067ffffffffffffffff841115618ba357618ba3618b30565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715618bd257618bd2618b30565b604052838152905080828401851015618bea57600080fd5b6163368460208301856187b4565b600082601f830112618c0957600080fd5b61466e83835160208501618b88565b600060208284031215618c2a57600080fd5b815167ffffffffffffffff811115618c4157600080fd5b61457184828501618bf8565b600060208284031215618c5f57600080fd5b8151801515811461466e57600080fd5b600181811c90821680618c8357607f821691505b602082108103616833577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561104f57806000526020600020601f840160051c81016020851015618ce35750805b601f840160051c820191505b818110156120075760008155600101618cef565b815167ffffffffffffffff811115618d1d57618d1d618b30565b618d3181618d2b8454618c6f565b84618cbc565b6020601f821160018114618d655760008315618d4d5750848201515b600019600385901b1c1916600184901b178455612007565b600084815260208120601f198516915b82811015618d955787850151825560209485019460019092019101618d75565b5084821015618db35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b038416815282602082015260606040820152600061681960608301846187d8565b828152604060208201526000615f6760408301846187d8565b600081546001600160a01b038116845267ffffffffffffffff8160a01c16602085015250600182016060604085015260008154618e3f81618c6f565b8060608801526001821660008114618e5e5760018114618e9857618ecc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b8901019350618ecc565b84600052602060002060005b83811015618ec35781548a820160800152600190910190602001618ea4565b89016080019450505b50919695505050505050565b6001600160a01b0384168152606060208201526000618efa60608301856187d8565b82810360408401526150e88185618e03565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081518084526020840193506020830160005b82811015618960578151865260209586019590910190600101618f4f565b606081526000618f806060830186618a08565b8281036020840152618f928186618f3b565b9150508215156040830152949350505050565b60208152600061466e60208301846187d8565b6001600160a01b03861681526001600160a01b038516602082015283604082015260a060608201526000618fef60a08301856187d8565b82810360808401526190018185618e03565b98975050505050505050565b60006020828403121561901f57600080fd5b5051919050565b6001600160a01b03851681526001600160a01b03841660208201528260408201526080606082015260006150e860808301846187d8565b6001600160a01b038516815260806020820152600061907f6080830186618a08565b82810360408401526190918186618f3b565b915050821515606083015295945050505050565b6001600160a01b0383168152604060208201526000615f676040830184618e03565b838152606060208201526000618efa60608301856187d8565b6060815260006190f360608301866187d8565b602083019490945250901515604090910152919050565b6001600160a01b038616815284602082015260a06040820152600061913260a08301866187d8565b6060830194909452509015156080909101529392505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161918381601a8501602088016187b4565b7f3a20000000000000000000000000000000000000000000000000000000000000601a9184019182015283516191c081601c8401602088016187b4565b01601c01949350505050565b6000602082840312156191de57600080fd5b81516001600160a01b038116811461466e57600080fd5b600083516192078184602088016187b4565b83519083019061921b8183602088016187b4565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161925c81601a8501602088016187b4565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a9184019182015283516192998160338401602088016187b4565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f5554000000000000000000000000000000000000000000606082015260806020820152600061466e60808301846187d8565b60006020828403121561932857600080fd5b815167ffffffffffffffff81111561933f57600080fd5b8201601f8101841361935057600080fd5b61457184825160208401618b88565b60008551619371818460208a016187b4565b7f2f0000000000000000000000000000000000000000000000000000000000000090830190815285516193ab816001840160208a016187b4565b7f2f000000000000000000000000000000000000000000000000000000000000006001929091019182015284516193e98160028401602089016187b4565b6001818301019150507f2f000000000000000000000000000000000000000000000000000000000000006001820152835161942b8160028401602088016187b4565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b60408152600061947660408301846187d8565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e20617274696661637420008152600082516194ed81601f8501602087016187b4565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b60408152600061955a60408301846187d8565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b6040815260006195ac60408301846187d8565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b270000000000000000000000008152600082516196238160148501602087016187b4565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b60408152600061966a60408301856187d8565b828103602084015261466a81856187d8565b7f22000000000000000000000000000000000000000000000000000000000000008152600082516196b48160018501602087016187b4565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b600082516196fa8184602087016187b4565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e7472616374200000000000000000000000000000000000000000006040820152600082516197ad81604b8501602087016187b4565b91909101604b0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff81036197ff576197ff6197ba565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c694000000000000000000000000000000000000000000000006020820152600082516198668160298501602087016187b4565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f5041544800000000000000000000606082015260806020820152600061466e60808301846187d8565b6000602082840312156198cc57600080fd5b815167ffffffffffffffff8111156198e357600080fd5b8201606081850312156198f557600080fd5b6198fd618b5f565b81518060030b811461990e57600080fd5b8152602082015167ffffffffffffffff81111561992a57600080fd5b61993686828501618bf8565b602083015250604082015167ffffffffffffffff81111561995657600080fd5b61996286828501618bf8565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f22000000000000000000000000000000000000000000000000000000000000006020820152600082516199ce8160218501602087016187b4565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f2700000000000000000000000000000000000000000000000000000000000000602082015260008351619bba8160218501602088016187b4565b7f2720696e206f75747075743a20000000000000000000000000000000000000006021918401918201528351619bf781602e8401602088016187b4565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a2000000000000000000000000000000000000000000000006020820152600082516198668160298501602087016187b4565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a000000000000000000000000000000000000000000000000000000000000602082015260008251619cbf8160228501602087016187b4565b9190910160220192915050565b81810381811115614575576145756197ba565b7f436f6e7472616374206e616d6520000000000000000000000000000000000000815260008251619d1781600e8501602087016187b4565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b80820180821115614575576145756197ba565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351619e088160188501602088016187b4565b7f20696e20000000000000000000000000000000000000000000000000000000006018918401918201528351619e4581601c8401602088016187b4565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b60008251619f4b8184602087016187b4565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f72654000000000815260008251619fb281601c8501602087016187b4565b91909101601c0192915050565b60006000198203619fd257619fd26197ba565b5060010190565b8082028115828204841417614575576145756197ba565b6001815b600184111561a02b5780850481111561a00f5761a00f6197ba565b600184161561a01d57908102905b60019390931c928002619ff4565b935093915050565b60008261a04257506001614575565b8161a04f57506000614575565b816001811461a065576002811461a06f5761a08b565b6001915050614575565b60ff84111561a0805761a0806197ba565b50506001821b614575565b5060208310610133831016604e8410600b841016171561a0ae575081810a614575565b61a0bb6000198484619ff0565b806000190482111561a0cf5761a0cf6197ba565b029392505050565b600061466e838361a033565b60008161a0f25761a0f26197ba565b506000190190565b6000835161a10c8184602088016187b4565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a1468160018401602088016187b4565b01600101949350505050565b818103600083128015838313168383128216171561792e5761792e6197ba56fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a0033608060405234801561001057600080fd5b506040516112a63803806112a683398101604081905261002f91610110565b604051806040016040528060048152602001635a65746160e01b815250604051806040016040528060048152602001635a45544160e01b815250816003908161007891906101e2565b50600461008582826101e2565b5050506001600160a01b03821615806100a557506001600160a01b038116155b156100c35760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b039384166001600160a01b031991821617909155600780549290931691161790556102a0565b80516001600160a01b038116811461010b57600080fd5b919050565b6000806040838503121561012357600080fd5b61012c836100f4565b915061013a602084016100f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061016d57607f821691505b60208210810361018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101dd57806000526020600020601f840160051c810160208510156101ba5750805b601f840160051c820191505b818110156101da57600081556001016101c6565b50505b505050565b81516001600160401b038111156101fb576101fb610143565b61020f816102098454610159565b84610193565b6020601f821160018114610243576000831561022b5750848201515b600019600385901b1c1916600184901b1784556101da565b600084815260208120601f198516915b828110156102735787850151825560209485019460019092019101610253565b50848210156102915786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610ff7806102af6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806379cc679011610081578063a9059cbb11610066578063a9059cbb1461028e578063bff9662a146102a1578063dd62ed3e146102c157600080fd5b806379cc67901461027357806395d89b411461028657600080fd5b806342966c68146102025780635b1125911461021557806370a0823114610235578063779e3b631461026b57600080fd5b80631e458bee116100ee5780631e458bee1461018857806323b872dd1461019b578063313ce567146101ae578063328a01d0146101bd57600080fd5b806306fdde0314610120578063095ea7b31461013e57806315d57fd41461016157806318160ddd14610176575b600080fd5b610128610307565b6040516101359190610d97565b60405180910390f35b61015161014c366004610e2c565b610399565b6040519015158152602001610135565b61017461016f366004610e56565b6103b3565b005b6002545b604051908152602001610135565b610174610196366004610e89565b61057e565b6101516101a9366004610ebc565b610631565b60405160128152602001610135565b6007546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610174610210366004610ef9565b610655565b6006546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a610243366004610f12565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610174610662565b610174610281366004610e2c565b610786565b610128610837565b61015161029c366004610e2c565b610846565b6005546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a6102cf366004610e56565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461031690610f34565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610f34565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b5050505050905090565b6000336103a7818585610854565b60019150505b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1633148015906103f3575060065473ffffffffffffffffffffffffffffffffffffffff163314155b15610431576040517fcdfcef970000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82161580610468575073ffffffffffffffffffffffffffffffffffffffff8116155b1561049f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560058054918516919092161790556040805133815260208101929092527fe79965b5c67dcfb2cf5fe152715e4a7256cee62a3d5dd8484fd8a8539eb8beff910160405180910390a16040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201527f1b9352454524a57a51f24f67dc66d898f616922cd1f7a12d73570ece12b1975c910160405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146105d1576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6105db8383610866565b808373ffffffffffffffffffffffffffffffffffffffff167fc263b302aec62d29105026245f19e16f8e0137066ccd4a8bd941f716bd4096bb8460405161062491815260200190565b60405180910390a3505050565b60003361063f8582856108c6565b61064a858585610995565b506001949350505050565b61065f3382610a40565b50565b60075473ffffffffffffffffffffffffffffffffffffffff1633146106b5576040517fe700765e000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b60065473ffffffffffffffffffffffffffffffffffffffff16610704576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040805133815260208101929092527f5104c9abdc7d111c2aeb4ce890ac70274a4be2ee83f46a62551be5e6ebc82dd0910160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6107e38282610a9c565b8173ffffffffffffffffffffffffffffffffffffffff167f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b18260405161082b91815260200190565b60405180910390a25050565b60606004805461031690610f34565b6000336103a7818585610995565b6108618383836001610ab1565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166108b6576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c260008383610bf9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f5781811015610980576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610428565b61098f84848484036000610ab1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166109e5576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8216610a35576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b610861838383610bf9565b73ffffffffffffffffffffffffffffffffffffffff8216610a90576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c282600083610bf9565b610aa78233836108c6565b6108c28282610a40565b73ffffffffffffffffffffffffffffffffffffffff8416610b01576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8316610b51576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561098f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610beb91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c31578060026000828254610c269190610f87565b90915550610ce39050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cb7576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610428565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610d0c57600280548290039055610d38565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161062491815260200190565b602081526000825180602084015260005b81811015610dc55760208186018101516040868401015201610da8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e2757600080fd5b919050565b60008060408385031215610e3f57600080fd5b610e4883610e03565b946020939093013593505050565b60008060408385031215610e6957600080fd5b610e7283610e03565b9150610e8060208401610e03565b90509250929050565b600080600060608486031215610e9e57600080fd5b610ea784610e03565b95602085013595506040909401359392505050565b600080600060608486031215610ed157600080fd5b610eda84610e03565b9250610ee860208501610e03565b929592945050506040919091013590565b600060208284031215610f0b57600080fd5b5035919050565b600060208284031215610f2457600080fd5b610f2d82610e03565b9392505050565b600181811c90821680610f4857607f821691505b602082108103610f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156103ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220085f01204b33dc17013c78c74fbca32a3da2c0b384ce7c8878c889551af28c6164736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a26469706673582212200ca58b09608757d2811325010decb3ac142b0ef78a6c6129ddfcf203b10b3ab664736f6c634300081a0033", } // GatewayEVMTestABI is the input ABI used to generate the binding from. @@ -2947,27 +2947,27 @@ func (it *GatewayEVMTestWithdrawnIterator) Close() error { // GatewayEVMTestWithdrawn represents a Withdrawn event raised by the GatewayEVMTest contract. type GatewayEVMTestWithdrawn struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterWithdrawn is a free log retrieval operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*GatewayEVMTestWithdrawnIterator, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*GatewayEVMTestWithdrawnIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _GatewayEVMTest.contract.FilterLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _GatewayEVMTest.contract.FilterLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -2976,19 +2976,19 @@ func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawn(opts *bind.Filter // WatchWithdrawn is a free log subscription operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayEVMTestWithdrawn, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayEVMTestWithdrawn, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _GatewayEVMTest.contract.WatchLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _GatewayEVMTest.contract.WatchLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -3022,7 +3022,7 @@ func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawn(opts *bind.WatchOp // ParseWithdrawn is a log parse operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) func (_GatewayEVMTest *GatewayEVMTestFilterer) ParseWithdrawn(log types.Log) (*GatewayEVMTestWithdrawn, error) { event := new(GatewayEVMTestWithdrawn) if err := _GatewayEVMTest.contract.UnpackLog(event, "Withdrawn", log); err != nil { @@ -3101,8 +3101,8 @@ func (it *GatewayEVMTestWithdrawnAndCalledIterator) Close() error { // GatewayEVMTestWithdrawnAndCalled represents a WithdrawnAndCalled event raised by the GatewayEVMTest contract. type GatewayEVMTestWithdrawnAndCalled struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte Raw types.Log // Blockchain specific contextual infos @@ -3110,19 +3110,19 @@ type GatewayEVMTestWithdrawnAndCalled struct { // FilterWithdrawnAndCalled is a free log retrieval operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*GatewayEVMTestWithdrawnAndCalledIterator, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*GatewayEVMTestWithdrawnAndCalledIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _GatewayEVMTest.contract.FilterLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _GatewayEVMTest.contract.FilterLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -3131,19 +3131,19 @@ func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawnAndCalled(opts *bi // WatchWithdrawnAndCalled is a free log subscription operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *GatewayEVMTestWithdrawnAndCalled, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *GatewayEVMTestWithdrawnAndCalled, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _GatewayEVMTest.contract.WatchLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _GatewayEVMTest.contract.WatchLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -3177,7 +3177,7 @@ func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawnAndCalled(opts *bin // ParseWithdrawnAndCalled is a log parse operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) func (_GatewayEVMTest *GatewayEVMTestFilterer) ParseWithdrawnAndCalled(log types.Log) (*GatewayEVMTestWithdrawnAndCalled, error) { event := new(GatewayEVMTestWithdrawnAndCalled) if err := _GatewayEVMTest.contract.UnpackLog(event, "WithdrawnAndCalled", log); err != nil { @@ -3256,8 +3256,8 @@ func (it *GatewayEVMTestWithdrawnAndRevertedIterator) Close() error { // GatewayEVMTestWithdrawnAndReverted represents a WithdrawnAndReverted event raised by the GatewayEVMTest contract. type GatewayEVMTestWithdrawnAndReverted struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte RevertContext RevertContext @@ -3266,19 +3266,19 @@ type GatewayEVMTestWithdrawnAndReverted struct { // FilterWithdrawnAndReverted is a free log retrieval operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*GatewayEVMTestWithdrawnAndRevertedIterator, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*GatewayEVMTestWithdrawnAndRevertedIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _GatewayEVMTest.contract.FilterLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _GatewayEVMTest.contract.FilterLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -3287,19 +3287,19 @@ func (_GatewayEVMTest *GatewayEVMTestFilterer) FilterWithdrawnAndReverted(opts * // WatchWithdrawnAndReverted is a free log subscription operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *GatewayEVMTestWithdrawnAndReverted, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *GatewayEVMTestWithdrawnAndReverted, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _GatewayEVMTest.contract.WatchLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _GatewayEVMTest.contract.WatchLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -3333,7 +3333,7 @@ func (_GatewayEVMTest *GatewayEVMTestFilterer) WatchWithdrawnAndReverted(opts *b // ParseWithdrawnAndReverted is a log parse operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) func (_GatewayEVMTest *GatewayEVMTestFilterer) ParseWithdrawnAndReverted(log types.Log) (*GatewayEVMTestWithdrawnAndReverted, error) { event := new(GatewayEVMTestWithdrawnAndReverted) if err := _GatewayEVMTest.contract.UnpackLog(event, "WithdrawnAndReverted", log); err != nil { diff --git a/v2/pkg/gatewayevmechidnatest.sol/gatewayevmechidnatest.go b/v2/pkg/gatewayevmechidnatest.sol/gatewayevmechidnatest.go index 8b8d0f87..35823187 100644 --- a/v2/pkg/gatewayevmechidnatest.sol/gatewayevmechidnatest.go +++ b/v2/pkg/gatewayevmechidnatest.sol/gatewayevmechidnatest.go @@ -47,7 +47,7 @@ type RevertOptions struct { // GatewayEVMEchidnaTestMetaData contains all meta data concerning the GatewayEVMEchidnaTest contract. var GatewayEVMEchidnaTestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"custody\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"echidnaCaller\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"executeWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"tssAddress_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"zetaToken_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revertWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setConnector\",\"inputs\":[{\"name\":\"zetaConnector_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCustody\",\"inputs\":[{\"name\":\"custody_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testERC20\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractTestERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testExecuteWithERC20\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tssAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"zetaConnector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"zetaToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x60a060405230608052600580546001600160a01b0319163317905534801561002657600080fd5b5061002f610154565b600554600180546001600160a01b039092166001600160a01b031992831617905560028054610123921691909117905560405161006b90610206565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f0801580156100bd573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b039283161790556001546040513092919091169082906100f290610213565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801561012e573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055610220565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156101a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610c9f80613b8883390190565b6119ca8061482783390190565b60805161393f610249600039600081816121190152818161214201526125ce015261393f6000f3fe6080604052600436106102345760003560e01c8063616e877a11610138578063ad3cb1cc116100b0578063d547741f1161007f578063e63ab1e911610064578063e63ab1e91461070c578063f7ad60db14610740578063fc93baef1461075357600080fd5b8063d547741f146106cc578063dda79b75146106ec57600080fd5b8063ad3cb1cc14610623578063ae7a3a6f1461066c578063c0c53b8b1461068c578063d0b492c3146106ac57600080fd5b80638456cb591161010757806391d14854116100ec57806391d1485414610575578063a217fddf146105da578063a783c789146105ef57600080fd5b80638456cb5914610540578063870de27a1461055557600080fd5b8063616e877a146104cd5780636ab90f9b146104ed57806370f23f881461050d57806381100bf01461052057600080fd5b80633f4ba83a116101cb57806352d1902d1161019a5780635b1125911161017f5780635b112591146104425780635c975abb146104625780635d62c8601461049957600080fd5b806352d1902d1461040d57806357bec62f1461042257600080fd5b80633f4ba83a146103a557806345ac7a8d146103ba5780634f1ef286146103da5780635131ab59146103ed57600080fd5b8063248a9ca311610207578063248a9ca3146102e85780632f2ff15d1461034557806336568abe146103655780633c2f05a81461038557600080fd5b806301ffc9a71461023957806310188aef1461026e5780631cff79cd1461029057806321e093b1146102b0575b600080fd5b34801561024557600080fd5b50610259610254366004612efb565b610766565b60405190151581526020015b60405180910390f35b34801561027a57600080fd5b5061028e610289366004612f59565b6107ff565b005b6102a361029e366004612fbd565b6108f3565b604051610265919061307e565b3480156102bc57600080fd5b506003546102d0906001600160a01b031681565b6040516001600160a01b039091168152602001610265565b3480156102f457600080fd5b50610337610303366004613091565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610265565b34801561035157600080fd5b5061028e6103603660046130aa565b6109f6565b34801561037157600080fd5b5061028e6103803660046130aa565b610a40565b34801561039157600080fd5b506004546102d0906001600160a01b031681565b3480156103b157600080fd5b5061028e610a91565b3480156103c657600080fd5b5061028e6103d53660046130ee565b610ac6565b61028e6103e836600461319c565b610b8e565b3480156103f957600080fd5b5061028e6104083660046132a3565b610bad565b34801561041957600080fd5b50610337610ec6565b34801561042e57600080fd5b506002546102d0906001600160a01b031681565b34801561044e57600080fd5b506001546102d0906001600160a01b031681565b34801561046e57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610259565b3480156104a557600080fd5b506103377f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b3480156104d957600080fd5b5061028e6104e8366004613312565b610ef5565b3480156104f957600080fd5b5061028e610508366004613362565b610fd1565b61028e61051b3660046133bc565b6110fc565b34801561052c57600080fd5b506005546102d0906001600160a01b031681565b34801561054c57600080fd5b5061028e61128d565b34801561056157600080fd5b5061028e61057036600461340a565b6112bf565b34801561058157600080fd5b506102596105903660046130aa565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156105e657600080fd5b50610337600081565b3480156105fb57600080fd5b506103377f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561062f57600080fd5b506102a36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b34801561067857600080fd5b5061028e610687366004612f59565b6113d0565b34801561069857600080fd5b5061028e6106a73660046134a2565b6114c4565b3480156106b857600080fd5b5061028e6106c73660046134f7565b611779565b3480156106d857600080fd5b5061028e6106e73660046130aa565b61193b565b3480156106f857600080fd5b506000546102d0906001600160a01b031681565b34801561071857600080fd5b506103377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61028e61074e366004613582565b61197f565b61028e6107613660046130ee565b611b80565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107f957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061080a81611d15565b6001600160a01b03821661084a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561088d576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b77f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611d1f565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091f81611d15565b610927611e0c565b61092f611e6a565b6001600160a01b03851661096f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097c868686611eeb565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f3487876040516109bb9392919061363e565b60405180910390a291506109ee60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a3081611d15565b610a3a8383611d1f565b50505050565b6001600160a01b0381163314610a82576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a8c8282611fba565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610abb81611d15565b610ac361207e565b50565b610ace611e0c565b610ad6611e6a565b6001600160a01b038416610b16576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610b5d93929190613731565b60405180910390a3610a3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610b9661210e565b610b9f826121de565b610ba982826121e9565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610bd781611d15565b610bdf611e0c565b610be7611e6a565b83600003610c21576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610c61576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6b868661230d565b610ca1576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190613757565b610d63576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d6e858484611eeb565b50610d79868661230d565b610daf576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e339190613774565b90508015610e4557610e45878261239d565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610e8c9392919061363e565b60405180910390a350610ebe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610ed06125c3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610efd611e0c565b610f05611e6a565b82600003610f3f576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610f7f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8a338385612625565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610b5d9392919061378d565b600480546040517f40c10f190000000000000000000000000000000000000000000000000000000081523092810192909252602482018590526001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505060045461106992506001600160a01b0316905085858585610bad565b600480546040517f70a0823100000000000000000000000000000000000000000000000000000000815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190613774565b15610a3a57610a3a6137c3565b611104611e0c565b61110c611e6a565b34600003611146576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611186576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d80600081146111d3576040519150601f19603f3d011682016040523d82523d6000602084013e6111d8565b606091505b5050905080611213576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161125b9392919061378d565b60405180910390a350610ba960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6112b781611d15565b610ac3612862565b6112c7611e0c565b6112cf611e6a565b84600003611309576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611349576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611354338587612625565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd878787878760405161139f9594939291906137f2565b60405180910390a3610ebe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006113db81611d15565b6001600160a01b03821661141b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b03161561145e576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114887f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611d1f565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff1660008115801561150f5750825b905060008267ffffffffffffffff16600114801561152c5750303b155b90508115801561153a575080155b15611571576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156115d25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b03881615806115ef57506001600160a01b038716155b15611626576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162e6128db565b6116366128e3565b61163e6128db565b6116466128f3565b611651600087611d1f565b5061167c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611d1f565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556116da7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611d1f565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038916179055831561176f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96117a381611d15565b6117ab611e0c565b6117b3611e6a565b846000036117ed576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661182d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118416001600160a01b0388168787612903565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de090611886908590600401613893565b600060405180830381600087803b1580156118a057600080fd5b505af11580156118b4573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14368787878760405161190194939291906138a6565b60405180910390a361193260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461197581611d15565b610a3a8383611fba565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6119a981611d15565b6119b1611e0c565b6119b9611e6a565b6001600160a01b0385166119f9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d8060008114611a46576040519150601f19603f3d011682016040523d82523d6000602084013e611a4b565b606091505b5050905080611a86576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de090611acb908690600401613893565b600060405180830381600087803b158015611ae557600080fd5b505af1158015611af9573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143634888888604051611b4794939291906138a6565b60405180910390a350611b7960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b611b88611e0c565b611b90611e6a565b34600003611bca576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611c0a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b5050905080611c97576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611ce39594939291906137f2565b60405180910390a350610a3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ac38133612977565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611e02576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611db83390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506107f9565b60009150506107f9565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611e68576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611ee5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611f0b9291906138dd565b60006040518083038185875af1925050503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509150915081611f89576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611e02576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506107f9565b612086612a04565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121a757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661219b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611e68576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ba981611d15565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612261575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261225e91810190613774565b60015b6122a7576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612303576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161229e565b610a8c8383612a5f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af1158015612379573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613757565b6003546001600160a01b03908116908316036124ec576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af115801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613757565b612479576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156124d857600080fd5b505af1158015610ebe573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa15801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190613757565b6125a9576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610ba9906001600160a01b03848116911683612903565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e68576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b0390811690831603612789576126506001600160a01b038316843084612ab5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156126bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e09190613757565b612716576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561277557600080fd5b505af1158015611932573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613757565b612846576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610a8c906001600160a01b038481169186911684612ab5565b61286a611e0c565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336120f0565b611e68612aee565b6128eb612aee565b611e68612b55565b6128fb612aee565b611e68612b5d565b6040516001600160a01b03838116602483015260448201839052610a8c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bae565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610ba9576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440161229e565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611e68576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6882612c2a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612aad57610a8c8282612cd2565b610ba9612d48565b6040516001600160a01b038481166024830152838116604483015260648201839052610a3a9186918216906323b872dd90608401612930565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611e68576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f94612aee565b612b65612aee565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000612bc36001600160a01b03841683612d80565b90508051600014158015612be8575080806020019051810190612be69190613757565b155b15610a8c576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161229e565b806001600160a01b03163b600003612c79576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161229e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612cef91906138ed565b600060405180830381855af49150503d8060008114612d2a576040519150601f19603f3d011682016040523d82523d6000602084013e612d2f565b606091505b5091509150612d3f858383612d8e565b95945050505050565b3415611e68576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611f8d83836000612e03565b606082612da357612d9e82612eb9565b611f8d565b8151158015612dba57506001600160a01b0384163b155b15612dfc576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161229e565b5080611f8d565b606081471015612e41576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161229e565b600080856001600160a01b03168486604051612e5d91906138ed565b60006040518083038185875af1925050503d8060008114612e9a576040519150601f19603f3d011682016040523d82523d6000602084013e612e9f565b606091505b5091509150612eaf868383612d8e565b9695505050505050565b805115612ec95780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612f0d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611f8d57600080fd5b80356001600160a01b0381168114612f5457600080fd5b919050565b600060208284031215612f6b57600080fd5b611f8d82612f3d565b60008083601f840112612f8657600080fd5b50813567ffffffffffffffff811115612f9e57600080fd5b602083019150836020828501011115612fb657600080fd5b9250929050565b600080600060408486031215612fd257600080fd5b612fdb84612f3d565b9250602084013567ffffffffffffffff811115612ff757600080fd5b61300386828701612f74565b9497909650939450505050565b60005b8381101561302b578181015183820152602001613013565b50506000910152565b6000815180845261304c816020860160208601613010565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f8d6020830184613034565b6000602082840312156130a357600080fd5b5035919050565b600080604083850312156130bd57600080fd5b823591506130cd60208401612f3d565b90509250929050565b6000608082840312156130e857600080fd5b50919050565b6000806000806060858703121561310457600080fd5b61310d85612f3d565b9350602085013567ffffffffffffffff81111561312957600080fd5b61313587828801612f74565b909450925050604085013567ffffffffffffffff81111561315557600080fd5b613161878288016130d6565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156131af57600080fd5b6131b883612f3d565b9150602083013567ffffffffffffffff8111156131d457600080fd5b8301601f810185136131e557600080fd5b803567ffffffffffffffff8111156131ff576131ff61316d565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561326b5761326b61316d565b60405281815282820160200187101561328357600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156132bb57600080fd5b6132c486612f3d565b94506132d260208701612f3d565b935060408601359250606086013567ffffffffffffffff8111156132f557600080fd5b61330188828901612f74565b969995985093965092949392505050565b6000806000806080858703121561332857600080fd5b61333185612f3d565b93506020850135925061334660408601612f3d565b9150606085013567ffffffffffffffff81111561315557600080fd5b6000806000806060858703121561337857600080fd5b61338185612f3d565b935060208501359250604085013567ffffffffffffffff8111156133a457600080fd5b6133b087828801612f74565b95989497509550505050565b600080604083850312156133cf57600080fd5b6133d883612f3d565b9150602083013567ffffffffffffffff8111156133f457600080fd5b613400858286016130d6565b9150509250929050565b60008060008060008060a0878903121561342357600080fd5b61342c87612f3d565b95506020870135945061344160408801612f3d565b9350606087013567ffffffffffffffff81111561345d57600080fd5b61346989828a01612f74565b909450925050608087013567ffffffffffffffff81111561348957600080fd5b61349589828a016130d6565b9150509295509295509295565b6000806000606084860312156134b757600080fd5b6134c084612f3d565b92506134ce60208501612f3d565b91506134dc60408501612f3d565b90509250925092565b6000606082840312156130e857600080fd5b60008060008060008060a0878903121561351057600080fd5b61351987612f3d565b955061352760208801612f3d565b945060408701359350606087013567ffffffffffffffff81111561354a57600080fd5b61355689828a01612f74565b909450925050608087013567ffffffffffffffff81111561357657600080fd5b61349589828a016134e5565b6000806000806060858703121561359857600080fd5b6135a185612f3d565b9350602085013567ffffffffffffffff8111156135bd57600080fd5b6135c987828801612f74565b909450925050604085013567ffffffffffffffff8111156135e957600080fd5b613161878288016134e5565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612d3f6040830184866135f5565b8015158114610ac357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261369b57600080fd5b830160208101925035905067ffffffffffffffff8111156136bb57600080fd5b803603821315612fb657600080fd5b6001600160a01b036136db82612f3d565b168252600060208201356136ee81613658565b151560208401526001600160a01b0361370960408401612f3d565b16604084015261371c6060830183613666565b60806060860152612d3f6080860182846135f5565b6040815260006137456040830185876135f5565b8281036020840152612eaf81856136ca565b60006020828403121561376957600080fd5b8151611f8d81613658565b60006020828403121561378657600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612d3f60a08301846136ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b8581526001600160a01b038516602082015260806040820152600061381b6080830185876135f5565b828103606084015261382d81856136ca565b98975050505050505050565b6001600160a01b0361384a82612f3d565b1682526000602082013567ffffffffffffffff811680821461386b57600080fd5b60208501525061387e6040830183613666565b60606040860152612d3f6060860182846135f5565b602081526000611f8d6020830184613839565b8481526060602082015260006138c06060830185876135f5565b82810360408401526138d28185613839565b979650505050505050565b8183823760009101908152919050565b600082516138ff818460208701613010565b919091019291505056fea264697066735822122026d0cadaf3cde211bc6eec2cadeca2578bd38190a95a53da1e9d894df17d695c64736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a", + Bin: "0x60a060405230608052600580546001600160a01b0319163317905534801561002657600080fd5b5061002f610154565b600554600180546001600160a01b039092166001600160a01b031992831617905560028054610123921691909117905560405161006b90610206565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f0801580156100bd573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b039283161790556001546040513092919091169082906100f290610213565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801561012e573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055610220565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156101a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610c9f80613b8883390190565b6119ca8061482783390190565b60805161393f610249600039600081816121190152818161214201526125ce015261393f6000f3fe6080604052600436106102345760003560e01c8063616e877a11610138578063ad3cb1cc116100b0578063d547741f1161007f578063e63ab1e911610064578063e63ab1e91461070c578063f7ad60db14610740578063fc93baef1461075357600080fd5b8063d547741f146106cc578063dda79b75146106ec57600080fd5b8063ad3cb1cc14610623578063ae7a3a6f1461066c578063c0c53b8b1461068c578063d0b492c3146106ac57600080fd5b80638456cb591161010757806391d14854116100ec57806391d1485414610575578063a217fddf146105da578063a783c789146105ef57600080fd5b80638456cb5914610540578063870de27a1461055557600080fd5b8063616e877a146104cd5780636ab90f9b146104ed57806370f23f881461050d57806381100bf01461052057600080fd5b80633f4ba83a116101cb57806352d1902d1161019a5780635b1125911161017f5780635b112591146104425780635c975abb146104625780635d62c8601461049957600080fd5b806352d1902d1461040d57806357bec62f1461042257600080fd5b80633f4ba83a146103a557806345ac7a8d146103ba5780634f1ef286146103da5780635131ab59146103ed57600080fd5b8063248a9ca311610207578063248a9ca3146102e85780632f2ff15d1461034557806336568abe146103655780633c2f05a81461038557600080fd5b806301ffc9a71461023957806310188aef1461026e5780631cff79cd1461029057806321e093b1146102b0575b600080fd5b34801561024557600080fd5b50610259610254366004612efb565b610766565b60405190151581526020015b60405180910390f35b34801561027a57600080fd5b5061028e610289366004612f59565b6107ff565b005b6102a361029e366004612fbd565b6108f3565b604051610265919061307e565b3480156102bc57600080fd5b506003546102d0906001600160a01b031681565b6040516001600160a01b039091168152602001610265565b3480156102f457600080fd5b50610337610303366004613091565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610265565b34801561035157600080fd5b5061028e6103603660046130aa565b6109f6565b34801561037157600080fd5b5061028e6103803660046130aa565b610a40565b34801561039157600080fd5b506004546102d0906001600160a01b031681565b3480156103b157600080fd5b5061028e610a91565b3480156103c657600080fd5b5061028e6103d53660046130ee565b610ac6565b61028e6103e836600461319c565b610b8e565b3480156103f957600080fd5b5061028e6104083660046132a3565b610bad565b34801561041957600080fd5b50610337610ec6565b34801561042e57600080fd5b506002546102d0906001600160a01b031681565b34801561044e57600080fd5b506001546102d0906001600160a01b031681565b34801561046e57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610259565b3480156104a557600080fd5b506103377f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b3480156104d957600080fd5b5061028e6104e8366004613312565b610ef5565b3480156104f957600080fd5b5061028e610508366004613362565b610fd1565b61028e61051b3660046133bc565b6110fc565b34801561052c57600080fd5b506005546102d0906001600160a01b031681565b34801561054c57600080fd5b5061028e61128d565b34801561056157600080fd5b5061028e61057036600461340a565b6112bf565b34801561058157600080fd5b506102596105903660046130aa565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156105e657600080fd5b50610337600081565b3480156105fb57600080fd5b506103377f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561062f57600080fd5b506102a36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b34801561067857600080fd5b5061028e610687366004612f59565b6113d0565b34801561069857600080fd5b5061028e6106a73660046134a2565b6114c4565b3480156106b857600080fd5b5061028e6106c73660046134f7565b611779565b3480156106d857600080fd5b5061028e6106e73660046130aa565b61193b565b3480156106f857600080fd5b506000546102d0906001600160a01b031681565b34801561071857600080fd5b506103377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61028e61074e366004613582565b61197f565b61028e6107613660046130ee565b611b80565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107f957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061080a81611d15565b6001600160a01b03821661084a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561088d576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b77f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611d1f565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091f81611d15565b610927611e0c565b61092f611e6a565b6001600160a01b03851661096f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097c868686611eeb565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f3487876040516109bb9392919061363e565b60405180910390a291506109ee60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a3081611d15565b610a3a8383611d1f565b50505050565b6001600160a01b0381163314610a82576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a8c8282611fba565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610abb81611d15565b610ac361207e565b50565b610ace611e0c565b610ad6611e6a565b6001600160a01b038416610b16576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610b5d93929190613731565b60405180910390a3610a3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610b9661210e565b610b9f826121de565b610ba982826121e9565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610bd781611d15565b610bdf611e0c565b610be7611e6a565b83600003610c21576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610c61576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6b868661230d565b610ca1576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190613757565b610d63576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d6e858484611eeb565b50610d79868661230d565b610daf576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e339190613774565b90508015610e4557610e45878261239d565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610e8c9392919061363e565b60405180910390a350610ebe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610ed06125c3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610efd611e0c565b610f05611e6a565b82600003610f3f576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610f7f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8a338385612625565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610b5d9392919061378d565b600480546040517f40c10f190000000000000000000000000000000000000000000000000000000081523092810192909252602482018590526001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505060045461106992506001600160a01b0316905085858585610bad565b600480546040517f70a0823100000000000000000000000000000000000000000000000000000000815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190613774565b15610a3a57610a3a6137c3565b611104611e0c565b61110c611e6a565b34600003611146576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611186576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d80600081146111d3576040519150601f19603f3d011682016040523d82523d6000602084013e6111d8565b606091505b5050905080611213576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161125b9392919061378d565b60405180910390a350610ba960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6112b781611d15565b610ac3612862565b6112c7611e0c565b6112cf611e6a565b84600003611309576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611349576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611354338587612625565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd878787878760405161139f9594939291906137f2565b60405180910390a3610ebe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006113db81611d15565b6001600160a01b03821661141b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b03161561145e576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114887f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611d1f565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff1660008115801561150f5750825b905060008267ffffffffffffffff16600114801561152c5750303b155b90508115801561153a575080155b15611571576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156115d25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b03881615806115ef57506001600160a01b038716155b15611626576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162e6128db565b6116366128e3565b61163e6128db565b6116466128f3565b611651600087611d1f565b5061167c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611d1f565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556116da7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611d1f565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038916179055831561176f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96117a381611d15565b6117ab611e0c565b6117b3611e6a565b846000036117ed576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661182d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118416001600160a01b0388168787612903565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de090611886908590600401613893565b600060405180830381600087803b1580156118a057600080fd5b505af11580156118b4573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14368787878760405161190194939291906138a6565b60405180910390a361193260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461197581611d15565b610a3a8383611fba565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6119a981611d15565b6119b1611e0c565b6119b9611e6a565b6001600160a01b0385166119f9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d8060008114611a46576040519150601f19603f3d011682016040523d82523d6000602084013e611a4b565b606091505b5050905080611a86576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de090611acb908690600401613893565b600060405180830381600087803b158015611ae557600080fd5b505af1158015611af9573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143634888888604051611b4794939291906138a6565b60405180910390a350611b7960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b611b88611e0c565b611b90611e6a565b34600003611bca576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611c0a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b5050905080611c97576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611ce39594939291906137f2565b60405180910390a350610a3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ac38133612977565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611e02576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611db83390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506107f9565b60009150506107f9565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611e68576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611ee5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611f0b9291906138dd565b60006040518083038185875af1925050503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509150915081611f89576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611e02576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506107f9565b612086612a04565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121a757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661219b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611e68576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ba981611d15565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612261575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261225e91810190613774565b60015b6122a7576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612303576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161229e565b610a8c8383612a5f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af1158015612379573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613757565b6003546001600160a01b03908116908316036124ec576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af115801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613757565b612479576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156124d857600080fd5b505af1158015610ebe573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa15801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190613757565b6125a9576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610ba9906001600160a01b03848116911683612903565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e68576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b0390811690831603612789576126506001600160a01b038316843084612ab5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156126bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e09190613757565b612716576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561277557600080fd5b505af1158015611932573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613757565b612846576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610a8c906001600160a01b038481169186911684612ab5565b61286a611e0c565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336120f0565b611e68612aee565b6128eb612aee565b611e68612b55565b6128fb612aee565b611e68612b5d565b6040516001600160a01b03838116602483015260448201839052610a8c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bae565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610ba9576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440161229e565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611e68576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6882612c2a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612aad57610a8c8282612cd2565b610ba9612d48565b6040516001600160a01b038481166024830152838116604483015260648201839052610a3a9186918216906323b872dd90608401612930565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611e68576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f94612aee565b612b65612aee565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000612bc36001600160a01b03841683612d80565b90508051600014158015612be8575080806020019051810190612be69190613757565b155b15610a8c576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161229e565b806001600160a01b03163b600003612c79576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161229e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612cef91906138ed565b600060405180830381855af49150503d8060008114612d2a576040519150601f19603f3d011682016040523d82523d6000602084013e612d2f565b606091505b5091509150612d3f858383612d8e565b95945050505050565b3415611e68576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611f8d83836000612e03565b606082612da357612d9e82612eb9565b611f8d565b8151158015612dba57506001600160a01b0384163b155b15612dfc576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161229e565b5080611f8d565b606081471015612e41576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161229e565b600080856001600160a01b03168486604051612e5d91906138ed565b60006040518083038185875af1925050503d8060008114612e9a576040519150601f19603f3d011682016040523d82523d6000602084013e612e9f565b606091505b5091509150612eaf868383612d8e565b9695505050505050565b805115612ec95780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612f0d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611f8d57600080fd5b80356001600160a01b0381168114612f5457600080fd5b919050565b600060208284031215612f6b57600080fd5b611f8d82612f3d565b60008083601f840112612f8657600080fd5b50813567ffffffffffffffff811115612f9e57600080fd5b602083019150836020828501011115612fb657600080fd5b9250929050565b600080600060408486031215612fd257600080fd5b612fdb84612f3d565b9250602084013567ffffffffffffffff811115612ff757600080fd5b61300386828701612f74565b9497909650939450505050565b60005b8381101561302b578181015183820152602001613013565b50506000910152565b6000815180845261304c816020860160208601613010565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f8d6020830184613034565b6000602082840312156130a357600080fd5b5035919050565b600080604083850312156130bd57600080fd5b823591506130cd60208401612f3d565b90509250929050565b6000608082840312156130e857600080fd5b50919050565b6000806000806060858703121561310457600080fd5b61310d85612f3d565b9350602085013567ffffffffffffffff81111561312957600080fd5b61313587828801612f74565b909450925050604085013567ffffffffffffffff81111561315557600080fd5b613161878288016130d6565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156131af57600080fd5b6131b883612f3d565b9150602083013567ffffffffffffffff8111156131d457600080fd5b8301601f810185136131e557600080fd5b803567ffffffffffffffff8111156131ff576131ff61316d565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561326b5761326b61316d565b60405281815282820160200187101561328357600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156132bb57600080fd5b6132c486612f3d565b94506132d260208701612f3d565b935060408601359250606086013567ffffffffffffffff8111156132f557600080fd5b61330188828901612f74565b969995985093965092949392505050565b6000806000806080858703121561332857600080fd5b61333185612f3d565b93506020850135925061334660408601612f3d565b9150606085013567ffffffffffffffff81111561315557600080fd5b6000806000806060858703121561337857600080fd5b61338185612f3d565b935060208501359250604085013567ffffffffffffffff8111156133a457600080fd5b6133b087828801612f74565b95989497509550505050565b600080604083850312156133cf57600080fd5b6133d883612f3d565b9150602083013567ffffffffffffffff8111156133f457600080fd5b613400858286016130d6565b9150509250929050565b60008060008060008060a0878903121561342357600080fd5b61342c87612f3d565b95506020870135945061344160408801612f3d565b9350606087013567ffffffffffffffff81111561345d57600080fd5b61346989828a01612f74565b909450925050608087013567ffffffffffffffff81111561348957600080fd5b61349589828a016130d6565b9150509295509295509295565b6000806000606084860312156134b757600080fd5b6134c084612f3d565b92506134ce60208501612f3d565b91506134dc60408501612f3d565b90509250925092565b6000606082840312156130e857600080fd5b60008060008060008060a0878903121561351057600080fd5b61351987612f3d565b955061352760208801612f3d565b945060408701359350606087013567ffffffffffffffff81111561354a57600080fd5b61355689828a01612f74565b909450925050608087013567ffffffffffffffff81111561357657600080fd5b61349589828a016134e5565b6000806000806060858703121561359857600080fd5b6135a185612f3d565b9350602085013567ffffffffffffffff8111156135bd57600080fd5b6135c987828801612f74565b909450925050604085013567ffffffffffffffff8111156135e957600080fd5b613161878288016134e5565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612d3f6040830184866135f5565b8015158114610ac357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261369b57600080fd5b830160208101925035905067ffffffffffffffff8111156136bb57600080fd5b803603821315612fb657600080fd5b6001600160a01b036136db82612f3d565b168252600060208201356136ee81613658565b151560208401526001600160a01b0361370960408401612f3d565b16604084015261371c6060830183613666565b60806060860152612d3f6080860182846135f5565b6040815260006137456040830185876135f5565b8281036020840152612eaf81856136ca565b60006020828403121561376957600080fd5b8151611f8d81613658565b60006020828403121561378657600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612d3f60a08301846136ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b8581526001600160a01b038516602082015260806040820152600061381b6080830185876135f5565b828103606084015261382d81856136ca565b98975050505050505050565b6001600160a01b0361384a82612f3d565b1682526000602082013567ffffffffffffffff811680821461386b57600080fd5b60208501525061387e6040830183613666565b60606040860152612d3f6060860182846135f5565b602081526000611f8d6020830184613839565b8481526060602082015260006138c06060830185876135f5565b82810360408401526138d28185613839565b979650505050505050565b8183823760009101908152919050565b600082516138ff818460208701613010565b919091019291505056fea264697066735822122031f891589c82d8503b2afa2146a5fe5ea5d8f03bc2113e27a01f4243dc46540364736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a", } // GatewayEVMEchidnaTestABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/gatewayevmupgrade.t.sol/gatewayevmuupsupgradetest.go b/v2/pkg/gatewayevmupgrade.t.sol/gatewayevmuupsupgradetest.go index 2e8db729..055c986b 100644 --- a/v2/pkg/gatewayevmupgrade.t.sol/gatewayevmuupsupgradetest.go +++ b/v2/pkg/gatewayevmupgrade.t.sol/gatewayevmuupsupgradetest.go @@ -65,7 +65,7 @@ type StdInvariantFuzzSelector struct { // GatewayEVMUUPSUpgradeTestMetaData contains all meta data concerning the GatewayEVMUUPSUpgradeTest contract. var GatewayEVMUUPSUpgradeTestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testUpgradeAndForwardCallToReceivePayable\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedV2\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061c4e48061003c6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806385226c811161008c578063b5508aa911610066578063b5508aa91461018b578063ba414fa614610193578063e20c9f71146101ab578063fa7626d4146101b357600080fd5b806385226c8114610159578063916a17c61461016e578063b0464fdc1461018357600080fd5b80633e5e3c23116100c85780633e5e3c231461012c5780633f7286f41461013457806366d9a9a01461013c5780637a380ebf1461015157600080fd5b80630a9254e4146100ef5780631ed7831c146100f95780632ade388014610117575b600080fd5b6100f76101c0565b005b610101610a85565b60405161010e919061620b565b60405180910390f35b61011f610ae7565b60405161010e91906162a7565b610101610c29565b610101610c89565b610144610ce9565b60405161010e919061640d565b6100f7610e6b565b61016161152d565b60405161010e91906164ab565b6101766115fd565b60405161010e9190616522565b6101766116f8565b6101616117f3565b61019b6118c3565b604051901515815260200161010e565b610101611997565b601f5461019b9060ff1681565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880549091166156781790556040516102129061611e565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f080158015610297573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516102dc9061611e565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f080158015610360573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600e81527f4761746577617945564d2e736f6c00000000000000000000000000000000000060208201526028546026549251908516602482015260448101939093529216606482015261044f919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526119f7565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556028546026546040519293918216929116906104db9061612b565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610517573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055602054602554602854602654604051938516949283169391831692169061057290616138565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f0801580156105b6573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516105fb90616145565b604051809103906000f080158015610617573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b1580156106c357600080fd5b505af11580156106d7573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561074d57600080fd5b505af1158015610761573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b15801561084157600080fd5b505af1158015610855573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108b757600080fd5b505af11580156108cb573d6000803e3d6000fd5b5050602480546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f4240938101939093521692506340c10f199150604401600060405180830381600087803b15801561093c57600080fd5b505af1158015610950573d6000803e3d6000fd5b5050602480546022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a1209381019390935216925063a9059cbb91506044016020604051808303816000875af11580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea91906165b9565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b50505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610add57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610abf575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015610c2057600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610c09578382906000526020600020018054610b7c906165db565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba8906165db565b8015610bf55780601f10610bca57610100808354040283529160200191610bf5565b820191906000526020600020905b815481529060010190602001808311610bd857829003601f168201915b505050505081526020019060010190610b5d565b505050508152505081526020019060010190610b0b565b50505050905090565b60606018805480602002602001604051908101604052809291908181526020018280548015610add576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610abf575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610add576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610abf575050505050905090565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015610c205783829060005260206000209060020201604051806040016040529081600082018054610d40906165db565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6c906165db565b8015610db95780601f10610d8e57610100808354040283529160200191610db9565b820191906000526020600020905b815481529060010190602001808311610d9c57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610e5357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610e005790505b50505050508152505081526020019060010190610d0d565b60208054604080517fdda79b7500000000000000000000000000000000000000000000000000000000815290516000936001600160a01b039093169263dda79b7592600480820193918290030181865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190616628565b60208054604080517f5b11259100000000000000000000000000000000000000000000000000000000815290519394506000936001600160a01b0390921692635b112591926004808401938290030181865afa158015610f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f799190616628565b604080518082018252600f81527f48656c6c6f2c20466f756e647279210000000000000000000000000000000000602080830191909152601f5483518085018552601981527f4761746577617945564d55706772616465546573742e736f6c00000000000000818401528451928301909452600082526026549495509193602a93600193670de0b6b3a764000093611023936001600160a01b036101009093048316939216611a16565b600084848460405160240161103a93929190616651565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f9700000000000000000000000000000000000000000000000000000000179052601f5460215491517ff30c7ba30000000000000000000000000000000000000000000000000000000081529293506001600160a01b03610100909104811692737109709ecfa91a80626ff3989d68f67f5b1dd12d9263f30c7ba392611100929116908790879060040161667b565b600060405180830381600087803b15801561111a57600080fd5b505af115801561112e573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156111c057600080fd5b505af11580156111d4573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa935061121d92506001600160a01b039091169086908a908a908a906166a3565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f373df382b9c587826f3de13f16d67f8d99f28ee947fc0924c6ef2d6d2c7e8546915061130c90869086906166e4565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561138657600080fd5b505af115801561139a573d6000803e3d6000fd5b50506021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b038086169450631cff79cd935087926113ec9291169087906004016166fd565b60006040518083038185885af115801561140a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526114339190810190616807565b5060208054604080517fdda79b7500000000000000000000000000000000000000000000000000000000815290516114c0938c936001600160a01b03169263dda79b7592600480830193928290030181865afa158015611497573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bb9190616628565b611a32565b60208054604080517f5b1125910000000000000000000000000000000000000000000000000000000081529051611523938b936001600160a01b031692635b11259192600480830193928290030181865afa158015611497573d6000803e3d6000fd5b5050505050505050565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015610c20578382906000526020600020018054611570906165db565b80601f016020809104026020016040519081016040528092919081815260200182805461159c906165db565b80156115e95780601f106115be576101008083540402835291602001916115e9565b820191906000526020600020905b8154815290600101906020018083116115cc57829003601f168201915b505050505081526020019060010190611551565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015610c205760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156116e057602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161168d5790505b50505050508152505081526020019060010190611621565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015610c205760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156117db57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116117885790505b5050505050815250508152602001906001019061171c565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015610c20578382906000526020600020018054611836906165db565b80601f0160208091040260200160405190810160405280929190818152602001828054611862906165db565b80156118af5780601f10611884576101008083540402835291602001916118af565b820191906000526020600020905b81548152906001019060200180831161189257829003601f168201915b505050505081526020019060010190611817565b60085460009060ff16156118db575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa15801561196c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611990919061683c565b1415905090565b60606015805480602002602001604051908101604052809291908181526020018280548015610add576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610abf575050505050905090565b6000611a01616152565b611a0c848483611ac2565b9150505b92915050565b611a1e616152565b611a2b8585858486611b3d565b5050505050565b6040517f515361f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015282166024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063515361f69060440160006040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050505050565b600080611acf8584611c3e565b9050611b326040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001611b1d9291906166fd565b60405160208183030381529060405285611c4a565b9150505b9392505050565b6040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201528190737109709ecfa91a80626ff3989d68f67f5b1dd12d9081906306447d5690602401600060405180830381600087803b158015611baf57600080fd5b505af1925050508015611bc0575060015b611bd557611bd087878787611c78565b611c35565b611be187878787611c78565b806001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c1c57600080fd5b505af1158015611c30573d6000803e3d6000fd5b505050505b50505050505050565b6000611b368383611c91565b60c08101515160009015611c6e57611c6784848460c00151611cac565b9050611b36565b611c678484611e52565b6000611c848483611f3d565b9050611a2b858285611f49565b6000611c9d8383612313565b611b3683836020015184611c4a565b600080611cb7612323565b90506000611cc586836123f6565b90506000611cdc826060015183602001518561289c565b90506000611cec83838989612aae565b90506000611cf98261392b565b602081015181519192509060030b15611d6c57898260400151604051602001611d23929190616855565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252611d63916004016168d6565b60405180910390fd5b6000611daf6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001613afa565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90611e029084906004016168d6565b602060405180830381865afa158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190616628565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590611ea79087906004016168d6565b600060405180830381865afa158015611ec4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611eec9190810190616807565b90506000611f1a8285604051602001611f069291906168e9565b604051602081830303815290604052613cfa565b90506001600160a01b038116611a0c578484604051602001611d23929190616918565b6000611c9d8383613d0d565b6040517f667f9d700000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90600090829063667f9d7090604401602060405180830381865afa158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612009919061683c565b9050806121b057600061201b86613d19565b604080518082018252600581527f352e302e30000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506120a6905b60408051808201825260008082526020918201528151808301909252845182528085019082015290613e06565b806120b2575060008451115b15612135576040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03871690634f1ef286906120fe90889088906004016166fd565b600060405180830381600087803b15801561211857600080fd5b505af115801561212c573d6000803e3d6000fd5b505050506121aa565b6040517f3659cfe60000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152871690633659cfe690602401600060405180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050505b50611a2b565b8060006121bc82613d19565b604080518082018252600581527f352e302e300000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061221e90612079565b8061222a575060008551115b156122af576040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03831690639623609d90612278908a908a908a906004016169c3565b600060405180830381600087803b15801561229257600080fd5b505af11580156122a6573d6000803e3d6000fd5b50505050611c35565b6040517f99a88ec40000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301528316906399a88ec490604401600060405180830381600087803b158015611c1c57600080fd5b61231f82826000613e1a565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906123aa9084906004016169f4565b600060405180830381865afa1580156123c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123ef9190810190616a3b565b9250505090565b6124286040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506124736040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61247c85613f1d565b6020820152600061248c86614302565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156124ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124f69190810190616a3b565b868385602001516040516020016125109493929190616a84565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906125689085906004016168d6565b600060405180830381865afa158015612585573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125ad9190810190616a3b565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f6906125f5908490600401616b88565b602060405180830381865afa158015612612573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263691906165b9565b61264b5781604051602001611d239190616bda565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890612690908490600401616c6c565b600060405180830381865afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d59190810190616a3b565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061271c908490600401616cbe565b602060405180830381865afa158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d91906165b9565b156127f2576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906127a7908490600401616cbe565b600060405180830381865afa1580156127c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127ec9190810190616a3b565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016128179190616d10565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401612843929190616d7c565b600060405180830381865afa158015612860573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128889190810190616a3b565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816128b85790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061291857612918616da1565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061296c5761296c616da1565b6020026020010181905250846040516020016129889190616dd0565b604051602081830303815290604052816002815181106129aa576129aa616da1565b6020026020010181905250826040516020016129c69190616e3c565b604051602081830303815290604052816003815181106129e8576129e8616da1565b602002602001018190525060006129fe8261392b565b602080820151604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000008185019081528251808401845260008082529086015282518084019093529051825292810192909252919250612a8f9060408051808201825260008082526020918201528151808301909252845182528085019082015290614585565b612aa45785604051602001611d239190616e7d565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015612afe565b511590565b612c7257826020015115612bba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401611d63565b8260c0015115612c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401611d63565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081612c8b57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280612ce690616f3d565b935060ff1681518110612cfb57612cfb616da1565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001612d4c9190616f5c565b604051602081830303815290604052828280612d6790616f3d565b935060ff1681518110612d7c57612d7c616da1565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280612dc990616f3d565b935060ff1681518110612dde57612dde616da1565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280612e2b90616f3d565b935060ff1681518110612e4057612e40616da1565b60200260200101819052508760200151828280612e5c90616f3d565b935060ff1681518110612e7157612e71616da1565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280612ebe90616f3d565b935060ff1681518110612ed357612ed3616da1565b602090810291909101015287518282612eeb81616f3d565b935060ff1681518110612f0057612f00616da1565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280612f4d90616f3d565b935060ff1681518110612f6257612f62616da1565b6020026020010181905250612f76466145e6565b8282612f8181616f3d565b935060ff1681518110612f9657612f96616da1565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280612fe390616f3d565b935060ff1681518110612ff857612ff8616da1565b60200260200101819052508682828061301090616f3d565b935060ff168151811061302557613025616da1565b602090810291909101015285511561314c5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261307681616f3d565b935060ff168151811061308b5761308b616da1565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906130db9089906004016168d6565b600060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131209190810190616a3b565b828261312b81616f3d565b935060ff168151811061314057613140616da1565b60200260200101819052505b84602001511561321c5760408051808201909152601281527f2d2d766572696679536f75726365436f646500000000000000000000000000006020820152828261319581616f3d565b935060ff16815181106131aa576131aa616da1565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806131f790616f3d565b935060ff168151811061320c5761320c616da1565b60200260200101819052506133e3565b613254612af98660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6132e75760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261329781616f3d565b935060ff16815181106132ac576132ac616da1565b60200260200101819052508460a001516040516020016132cc9190616dd0565b6040516020818303038152906040528282806131f790616f3d565b8460c0015115801561332a57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261332890511590565b155b156133e35760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261336e81616f3d565b935060ff168151811061338357613383616da1565b602002602001018190525061339788614686565b6040516020016133a79190616dd0565b6040516020818303038152906040528282806133c290616f3d565b935060ff16815181106133d7576133d7616da1565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261341790511590565b6134ac5760408051808201909152600b81527f2d2d72656c6179657249640000000000000000000000000000000000000000006020820152828261345a81616f3d565b935060ff168151811061346f5761346f616da1565b6020026020010181905250846040015182828061348b90616f3d565b935060ff16815181106134a0576134a0616da1565b60200260200101819052505b6060850151156135cd5760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826134f581616f3d565b935060ff168151811061350a5761350a616da1565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015613579573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135a19190810190616a3b565b82826135ac81616f3d565b935060ff16815181106135c1576135c1616da1565b60200260200101819052505b60e085015151156136745760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261361781616f3d565b935060ff168151811061362c5761362c616da1565b60200260200101819052506136488560e00151600001516145e6565b828261365381616f3d565b935060ff168151811061366857613668616da1565b60200260200101819052505b60e0850151602001511561371e5760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826136c181616f3d565b935060ff16815181106136d6576136d6616da1565b60200260200101819052506136f28560e00151602001516145e6565b82826136fd81616f3d565b935060ff168151811061371257613712616da1565b60200260200101819052505b60e085015160400151156137c85760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261376b81616f3d565b935060ff168151811061378057613780616da1565b602002602001018190525061379c8560e00151604001516145e6565b82826137a781616f3d565b935060ff16815181106137bc576137bc616da1565b60200260200101819052505b60e085015160600151156138725760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261381581616f3d565b935060ff168151811061382a5761382a616da1565b60200260200101819052506138468560e00151606001516145e6565b828261385181616f3d565b935060ff168151811061386657613866616da1565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156138905761389061671f565b6040519080825280602002602001820160405280156138c357816020015b60608152602001906001900390816138ae5790505b50905060005b8260ff168160ff16101561391c57838160ff16815181106138ec576138ec616da1565b6020026020010151828260ff168151811061390957613909616da1565b60209081029190910101526001016138c9565b5093505050505b949350505050565b6139526040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916139d891869101616fc7565b600060405180830381865afa1580156139f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a1d9190810190616a3b565b90506000613a2b8683615175565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401613a5b91906164ab565b6000604051808303816000875af1158015613a7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613aa2919081019061700e565b805190915060030b15801590613abb5750602081015151155b8015613aca5750604081015151155b15612aa45781600081518110613ae257613ae2616da1565b6020026020010151604051602001611d2391906170c4565b60606000613b2f8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150613b669082905b906152ca565b15613cc3576000613be382613bdd84613bd7613ba98a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906152f1565b90615353565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150613c479082906152ca565b15613cb157604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152613cae905b82906153d8565b90505b613cba816153fe565b92505050611b36565b8215613cdc578484604051602001611d239291906172b0565b5050604080516020810190915260008152611b36565b509392505050565b6000808251602084016000f09392505050565b61231f82826001613e1a565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fad3cb1cc00000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b03861691613d8e9190617357565b6000604051808303816000865af19150503d8060008114613dcb576040519150601f19603f3d011682016040523d82523d6000602084013e613dd0565b606091505b50915091508115613def57808060200190518101906139239190616a3b565b505060408051602081019091526000815292915050565b6000613e128383615467565b159392505050565b8160a0015115613e2957505050565b6000613e36848484615542565b90506000613e438261392b565b602081015181519192509060030b158015613edf5750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152613edf90604080518082018252600080825260209182015281518083019092528451825280850190820152613b60565b15613eec57505050505050565b60408201515115613f0c578160400151604051602001611d239190617373565b80604051602001611d2391906173d1565b60606000613f528360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150613fb7905b8290614585565b1561402657604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152611b3690614021908390615add565b6153fe565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614088905b8290615b67565b60010361415557604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526140ee90613ca7565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152611b3690614021905b83906153d8565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526141b490613fb0565b156142eb57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061421c908390615c01565b90506000816001835161422f919061743c565b8151811061423f5761423f616da1565b602002602001015190506142e26140216142b56040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290615add565b95945050505050565b82604051602001611d23919061744f565b50919050565b606060006143378360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061439990613fb0565b156143a757611b36816153fe565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261440690614081565b60010361447057604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152611b36906140219061414e565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526144cf90613fb0565b156142eb57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290614537908390615c01565b9050600181511115614573578060028251614552919061743c565b8151811061456257614562616da1565b602002602001015192505050919050565b5082604051602001611d23919061744f565b80518251600091111561459a57506000611a10565b815183516020850151600092916145b09161752d565b6145ba919061743c565b9050826020015181036145d1576001915050611a10565b82516020840151819020912014905092915050565b606060006145f383615ca6565b600101905060008167ffffffffffffffff8111156146135761461361671f565b6040519080825280601f01601f19166020018201604052801561463d576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461464757509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091614712905b8290613e06565b1561475257505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526147b19061470b565b156147f157505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526148509061470b565b1561489057505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526148ef9061470b565b806149545750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526149549061470b565b1561499457505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526149f39061470b565b80614a585750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614a589061470b565b15614a9857505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614af79061470b565b80614b5c5750604080518082018252601181527f4c47504c2d322e312d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614b5c9061470b565b15614b9c57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614bfb9061470b565b80614c605750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614c609061470b565b15614ca057505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614cff9061470b565b15614d3f57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d9e9061470b565b15614dde57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614e3d9061470b565b15614e7d57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614edc9061470b565b15614f1c57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7b9061470b565b15614fbb57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261501a9061470b565b8061507f5750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261507f9061470b565b156150bf57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261511e9061470b565b1561515e57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151611d239290602001617540565b60608060005b8451811015615200578185828151811061519757615197616da1565b60200260200101516040516020016151b09291906168e9565b6040516020818303038152906040529150600185516151cf919061743c565b81146151f857816040516020016151e691906176a9565b60405160208183030381529060405291505b60010161517b565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081615219579050509050838160008151811061524457615244616da1565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061529857615298616da1565b602002602001018190525081816002815181106152b7576152b7616da1565b6020908102919091010152949350505050565b60208083015183518351928401516000936152e89291849190615d88565b14159392505050565b604080518082019091526000808252602082015260006153238460000151856020015185600001518660200151615e99565b9050836020015181615335919061743c565b8451859061534490839061743c565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015615378575081611a10565b602080830151908401516001911461539f5750815160208481015190840151829020919020145b80156153d0578251845185906153b690839061743c565b90525082516020850180516153cc90839061752d565b9052505b509192915050565b60408051808201909152600080825260208201526153f7838383615fb9565b5092915050565b60606000826000015167ffffffffffffffff81111561541f5761541f61671f565b6040519080825280601f01601f191660200182016040528015615449576020820181803683370190505b50905060006020820190506153f78185602001518660000151616064565b815181516000919081111561547a575081515b6020808501519084015160005b8381101561553357825182518082146155035760001960208710156154e2576001846154b489602061743c565b6154be919061752d565b6154c99060086176ea565b6154d49060026177e8565b6154de919061743c565b1990505b8181168382168181039114615500579750611a109650505050505050565b50505b61550e60208661752d565b945061551b60208561752d565b9350505060208161552c919061752d565b9050615487565b5084518651612aa491906177f4565b6060600061554e612323565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161556b57905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806155c690616f3d565b935060ff16815181106155db576155db616da1565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e330000000000000000000000000000000000000000000000000081525060405160200161562c9190617814565b60405160208183030381529060405282828061564790616f3d565b935060ff168151811061565c5761565c616da1565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806156a990616f3d565b935060ff16815181106156be576156be616da1565b6020026020010181905250826040516020016156da9190616e3c565b6040516020818303038152906040528282806156f590616f3d565b935060ff168151811061570a5761570a616da1565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e74726163740000000000000000000000000000000000000000000081525082828061575790616f3d565b935060ff168151811061576c5761576c616da1565b602002602001018190525061578187846160de565b828261578c81616f3d565b935060ff16815181106157a1576157a1616da1565b60209081029190910101528551511561584d5760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826157f381616f3d565b935060ff168151811061580857615808616da1565b60200260200101819052506158218660000151846160de565b828261582c81616f3d565b935060ff168151811061584157615841616da1565b60200260200101819052505b8560800151156158bb5760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261589681616f3d565b935060ff16815181106158ab576158ab616da1565b6020026020010181905250615921565b84156159215760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261590081616f3d565b935060ff168151811061591557615915616da1565b60200260200101819052505b604086015151156159bd5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261596b81616f3d565b935060ff168151811061598057615980616da1565b6020026020010181905250856040015182828061599c90616f3d565b935060ff16815181106159b1576159b1616da1565b60200260200101819052505b856060015115615a275760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282615a0681616f3d565b935060ff1681518110615a1b57615a1b616da1565b60200260200101819052505b60008160ff1667ffffffffffffffff811115615a4557615a4561671f565b604051908082528060200260200182016040528015615a7857816020015b6060815260200190600190039081615a635790505b50905060005b8260ff168160ff161015615ad157838160ff1681518110615aa157615aa1616da1565b6020026020010151828260ff1681518110615abe57615abe616da1565b6020908102919091010152600101615a7e565b50979650505050505050565b6040805180820190915260008082526020820152815183511015615b02575081611a10565b81518351602085015160009291615b189161752d565b615b22919061743c565b60208401519091506001908214615b43575082516020840151819020908220145b8015615b5e57835185518690615b5a90839061743c565b9052505b50929392505050565b6000808260000151615b8b8560000151866020015186600001518760200151615e99565b615b95919061752d565b90505b83516020850151615ba9919061752d565b81116153f75781615bb981617859565b9250508260000151615bf0856020015183615bd4919061743c565b8651615be0919061743c565b8386600001518760200151615e99565b615bfa919061752d565b9050615b98565b60606000615c0f8484615b67565b615c1a90600161752d565b67ffffffffffffffff811115615c3257615c3261671f565b604051908082528060200260200182016040528015615c6557816020015b6060815260200190600190039081615c505790505b50905060005b8151811015613cf257615c8161402186866153d8565b828281518110615c9357615c93616da1565b6020908102919091010152600101615c6b565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310615cef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310615d1b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310615d3957662386f26fc10000830492506010015b6305f5e1008310615d51576305f5e100830492506008015b6127108310615d6557612710830492506004015b60648310615d77576064830492506002015b600a8310611a105760010192915050565b600080858411615e8f5760208411615e3b5760008415615dd3576001615daf86602061743c565b615dba9060086176ea565b615dc59060026177e8565b615dcf919061743c565b1990505b8351811685615de2898961752d565b615dec919061743c565b805190935082165b818114615e2657878411615e0e5787945050505050613923565b83615e1881617873565b945050828451169050615df4565b615e30878561752d565b945050505050613923565b838320615e48858861743c565b615e52908761752d565b91505b858210615e8d57848220808203615e7a57615e70868461752d565b9350505050613923565b615e8560018461743c565b925050615e55565b505b5092949350505050565b60008381868511615fa45760208511615f535760008515615ee5576001615ec187602061743c565b615ecc9060086176ea565b615ed79060026177e8565b615ee1919061743c565b1990505b84518116600087615ef68b8b61752d565b615f00919061743c565b855190915083165b828114615f4557818610615f2d57615f208b8b61752d565b9650505050505050613923565b85615f3781617859565b965050838651169050615f08565b859650505050505050613923565b508383206000905b615f65868961743c565b8211615fa257858320808203615f815783945050505050613923565b615f8c60018561752d565b9350508180615f9a90617859565b925050615f5b565b505b615fae878761752d565b979650505050505050565b60408051808201909152600080825260208201526000615feb8560000151866020015186600001518760200151615e99565b602080870180519186019190915251909150616007908261743c565b83528451602086015161601a919061752d565b8103616029576000855261605b565b83518351616037919061752d565b8551869061604690839061743c565b9052508351616055908261752d565b60208601525b50909392505050565b6020811061609c578151835261607b60208461752d565b925061608860208361752d565b915061609560208261743c565b9050616064565b60001981156160cb5760016160b283602061743c565b6160be906101006177e8565b6160c8919061743c565b90505b9151835183169219169190911790915250565b606060006160ec84846123f6565b80516020808301516040519394506161069390910161788a565b60405160208183030381529060405291505092915050565b610c9f806178e383390190565b6119ca8061858283390190565b61178380619f4c83390190565b610de08061b6cf83390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161619561619a565b905290565b604051806101000160405280600015158152602001600015158152602001606081526020016000801916815260200160608152602001606081526020016000151581526020016161956040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b8181101561624c5783516001600160a01b0316835260209384019390920191600101616225565b509095945050505050565b60005b8381101561627257818101518382015260200161625a565b50506000910152565b60008151808452616293816020860160208601616257565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015616389577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261637384865161627b565b6020958601959094509290920191600101616339565b5091975050506020948501949290920191506001016162cf565b50929695505050505050565b600081518084526020840193506020830160005b828110156164035781517fffffffff00000000000000000000000000000000000000000000000000000000168652602095860195909101906001016163c3565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752616479604088018261627b565b905060208201519150868103602088015261649481836163af565b965050506020938401939190910190600101616435565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261650d85835161627b565b945060209384019391909101906001016164d3565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b03815116865260208101519050604060208701526165a360408701826163af565b955050602093840193919091019060010161654a565b6000602082840312156165cb57600080fd5b81518015158114611b3657600080fd5b600181811c908216806165ef57607f821691505b6020821081036142fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006020828403121561663a57600080fd5b81516001600160a01b0381168114611b3657600080fd5b606081526000616664606083018661627b565b602083019490945250901515604090910152919050565b6001600160a01b03841681528260208201526060604082015260006142e2606083018461627b565b6001600160a01b038616815284602082015260a0604082015260006166cb60a083018661627b565b6060830194909452509015156080909101529392505050565b828152604060208201526000613923604083018461627b565b6001600160a01b0383168152604060208201526000613923604083018461627b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156167715761677161671f565b60405290565b60008067ffffffffffffffff8411156167925761679261671f565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156167c1576167c161671f565b6040528381529050808284018510156167d957600080fd5b613cf2846020830185616257565b600082601f8301126167f857600080fd5b611b3683835160208501616777565b60006020828403121561681957600080fd5b815167ffffffffffffffff81111561683057600080fd5b611a0c848285016167e7565b60006020828403121561684e57600080fd5b5051919050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161688d81601a850160208801616257565b7f3a20000000000000000000000000000000000000000000000000000000000000601a9184019182015283516168ca81601c840160208801616257565b01601c01949350505050565b602081526000611b36602083018461627b565b600083516168fb818460208801616257565b83519083019061690f818360208801616257565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161695081601a850160208801616257565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161698d816033840160208801616257565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b6001600160a01b03841681526001600160a01b03831660208201526060604082015260006142e2606083018461627b565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000611b36608083018461627b565b600060208284031215616a4d57600080fd5b815167ffffffffffffffff811115616a6457600080fd5b8201601f81018413616a7557600080fd5b611a0c84825160208401616777565b60008551616a96818460208a01616257565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551616ad0816001840160208a01616257565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451616b0e816002840160208901616257565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351616b50816002840160208801616257565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000616b9b604083018461627b565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251616c1281601f850160208701616257565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000616c7f604083018461627b565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000616cd1604083018461627b565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251616d48816014850160208701616257565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000616d8f604083018561627b565b8281036020840152611b32818561627b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251616e08816001850160208701616257565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251616e4e818460208701616257565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251616f0181604b850160208701616257565b91909101604b0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff8103616f5357616f53616f0e565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251616fba816029850160208701616257565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000611b36608083018461627b565b60006020828403121561702057600080fd5b815167ffffffffffffffff81111561703757600080fd5b82016060818503121561704957600080fd5b61705161674e565b81518060030b811461706257600080fd5b8152602082015167ffffffffffffffff81111561707e57600080fd5b61708a868285016167e7565b602083015250604082015167ffffffffffffffff8111156170aa57600080fd5b6170b6868285016167e7565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f2200000000000000000000000000000000000000000000000000000000000000602082015260008251617122816021850160208701616257565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161730e816021850160208801616257565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161734b81602e840160208801616257565b01602e01949350505050565b60008251617369818460208701616257565b9190910192915050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251616fba816029850160208701616257565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161742f816022850160208701616257565b9190910160220192915050565b81810381811115611a1057611a10616f0e565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161748781600e850160208701616257565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b80820180821115611a1057611a10616f0e565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351617578816018850160208801616257565b7f20696e200000000000000000000000000000000000000000000000000000000060189184019182015283516175b581601c840160208801616257565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516176bb818460208701616257565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b8082028115828204841417611a1057611a10616f0e565b6001815b600184111561773c5780850481111561772057617720616f0e565b600184161561772e57908102905b60019390931c928002617705565b935093915050565b60008261775357506001611a10565b8161776057506000611a10565b816001811461777657600281146177805761779c565b6001915050611a10565b60ff84111561779157617791616f0e565b50506001821b611a10565b5060208310610133831016604e8410600b84101617156177bf575081810a611a10565b6177cc6000198484617701565b80600019048211156177e0576177e0616f0e565b029392505050565b6000611b368383617744565b81810360008312801583831316838312821617156153f7576153f7616f0e565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161784c81601c850160208701616257565b91909101601c0192915050565b6000600019820361786c5761786c616f0e565b5060010190565b60008161788257617882616f0e565b506000190190565b6000835161789c818460208801616257565b7f3a0000000000000000000000000000000000000000000000000000000000000090830190815283516178d6816001840160208801616257565b0160010194935050505056fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a264697066735822122080a686a8fefe605bfa621239ae5412b3db6764178f1103c1f60928bd5b2d83ec64736f6c634300081a0033", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061c4e48061003c6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806385226c811161008c578063b5508aa911610066578063b5508aa91461018b578063ba414fa614610193578063e20c9f71146101ab578063fa7626d4146101b357600080fd5b806385226c8114610159578063916a17c61461016e578063b0464fdc1461018357600080fd5b80633e5e3c23116100c85780633e5e3c231461012c5780633f7286f41461013457806366d9a9a01461013c5780637a380ebf1461015157600080fd5b80630a9254e4146100ef5780631ed7831c146100f95780632ade388014610117575b600080fd5b6100f76101c0565b005b610101610a85565b60405161010e919061620b565b60405180910390f35b61011f610ae7565b60405161010e91906162a7565b610101610c29565b610101610c89565b610144610ce9565b60405161010e919061640d565b6100f7610e6b565b61016161152d565b60405161010e91906164ab565b6101766115fd565b60405161010e9190616522565b6101766116f8565b6101616117f3565b61019b6118c3565b604051901515815260200161010e565b610101611997565b601f5461019b9060ff1681565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880549091166156781790556040516102129061611e565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f080158015610297573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516102dc9061611e565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f080158015610360573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600e81527f4761746577617945564d2e736f6c00000000000000000000000000000000000060208201526028546026549251908516602482015260448101939093529216606482015261044f919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526119f7565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556028546026546040519293918216929116906104db9061612b565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610517573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055602054602554602854602654604051938516949283169391831692169061057290616138565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f0801580156105b6573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516105fb90616145565b604051809103906000f080158015610617573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b1580156106c357600080fd5b505af11580156106d7573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561074d57600080fd5b505af1158015610761573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b15801561084157600080fd5b505af1158015610855573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108b757600080fd5b505af11580156108cb573d6000803e3d6000fd5b5050602480546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f4240938101939093521692506340c10f199150604401600060405180830381600087803b15801561093c57600080fd5b505af1158015610950573d6000803e3d6000fd5b5050602480546022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a1209381019390935216925063a9059cbb91506044016020604051808303816000875af11580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea91906165b9565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b50505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610add57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610abf575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015610c2057600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610c09578382906000526020600020018054610b7c906165db565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba8906165db565b8015610bf55780601f10610bca57610100808354040283529160200191610bf5565b820191906000526020600020905b815481529060010190602001808311610bd857829003601f168201915b505050505081526020019060010190610b5d565b505050508152505081526020019060010190610b0b565b50505050905090565b60606018805480602002602001604051908101604052809291908181526020018280548015610add576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610abf575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610add576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610abf575050505050905090565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015610c205783829060005260206000209060020201604051806040016040529081600082018054610d40906165db565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6c906165db565b8015610db95780601f10610d8e57610100808354040283529160200191610db9565b820191906000526020600020905b815481529060010190602001808311610d9c57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610e5357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610e005790505b50505050508152505081526020019060010190610d0d565b60208054604080517fdda79b7500000000000000000000000000000000000000000000000000000000815290516000936001600160a01b039093169263dda79b7592600480820193918290030181865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190616628565b60208054604080517f5b11259100000000000000000000000000000000000000000000000000000000815290519394506000936001600160a01b0390921692635b112591926004808401938290030181865afa158015610f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f799190616628565b604080518082018252600f81527f48656c6c6f2c20466f756e647279210000000000000000000000000000000000602080830191909152601f5483518085018552601981527f4761746577617945564d55706772616465546573742e736f6c00000000000000818401528451928301909452600082526026549495509193602a93600193670de0b6b3a764000093611023936001600160a01b036101009093048316939216611a16565b600084848460405160240161103a93929190616651565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f9700000000000000000000000000000000000000000000000000000000179052601f5460215491517ff30c7ba30000000000000000000000000000000000000000000000000000000081529293506001600160a01b03610100909104811692737109709ecfa91a80626ff3989d68f67f5b1dd12d9263f30c7ba392611100929116908790879060040161667b565b600060405180830381600087803b15801561111a57600080fd5b505af115801561112e573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156111c057600080fd5b505af11580156111d4573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa935061121d92506001600160a01b039091169086908a908a908a906166a3565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f373df382b9c587826f3de13f16d67f8d99f28ee947fc0924c6ef2d6d2c7e8546915061130c90869086906166e4565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561138657600080fd5b505af115801561139a573d6000803e3d6000fd5b50506021546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b038086169450631cff79cd935087926113ec9291169087906004016166fd565b60006040518083038185885af115801561140a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526114339190810190616807565b5060208054604080517fdda79b7500000000000000000000000000000000000000000000000000000000815290516114c0938c936001600160a01b03169263dda79b7592600480830193928290030181865afa158015611497573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bb9190616628565b611a32565b60208054604080517f5b1125910000000000000000000000000000000000000000000000000000000081529051611523938b936001600160a01b031692635b11259192600480830193928290030181865afa158015611497573d6000803e3d6000fd5b5050505050505050565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015610c20578382906000526020600020018054611570906165db565b80601f016020809104026020016040519081016040528092919081815260200182805461159c906165db565b80156115e95780601f106115be576101008083540402835291602001916115e9565b820191906000526020600020905b8154815290600101906020018083116115cc57829003601f168201915b505050505081526020019060010190611551565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015610c205760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156116e057602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161168d5790505b50505050508152505081526020019060010190611621565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015610c205760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156117db57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116117885790505b5050505050815250508152602001906001019061171c565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015610c20578382906000526020600020018054611836906165db565b80601f0160208091040260200160405190810160405280929190818152602001828054611862906165db565b80156118af5780601f10611884576101008083540402835291602001916118af565b820191906000526020600020905b81548152906001019060200180831161189257829003601f168201915b505050505081526020019060010190611817565b60085460009060ff16156118db575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa15801561196c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611990919061683c565b1415905090565b60606015805480602002602001604051908101604052809291908181526020018280548015610add576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610abf575050505050905090565b6000611a01616152565b611a0c848483611ac2565b9150505b92915050565b611a1e616152565b611a2b8585858486611b3d565b5050505050565b6040517f515361f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015282166024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063515361f69060440160006040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050505050565b600080611acf8584611c3e565b9050611b326040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001611b1d9291906166fd565b60405160208183030381529060405285611c4a565b9150505b9392505050565b6040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201528190737109709ecfa91a80626ff3989d68f67f5b1dd12d9081906306447d5690602401600060405180830381600087803b158015611baf57600080fd5b505af1925050508015611bc0575060015b611bd557611bd087878787611c78565b611c35565b611be187878787611c78565b806001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c1c57600080fd5b505af1158015611c30573d6000803e3d6000fd5b505050505b50505050505050565b6000611b368383611c91565b60c08101515160009015611c6e57611c6784848460c00151611cac565b9050611b36565b611c678484611e52565b6000611c848483611f3d565b9050611a2b858285611f49565b6000611c9d8383612313565b611b3683836020015184611c4a565b600080611cb7612323565b90506000611cc586836123f6565b90506000611cdc826060015183602001518561289c565b90506000611cec83838989612aae565b90506000611cf98261392b565b602081015181519192509060030b15611d6c57898260400151604051602001611d23929190616855565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252611d63916004016168d6565b60405180910390fd5b6000611daf6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001613afa565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90611e029084906004016168d6565b602060405180830381865afa158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190616628565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590611ea79087906004016168d6565b600060405180830381865afa158015611ec4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611eec9190810190616807565b90506000611f1a8285604051602001611f069291906168e9565b604051602081830303815290604052613cfa565b90506001600160a01b038116611a0c578484604051602001611d23929190616918565b6000611c9d8383613d0d565b6040517f667f9d700000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90600090829063667f9d7090604401602060405180830381865afa158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612009919061683c565b9050806121b057600061201b86613d19565b604080518082018252600581527f352e302e30000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506120a6905b60408051808201825260008082526020918201528151808301909252845182528085019082015290613e06565b806120b2575060008451115b15612135576040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03871690634f1ef286906120fe90889088906004016166fd565b600060405180830381600087803b15801561211857600080fd5b505af115801561212c573d6000803e3d6000fd5b505050506121aa565b6040517f3659cfe60000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152871690633659cfe690602401600060405180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050505b50611a2b565b8060006121bc82613d19565b604080518082018252600581527f352e302e300000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061221e90612079565b8061222a575060008551115b156122af576040517f9623609d0000000000000000000000000000000000000000000000000000000081526001600160a01b03831690639623609d90612278908a908a908a906004016169c3565b600060405180830381600087803b15801561229257600080fd5b505af11580156122a6573d6000803e3d6000fd5b50505050611c35565b6040517f99a88ec40000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301528316906399a88ec490604401600060405180830381600087803b158015611c1c57600080fd5b61231f82826000613e1a565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906123aa9084906004016169f4565b600060405180830381865afa1580156123c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123ef9190810190616a3b565b9250505090565b6124286040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506124736040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61247c85613f1d565b6020820152600061248c86614302565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156124ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124f69190810190616a3b565b868385602001516040516020016125109493929190616a84565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906125689085906004016168d6565b600060405180830381865afa158015612585573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125ad9190810190616a3b565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f6906125f5908490600401616b88565b602060405180830381865afa158015612612573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263691906165b9565b61264b5781604051602001611d239190616bda565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890612690908490600401616c6c565b600060405180830381865afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d59190810190616a3b565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061271c908490600401616cbe565b602060405180830381865afa158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d91906165b9565b156127f2576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906127a7908490600401616cbe565b600060405180830381865afa1580156127c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127ec9190810190616a3b565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016128179190616d10565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401612843929190616d7c565b600060405180830381865afa158015612860573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128889190810190616a3b565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816128b85790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061291857612918616da1565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061296c5761296c616da1565b6020026020010181905250846040516020016129889190616dd0565b604051602081830303815290604052816002815181106129aa576129aa616da1565b6020026020010181905250826040516020016129c69190616e3c565b604051602081830303815290604052816003815181106129e8576129e8616da1565b602002602001018190525060006129fe8261392b565b602080820151604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000008185019081528251808401845260008082529086015282518084019093529051825292810192909252919250612a8f9060408051808201825260008082526020918201528151808301909252845182528085019082015290614585565b612aa45785604051602001611d239190616e7d565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015612afe565b511590565b612c7257826020015115612bba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401611d63565b8260c0015115612c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401611d63565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081612c8b57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280612ce690616f3d565b935060ff1681518110612cfb57612cfb616da1565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001612d4c9190616f5c565b604051602081830303815290604052828280612d6790616f3d565b935060ff1681518110612d7c57612d7c616da1565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280612dc990616f3d565b935060ff1681518110612dde57612dde616da1565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280612e2b90616f3d565b935060ff1681518110612e4057612e40616da1565b60200260200101819052508760200151828280612e5c90616f3d565b935060ff1681518110612e7157612e71616da1565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280612ebe90616f3d565b935060ff1681518110612ed357612ed3616da1565b602090810291909101015287518282612eeb81616f3d565b935060ff1681518110612f0057612f00616da1565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280612f4d90616f3d565b935060ff1681518110612f6257612f62616da1565b6020026020010181905250612f76466145e6565b8282612f8181616f3d565b935060ff1681518110612f9657612f96616da1565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280612fe390616f3d565b935060ff1681518110612ff857612ff8616da1565b60200260200101819052508682828061301090616f3d565b935060ff168151811061302557613025616da1565b602090810291909101015285511561314c5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261307681616f3d565b935060ff168151811061308b5761308b616da1565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906130db9089906004016168d6565b600060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131209190810190616a3b565b828261312b81616f3d565b935060ff168151811061314057613140616da1565b60200260200101819052505b84602001511561321c5760408051808201909152601281527f2d2d766572696679536f75726365436f646500000000000000000000000000006020820152828261319581616f3d565b935060ff16815181106131aa576131aa616da1565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806131f790616f3d565b935060ff168151811061320c5761320c616da1565b60200260200101819052506133e3565b613254612af98660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6132e75760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261329781616f3d565b935060ff16815181106132ac576132ac616da1565b60200260200101819052508460a001516040516020016132cc9190616dd0565b6040516020818303038152906040528282806131f790616f3d565b8460c0015115801561332a57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261332890511590565b155b156133e35760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261336e81616f3d565b935060ff168151811061338357613383616da1565b602002602001018190525061339788614686565b6040516020016133a79190616dd0565b6040516020818303038152906040528282806133c290616f3d565b935060ff16815181106133d7576133d7616da1565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261341790511590565b6134ac5760408051808201909152600b81527f2d2d72656c6179657249640000000000000000000000000000000000000000006020820152828261345a81616f3d565b935060ff168151811061346f5761346f616da1565b6020026020010181905250846040015182828061348b90616f3d565b935060ff16815181106134a0576134a0616da1565b60200260200101819052505b6060850151156135cd5760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826134f581616f3d565b935060ff168151811061350a5761350a616da1565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015613579573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135a19190810190616a3b565b82826135ac81616f3d565b935060ff16815181106135c1576135c1616da1565b60200260200101819052505b60e085015151156136745760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261361781616f3d565b935060ff168151811061362c5761362c616da1565b60200260200101819052506136488560e00151600001516145e6565b828261365381616f3d565b935060ff168151811061366857613668616da1565b60200260200101819052505b60e0850151602001511561371e5760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826136c181616f3d565b935060ff16815181106136d6576136d6616da1565b60200260200101819052506136f28560e00151602001516145e6565b82826136fd81616f3d565b935060ff168151811061371257613712616da1565b60200260200101819052505b60e085015160400151156137c85760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261376b81616f3d565b935060ff168151811061378057613780616da1565b602002602001018190525061379c8560e00151604001516145e6565b82826137a781616f3d565b935060ff16815181106137bc576137bc616da1565b60200260200101819052505b60e085015160600151156138725760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261381581616f3d565b935060ff168151811061382a5761382a616da1565b60200260200101819052506138468560e00151606001516145e6565b828261385181616f3d565b935060ff168151811061386657613866616da1565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156138905761389061671f565b6040519080825280602002602001820160405280156138c357816020015b60608152602001906001900390816138ae5790505b50905060005b8260ff168160ff16101561391c57838160ff16815181106138ec576138ec616da1565b6020026020010151828260ff168151811061390957613909616da1565b60209081029190910101526001016138c9565b5093505050505b949350505050565b6139526040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916139d891869101616fc7565b600060405180830381865afa1580156139f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a1d9190810190616a3b565b90506000613a2b8683615175565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401613a5b91906164ab565b6000604051808303816000875af1158015613a7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613aa2919081019061700e565b805190915060030b15801590613abb5750602081015151155b8015613aca5750604081015151155b15612aa45781600081518110613ae257613ae2616da1565b6020026020010151604051602001611d2391906170c4565b60606000613b2f8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150613b669082905b906152ca565b15613cc3576000613be382613bdd84613bd7613ba98a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906152f1565b90615353565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150613c479082906152ca565b15613cb157604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152613cae905b82906153d8565b90505b613cba816153fe565b92505050611b36565b8215613cdc578484604051602001611d239291906172b0565b5050604080516020810190915260008152611b36565b509392505050565b6000808251602084016000f09392505050565b61231f82826001613e1a565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fad3cb1cc00000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b03861691613d8e9190617357565b6000604051808303816000865af19150503d8060008114613dcb576040519150601f19603f3d011682016040523d82523d6000602084013e613dd0565b606091505b50915091508115613def57808060200190518101906139239190616a3b565b505060408051602081019091526000815292915050565b6000613e128383615467565b159392505050565b8160a0015115613e2957505050565b6000613e36848484615542565b90506000613e438261392b565b602081015181519192509060030b158015613edf5750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152613edf90604080518082018252600080825260209182015281518083019092528451825280850190820152613b60565b15613eec57505050505050565b60408201515115613f0c578160400151604051602001611d239190617373565b80604051602001611d2391906173d1565b60606000613f528360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150613fb7905b8290614585565b1561402657604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152611b3690614021908390615add565b6153fe565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614088905b8290615b67565b60010361415557604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526140ee90613ca7565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152611b3690614021905b83906153d8565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526141b490613fb0565b156142eb57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061421c908390615c01565b90506000816001835161422f919061743c565b8151811061423f5761423f616da1565b602002602001015190506142e26140216142b56040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290615add565b95945050505050565b82604051602001611d23919061744f565b50919050565b606060006143378360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061439990613fb0565b156143a757611b36816153fe565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261440690614081565b60010361447057604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152611b36906140219061414e565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526144cf90613fb0565b156142eb57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290614537908390615c01565b9050600181511115614573578060028251614552919061743c565b8151811061456257614562616da1565b602002602001015192505050919050565b5082604051602001611d23919061744f565b80518251600091111561459a57506000611a10565b815183516020850151600092916145b09161752d565b6145ba919061743c565b9050826020015181036145d1576001915050611a10565b82516020840151819020912014905092915050565b606060006145f383615ca6565b600101905060008167ffffffffffffffff8111156146135761461361671f565b6040519080825280601f01601f19166020018201604052801561463d576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461464757509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091614712905b8290613e06565b1561475257505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526147b19061470b565b156147f157505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526148509061470b565b1561489057505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526148ef9061470b565b806149545750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526149549061470b565b1561499457505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526149f39061470b565b80614a585750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614a589061470b565b15614a9857505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614af79061470b565b80614b5c5750604080518082018252601181527f4c47504c2d322e312d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614b5c9061470b565b15614b9c57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614bfb9061470b565b80614c605750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614c609061470b565b15614ca057505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614cff9061470b565b15614d3f57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d9e9061470b565b15614dde57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614e3d9061470b565b15614e7d57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614edc9061470b565b15614f1c57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7b9061470b565b15614fbb57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261501a9061470b565b8061507f5750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261507f9061470b565b156150bf57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e310000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261511e9061470b565b1561515e57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151611d239290602001617540565b60608060005b8451811015615200578185828151811061519757615197616da1565b60200260200101516040516020016151b09291906168e9565b6040516020818303038152906040529150600185516151cf919061743c565b81146151f857816040516020016151e691906176a9565b60405160208183030381529060405291505b60010161517b565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081615219579050509050838160008151811061524457615244616da1565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061529857615298616da1565b602002602001018190525081816002815181106152b7576152b7616da1565b6020908102919091010152949350505050565b60208083015183518351928401516000936152e89291849190615d88565b14159392505050565b604080518082019091526000808252602082015260006153238460000151856020015185600001518660200151615e99565b9050836020015181615335919061743c565b8451859061534490839061743c565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015615378575081611a10565b602080830151908401516001911461539f5750815160208481015190840151829020919020145b80156153d0578251845185906153b690839061743c565b90525082516020850180516153cc90839061752d565b9052505b509192915050565b60408051808201909152600080825260208201526153f7838383615fb9565b5092915050565b60606000826000015167ffffffffffffffff81111561541f5761541f61671f565b6040519080825280601f01601f191660200182016040528015615449576020820181803683370190505b50905060006020820190506153f78185602001518660000151616064565b815181516000919081111561547a575081515b6020808501519084015160005b8381101561553357825182518082146155035760001960208710156154e2576001846154b489602061743c565b6154be919061752d565b6154c99060086176ea565b6154d49060026177e8565b6154de919061743c565b1990505b8181168382168181039114615500579750611a109650505050505050565b50505b61550e60208661752d565b945061551b60208561752d565b9350505060208161552c919061752d565b9050615487565b5084518651612aa491906177f4565b6060600061554e612323565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161556b57905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806155c690616f3d565b935060ff16815181106155db576155db616da1565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e330000000000000000000000000000000000000000000000000081525060405160200161562c9190617814565b60405160208183030381529060405282828061564790616f3d565b935060ff168151811061565c5761565c616da1565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806156a990616f3d565b935060ff16815181106156be576156be616da1565b6020026020010181905250826040516020016156da9190616e3c565b6040516020818303038152906040528282806156f590616f3d565b935060ff168151811061570a5761570a616da1565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e74726163740000000000000000000000000000000000000000000081525082828061575790616f3d565b935060ff168151811061576c5761576c616da1565b602002602001018190525061578187846160de565b828261578c81616f3d565b935060ff16815181106157a1576157a1616da1565b60209081029190910101528551511561584d5760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826157f381616f3d565b935060ff168151811061580857615808616da1565b60200260200101819052506158218660000151846160de565b828261582c81616f3d565b935060ff168151811061584157615841616da1565b60200260200101819052505b8560800151156158bb5760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261589681616f3d565b935060ff16815181106158ab576158ab616da1565b6020026020010181905250615921565b84156159215760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261590081616f3d565b935060ff168151811061591557615915616da1565b60200260200101819052505b604086015151156159bd5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261596b81616f3d565b935060ff168151811061598057615980616da1565b6020026020010181905250856040015182828061599c90616f3d565b935060ff16815181106159b1576159b1616da1565b60200260200101819052505b856060015115615a275760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282615a0681616f3d565b935060ff1681518110615a1b57615a1b616da1565b60200260200101819052505b60008160ff1667ffffffffffffffff811115615a4557615a4561671f565b604051908082528060200260200182016040528015615a7857816020015b6060815260200190600190039081615a635790505b50905060005b8260ff168160ff161015615ad157838160ff1681518110615aa157615aa1616da1565b6020026020010151828260ff1681518110615abe57615abe616da1565b6020908102919091010152600101615a7e565b50979650505050505050565b6040805180820190915260008082526020820152815183511015615b02575081611a10565b81518351602085015160009291615b189161752d565b615b22919061743c565b60208401519091506001908214615b43575082516020840151819020908220145b8015615b5e57835185518690615b5a90839061743c565b9052505b50929392505050565b6000808260000151615b8b8560000151866020015186600001518760200151615e99565b615b95919061752d565b90505b83516020850151615ba9919061752d565b81116153f75781615bb981617859565b9250508260000151615bf0856020015183615bd4919061743c565b8651615be0919061743c565b8386600001518760200151615e99565b615bfa919061752d565b9050615b98565b60606000615c0f8484615b67565b615c1a90600161752d565b67ffffffffffffffff811115615c3257615c3261671f565b604051908082528060200260200182016040528015615c6557816020015b6060815260200190600190039081615c505790505b50905060005b8151811015613cf257615c8161402186866153d8565b828281518110615c9357615c93616da1565b6020908102919091010152600101615c6b565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310615cef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310615d1b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310615d3957662386f26fc10000830492506010015b6305f5e1008310615d51576305f5e100830492506008015b6127108310615d6557612710830492506004015b60648310615d77576064830492506002015b600a8310611a105760010192915050565b600080858411615e8f5760208411615e3b5760008415615dd3576001615daf86602061743c565b615dba9060086176ea565b615dc59060026177e8565b615dcf919061743c565b1990505b8351811685615de2898961752d565b615dec919061743c565b805190935082165b818114615e2657878411615e0e5787945050505050613923565b83615e1881617873565b945050828451169050615df4565b615e30878561752d565b945050505050613923565b838320615e48858861743c565b615e52908761752d565b91505b858210615e8d57848220808203615e7a57615e70868461752d565b9350505050613923565b615e8560018461743c565b925050615e55565b505b5092949350505050565b60008381868511615fa45760208511615f535760008515615ee5576001615ec187602061743c565b615ecc9060086176ea565b615ed79060026177e8565b615ee1919061743c565b1990505b84518116600087615ef68b8b61752d565b615f00919061743c565b855190915083165b828114615f4557818610615f2d57615f208b8b61752d565b9650505050505050613923565b85615f3781617859565b965050838651169050615f08565b859650505050505050613923565b508383206000905b615f65868961743c565b8211615fa257858320808203615f815783945050505050613923565b615f8c60018561752d565b9350508180615f9a90617859565b925050615f5b565b505b615fae878761752d565b979650505050505050565b60408051808201909152600080825260208201526000615feb8560000151866020015186600001518760200151615e99565b602080870180519186019190915251909150616007908261743c565b83528451602086015161601a919061752d565b8103616029576000855261605b565b83518351616037919061752d565b8551869061604690839061743c565b9052508351616055908261752d565b60208601525b50909392505050565b6020811061609c578151835261607b60208461752d565b925061608860208361752d565b915061609560208261743c565b9050616064565b60001981156160cb5760016160b283602061743c565b6160be906101006177e8565b6160c8919061743c565b90505b9151835183169219169190911790915250565b606060006160ec84846123f6565b80516020808301516040519394506161069390910161788a565b60405160208183030381529060405291505092915050565b610c9f806178e383390190565b6119ca8061858283390190565b61178380619f4c83390190565b610de08061b6cf83390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161619561619a565b905290565b604051806101000160405280600015158152602001600015158152602001606081526020016000801916815260200160608152602001606081526020016000151581526020016161956040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b8181101561624c5783516001600160a01b0316835260209384019390920191600101616225565b509095945050505050565b60005b8381101561627257818101518382015260200161625a565b50506000910152565b60008151808452616293816020860160208601616257565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015616389577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261637384865161627b565b6020958601959094509290920191600101616339565b5091975050506020948501949290920191506001016162cf565b50929695505050505050565b600081518084526020840193506020830160005b828110156164035781517fffffffff00000000000000000000000000000000000000000000000000000000168652602095860195909101906001016163c3565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752616479604088018261627b565b905060208201519150868103602088015261649481836163af565b965050506020938401939190910190600101616435565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261650d85835161627b565b945060209384019391909101906001016164d3565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156163a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b03815116865260208101519050604060208701526165a360408701826163af565b955050602093840193919091019060010161654a565b6000602082840312156165cb57600080fd5b81518015158114611b3657600080fd5b600181811c908216806165ef57607f821691505b6020821081036142fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006020828403121561663a57600080fd5b81516001600160a01b0381168114611b3657600080fd5b606081526000616664606083018661627b565b602083019490945250901515604090910152919050565b6001600160a01b03841681528260208201526060604082015260006142e2606083018461627b565b6001600160a01b038616815284602082015260a0604082015260006166cb60a083018661627b565b6060830194909452509015156080909101529392505050565b828152604060208201526000613923604083018461627b565b6001600160a01b0383168152604060208201526000613923604083018461627b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156167715761677161671f565b60405290565b60008067ffffffffffffffff8411156167925761679261671f565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156167c1576167c161671f565b6040528381529050808284018510156167d957600080fd5b613cf2846020830185616257565b600082601f8301126167f857600080fd5b611b3683835160208501616777565b60006020828403121561681957600080fd5b815167ffffffffffffffff81111561683057600080fd5b611a0c848285016167e7565b60006020828403121561684e57600080fd5b5051919050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161688d81601a850160208801616257565b7f3a20000000000000000000000000000000000000000000000000000000000000601a9184019182015283516168ca81601c840160208801616257565b01601c01949350505050565b602081526000611b36602083018461627b565b600083516168fb818460208801616257565b83519083019061690f818360208801616257565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161695081601a850160208801616257565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161698d816033840160208801616257565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b6001600160a01b03841681526001600160a01b03831660208201526060604082015260006142e2606083018461627b565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000611b36608083018461627b565b600060208284031215616a4d57600080fd5b815167ffffffffffffffff811115616a6457600080fd5b8201601f81018413616a7557600080fd5b611a0c84825160208401616777565b60008551616a96818460208a01616257565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551616ad0816001840160208a01616257565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451616b0e816002840160208901616257565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351616b50816002840160208801616257565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000616b9b604083018461627b565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251616c1281601f850160208701616257565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000616c7f604083018461627b565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000616cd1604083018461627b565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251616d48816014850160208701616257565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000616d8f604083018561627b565b8281036020840152611b32818561627b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251616e08816001850160208701616257565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251616e4e818460208701616257565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251616f0181604b850160208701616257565b91909101604b0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff8103616f5357616f53616f0e565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251616fba816029850160208701616257565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000611b36608083018461627b565b60006020828403121561702057600080fd5b815167ffffffffffffffff81111561703757600080fd5b82016060818503121561704957600080fd5b61705161674e565b81518060030b811461706257600080fd5b8152602082015167ffffffffffffffff81111561707e57600080fd5b61708a868285016167e7565b602083015250604082015167ffffffffffffffff8111156170aa57600080fd5b6170b6868285016167e7565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f2200000000000000000000000000000000000000000000000000000000000000602082015260008251617122816021850160208701616257565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161730e816021850160208801616257565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161734b81602e840160208801616257565b01602e01949350505050565b60008251617369818460208701616257565b9190910192915050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251616fba816029850160208701616257565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161742f816022850160208701616257565b9190910160220192915050565b81810381811115611a1057611a10616f0e565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161748781600e850160208701616257565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b80820180821115611a1057611a10616f0e565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351617578816018850160208801616257565b7f20696e200000000000000000000000000000000000000000000000000000000060189184019182015283516175b581601c840160208801616257565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516176bb818460208701616257565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b8082028115828204841417611a1057611a10616f0e565b6001815b600184111561773c5780850481111561772057617720616f0e565b600184161561772e57908102905b60019390931c928002617705565b935093915050565b60008261775357506001611a10565b8161776057506000611a10565b816001811461777657600281146177805761779c565b6001915050611a10565b60ff84111561779157617791616f0e565b50506001821b611a10565b5060208310610133831016604e8410600b84101617156177bf575081810a611a10565b6177cc6000198484617701565b80600019048211156177e0576177e0616f0e565b029392505050565b6000611b368383617744565b81810360008312801583831316838312821617156153f7576153f7616f0e565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161784c81601c850160208701616257565b91909101601c0192915050565b6000600019820361786c5761786c616f0e565b5060010190565b60008161788257617882616f0e565b506000190190565b6000835161789c818460208801616257565b7f3a0000000000000000000000000000000000000000000000000000000000000090830190815283516178d6816001840160208801616257565b0160010194935050505056fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220d8f30d53d406284d4518a005e401a95f32c91c3f2a106a1a6dc363e40dce236964736f6c634300081a0033", } // GatewayEVMUUPSUpgradeTestABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/gatewayevmupgradetest.sol/gatewayevmupgradetest.go b/v2/pkg/gatewayevmupgradetest.sol/gatewayevmupgradetest.go index 02799494..3c28f81a 100644 --- a/v2/pkg/gatewayevmupgradetest.sol/gatewayevmupgradetest.go +++ b/v2/pkg/gatewayevmupgradetest.sol/gatewayevmupgradetest.go @@ -47,7 +47,7 @@ type RevertOptions struct { // GatewayEVMUpgradeTestMetaData contains all meta data concerning the GatewayEVMUpgradeTest contract. var GatewayEVMUpgradeTestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_HANDLER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"custody\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"executeWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"tssAddress_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"zetaToken_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revertWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setConnector\",\"inputs\":[{\"name\":\"zetaConnector_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCustody\",\"inputs\":[{\"name\":\"custody_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tssAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"zetaConnector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"zetaToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedV2\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516136da6100fd60003960008181611f3d01528181611f6601526123f201526136da6000f3fe6080604052600436106101e35760003560e01c8063616e877a11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461063b578063e63ab1e91461065b578063f7ad60db1461068f578063fc93baef146106a257600080fd5b8063ae7a3a6f146105bb578063c0c53b8b146105db578063d0b492c3146105fb578063d547741f1461061b57600080fd5b806391d14854116100d157806391d14854146104c4578063a217fddf14610529578063a783c7891461053e578063ad3cb1cc1461057257600080fd5b8063616e877a1461045c57806370f23f881461047c5780638456cb591461048f578063870de27a146104a457600080fd5b806345ac7a8d1161017a57806357bec62f1161014957806357bec62f146103b15780635b112591146103d15780635c975abb146103f15780635d62c8601461042857600080fd5b806345ac7a8d146103495780634f1ef286146103695780635131ab591461037c57806352d1902d1461039c57600080fd5b8063248a9ca3116101b6578063248a9ca3146102975780632f2ff15d146102f457806336568abe146103145780633f4ba83a1461033457600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631cff79cd1461023f57806321e093b11461025f575b600080fd5b3480156101f457600080fd5b50610208610203366004612d1f565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612d7d565b61074e565b005b61025261024d366004612de1565b610842565b6040516102149190612ea2565b34801561026b57600080fd5b5060035461027f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102a357600080fd5b506102e66102b2366004612eb5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b34801561030057600080fd5b5061023d61030f366004612ece565b610945565b34801561032057600080fd5b5061023d61032f366004612ece565b61098f565b34801561034057600080fd5b5061023d6109e0565b34801561035557600080fd5b5061023d610364366004612f12565b610a15565b61023d610377366004612fc0565b610add565b34801561038857600080fd5b5061023d6103973660046130c7565b610afc565b3480156103a857600080fd5b506102e6610e15565b3480156103bd57600080fd5b5060025461027f906001600160a01b031681565b3480156103dd57600080fd5b5060015461027f906001600160a01b031681565b3480156103fd57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561043457600080fd5b506102e67f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561046857600080fd5b5061023d610477366004613136565b610e44565b61023d61048a366004613186565b610f20565b34801561049b57600080fd5b5061023d6110b1565b3480156104b057600080fd5b5061023d6104bf3660046131d4565b6110e3565b3480156104d057600080fd5b506102086104df366004612ece565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561053557600080fd5b506102e6600081565b34801561054a57600080fd5b506102e67f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057e57600080fd5b506102526040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105c757600080fd5b5061023d6105d6366004612d7d565b6111f4565b3480156105e757600080fd5b5061023d6105f636600461326c565b6112e8565b34801561060757600080fd5b5061023d6106163660046132c1565b61159d565b34801561062757600080fd5b5061023d610636366004612ece565b61175f565b34801561064757600080fd5b5060005461027f906001600160a01b031681565b34801561066757600080fd5b506102e67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d61069d36600461334c565b6117a3565b61023d6106b0366004612f12565b6119a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611b39565b6001600160a01b038216610799576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b0316156107dc576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61086e81611b39565b610876611c30565b61087e611c8e565b6001600160a01b0385166108be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108cb868686611d0f565b9050856001600160a01b03167f373df382b9c587826f3de13f16d67f8d99f28ee947fc0924c6ef2d6d2c7e854634878760405161090a93929190613408565b60405180910390a2915061093d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461097f81611b39565b6109898383611b43565b50505050565b6001600160a01b03811633146109d1576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db8282611dde565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0a81611b39565b610a12611ea2565b50565b610a1d611c30565b610a25611c8e565b6001600160a01b038416610a65576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610aac939291906134fb565b60405180910390a361098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ae5611f32565b610aee82612002565b610af8828261200d565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610b2681611b39565b610b2e611c30565b610b36611c8e565b83600003610b70576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610bb0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bba8686612131565b610bf0576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613521565b610cb2576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbd858484611d0f565b50610cc88686612131565b610cfe576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d82919061353e565b90508015610d9457610d9487826121c1565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610ddb93929190613408565b60405180910390a350610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610e1f6123e7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610e4c611c30565b610e54611c8e565b82600003610e8e576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610ece576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed9338385612449565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610aac93929190613557565b610f28611c30565b610f30611c8e565b34600003610f6a576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610faa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b5050905080611037576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161107f93929190613557565b60405180910390a350610af860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110db81611b39565b610a12612686565b6110eb611c30565b6110f3611c8e565b8460000361112d576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661116d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611178338587612449565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd87878787876040516111c395949392919061358d565b60405180910390a3610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006111ff81611b39565b6001600160a01b03821661123f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031615611282576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ac7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113335750825b905060008267ffffffffffffffff1660011480156113505750303b155b90508115801561135e575080155b15611395576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141357506001600160a01b038716155b1561144a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114526126ff565b61145a612707565b6114626126ff565b61146a612717565b611475600087611b43565b506114a07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b43565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114fe7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b43565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115935784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96115c781611b39565b6115cf611c30565b6115d7611c8e565b84600003611611576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611651576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116656001600160a01b0388168787612727565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906116aa90859060040161362e565b600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b1436878787876040516117259493929190613641565b60405180910390a361175660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461179981611b39565b6109898383611dde565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6117cd81611b39565b6117d5611c30565b6117dd611c8e565b6001600160a01b03851661181d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d806000811461186a576040519150601f19603f3d011682016040523d82523d6000602084013e61186f565b606091505b50509050806118aa576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906118ef90869060040161362e565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14363488888860405161196b9493929190613641565b60405180910390a35061199d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6119ac611c30565b6119b4611c8e565b346000036119ee576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611a2e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611abb576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611b0795949392919061358d565b60405180910390a35061098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610a12813361279b565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c26576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bdc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c8c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d09576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611d2f929190613678565b60006040518083038185875af1925050503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b509150915081611dad576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c26576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611eaa612828565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fbf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610af881611b39565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612085575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120829181019061353e565b60015b6120cb576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612127576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120c2565b6109db8383612883565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190613521565b6003546001600160a01b0390811690831603612310576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613521565b61229d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122fc57600080fd5b505af1158015610e0d573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613521565b6123cd576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610af8906001600160a01b03848116911683612727565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b03908116908316036125ad576124746001600160a01b0383168430846128d9565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613521565b61253a576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561259957600080fd5b505af1158015611756573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190613521565b61266a576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546109db906001600160a01b0384811691869116846128d9565b61268e611c30565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611f14565b611c8c612912565b61270f612912565b611c8c612979565b61271f612912565b611c8c612981565b6040516001600160a01b038381166024830152604482018390526109db91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d2565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610af8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120c2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c8c576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61288c82612a4e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128d1576109db8282612af6565b610af8612b6c565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401612754565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c8c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db8612912565b612989612912565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60006129e76001600160a01b03841683612ba4565b90508051600014158015612a0c575080806020019051810190612a0a9190613521565b155b156109db576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120c2565b806001600160a01b03163b600003612a9d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120c2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b139190613688565b600060405180830381855af49150503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b63858383612bb2565b95945050505050565b3415611c8c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611db183836000612c27565b606082612bc757612bc282612cdd565b611db1565b8151158015612bde57506001600160a01b0384163b155b15612c20576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120c2565b5080611db1565b606081471015612c65576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120c2565b600080856001600160a01b03168486604051612c819190613688565b60006040518083038185875af1925050503d8060008114612cbe576040519150601f19603f3d011682016040523d82523d6000602084013e612cc3565b606091505b5091509150612cd3868383612bb2565b9695505050505050565b805115612ced5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611db157600080fd5b80356001600160a01b0381168114612d7857600080fd5b919050565b600060208284031215612d8f57600080fd5b611db182612d61565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b602083019150836020828501011115612dda57600080fd5b9250929050565b600080600060408486031215612df657600080fd5b612dff84612d61565b9250602084013567ffffffffffffffff811115612e1b57600080fd5b612e2786828701612d98565b9497909650939450505050565b60005b83811015612e4f578181015183820152602001612e37565b50506000910152565b60008151808452612e70816020860160208601612e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db16020830184612e58565b600060208284031215612ec757600080fd5b5035919050565b60008060408385031215612ee157600080fd5b82359150612ef160208401612d61565b90509250929050565b600060808284031215612f0c57600080fd5b50919050565b60008060008060608587031215612f2857600080fd5b612f3185612d61565b9350602085013567ffffffffffffffff811115612f4d57600080fd5b612f5987828801612d98565b909450925050604085013567ffffffffffffffff811115612f7957600080fd5b612f8587828801612efa565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612fd357600080fd5b612fdc83612d61565b9150602083013567ffffffffffffffff811115612ff857600080fd5b8301601f8101851361300957600080fd5b803567ffffffffffffffff81111561302357613023612f91565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561308f5761308f612f91565b6040528181528282016020018710156130a757600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156130df57600080fd5b6130e886612d61565b94506130f660208701612d61565b935060408601359250606086013567ffffffffffffffff81111561311957600080fd5b61312588828901612d98565b969995985093965092949392505050565b6000806000806080858703121561314c57600080fd5b61315585612d61565b93506020850135925061316a60408601612d61565b9150606085013567ffffffffffffffff811115612f7957600080fd5b6000806040838503121561319957600080fd5b6131a283612d61565b9150602083013567ffffffffffffffff8111156131be57600080fd5b6131ca85828601612efa565b9150509250929050565b60008060008060008060a087890312156131ed57600080fd5b6131f687612d61565b95506020870135945061320b60408801612d61565b9350606087013567ffffffffffffffff81111561322757600080fd5b61323389828a01612d98565b909450925050608087013567ffffffffffffffff81111561325357600080fd5b61325f89828a01612efa565b9150509295509295509295565b60008060006060848603121561328157600080fd5b61328a84612d61565b925061329860208501612d61565b91506132a660408501612d61565b90509250925092565b600060608284031215612f0c57600080fd5b60008060008060008060a087890312156132da57600080fd5b6132e387612d61565b95506132f160208801612d61565b945060408701359350606087013567ffffffffffffffff81111561331457600080fd5b61332089828a01612d98565b909450925050608087013567ffffffffffffffff81111561334057600080fd5b61325f89828a016132af565b6000806000806060858703121561336257600080fd5b61336b85612d61565b9350602085013567ffffffffffffffff81111561338757600080fd5b61339387828801612d98565b909450925050604085013567ffffffffffffffff8111156133b357600080fd5b612f85878288016132af565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612b636040830184866133bf565b8015158114610a1257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261346557600080fd5b830160208101925035905067ffffffffffffffff81111561348557600080fd5b803603821315612dda57600080fd5b6001600160a01b036134a582612d61565b168252600060208201356134b881613422565b151560208401526001600160a01b036134d360408401612d61565b1660408401526134e66060830183613430565b60806060860152612b636080860182846133bf565b60408152600061350f6040830185876133bf565b8281036020840152612cd38185613494565b60006020828403121561353357600080fd5b8151611db181613422565b60006020828403121561355057600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612b6360a0830184613494565b8581526001600160a01b03851660208201526080604082015260006135b66080830185876133bf565b82810360608401526135c88185613494565b98975050505050505050565b6001600160a01b036135e582612d61565b1682526000602082013567ffffffffffffffff811680821461360657600080fd5b6020850152506136196040830183613430565b60606040860152612b636060860182846133bf565b602081526000611db160208301846135d4565b84815260606020820152600061365b6060830185876133bf565b828103604084015261366d81856135d4565b979650505050505050565b8183823760009101908152919050565b6000825161369a818460208701612e34565b919091019291505056fea2646970667358221220f4b0a975b38838244991463c0ceae1e31f1d6b1e770b1d170f5ca8c1d3277c3a64736f6c634300081a0033", + Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516136da6100fd60003960008181611f3d01528181611f6601526123f201526136da6000f3fe6080604052600436106101e35760003560e01c8063616e877a11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461063b578063e63ab1e91461065b578063f7ad60db1461068f578063fc93baef146106a257600080fd5b8063ae7a3a6f146105bb578063c0c53b8b146105db578063d0b492c3146105fb578063d547741f1461061b57600080fd5b806391d14854116100d157806391d14854146104c4578063a217fddf14610529578063a783c7891461053e578063ad3cb1cc1461057257600080fd5b8063616e877a1461045c57806370f23f881461047c5780638456cb591461048f578063870de27a146104a457600080fd5b806345ac7a8d1161017a57806357bec62f1161014957806357bec62f146103b15780635b112591146103d15780635c975abb146103f15780635d62c8601461042857600080fd5b806345ac7a8d146103495780634f1ef286146103695780635131ab591461037c57806352d1902d1461039c57600080fd5b8063248a9ca3116101b6578063248a9ca3146102975780632f2ff15d146102f457806336568abe146103145780633f4ba83a1461033457600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631cff79cd1461023f57806321e093b11461025f575b600080fd5b3480156101f457600080fd5b50610208610203366004612d1f565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612d7d565b61074e565b005b61025261024d366004612de1565b610842565b6040516102149190612ea2565b34801561026b57600080fd5b5060035461027f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102a357600080fd5b506102e66102b2366004612eb5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b34801561030057600080fd5b5061023d61030f366004612ece565b610945565b34801561032057600080fd5b5061023d61032f366004612ece565b61098f565b34801561034057600080fd5b5061023d6109e0565b34801561035557600080fd5b5061023d610364366004612f12565b610a15565b61023d610377366004612fc0565b610add565b34801561038857600080fd5b5061023d6103973660046130c7565b610afc565b3480156103a857600080fd5b506102e6610e15565b3480156103bd57600080fd5b5060025461027f906001600160a01b031681565b3480156103dd57600080fd5b5060015461027f906001600160a01b031681565b3480156103fd57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561043457600080fd5b506102e67f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561046857600080fd5b5061023d610477366004613136565b610e44565b61023d61048a366004613186565b610f20565b34801561049b57600080fd5b5061023d6110b1565b3480156104b057600080fd5b5061023d6104bf3660046131d4565b6110e3565b3480156104d057600080fd5b506102086104df366004612ece565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561053557600080fd5b506102e6600081565b34801561054a57600080fd5b506102e67f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057e57600080fd5b506102526040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105c757600080fd5b5061023d6105d6366004612d7d565b6111f4565b3480156105e757600080fd5b5061023d6105f636600461326c565b6112e8565b34801561060757600080fd5b5061023d6106163660046132c1565b61159d565b34801561062757600080fd5b5061023d610636366004612ece565b61175f565b34801561064757600080fd5b5060005461027f906001600160a01b031681565b34801561066757600080fd5b506102e67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d61069d36600461334c565b6117a3565b61023d6106b0366004612f12565b6119a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611b39565b6001600160a01b038216610799576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b0316156107dc576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61086e81611b39565b610876611c30565b61087e611c8e565b6001600160a01b0385166108be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108cb868686611d0f565b9050856001600160a01b03167f373df382b9c587826f3de13f16d67f8d99f28ee947fc0924c6ef2d6d2c7e854634878760405161090a93929190613408565b60405180910390a2915061093d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461097f81611b39565b6109898383611b43565b50505050565b6001600160a01b03811633146109d1576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db8282611dde565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0a81611b39565b610a12611ea2565b50565b610a1d611c30565b610a25611c8e565b6001600160a01b038416610a65576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610aac939291906134fb565b60405180910390a361098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ae5611f32565b610aee82612002565b610af8828261200d565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610b2681611b39565b610b2e611c30565b610b36611c8e565b83600003610b70576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610bb0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bba8686612131565b610bf0576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613521565b610cb2576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbd858484611d0f565b50610cc88686612131565b610cfe576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d82919061353e565b90508015610d9457610d9487826121c1565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610ddb93929190613408565b60405180910390a350610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610e1f6123e7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610e4c611c30565b610e54611c8e565b82600003610e8e576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610ece576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed9338385612449565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610aac93929190613557565b610f28611c30565b610f30611c8e565b34600003610f6a576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610faa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b5050905080611037576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161107f93929190613557565b60405180910390a350610af860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110db81611b39565b610a12612686565b6110eb611c30565b6110f3611c8e565b8460000361112d576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661116d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611178338587612449565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd87878787876040516111c395949392919061358d565b60405180910390a3610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006111ff81611b39565b6001600160a01b03821661123f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031615611282576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ac7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113335750825b905060008267ffffffffffffffff1660011480156113505750303b155b90508115801561135e575080155b15611395576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141357506001600160a01b038716155b1561144a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114526126ff565b61145a612707565b6114626126ff565b61146a612717565b611475600087611b43565b506114a07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b43565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114fe7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b43565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115935784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96115c781611b39565b6115cf611c30565b6115d7611c8e565b84600003611611576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611651576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116656001600160a01b0388168787612727565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906116aa90859060040161362e565b600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b1436878787876040516117259493929190613641565b60405180910390a361175660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461179981611b39565b6109898383611dde565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6117cd81611b39565b6117d5611c30565b6117dd611c8e565b6001600160a01b03851661181d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d806000811461186a576040519150601f19603f3d011682016040523d82523d6000602084013e61186f565b606091505b50509050806118aa576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906118ef90869060040161362e565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14363488888860405161196b9493929190613641565b60405180910390a35061199d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6119ac611c30565b6119b4611c8e565b346000036119ee576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611a2e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611abb576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611b0795949392919061358d565b60405180910390a35061098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610a12813361279b565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c26576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bdc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c8c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d09576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611d2f929190613678565b60006040518083038185875af1925050503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b509150915081611dad576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c26576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611eaa612828565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fbf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610af881611b39565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612085575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120829181019061353e565b60015b6120cb576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612127576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120c2565b6109db8383612883565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190613521565b6003546001600160a01b0390811690831603612310576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613521565b61229d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122fc57600080fd5b505af1158015610e0d573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613521565b6123cd576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610af8906001600160a01b03848116911683612727565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b03908116908316036125ad576124746001600160a01b0383168430846128d9565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613521565b61253a576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561259957600080fd5b505af1158015611756573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190613521565b61266a576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546109db906001600160a01b0384811691869116846128d9565b61268e611c30565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611f14565b611c8c612912565b61270f612912565b611c8c612979565b61271f612912565b611c8c612981565b6040516001600160a01b038381166024830152604482018390526109db91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d2565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610af8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120c2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c8c576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61288c82612a4e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128d1576109db8282612af6565b610af8612b6c565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401612754565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c8c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db8612912565b612989612912565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60006129e76001600160a01b03841683612ba4565b90508051600014158015612a0c575080806020019051810190612a0a9190613521565b155b156109db576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120c2565b806001600160a01b03163b600003612a9d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120c2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b139190613688565b600060405180830381855af49150503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b63858383612bb2565b95945050505050565b3415611c8c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611db183836000612c27565b606082612bc757612bc282612cdd565b611db1565b8151158015612bde57506001600160a01b0384163b155b15612c20576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120c2565b5080611db1565b606081471015612c65576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120c2565b600080856001600160a01b03168486604051612c819190613688565b60006040518083038185875af1925050503d8060008114612cbe576040519150601f19603f3d011682016040523d82523d6000602084013e612cc3565b606091505b5091509150612cd3868383612bb2565b9695505050505050565b805115612ced5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611db157600080fd5b80356001600160a01b0381168114612d7857600080fd5b919050565b600060208284031215612d8f57600080fd5b611db182612d61565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b602083019150836020828501011115612dda57600080fd5b9250929050565b600080600060408486031215612df657600080fd5b612dff84612d61565b9250602084013567ffffffffffffffff811115612e1b57600080fd5b612e2786828701612d98565b9497909650939450505050565b60005b83811015612e4f578181015183820152602001612e37565b50506000910152565b60008151808452612e70816020860160208601612e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db16020830184612e58565b600060208284031215612ec757600080fd5b5035919050565b60008060408385031215612ee157600080fd5b82359150612ef160208401612d61565b90509250929050565b600060808284031215612f0c57600080fd5b50919050565b60008060008060608587031215612f2857600080fd5b612f3185612d61565b9350602085013567ffffffffffffffff811115612f4d57600080fd5b612f5987828801612d98565b909450925050604085013567ffffffffffffffff811115612f7957600080fd5b612f8587828801612efa565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612fd357600080fd5b612fdc83612d61565b9150602083013567ffffffffffffffff811115612ff857600080fd5b8301601f8101851361300957600080fd5b803567ffffffffffffffff81111561302357613023612f91565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561308f5761308f612f91565b6040528181528282016020018710156130a757600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156130df57600080fd5b6130e886612d61565b94506130f660208701612d61565b935060408601359250606086013567ffffffffffffffff81111561311957600080fd5b61312588828901612d98565b969995985093965092949392505050565b6000806000806080858703121561314c57600080fd5b61315585612d61565b93506020850135925061316a60408601612d61565b9150606085013567ffffffffffffffff811115612f7957600080fd5b6000806040838503121561319957600080fd5b6131a283612d61565b9150602083013567ffffffffffffffff8111156131be57600080fd5b6131ca85828601612efa565b9150509250929050565b60008060008060008060a087890312156131ed57600080fd5b6131f687612d61565b95506020870135945061320b60408801612d61565b9350606087013567ffffffffffffffff81111561322757600080fd5b61323389828a01612d98565b909450925050608087013567ffffffffffffffff81111561325357600080fd5b61325f89828a01612efa565b9150509295509295509295565b60008060006060848603121561328157600080fd5b61328a84612d61565b925061329860208501612d61565b91506132a660408501612d61565b90509250925092565b600060608284031215612f0c57600080fd5b60008060008060008060a087890312156132da57600080fd5b6132e387612d61565b95506132f160208801612d61565b945060408701359350606087013567ffffffffffffffff81111561331457600080fd5b61332089828a01612d98565b909450925050608087013567ffffffffffffffff81111561334057600080fd5b61325f89828a016132af565b6000806000806060858703121561336257600080fd5b61336b85612d61565b9350602085013567ffffffffffffffff81111561338757600080fd5b61339387828801612d98565b909450925050604085013567ffffffffffffffff8111156133b357600080fd5b612f85878288016132af565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612b636040830184866133bf565b8015158114610a1257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261346557600080fd5b830160208101925035905067ffffffffffffffff81111561348557600080fd5b803603821315612dda57600080fd5b6001600160a01b036134a582612d61565b168252600060208201356134b881613422565b151560208401526001600160a01b036134d360408401612d61565b1660408401526134e66060830183613430565b60806060860152612b636080860182846133bf565b60408152600061350f6040830185876133bf565b8281036020840152612cd38185613494565b60006020828403121561353357600080fd5b8151611db181613422565b60006020828403121561355057600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612b6360a0830184613494565b8581526001600160a01b03851660208201526080604082015260006135b66080830185876133bf565b82810360608401526135c88185613494565b98975050505050505050565b6001600160a01b036135e582612d61565b1682526000602082013567ffffffffffffffff811680821461360657600080fd5b6020850152506136196040830183613430565b60606040860152612b636060860182846133bf565b602081526000611db160208301846135d4565b84815260606020820152600061365b6060830185876133bf565b828103604084015261366d81856135d4565b979650505050505050565b8183823760009101908152919050565b6000825161369a818460208701612e34565b919091019291505056fea2646970667358221220cb6089a1141e91f88c3d18b5cebf51d96613376a65e1874d62836bd5fbf8adef64736f6c634300081a0033", } // GatewayEVMUpgradeTestABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/gatewayevmzevm.t.sol/gatewayevmzevmtest.go b/v2/pkg/gatewayevmzevm.t.sol/gatewayevmzevmtest.go index 84e39083..a05beac3 100644 --- a/v2/pkg/gatewayevmzevm.t.sol/gatewayevmzevmtest.go +++ b/v2/pkg/gatewayevmzevm.t.sol/gatewayevmzevmtest.go @@ -64,8 +64,8 @@ type StdInvariantFuzzSelector struct { // GatewayEVMZEVMTestMetaData contains all meta data concerning the GatewayEVMZEVMTest contract. var GatewayEVMZEVMTestMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testCallReceiverEVMFromSenderZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testCallReceiverEVMFromZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiverEVMFromSenderZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiverEVMFromZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b506201164d806200003e6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806385226c81116100b2578063b5508aa911610081578063d7a525fc11610066578063d7a525fc146101ec578063e20c9f71146101f4578063fa7626d4146101fc57600080fd5b8063b5508aa9146101cc578063ba414fa6146101d457600080fd5b806385226c8114610192578063916a17c6146101a75780639683c695146101bc578063b0464fdc146101c457600080fd5b80633f7286f4116100ee5780633f7286f414610165578063524744131461016d57806366d9a9a0146101755780636ff15ccc1461018a57600080fd5b80630a9254e4146101205780631ed7831c1461012a5780632ade3880146101485780633e5e3c231461015d575b600080fd5b610128610209565b005b61013261125d565b60405161013f9190617add565b60405180910390f35b6101506112bf565b60405161013f9190617b79565b610132611401565b610132611461565b6101286114c1565b61017d611d30565b60405161013f9190617cdf565b610128611eb2565b61019a6126d2565b60405161013f9190617d7d565b6101af6127a2565b60405161013f9190617df4565b61012861289d565b6101af612e8e565b61019a612f89565b6101dc613059565b604051901515815260200161013f565b61012861312d565b610132613851565b601f546101dc9060ff1681565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880548216615678179055602e8054909116614321179055604051610267906179c2565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156102ec573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055604051610331906179c2565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156103b5573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602854602654925190861694810194909452604484019290925290921660648201526104a6919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526138b1565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155602854602654604051929391821692911690610532906179d0565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801561056e573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460245460285460265460405193851694928316939183169216906105c9906179de565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801561060d573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b1580156106b957600080fd5b505af11580156106cd573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561074357600080fd5b505af1158015610757573d6000803e3d6000fd5b50506020546021546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b1580156107bd57600080fd5b505af11580156107d1573d6000803e3d6000fd5b50506020546022546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50506023546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f42406024820152911692506340c10f199150604401600060405180830381600087803b15801561093057600080fd5b505af1158015610944573d6000803e3d6000fd5b50506023546021546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12060248201529116925063a9059cbb91506044016020604051808303816000875af11580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190617e8b565b506040516109e9906179ec565b604051809103906000f080158015610a05573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055604080518082018252600f81527f476174657761795a45564d2e736f6c0000000000000000000000000000000000602082015260248054602e54935190851691810191909152919092166044820152610aee919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc955000000000000000000000000000000000000000000000000000000001790526138b1565b602980546001600160a01b03929092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155602a80549092168117909155604051610b3f906179fa565b6001600160a01b039091168152602001604051809103906000f080158015610b6b573d6000803e3d6000fd5b50602b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040517f06447d5600000000000000000000000000000000000000000000000000000000815273735b14bb79463307aacbed86daf3322b1e6226ab6004820181905290737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015610c2057600080fd5b505af1158015610c34573d6000803e3d6000fd5b505050506000806000604051610c4990617a08565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610c85573d6000803e3d6000fd5b50602c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602a54604051601293600193600093849391921690610cdb90617a16565b610cea96959493929190617ead565b604051809103906000f080158015610d06573d6000803e3d6000fd5b50602d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602c546040517fee2815ba0000000000000000000000000000000000000000000000000000000081526001600482015260248101929092529091169063ee2815ba90604401600060405180830381600087803b158015610d9d57600080fd5b505af1158015610db1573d6000803e3d6000fd5b5050602c546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610e1b57600080fd5b505af1158015610e2f573d6000803e3d6000fd5b5050602d54602e546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f42406024820152911692506347e7ef2491506044016020604051808303816000875af1158015610ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec79190617e8b565b50602d54602b546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f424060248201529116906347e7ef24906044016020604051808303816000875af1158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5c9190617e8b565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b5050602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561104557600080fd5b505af1158015611059573d6000803e3d6000fd5b5050602d54602a546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f424060248201529116925063095ea7b391506044016020604051808303816000875af11580156110cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f19190617e8b565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b50506040805160808101825261032180825260016020808401918252838501928352845190810190945260008452606083018490528251602f80549251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009093166001600160a01b0392831617929092178255915160308054919093167fffffffffffffffffffffffff000000000000000000000000000000000000000091909116179091559093509150603190611257908261806d565b50505050565b606060168054806020026020016040519081016040528092919081815260200182805480156112b557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611297575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156113f857600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156113e157838290600052602060002001805461135490617fd1565b80601f016020809104026020016040519081016040528092919081815260200182805461138090617fd1565b80156113cd5780601f106113a2576101008083540402835291602001916113cd565b820191906000526020600020905b8154815290600101906020018083116113b057829003601f168201915b505050505081526020019060010190611335565b5050505081525050815260200190600101906112e3565b50505050905090565b606060188054806020026020016040519081016040528092919081815260200182805480156112b5576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611297575050505050905090565b606060178054806020026020016040519081016040528092919081815260200182805480156112b5576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611297575050505050905090565b604080518082018252600681527f48656c6c6f2100000000000000000000000000000000000000000000000000006020820152602d54602b5492517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529192602a92600192670de0b6b3a7640000926000929116906370a0823190602401602060405180830381865afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611591919061812c565b6040519091506000907fe04d4f9700000000000000000000000000000000000000000000000000000000906115ce90889088908890602401618145565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093526025549051919350600092611667926001600160a01b03909216910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602d5461169e926207a120916001600160a01b0316908690600190602f90602401618252565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f90ad3e2300000000000000000000000000000000000000000000000000000000179052602a5490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba39161175b916001600160a01b03919091169060009086906004016182bb565b600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156117ff57600080fd5b505af1158015611813573d6000803e3d6000fd5b5050602b5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039091169250630abd8905915060340160408051601f1981840301815290829052602d547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1683526118ad926207a120916001600160a01b0316908d908d908d906004016182e3565b600060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b50506020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101879052737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b15801561195857600080fd5b505af115801561196c573d6000803e3d6000fd5b50506025546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156119fe57600080fd5b505af1158015611a12573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa9350611a5b92506001600160a01b039091169087908b908b908b90618338565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611af157600080fd5b505af1158015611b05573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150611b4a9087908690618379565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611bc457600080fd5b505af1158015611bd8573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd93508892611c2c9216908790600401618392565b60006040518083038185885af1158015611c4a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611c73919081019061846d565b50602d54602b546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d02919061812c565b9050611d26816001611d176207a120886184d1565b611d2191906184d1565b6138d0565b5050505050505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156113f85783829060005260206000209060020201604051806040016040529081600082018054611d8790617fd1565b80601f0160208091040260200160405190810160405280929190818152602001828054611db390617fd1565b8015611e005780601f10611dd557610100808354040283529160200191611e00565b820191906000526020600020905b815481529060010190602001808311611de357829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611e9a57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611e475790505b50505050508152505081526020019060010190611d54565b604080518082018252600681527f48656c6c6f21000000000000000000000000000000000000000000000000000060208201529051602a90600190670de0b6b3a7640000906000907fe04d4f970000000000000000000000000000000000000000000000000000000090611f2e90879087908790602401618145565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009490941693909317909252602a5491517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b039093166084820152909250737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561202057600080fd5b505af1158015612034573d6000803e3d6000fd5b5050602e5460255460405160609190911b6bffffffffffffffffffffffff19166020820152600093506001600160a01b0390911691507f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de9060340160408051601f19818403018152828252602d547f4d8943bb000000000000000000000000000000000000000000000000000000008452915190926001600160a01b03909216916207a1209188918491634d8943bb916004808201926020929091908290030181865afa158015612109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212d919061812c565b89602f60405161214397969594939291906184e4565b60405180910390a3602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b5050602a5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b0390911692506390ad3e23915060340160408051601f1981840301815290829052602d547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16835261226d926207a120916001600160a01b0316908890600190602f9060040161854c565b600060405180830381600087803b15801561228757600080fd5b505af115801561229b573d6000803e3d6000fd5b5050602d54602e546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232b919061812c565b905061233e81611d21846207a1206184d1565b6020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101859052737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b50506025546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561245d57600080fd5b505af1158015612471573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa93506124ba92506001600160a01b039091169087908b908b908b90618338565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561255057600080fd5b505af1158015612564573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f91506125a99087908790618379565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561262357600080fd5b505af1158015612637573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd9350889261268b9216908890600401618392565b60006040518083038185885af11580156126a9573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611d26919081019061846d565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156113f857838290600052602060002001805461271590617fd1565b80601f016020809104026020016040519081016040528092919081815260200182805461274190617fd1565b801561278e5780601f106127635761010080835404028352916020019161278e565b820191906000526020600020905b81548152906001019060200180831161277157829003601f168201915b5050505050815260200190600101906126f6565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156113f85760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561288557602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116128325790505b505050505081525050815260200190600101906127c6565b604080518082018252600681527f48656c6c6f21000000000000000000000000000000000000000000000000000060208201529051602a90600190670de0b6b3a7640000906000907fe04d4f97000000000000000000000000000000000000000000000000000000009061291990879087908790602401618145565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009490941693909317909252602e5491517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b5050602a546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612a9257600080fd5b505af1158015612aa6573d6000803e3d6000fd5b5050602d54602e5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039283169450911691507fde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a9060340160408051601f1981840301815290829052612b23918690602f906185a0565b60405180910390a3602a546025546040805160609290921b6bffffffffffffffffffffffff19166020830152805180830360140181526034830191829052602d547fdc9ca2e7000000000000000000000000000000000000000000000000000000009092526001600160a01b039384169363dc9ca2e793612bb39391909116908690600190602f906038016185d9565b600060405180830381600087803b158015612bcd57600080fd5b505af1158015612be1573d6000803e3d6000fd5b50506020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101859052737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015612c5e57600080fd5b505af1158015612c72573d6000803e3d6000fd5b50506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612d0457600080fd5b505af1158015612d18573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150612d5d9085908590618379565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612dd757600080fd5b505af1158015612deb573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd93508692612e3f9216908690600401618392565b60006040518083038185885af1158015612e5d573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612e86919081019061846d565b505050505050565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156113f85760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015612f7157602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411612f1e5790505b50505050508152505081526020019060010190612eb2565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156113f8578382906000526020600020018054612fcc90617fd1565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff890617fd1565b80156130455780601f1061301a57610100808354040283529160200191613045565b820191906000526020600020905b81548152906001019060200180831161302857829003601f168201915b505050505081526020019060010190612fad565b60085460009060ff1615613071575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015613102573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613126919061812c565b1415905090565b604080518082018252600681527f48656c6c6f21000000000000000000000000000000000000000000000000000060208201529051602a90600190670de0b6b3a7640000906000907fe04d4f9700000000000000000000000000000000000000000000000000000000906131a990879087908790602401618145565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093526025549051919350600092613242926001600160a01b03909216910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602d54613276926001600160a01b03909116908590600190602f90602401618633565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdc9ca2e700000000000000000000000000000000000000000000000000000000179052602a5490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613333916001600160a01b03919091169060009086906004016182bb565b600060405180830381600087803b15801561334d57600080fd5b505af1158015613361573d6000803e3d6000fd5b5050602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156133d757600080fd5b505af11580156133eb573d6000803e3d6000fd5b5050602b5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039091169250637a34d8bb915060340160408051601f1981840301815290829052602d547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352613482926001600160a01b03909116908b908b908b90600401618684565b600060405180830381600087803b15801561349c57600080fd5b505af11580156134b0573d6000803e3d6000fd5b50506020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101869052737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b15801561352d57600080fd5b505af1158015613541573d6000803e3d6000fd5b50506025546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156135d357600080fd5b505af11580156135e7573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa935061363092506001600160a01b039091169086908a908a908a90618338565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156136c657600080fd5b505af11580156136da573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f915061371f9086908690618379565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561379957600080fd5b505af11580156137ad573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935087926138019216908790600401618392565b60006040518083038185885af115801561381f573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052613848919081019061846d565b50505050505050565b606060158054806020026020016040519081016040528092919081815260200182805480156112b5576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611297575050505050905090565b60006138bb617a24565b6138c684848361394f565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561393b57600080fd5b505afa158015612e86573d6000803e3d6000fd5b60008061395c85846139ca565b90506139bf6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016139aa929190618392565b604051602081830303815290604052856139d6565b9150505b9392505050565b60006139c38383613a04565b60c081015151600090156139fa576139f384848460c00151613a1f565b90506139c3565b6139f38484613bc5565b6000613a108383613cb0565b6139c3838360200151846139d6565b600080613a2a613cc0565b90506000613a388683613d93565b90506000613a4f8260600151836020015185614239565b90506000613a5f8383898961444b565b90506000613a6c826152c8565b602081015181519192509060030b15613adf57898260400151604051602001613a969291906186d2565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252613ad691600401618753565b60405180910390fd5b6000613b226040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001615497565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90613b75908490600401618753565b602060405180830381865afa158015613b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb69190618766565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590613c1a908790600401618753565b600060405180830381865afa158015613c37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c5f919081019061846d565b90506000613c8d8285604051602001613c7992919061878f565b604051602081830303815290604052615697565b90506001600160a01b0381166138c6578484604051602001613a969291906187be565b613cbc828260006156aa565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90613d47908490600401618869565b600060405180830381865afa158015613d64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d8c91908101906188b0565b9250505090565b613dc56040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050613e106040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b613e19856157ad565b60208201526000613e2986615b92565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015613e6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e9391908101906188b0565b86838560200151604051602001613ead94939291906188f9565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190613f05908590600401618753565b600060405180830381865afa158015613f22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f4a91908101906188b0565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690613f929084906004016189fd565b602060405180830381865afa158015613faf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd39190617e8b565b613fe85781604051602001613a969190618a4f565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061402d908490600401618ae1565b600060405180830381865afa15801561404a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261407291908101906188b0565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f6906140b9908490600401618b33565b602060405180830381865afa1580156140d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fa9190617e8b565b1561418f576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614144908490600401618b33565b600060405180830381865afa158015614161573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261418991908101906188b0565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016141b49190618b85565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016141e0929190618bf1565b600060405180830381865afa1580156141fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261422591908101906188b0565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816142555790505090506040518060400160405280600481526020017f6772657000000000000000000000000000000000000000000000000000000000815250816000815181106142b5576142b5618c16565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061430957614309618c16565b6020026020010181905250846040516020016143259190618c45565b6040516020818303038152906040528160028151811061434757614347618c16565b6020026020010181905250826040516020016143639190618cb1565b6040516020818303038152906040528160038151811061438557614385618c16565b6020026020010181905250600061439b826152c8565b602080820151604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000818501908152825180840184526000808252908601528251808401909352905182529281019290925291925061442c9060408051808201825260008082526020918201528151808301909252845182528085019082015290615e15565b6144415785604051602001613a969190618cf2565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d901561449b565b511590565b61460f57826020015115614557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401613ad6565b8260c001511561460f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401613ad6565b6040805160ff8082526120008201909252600091816020015b606081526020019060019003908161462857905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061468390618d83565b935060ff168151811061469857614698618c16565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e37000000000000000000000000000000000000008152506040516020016146e99190618da2565b60405160208183030381529060405282828061470490618d83565b935060ff168151811061471957614719618c16565b60200260200101819052506040518060400160405280600681526020017f6465706c6f79000000000000000000000000000000000000000000000000000081525082828061476690618d83565b935060ff168151811061477b5761477b618c16565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d650000000000000000000000000000000000008152508282806147c890618d83565b935060ff16815181106147dd576147dd618c16565b602002602001018190525087602001518282806147f990618d83565b935060ff168151811061480e5761480e618c16565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163745061746800000000000000000000000000000000000081525082828061485b90618d83565b935060ff168151811061487057614870618c16565b60209081029190910101528751828261488881618d83565b935060ff168151811061489d5761489d618c16565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e496400000000000000000000000000000000000000000000008152508282806148ea90618d83565b935060ff16815181106148ff576148ff618c16565b602002602001018190525061491346615e76565b828261491e81618d83565b935060ff168151811061493357614933618c16565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c65000000000000000000000000000000000081525082828061498090618d83565b935060ff168151811061499557614995618c16565b6020026020010181905250868282806149ad90618d83565b935060ff16815181106149c2576149c2618c16565b6020908102919091010152855115614ae95760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282614a1381618d83565b935060ff1681518110614a2857614a28618c16565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90614a78908990600401618753565b600060405180830381865afa158015614a95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614abd91908101906188b0565b8282614ac881618d83565b935060ff1681518110614add57614add618c16565b60200260200101819052505b846020015115614bb95760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282614b3281618d83565b935060ff1681518110614b4757614b47618c16565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280614b9490618d83565b935060ff1681518110614ba957614ba9618c16565b6020026020010181905250614d80565b614bf16144968660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b614c845760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614c3481618d83565b935060ff1681518110614c4957614c49618c16565b60200260200101819052508460a00151604051602001614c699190618c45565b604051602081830303815290604052828280614b9490618d83565b8460c00151158015614cc7575060408089015181518083018352600080825260209182015282518084019093528151835290810190820152614cc590511590565b155b15614d805760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614d0b81618d83565b935060ff1681518110614d2057614d20618c16565b6020026020010181905250614d3488615f16565b604051602001614d449190618c45565b604051602081830303815290604052828280614d5f90618d83565b935060ff1681518110614d7457614d74618c16565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152614db490511590565b614e495760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282614df781618d83565b935060ff1681518110614e0c57614e0c618c16565b60200260200101819052508460400151828280614e2890618d83565b935060ff1681518110614e3d57614e3d618c16565b60200260200101819052505b606085015115614f6a5760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282614e9281618d83565b935060ff1681518110614ea757614ea7618c16565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015614f16573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614f3e91908101906188b0565b8282614f4981618d83565b935060ff1681518110614f5e57614f5e618c16565b60200260200101819052505b60e085015151156150115760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282614fb481618d83565b935060ff1681518110614fc957614fc9618c16565b6020026020010181905250614fe58560e0015160000151615e76565b8282614ff081618d83565b935060ff168151811061500557615005618c16565b60200260200101819052505b60e085015160200151156150bb5760408051808201909152600a81527f2d2d6761735072696365000000000000000000000000000000000000000000006020820152828261505e81618d83565b935060ff168151811061507357615073618c16565b602002602001018190525061508f8560e0015160200151615e76565b828261509a81618d83565b935060ff16815181106150af576150af618c16565b60200260200101819052505b60e085015160400151156151655760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261510881618d83565b935060ff168151811061511d5761511d618c16565b60200260200101819052506151398560e0015160400151615e76565b828261514481618d83565b935060ff168151811061515957615159618c16565b60200260200101819052505b60e0850151606001511561520f5760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826151b281618d83565b935060ff16815181106151c7576151c7618c16565b60200260200101819052506151e38560e0015160600151615e76565b82826151ee81618d83565b935060ff168151811061520357615203618c16565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561522d5761522d617fa2565b60405190808252806020026020018201604052801561526057816020015b606081526020019060019003908161524b5790505b50905060005b8260ff168160ff1610156152b957838160ff168151811061528957615289618c16565b6020026020010151828260ff16815181106152a6576152a6618c16565b6020908102919091010152600101615266565b5093505050505b949350505050565b6152ef6040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161537591869101618e0d565b600060405180830381865afa158015615392573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153ba91908101906188b0565b905060006153c88683616a05565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016153f89190617d7d565b6000604051808303816000875af1158015615417573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261543f9190810190618e54565b805190915060030b158015906154585750602081015151155b80156154675750604081015151155b15614441578160008151811061547f5761547f618c16565b6020026020010151604051602001613a969190618f0a565b606060006154cc8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506155039082905b90616b5a565b156156605760006155808261557a846155746155468a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90616b81565b90616be3565b604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506155e4908290616b5a565b1561564e57604080518082018252600181527f0a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261564b905b8290616c68565b90505b61565781616c8e565b925050506139c3565b8215615679578484604051602001613a969291906190f6565b50506040805160208101909152600081526139c3565b509392505050565b6000808251602084016000f09392505050565b8160a00151156156b957505050565b60006156c6848484616cf7565b905060006156d3826152c8565b602081015181519192509060030b15801561576f5750604080518082018252600781527f53554343455353000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261576f906040805180820182526000808252602091820152815180830190925284518252808501908201526154fd565b1561577c57505050505050565b6040820151511561579c578160400151604051602001613a96919061919d565b80604051602001613a9691906191fb565b606060006157e28360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615847905b8290615e15565b156158b657604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139c3906158b1908390617292565b616c8e565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615918905b829061731c565b6001036159e557604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261597e90615644565b50604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139c3906158b1905b8390616c68565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615a4490615840565b15615b7b57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615aac9083906173b6565b905060008160018351615abf91906184d1565b81518110615acf57615acf618c16565b60200260200101519050615b726158b1615b456040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290617292565b95945050505050565b82604051602001613a969190619266565b50919050565b60606000615bc78360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615c2990615840565b15615c37576139c381616c8e565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615c9690615911565b600103615d0057604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139c3906158b1906159de565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615d5f90615840565b15615b7b57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615dc79083906173b6565b9050600181511115615e03578060028251615de291906184d1565b81518110615df257615df2618c16565b602002602001015192505050919050565b5082604051602001613a969190619266565b805182516000911115615e2a575060006138ca565b81518351602085015160009291615e4091619344565b615e4a91906184d1565b905082602001518103615e615760019150506138ca565b82516020840151819020912014905092915050565b60606000615e838361745b565b600101905060008167ffffffffffffffff811115615ea357615ea3617fa2565b6040519080825280601f01601f191660200182016040528015615ecd576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084615ed757509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091615fa2905b829061753d565b15615fe257505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261604190615f9b565b1561608157505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526160e090615f9b565b1561612057505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261617f90615f9b565b806161e45750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526161e490615f9b565b1561622457505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261628390615f9b565b806162e85750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526162e890615f9b565b1561632857505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261638790615f9b565b806163ec5750604080518082018252601181527f4c47504c2d322e312d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526163ec90615f9b565b1561642c57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261648b90615f9b565b806164f05750604080518082018252601181527f4c47504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526164f090615f9b565b1561653057505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261658f90615f9b565b156165cf57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261662e90615f9b565b1561666e57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166cd90615f9b565b1561670d57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261676c90615f9b565b156167ac57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261680b90615f9b565b1561684b57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526168aa90615f9b565b8061690f5750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261690f90615f9b565b1561694f57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e31000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526169ae90615f9b565b156169ee57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151613a969290602001619357565b60608060005b8451811015616a905781858281518110616a2757616a27618c16565b6020026020010151604051602001616a4092919061878f565b604051602081830303815290604052915060018551616a5f91906184d1565b8114616a885781604051602001616a7691906194c0565b60405160208183030381529060405291505b600101616a0b565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081616aa95790505090508381600081518110616ad457616ad4618c16565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110616b2857616b28618c16565b60200260200101819052508181600281518110616b4757616b47618c16565b6020908102919091010152949350505050565b6020808301518351835192840151600093616b789291849190617551565b14159392505050565b60408051808201909152600080825260208201526000616bb38460000151856020015185600001518660200151617662565b9050836020015181616bc591906184d1565b84518590616bd49083906184d1565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015616c085750816138ca565b6020808301519084015160019114616c2f5750815160208481015190840151829020919020145b8015616c6057825184518590616c469083906184d1565b9052508251602085018051616c5c908390619344565b9052505b509192915050565b6040805180820190915260008082526020820152616c87838383617782565b5092915050565b60606000826000015167ffffffffffffffff811115616caf57616caf617fa2565b6040519080825280601f01601f191660200182016040528015616cd9576020820181803683370190505b5090506000602082019050616c87818560200151866000015161782d565b60606000616d03613cc0565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081616d2057905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280616d7b90618d83565b935060ff1681518110616d9057616d90618c16565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001616de19190619501565b604051602081830303815290604052828280616dfc90618d83565b935060ff1681518110616e1157616e11618c16565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280616e5e90618d83565b935060ff1681518110616e7357616e73618c16565b602002602001018190525082604051602001616e8f9190618cb1565b604051602081830303815290604052828280616eaa90618d83565b935060ff1681518110616ebf57616ebf618c16565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280616f0c90618d83565b935060ff1681518110616f2157616f21618c16565b6020026020010181905250616f3687846178a7565b8282616f4181618d83565b935060ff1681518110616f5657616f56618c16565b6020908102919091010152855151156170025760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282616fa881618d83565b935060ff1681518110616fbd57616fbd618c16565b6020026020010181905250616fd68660000151846178a7565b8282616fe181618d83565b935060ff1681518110616ff657616ff6618c16565b60200260200101819052505b8560800151156170705760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261704b81618d83565b935060ff168151811061706057617060618c16565b60200260200101819052506170d6565b84156170d65760408051808201909152601281527f2d2d726571756972655265666572656e63650000000000000000000000000000602082015282826170b581618d83565b935060ff16815181106170ca576170ca618c16565b60200260200101819052505b604086015151156171725760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261712081618d83565b935060ff168151811061713557617135618c16565b6020026020010181905250856040015182828061715190618d83565b935060ff168151811061716657617166618c16565b60200260200101819052505b8560600151156171dc5760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d6573000000000000000000000000602082015282826171bb81618d83565b935060ff16815181106171d0576171d0618c16565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156171fa576171fa617fa2565b60405190808252806020026020018201604052801561722d57816020015b60608152602001906001900390816172185790505b50905060005b8260ff168160ff16101561728657838160ff168151811061725657617256618c16565b6020026020010151828260ff168151811061727357617273618c16565b6020908102919091010152600101617233565b50979650505050505050565b60408051808201909152600080825260208201528151835110156172b75750816138ca565b815183516020850151600092916172cd91619344565b6172d791906184d1565b602084015190915060019082146172f8575082516020840151819020908220145b80156173135783518551869061730f9083906184d1565b9052505b50929392505050565b60008082600001516173408560000151866020015186600001518760200151617662565b61734a9190619344565b90505b8351602085015161735e9190619344565b8111616c87578161736e81619546565b92505082600001516173a585602001518361738991906184d1565b865161739591906184d1565b8386600001518760200151617662565b6173af9190619344565b905061734d565b606060006173c4848461731c565b6173cf906001619344565b67ffffffffffffffff8111156173e7576173e7617fa2565b60405190808252806020026020018201604052801561741a57816020015b60608152602001906001900390816174055790505b50905060005b815181101561568f576174366158b18686616c68565b82828151811061744857617448618c16565b6020908102919091010152600101617420565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106174a4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106174d0576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106174ee57662386f26fc10000830492506010015b6305f5e1008310617506576305f5e100830492506008015b612710831061751a57612710830492506004015b6064831061752c576064830492506002015b600a83106138ca5760010192915050565b600061754983836178e7565b159392505050565b6000808584116176585760208411617604576000841561759c5760016175788660206184d1565b617583906008619560565b61758e90600261965e565b61759891906184d1565b1990505b83518116856175ab8989619344565b6175b591906184d1565b805190935082165b8181146175ef578784116175d757879450505050506152c0565b836175e18161966a565b9450508284511690506175bd565b6175f98785619344565b9450505050506152c0565b83832061761185886184d1565b61761b9087619344565b91505b85821061765657848220808203617643576176398684619344565b93505050506152c0565b61764e6001846184d1565b92505061761e565b505b5092949350505050565b6000838186851161776d576020851161771c57600085156176ae57600161768a8760206184d1565b617695906008619560565b6176a090600261965e565b6176aa91906184d1565b1990505b845181166000876176bf8b8b619344565b6176c991906184d1565b855190915083165b82811461770e578186106176f6576176e98b8b619344565b96505050505050506152c0565b8561770081619546565b9650508386511690506176d1565b8596505050505050506152c0565b508383206000905b61772e86896184d1565b821161776b5785832080820361774a57839450505050506152c0565b617755600185619344565b935050818061776390619546565b925050617724565b505b6177778787619344565b979650505050505050565b604080518082019091526000808252602082015260006177b48560000151866020015186600001518760200151617662565b6020808701805191860191909152519091506177d090826184d1565b8352845160208601516177e39190619344565b81036177f25760008552617824565b835183516178009190619344565b8551869061780f9083906184d1565b905250835161781e9082619344565b60208601525b50909392505050565b602081106178655781518352617844602084619344565b9250617851602083619344565b915061785e6020826184d1565b905061782d565b600019811561789457600161787b8360206184d1565b6178879061010061965e565b61789191906184d1565b90505b9151835183169219169190911790915250565b606060006178b58484613d93565b80516020808301516040519394506178cf93909101619681565b60405160208183030381529060405291505092915050565b81518151600091908111156178fa575081515b6020808501519084015160005b838110156179b35782518251808214617983576000196020871015617962576001846179348960206184d1565b61793e9190619344565b617949906008619560565b61795490600261965e565b61795e91906184d1565b1990505b81811683821681810391146179805797506138ca9650505050505050565b50505b61798e602086619344565b945061799b602085619344565b935050506020816179ac9190619344565b9050617907565b508451865161444191906196d9565b610c9f80620096fa83390190565b6119ca806200a39983390190565b611783806200bd6383390190565b610de0806200d4e683390190565b610a12806200e2c683390190565b610b3f806200ecd883390190565b611e01806200f81783390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001617a67617a6c565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001617a676040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015617b1e5783516001600160a01b0316835260209384019390920191600101617af7565b509095945050505050565b60005b83811015617b44578181015183820152602001617b2c565b50506000910152565b60008151808452617b65816020860160208601617b29565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c75577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015617c5b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018352617c45848651617b4d565b6020958601959094509290920191600101617c0b565b509197505050602094850194929092019150600101617ba1565b50929695505050505050565b600081518084526020840193506020830160005b82811015617cd55781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101617c95565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c75577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752617d4b6040880182617b4d565b9050602082015191508681036020880152617d668183617c81565b965050506020938401939190910190600101617d07565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c75577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452617ddf858351617b4d565b94506020938401939190910190600101617da5565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c75577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152617e756040870182617c81565b9550506020938401939190910190600101617e1c565b600060208284031215617e9d57600080fd5b815180151581146139c357600080fd5b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff8816604083015286606083015260038610617f67577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a0830152617f8860c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c90821680617fe557607f821691505b602082108103615b8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561806857806000526020600020601f840160051c810160208510156180455750805b601f840160051c820191505b818110156180655760008155600101618051565b50505b505050565b815167ffffffffffffffff81111561808757618087617fa2565b61809b816180958454617fd1565b8461801e565b6020601f8211600181146180cf57600083156180b75750848201515b600019600385901b1c1916600184901b178455618065565b600084815260208120601f198516915b828110156180ff57878501518255602094850194600190920191016180df565b508482101561811d5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561813e57600080fd5b5051919050565b6060815260006181586060830186617b4d565b602083019490945250901515604090910152919050565b600081546001600160a01b038116845260ff8160a01c1615156020850152506001600160a01b0360018301541660408401526002820160806060850152600081546181b981617fd1565b80608088015260018216600081146181d8576001811461821257618246565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00831660a089015260a082151560051b8901019350618246565b84600052602060002060005b8381101561823d5781548a820160a0015260019091019060200161821e565b890160a0019450505b50919695505050505050565b60c08152600061826560c0830189617b4d565b62ffffff881660208401526001600160a01b038716604084015282810360608401526182918187617b4d565b905060ff8516608084015282810360a08401526182ae818561816f565b9998505050505050505050565b6001600160a01b0384168152826020820152606060408201526000615b726060830184617b4d565b60c0815260006182f660c0830189617b4d565b8760208401526001600160a01b0387166040840152828103606084015261831d8187617b4d565b6080840195909552505090151560a090910152949350505050565b6001600160a01b038616815284602082015260a06040820152600061836060a0830186617b4d565b6060830194909452509015156080909101529392505050565b8281526040602082015260006152c06040830184617b4d565b6001600160a01b03831681526040602082015260006152c06040830184617b4d565b6040516060810167ffffffffffffffff811182821017156183d7576183d7617fa2565b60405290565b60008067ffffffffffffffff8411156183f8576183f8617fa2565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561842757618427617fa2565b60405283815290508082840185101561843f57600080fd5b61568f846020830185617b29565b600082601f83011261845e57600080fd5b6139c3838351602085016183dd565b60006020828403121561847f57600080fd5b815167ffffffffffffffff81111561849657600080fd5b6138c68482850161844d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156138ca576138ca6184a2565b60e0815260006184f760e083018a617b4d565b6001600160a01b038916602084015287604084015286606084015285608084015282810360a084015261852a8186617b4d565b905082810360c084015261853e818561816f565b9a9950505050505050505050565b60c08152600061855f60c0830189617b4d565b8760208401526001600160a01b038716604084015282810360608401526185868187617b4d565b905084608084015282810360a08401526182ae818561816f565b6060815260006185b36060830186617b4d565b82810360208401526185c58186617b4d565b90508281036040840152614441818561816f565b60a0815260006185ec60a0830188617b4d565b6001600160a01b0387166020840152828103604084015261860d8187617b4d565b90508460608401528281036080840152618627818561816f565b98975050505050505050565b60a08152600061864660a0830188617b4d565b6001600160a01b038716602084015282810360408401526186678187617b4d565b905060ff851660608401528281036080840152618627818561816f565b60a08152600061869760a0830188617b4d565b6001600160a01b038716602084015282810360408401526186b88187617b4d565b606084019590955250509015156080909101529392505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161870a81601a850160208801617b29565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161874781601c840160208801617b29565b01601c01949350505050565b6020815260006139c36020830184617b4d565b60006020828403121561877857600080fd5b81516001600160a01b03811681146139c357600080fd5b600083516187a1818460208801617b29565b8351908301906187b5818360208801617b29565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e7472616374200000000000008152600083516187f681601a850160208801617b29565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351618833816033840160208801617b29565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f555400000000000000000000000000000000000000000060608201526080602082015260006139c36080830184617b4d565b6000602082840312156188c257600080fd5b815167ffffffffffffffff8111156188d957600080fd5b8201601f810184136188ea57600080fd5b6138c6848251602084016183dd565b6000855161890b818460208a01617b29565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551618945816001840160208a01617b29565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451618983816002840160208901617b29565b6001818301019150507f2f00000000000000000000000000000000000000000000000000000000000000600182015283516189c5816002840160208801617b29565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000618a106040830184617b4d565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251618a8781601f850160208701617b29565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000618af46040830184617b4d565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000618b466040830184617b4d565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251618bbd816014850160208701617b29565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000618c046040830185617b4d565b82810360208401526139bf8185617b4d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251618c7d816001850160208701617b29565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251618cc3818460208701617b29565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251618d7681604b850160208701617b29565b91909101604b0192915050565b600060ff821660ff8103618d9957618d996184a2565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251618e00816029850160208701617b29565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006139c36080830184617b4d565b600060208284031215618e6657600080fd5b815167ffffffffffffffff811115618e7d57600080fd5b820160608185031215618e8f57600080fd5b618e976183b4565b81518060030b8114618ea857600080fd5b8152602082015167ffffffffffffffff811115618ec457600080fd5b618ed08682850161844d565b602083015250604082015167ffffffffffffffff811115618ef057600080fd5b618efc8682850161844d565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f2200000000000000000000000000000000000000000000000000000000000000602082015260008251618f68816021850160208701617b29565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f2700000000000000000000000000000000000000000000000000000000000000602082015260008351619154816021850160208801617b29565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161919181602e840160208801617b29565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251618e00816029850160208701617b29565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a000000000000000000000000000000000000000000000000000000000000602082015260008251619259816022850160208701617b29565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161929e81600e850160208701617b29565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b808201808211156138ca576138ca6184a2565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161938f816018850160208801617b29565b7f20696e200000000000000000000000000000000000000000000000000000000060189184019182015283516193cc81601c840160208801617b29565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516194d2818460208701617b29565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161953981601c850160208701617b29565b91909101601c0192915050565b60006000198203619559576195596184a2565b5060010190565b80820281158282048414176138ca576138ca6184a2565b6001815b60018411156195b257808504811115619596576195966184a2565b60018416156195a457908102905b60019390931c92800261957b565b935093915050565b6000826195c9575060016138ca565b816195d6575060006138ca565b81600181146195ec57600281146195f657619612565b60019150506138ca565b60ff841115619607576196076184a2565b50506001821b6138ca565b5060208310610133831016604e8410600b8410161715619635575081810a6138ca565b6196426000198484619577565b8060001904821115619656576196566184a2565b029392505050565b60006139c383836195ba565b600081619679576196796184a2565b506000190190565b60008351619693818460208801617b29565b7f3a0000000000000000000000000000000000000000000000000000000000000090830190815283516196cd816001840160208801617b29565b01600101949350505050565b8181036000831280158383131683831282161715616c8757616c876184a256fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a00336080604052348015600f57600080fd5b50604051610a12380380610a12833981016040819052602c916050565b600080546001600160a01b0319166001600160a01b0392909216919091179055607e565b600060208284031215606157600080fd5b81516001600160a01b0381168114607757600080fd5b9392505050565b6109858061008d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630abd890514610046578063116191b61461005b5780637a34d8bb146100a4575b600080fd5b6100596100543660046105e7565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100596100b2366004610687565b61030c565b60008383836040516024016100ce93929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490915073ffffffffffffffffffffffffffffffffffffffff8087169163095ea7b391166101758960026107ad565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156101e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020991906107ed565b61023f576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160808101825261032180825260016020808401829052838501929092528351918201845260008083526060840192909252905492517f90ad3e23000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff16916390ad3e23916102d0918c918c918c918991899060040161087a565b600060405180830381600087803b1580156102ea57600080fd5b505af11580156102fe573d6000803e3d6000fd5b505050505050505050505050565b600083838360405160240161032393929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905281516080810183526103218082526001828401819052828501919091528351928301845260008084526060830193909352915492517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201526024810183905293945092909188169063095ea7b3906044016020604051808303816000875af1158015610447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046b91906107ed565b506000546040517fdc9ca2e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063dc9ca2e7906102d0908b908b908890879089906004016108e8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261050a57600080fd5b81356020830160008067ffffffffffffffff84111561052b5761052b6104ca565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610578576105786104ca565b60405283815290508082840187101561059057600080fd5b838360208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105d157600080fd5b919050565b80151581146105e457600080fd5b50565b60008060008060008060c0878903121561060057600080fd5b863567ffffffffffffffff81111561061757600080fd5b61062389828a016104f9565b96505060208701359450610639604088016105ad565b9350606087013567ffffffffffffffff81111561065557600080fd5b61066189828a016104f9565b9350506080870135915060a0870135610679816105d6565b809150509295509295509295565b600080600080600060a0868803121561069f57600080fd5b853567ffffffffffffffff8111156106b657600080fd5b6106c2888289016104f9565b9550506106d1602087016105ad565b9350604086013567ffffffffffffffff8111156106ed57600080fd5b6106f9888289016104f9565b935050606086013591506080860135610711816105d6565b809150509295509295909350565b6000815180845260005b8181101561074557602081850181015186830182015201610729565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b606081526000610796606083018661071f565b602083019490945250901515604090910152919050565b808201808211156107e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156107ff57600080fd5b815161080a816105d6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526000606082015160806060850152610872608085018261071f565b949350505050565b60c08152600061088d60c083018961071f565b87602084015273ffffffffffffffffffffffffffffffffffffffff8716604084015282810360608401526108c1818761071f565b905084608084015282810360a08401526108db8185610811565b9998505050505050505050565b60a0815260006108fb60a083018861071f565b73ffffffffffffffffffffffffffffffffffffffff871660208401528281036040840152610929818761071f565b905084606084015282810360808401526109438185610811565b9897505050505050505056fea264697066735822122081a08bbd8f6b6c1e3e73e92df5ac001d9e383817e2faa175b98d3c6cd01edab664736f6c634300081a0033608060405234801561001057600080fd5b50604051610b3f380380610b3f83398101604081905261002f916100b9565b600380546001600160a01b038086166001600160a01b0319928316179092556004805485841690831617905560058054928416929091169190911790556040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a15050506100fc565b80516001600160a01b03811681146100b457600080fd5b919050565b6000806000606084860312156100ce57600080fd5b6100d78461009d565b92506100e56020850161009d565b91506100f36040850161009d565b90509250925092565b610a348061010b6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806397770dff11610081578063d7fd7afb1161005b578063d7fd7afb146101f2578063d936a01214610220578063ee2815ba1461024057600080fd5b806397770dff146101b9578063a7cb0507146101cc578063c63585cc146101df57600080fd5b8063513a9c05116100b2578063513a9c0514610143578063569541b914610179578063842da36d1461019957600080fd5b80630be15547146100ce5780633c669d551461012e575b600080fd5b6101046100dc36600461071e565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61014161013c366004610760565b610253565b005b61010461015136600461071e565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6005546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6101416101c73660046107fd565b6103a0565b6101416101da36600461081f565b610419565b6101046101ed366004610841565b610467565b61021261020036600461071e565b60006020819052908152604090205481565b604051908152602001610125565b6004546101049073ffffffffffffffffffffffffffffffffffffffff1681565b61014161024e366004610884565b61059c565b604080516080810182526000606082019081528152336020820152468183015290517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820186905286169063a9059cbb906044016020604051808303816000875af11580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b91906108b0565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87169063de43156e90610366908490899089908990899060040161091b565b600060405180830381600087803b15801561038057600080fd5b505af1158015610394573d6000803e3d6000fd5b50505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e9060200160405180910390a150565b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b60008060006104768585610620565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012060405160200161055c9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d910161045b565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610688576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106106c25782846106c5565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610717576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b60006020828403121561073057600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461075b57600080fd5b919050565b60008060008060006080868803121561077857600080fd5b61078186610737565b945061078f60208701610737565b935060408601359250606086013567ffffffffffffffff8111156107b257600080fd5b8601601f810188136107c357600080fd5b803567ffffffffffffffff8111156107da57600080fd5b8860208284010111156107ec57600080fd5b959894975092955050506020019190565b60006020828403121561080f57600080fd5b61081882610737565b9392505050565b6000806040838503121561083257600080fd5b50508035926020909101359150565b60008060006060848603121561085657600080fd5b61085f84610737565b925061086d60208501610737565b915061087b60408501610737565b90509250925092565b6000806040838503121561089757600080fd5b823591506108a760208401610737565b90509250929050565b6000602082840312156108c257600080fd5b8151801515811461081857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086516060608084015280518060e085015260005b81811015610953576020818401810151610100878401015201610935565b5060008482016101000152602089015173ffffffffffffffffffffffffffffffffffffffff811660a0860152601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168401915050604088015160c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401526101008382030160608401526109f2610100820185876108d2565b9897505050505050505056fea2646970667358221220fecb52d63ec1b967fad2855018329377964bac04ed54a998543272d32f4338fd64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a26469706673582212205a2885036e88ddf175c2afcb4e7ee6317f01b16b20d25f238103a977da9416d164736f6c634300081a0033", + ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testCallReceiverEVMFromSenderZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testCallReceiverEVMFromZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiverEVMFromSenderZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiverEVMFromZEVM\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5062011653806200003e6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806385226c81116100b2578063b5508aa911610081578063d7a525fc11610066578063d7a525fc146101ec578063e20c9f71146101f4578063fa7626d4146101fc57600080fd5b8063b5508aa9146101cc578063ba414fa6146101d457600080fd5b806385226c8114610192578063916a17c6146101a75780639683c695146101bc578063b0464fdc146101c457600080fd5b80633f7286f4116100ee5780633f7286f414610165578063524744131461016d57806366d9a9a0146101755780636ff15ccc1461018a57600080fd5b80630a9254e4146101205780631ed7831c1461012a5780632ade3880146101485780633e5e3c231461015d575b600080fd5b610128610209565b005b61013261125d565b60405161013f9190617ae3565b60405180910390f35b6101506112bf565b60405161013f9190617b7f565b610132611401565b610132611461565b6101286114c1565b61017d611d30565b60405161013f9190617ce5565b610128611eb2565b61019a6126d5565b60405161013f9190617d83565b6101af6127a5565b60405161013f9190617dfa565b6101286128a0565b6101af612e94565b61019a612f8f565b6101dc61305f565b604051901515815260200161013f565b610128613133565b610132613857565b601f546101dc9060ff1681565b602680547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602780548216611234179055602880548216615678179055602e8054909116614321179055604051610267906179c8565b60408082526004908201527f746573740000000000000000000000000000000000000000000000000000000060608201526080602082018190526003908201527f54544b000000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156102ec573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055604051610331906179c8565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156103b5573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602854602654925190861694810194909452604484019290925290921660648201526104a6919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b000000000000000000000000000000000000000000000000000000001790526138b7565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155602854602654604051929391821692911690610532906179d6565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801561056e573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460245460285460265460405193851694928316939183169216906105c9906179e4565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801561060d573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556028546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b1580156106b957600080fd5b505af11580156106cd573d6000803e3d6000fd5b50506026546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561074357600080fd5b505af1158015610757573d6000803e3d6000fd5b50506020546021546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b1580156107bd57600080fd5b505af11580156107d1573d6000803e3d6000fd5b50506020546022546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50506023546026546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f42406024820152911692506340c10f199150604401600060405180830381600087803b15801561093057600080fd5b505af1158015610944573d6000803e3d6000fd5b50506023546021546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12060248201529116925063a9059cbb91506044016020604051808303816000875af11580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190617e91565b506040516109e9906179f2565b604051809103906000f080158015610a05573d6000803e3d6000fd5b50602580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055604080518082018252600f81527f476174657761795a45564d2e736f6c0000000000000000000000000000000000602082015260248054602e54935190851691810191909152919092166044820152610aee919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc955000000000000000000000000000000000000000000000000000000001790526138b7565b602980546001600160a01b03929092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155602a80549092168117909155604051610b3f90617a00565b6001600160a01b039091168152602001604051809103906000f080158015610b6b573d6000803e3d6000fd5b50602b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040517f06447d5600000000000000000000000000000000000000000000000000000000815273735b14bb79463307aacbed86daf3322b1e6226ab6004820181905290737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b158015610c2057600080fd5b505af1158015610c34573d6000803e3d6000fd5b505050506000806000604051610c4990617a0e565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610c85573d6000803e3d6000fd5b50602c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602a54604051601293600193600093849391921690610cdb90617a1c565b610cea96959493929190617eb3565b604051809103906000f080158015610d06573d6000803e3d6000fd5b50602d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602c546040517fee2815ba0000000000000000000000000000000000000000000000000000000081526001600482015260248101929092529091169063ee2815ba90604401600060405180830381600087803b158015610d9d57600080fd5b505af1158015610db1573d6000803e3d6000fd5b5050602c546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610e1b57600080fd5b505af1158015610e2f573d6000803e3d6000fd5b5050602d54602e546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f42406024820152911692506347e7ef2491506044016020604051808303816000875af1158015610ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec79190617e91565b50602d54602b546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f424060248201529116906347e7ef24906044016020604051808303816000875af1158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5c9190617e91565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b5050602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561104557600080fd5b505af1158015611059573d6000803e3d6000fd5b5050602d54602a546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620f424060248201529116925063095ea7b391506044016020604051808303816000875af11580156110cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f19190617e91565b506028546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b50506040805160808101825261032180825260016020808401918252838501928352845190810190945260008452606083018490528251602f80549251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009093166001600160a01b0392831617929092178255915160308054919093167fffffffffffffffffffffffff0000000000000000000000000000000000000000919091161790915590935091506031906112579082618073565b50505050565b606060168054806020026020016040519081016040528092919081815260200182805480156112b557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611297575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156113f857600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156113e157838290600052602060002001805461135490617fd7565b80601f016020809104026020016040519081016040528092919081815260200182805461138090617fd7565b80156113cd5780601f106113a2576101008083540402835291602001916113cd565b820191906000526020600020905b8154815290600101906020018083116113b057829003601f168201915b505050505081526020019060010190611335565b5050505081525050815260200190600101906112e3565b50505050905090565b606060188054806020026020016040519081016040528092919081815260200182805480156112b5576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611297575050505050905090565b606060178054806020026020016040519081016040528092919081815260200182805480156112b5576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611297575050505050905090565b604080518082018252600681527f48656c6c6f2100000000000000000000000000000000000000000000000000006020820152602d54602b5492517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529192602a92600192670de0b6b3a7640000926000929116906370a0823190602401602060405180830381865afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115919190618132565b6040519091506000907fe04d4f9700000000000000000000000000000000000000000000000000000000906115ce9088908890889060240161814b565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093526025549051919350600092611667926001600160a01b03909216910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602d5461169e926207a120916001600160a01b0316908690600190602f90602401618258565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f90ad3e2300000000000000000000000000000000000000000000000000000000179052602a5490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba39161175b916001600160a01b03919091169060009086906004016182c1565b600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156117ff57600080fd5b505af1158015611813573d6000803e3d6000fd5b5050602b5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039091169250630abd8905915060340160408051601f1981840301815290829052602d547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1683526118ad926207a120916001600160a01b0316908d908d908d906004016182e9565b600060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b50506020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101879052737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b15801561195857600080fd5b505af115801561196c573d6000803e3d6000fd5b50506025546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156119fe57600080fd5b505af1158015611a12573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa9350611a5b92506001600160a01b039091169087908b908b908b9061833e565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611af157600080fd5b505af1158015611b05573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150611b4a908790869061837f565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611bc457600080fd5b505af1158015611bd8573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd93508892611c2c9216908790600401618398565b60006040518083038185885af1158015611c4a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611c739190810190618473565b50602d54602b546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190618132565b9050611d26816001611d176207a120886184d7565b611d2191906184d7565b6138d6565b5050505050505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156113f85783829060005260206000209060020201604051806040016040529081600082018054611d8790617fd7565b80601f0160208091040260200160405190810160405280929190818152602001828054611db390617fd7565b8015611e005780601f10611dd557610100808354040283529160200191611e00565b820191906000526020600020905b815481529060010190602001808311611de357829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611e9a57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611e475790505b50505050508152505081526020019060010190611d54565b604080518082018252600681527f48656c6c6f21000000000000000000000000000000000000000000000000000060208201529051602a90600190670de0b6b3a7640000906000907fe04d4f970000000000000000000000000000000000000000000000000000000090611f2e9087908790879060240161814b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009490941693909317909252602a5491517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b039093166084820152909250737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561202057600080fd5b505af1158015612034573d6000803e3d6000fd5b5050602e5460255460405160609190911b6bffffffffffffffffffffffff19166020820152600093506001600160a01b0390911691507ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c09060340160408051601f19818403018152828252602d547f4d8943bb000000000000000000000000000000000000000000000000000000008452915190926001600160a01b03909216916207a1209188918491634d8943bb916004808201926020929091908290030181865afa158015612109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212d9190618132565b896001602f6040516121469897969594939291906184ea565b60405180910390a3602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156121c057600080fd5b505af11580156121d4573d6000803e3d6000fd5b5050602a5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b0390911692506390ad3e23915060340160408051601f1981840301815290829052602d547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352612270926207a120916001600160a01b0316908890600190602f9060040161854c565b600060405180830381600087803b15801561228a57600080fd5b505af115801561229e573d6000803e3d6000fd5b5050602d54602e546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa15801561230a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232e9190618132565b905061234181611d21846207a1206184d7565b6020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101859052737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b1580156123ba57600080fd5b505af11580156123ce573d6000803e3d6000fd5b50506025546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561246057600080fd5b505af1158015612474573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa93506124bd92506001600160a01b039091169087908b908b908b9061833e565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561255357600080fd5b505af1158015612567573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f91506125ac908790879061837f565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561262657600080fd5b505af115801561263a573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd9350889261268e9216908890600401618398565b60006040518083038185885af11580156126ac573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611d269190810190618473565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156113f857838290600052602060002001805461271890617fd7565b80601f016020809104026020016040519081016040528092919081815260200182805461274490617fd7565b80156127915780601f1061276657610100808354040283529160200191612791565b820191906000526020600020905b81548152906001019060200180831161277457829003601f168201915b5050505050815260200190600101906126f9565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156113f85760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561288857602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116128355790505b505050505081525050815260200190600101906127c9565b604080518082018252600681527f48656c6c6f21000000000000000000000000000000000000000000000000000060208201529051602a90600190670de0b6b3a7640000906000907fe04d4f97000000000000000000000000000000000000000000000000000000009061291c9087908790879060240161814b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009490941693909317909252602e5491517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156129ef57600080fd5b505af1158015612a03573d6000803e3d6000fd5b5050602a546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612a9557600080fd5b505af1158015612aa9573d6000803e3d6000fd5b5050602d54602e5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039283169450911691507f885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d89060340160408051601f1981840301815290829052612b29918690600190602f906185a0565b60405180910390a3602a546025546040805160609290921b6bffffffffffffffffffffffff19166020830152805180830360140181526034830191829052602d547fdc9ca2e7000000000000000000000000000000000000000000000000000000009092526001600160a01b039384169363dc9ca2e793612bb99391909116908690600190602f906038016185df565b600060405180830381600087803b158015612bd357600080fd5b505af1158015612be7573d6000803e3d6000fd5b50506020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101859052737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015612c6457600080fd5b505af1158015612c78573d6000803e3d6000fd5b50506020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612d0a57600080fd5b505af1158015612d1e573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150612d63908590859061837f565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612ddd57600080fd5b505af1158015612df1573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd93508692612e459216908690600401618398565b60006040518083038185885af1158015612e63573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612e8c9190810190618473565b505050505050565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156113f85760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015612f7757602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411612f245790505b50505050508152505081526020019060010190612eb8565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156113f8578382906000526020600020018054612fd290617fd7565b80601f0160208091040260200160405190810160405280929190818152602001828054612ffe90617fd7565b801561304b5780601f106130205761010080835404028352916020019161304b565b820191906000526020600020905b81548152906001019060200180831161302e57829003601f168201915b505050505081526020019060010190612fb3565b60085460009060ff1615613077575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015613108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312c9190618132565b1415905090565b604080518082018252600681527f48656c6c6f21000000000000000000000000000000000000000000000000000060208201529051602a90600190670de0b6b3a7640000906000907fe04d4f9700000000000000000000000000000000000000000000000000000000906131af9087908790879060240161814b565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093526025549051919350600092613248926001600160a01b03909216910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602d5461327c926001600160a01b03909116908590600190602f90602401618639565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fdc9ca2e700000000000000000000000000000000000000000000000000000000179052602a5490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613339916001600160a01b03919091169060009086906004016182c1565b600060405180830381600087803b15801561335357600080fd5b505af1158015613367573d6000803e3d6000fd5b5050602e546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156133dd57600080fd5b505af11580156133f1573d6000803e3d6000fd5b5050602b5460255460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039091169250637a34d8bb915060340160408051601f1981840301815290829052602d547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352613488926001600160a01b03909116908b908b908b9060040161868a565b600060405180830381600087803b1580156134a257600080fd5b505af11580156134b6573d6000803e3d6000fd5b50506020546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101869052737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b50506025546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156135d957600080fd5b505af11580156135ed573d6000803e3d6000fd5b50506020546040517f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa935061363692506001600160a01b039091169086908a908a908a9061833e565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156136cc57600080fd5b505af11580156136e0573d6000803e3d6000fd5b50506025546040516001600160a01b0390911692507fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f9150613725908690869061837f565b60405180910390a26028546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561379f57600080fd5b505af11580156137b3573d6000803e3d6000fd5b50506020546025546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450631cff79cd935087926138079216908790600401618398565b60006040518083038185885af1158015613825573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261384e9190810190618473565b50505050505050565b606060158054806020026020016040519081016040528092919081815260200182805480156112b5576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611297575050505050905090565b60006138c1617a2a565b6138cc848483613955565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561394157600080fd5b505afa158015612e8c573d6000803e3d6000fd5b60008061396285846139d0565b90506139c56040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016139b0929190618398565b604051602081830303815290604052856139dc565b9150505b9392505050565b60006139c98383613a0a565b60c08101515160009015613a00576139f984848460c00151613a25565b90506139c9565b6139f98484613bcb565b6000613a168383613cb6565b6139c9838360200151846139dc565b600080613a30613cc6565b90506000613a3e8683613d99565b90506000613a55826060015183602001518561423f565b90506000613a6583838989614451565b90506000613a72826152ce565b602081015181519192509060030b15613ae557898260400151604051602001613a9c9291906186d8565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252613adc91600401618759565b60405180910390fd5b6000613b286040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a20000000000000000000000081525083600161549d565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90613b7b908490600401618759565b602060405180830381865afa158015613b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbc919061876c565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590613c20908790600401618759565b600060405180830381865afa158015613c3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c659190810190618473565b90506000613c938285604051602001613c7f929190618795565b60405160208183030381529060405261569d565b90506001600160a01b0381166138cc578484604051602001613a9c9291906187c4565b613cc2828260006156b0565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90613d4d90849060040161886f565b600060405180830381865afa158015613d6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d9291908101906188b6565b9250505090565b613dcb6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050613e166040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b613e1f856157b3565b60208201526000613e2f86615b98565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015613e71573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e9991908101906188b6565b86838560200151604051602001613eb394939291906188ff565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190613f0b908590600401618759565b600060405180830381865afa158015613f28573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f5091908101906188b6565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690613f98908490600401618a03565b602060405180830381865afa158015613fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fd99190617e91565b613fee5781604051602001613a9c9190618a55565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614033908490600401618ae7565b600060405180830381865afa158015614050573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261407891908101906188b6565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f6906140bf908490600401618b39565b602060405180830381865afa1580156140dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141009190617e91565b15614195576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061414a908490600401618b39565b600060405180830381865afa158015614167573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261418f91908101906188b6565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016141ba9190618b8b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016141e6929190618bf7565b600060405180830381865afa158015614203573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261422b91908101906188b6565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161425b5790505090506040518060400160405280600481526020017f6772657000000000000000000000000000000000000000000000000000000000815250816000815181106142bb576142bb618c1c565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061430f5761430f618c1c565b60200260200101819052508460405160200161432b9190618c4b565b6040516020818303038152906040528160028151811061434d5761434d618c1c565b6020026020010181905250826040516020016143699190618cb7565b6040516020818303038152906040528160038151811061438b5761438b618c1c565b602002602001018190525060006143a1826152ce565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506144329060408051808201825260008082526020918201528151808301909252845182528085019082015290615e1b565b6144475785604051602001613a9c9190618cf8565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d90156144a1565b511590565b6146155782602001511561455d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401613adc565b8260c0015115614615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401613adc565b6040805160ff8082526120008201909252600091816020015b606081526020019060019003908161462e57905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061468990618d89565b935060ff168151811061469e5761469e618c1c565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e37000000000000000000000000000000000000008152506040516020016146ef9190618da8565b60405160208183030381529060405282828061470a90618d89565b935060ff168151811061471f5761471f618c1c565b60200260200101819052506040518060400160405280600681526020017f6465706c6f79000000000000000000000000000000000000000000000000000081525082828061476c90618d89565b935060ff168151811061478157614781618c1c565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d650000000000000000000000000000000000008152508282806147ce90618d89565b935060ff16815181106147e3576147e3618c1c565b602002602001018190525087602001518282806147ff90618d89565b935060ff168151811061481457614814618c1c565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163745061746800000000000000000000000000000000000081525082828061486190618d89565b935060ff168151811061487657614876618c1c565b60209081029190910101528751828261488e81618d89565b935060ff16815181106148a3576148a3618c1c565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e496400000000000000000000000000000000000000000000008152508282806148f090618d89565b935060ff168151811061490557614905618c1c565b602002602001018190525061491946615e7c565b828261492481618d89565b935060ff168151811061493957614939618c1c565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c65000000000000000000000000000000000081525082828061498690618d89565b935060ff168151811061499b5761499b618c1c565b6020026020010181905250868282806149b390618d89565b935060ff16815181106149c8576149c8618c1c565b6020908102919091010152855115614aef5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282614a1981618d89565b935060ff1681518110614a2e57614a2e618c1c565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90614a7e908990600401618759565b600060405180830381865afa158015614a9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614ac391908101906188b6565b8282614ace81618d89565b935060ff1681518110614ae357614ae3618c1c565b60200260200101819052505b846020015115614bbf5760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282614b3881618d89565b935060ff1681518110614b4d57614b4d618c1c565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280614b9a90618d89565b935060ff1681518110614baf57614baf618c1c565b6020026020010181905250614d86565b614bf761449c8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b614c8a5760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614c3a81618d89565b935060ff1681518110614c4f57614c4f618c1c565b60200260200101819052508460a00151604051602001614c6f9190618c4b565b604051602081830303815290604052828280614b9a90618d89565b8460c00151158015614ccd575060408089015181518083018352600080825260209182015282518084019093528151835290810190820152614ccb90511590565b155b15614d865760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282614d1181618d89565b935060ff1681518110614d2657614d26618c1c565b6020026020010181905250614d3a88615f1c565b604051602001614d4a9190618c4b565b604051602081830303815290604052828280614d6590618d89565b935060ff1681518110614d7a57614d7a618c1c565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152614dba90511590565b614e4f5760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282614dfd81618d89565b935060ff1681518110614e1257614e12618c1c565b60200260200101819052508460400151828280614e2e90618d89565b935060ff1681518110614e4357614e43618c1c565b60200260200101819052505b606085015115614f705760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282614e9881618d89565b935060ff1681518110614ead57614ead618c1c565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015614f1c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614f4491908101906188b6565b8282614f4f81618d89565b935060ff1681518110614f6457614f64618c1c565b60200260200101819052505b60e085015151156150175760408051808201909152600a81527f2d2d6761734c696d69740000000000000000000000000000000000000000000060208201528282614fba81618d89565b935060ff1681518110614fcf57614fcf618c1c565b6020026020010181905250614feb8560e0015160000151615e7c565b8282614ff681618d89565b935060ff168151811061500b5761500b618c1c565b60200260200101819052505b60e085015160200151156150c15760408051808201909152600a81527f2d2d6761735072696365000000000000000000000000000000000000000000006020820152828261506481618d89565b935060ff168151811061507957615079618c1c565b60200260200101819052506150958560e0015160200151615e7c565b82826150a081618d89565b935060ff16815181106150b5576150b5618c1c565b60200260200101819052505b60e0850151604001511561516b5760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261510e81618d89565b935060ff168151811061512357615123618c1c565b602002602001018190525061513f8560e0015160400151615e7c565b828261514a81618d89565b935060ff168151811061515f5761515f618c1c565b60200260200101819052505b60e085015160600151156152155760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826151b881618d89565b935060ff16815181106151cd576151cd618c1c565b60200260200101819052506151e98560e0015160600151615e7c565b82826151f481618d89565b935060ff168151811061520957615209618c1c565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561523357615233617fa8565b60405190808252806020026020018201604052801561526657816020015b60608152602001906001900390816152515790505b50905060005b8260ff168160ff1610156152bf57838160ff168151811061528f5761528f618c1c565b6020026020010151828260ff16815181106152ac576152ac618c1c565b602090810291909101015260010161526c565b5093505050505b949350505050565b6152f56040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161537b91869101618e13565b600060405180830381865afa158015615398573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153c091908101906188b6565b905060006153ce8683616a0b565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016153fe9190617d83565b6000604051808303816000875af115801561541d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154459190810190618e5a565b805190915060030b1580159061545e5750602081015151155b801561546d5750604081015151155b15614447578160008151811061548557615485618c1c565b6020026020010151604051602001613a9c9190618f10565b606060006154d28560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506155099082905b90616b60565b15615666576000615586826155808461557a61554c8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90616b87565b90616be9565b604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506155ea908290616b60565b1561565457604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615651905b8290616c6e565b90505b61565d81616c94565b925050506139c9565b821561567f578484604051602001613a9c9291906190fc565b50506040805160208101909152600081526139c9565b509392505050565b6000808251602084016000f09392505050565b8160a00151156156bf57505050565b60006156cc848484616cfd565b905060006156d9826152ce565b602081015181519192509060030b1580156157755750604080518082018252600781527f53554343455353000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261577590604080518082018252600080825260209182015281518083019092528451825280850190820152615503565b1561578257505050505050565b604082015151156157a2578160400151604051602001613a9c91906191a3565b80604051602001613a9c9190619201565b606060006157e88360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061584d905b8290615e1b565b156158bc57604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139c9906158b7908390617298565b616c94565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261591e905b8290617322565b6001036159eb57604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526159849061564a565b50604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139c9906158b7905b8390616c6e565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615a4a90615846565b15615b8157604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615ab29083906173bc565b905060008160018351615ac591906184d7565b81518110615ad557615ad5618c1c565b60200260200101519050615b786158b7615b4b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290617298565b95945050505050565b82604051602001613a9c919061926c565b50919050565b60606000615bcd8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615c2f90615846565b15615c3d576139c981616c94565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615c9c90615917565b600103615d0657604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526139c9906158b7906159e4565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615d6590615846565b15615b8157604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290615dcd9083906173bc565b9050600181511115615e09578060028251615de891906184d7565b81518110615df857615df8618c1c565b602002602001015192505050919050565b5082604051602001613a9c919061926c565b805182516000911115615e30575060006138d0565b81518351602085015160009291615e469161934a565b615e5091906184d7565b905082602001518103615e675760019150506138d0565b82516020840151819020912014905092915050565b60606000615e8983617461565b600101905060008167ffffffffffffffff811115615ea957615ea9617fa8565b6040519080825280601f01601f191660200182016040528015615ed3576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084615edd57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091615fa8905b8290617543565b15615fe857505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261604790615fa1565b1561608757505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526160e690615fa1565b1561612657505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261618590615fa1565b806161ea5750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526161ea90615fa1565b1561622a57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261628990615fa1565b806162ee5750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526162ee90615fa1565b1561632e57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261638d90615fa1565b806163f25750604080518082018252601181527f4c47504c2d322e312d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526163f290615fa1565b1561643257505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261649190615fa1565b806164f65750604080518082018252601181527f4c47504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526164f690615fa1565b1561653657505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261659590615fa1565b156165d557505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261663490615fa1565b1561667457505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526166d390615fa1565b1561671357505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261677290615fa1565b156167b257505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261681190615fa1565b1561685157505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526168b090615fa1565b806169155750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261691590615fa1565b1561695557505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e31000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526169b490615fa1565b156169f457505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151613a9c929060200161935d565b60608060005b8451811015616a965781858281518110616a2d57616a2d618c1c565b6020026020010151604051602001616a46929190618795565b604051602081830303815290604052915060018551616a6591906184d7565b8114616a8e5781604051602001616a7c91906194c6565b60405160208183030381529060405291505b600101616a11565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081616aaf5790505090508381600081518110616ada57616ada618c1c565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110616b2e57616b2e618c1c565b60200260200101819052508181600281518110616b4d57616b4d618c1c565b6020908102919091010152949350505050565b6020808301518351835192840151600093616b7e9291849190617557565b14159392505050565b60408051808201909152600080825260208201526000616bb98460000151856020015185600001518660200151617668565b9050836020015181616bcb91906184d7565b84518590616bda9083906184d7565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015616c0e5750816138d0565b6020808301519084015160019114616c355750815160208481015190840151829020919020145b8015616c6657825184518590616c4c9083906184d7565b9052508251602085018051616c6290839061934a565b9052505b509192915050565b6040805180820190915260008082526020820152616c8d838383617788565b5092915050565b60606000826000015167ffffffffffffffff811115616cb557616cb5617fa8565b6040519080825280601f01601f191660200182016040528015616cdf576020820181803683370190505b5090506000602082019050616c8d8185602001518660000151617833565b60606000616d09613cc6565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081616d2657905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280616d8190618d89565b935060ff1681518110616d9657616d96618c1c565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001616de79190619507565b604051602081830303815290604052828280616e0290618d89565b935060ff1681518110616e1757616e17618c1c565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280616e6490618d89565b935060ff1681518110616e7957616e79618c1c565b602002602001018190525082604051602001616e959190618cb7565b604051602081830303815290604052828280616eb090618d89565b935060ff1681518110616ec557616ec5618c1c565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280616f1290618d89565b935060ff1681518110616f2757616f27618c1c565b6020026020010181905250616f3c87846178ad565b8282616f4781618d89565b935060ff1681518110616f5c57616f5c618c1c565b6020908102919091010152855151156170085760408051808201909152600b81527f2d2d7265666572656e636500000000000000000000000000000000000000000060208201528282616fae81618d89565b935060ff1681518110616fc357616fc3618c1c565b6020026020010181905250616fdc8660000151846178ad565b8282616fe781618d89565b935060ff1681518110616ffc57616ffc618c1c565b60200260200101819052505b8560800151156170765760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261705181618d89565b935060ff168151811061706657617066618c1c565b60200260200101819052506170dc565b84156170dc5760408051808201909152601281527f2d2d726571756972655265666572656e63650000000000000000000000000000602082015282826170bb81618d89565b935060ff16815181106170d0576170d0618c1c565b60200260200101819052505b604086015151156171785760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261712681618d89565b935060ff168151811061713b5761713b618c1c565b6020026020010181905250856040015182828061715790618d89565b935060ff168151811061716c5761716c618c1c565b60200260200101819052505b8560600151156171e25760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d6573000000000000000000000000602082015282826171c181618d89565b935060ff16815181106171d6576171d6618c1c565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561720057617200617fa8565b60405190808252806020026020018201604052801561723357816020015b606081526020019060019003908161721e5790505b50905060005b8260ff168160ff16101561728c57838160ff168151811061725c5761725c618c1c565b6020026020010151828260ff168151811061727957617279618c1c565b6020908102919091010152600101617239565b50979650505050505050565b60408051808201909152600080825260208201528151835110156172bd5750816138d0565b815183516020850151600092916172d39161934a565b6172dd91906184d7565b602084015190915060019082146172fe575082516020840151819020908220145b8015617319578351855186906173159083906184d7565b9052505b50929392505050565b60008082600001516173468560000151866020015186600001518760200151617668565b617350919061934a565b90505b83516020850151617364919061934a565b8111616c8d57816173748161954c565b92505082600001516173ab85602001518361738f91906184d7565b865161739b91906184d7565b8386600001518760200151617668565b6173b5919061934a565b9050617353565b606060006173ca8484617322565b6173d590600161934a565b67ffffffffffffffff8111156173ed576173ed617fa8565b60405190808252806020026020018201604052801561742057816020015b606081526020019060019003908161740b5790505b50905060005b81518110156156955761743c6158b78686616c6e565b82828151811061744e5761744e618c1c565b6020908102919091010152600101617426565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106174aa577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106174d6576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106174f457662386f26fc10000830492506010015b6305f5e100831061750c576305f5e100830492506008015b612710831061752057612710830492506004015b60648310617532576064830492506002015b600a83106138d05760010192915050565b600061754f83836178ed565b159392505050565b60008085841161765e576020841161760a57600084156175a257600161757e8660206184d7565b617589906008619566565b617594906002619664565b61759e91906184d7565b1990505b83518116856175b1898961934a565b6175bb91906184d7565b805190935082165b8181146175f5578784116175dd57879450505050506152c6565b836175e781619670565b9450508284511690506175c3565b6175ff878561934a565b9450505050506152c6565b83832061761785886184d7565b617621908761934a565b91505b85821061765c578482208082036176495761763f868461934a565b93505050506152c6565b6176546001846184d7565b925050617624565b505b5092949350505050565b60008381868511617773576020851161772257600085156176b45760016176908760206184d7565b61769b906008619566565b6176a6906002619664565b6176b091906184d7565b1990505b845181166000876176c58b8b61934a565b6176cf91906184d7565b855190915083165b828114617714578186106176fc576176ef8b8b61934a565b96505050505050506152c6565b856177068161954c565b9650508386511690506176d7565b8596505050505050506152c6565b508383206000905b61773486896184d7565b82116177715785832080820361775057839450505050506152c6565b61775b60018561934a565b93505081806177699061954c565b92505061772a565b505b61777d878761934a565b979650505050505050565b604080518082019091526000808252602082015260006177ba8560000151866020015186600001518760200151617668565b6020808701805191860191909152519091506177d690826184d7565b8352845160208601516177e9919061934a565b81036177f8576000855261782a565b83518351617806919061934a565b855186906178159083906184d7565b9052508351617824908261934a565b60208601525b50909392505050565b6020811061786b578151835261784a60208461934a565b925061785760208361934a565b91506178646020826184d7565b9050617833565b600019811561789a5760016178818360206184d7565b61788d90610100619664565b61789791906184d7565b90505b9151835183169219169190911790915250565b606060006178bb8484613d99565b80516020808301516040519394506178d593909101619687565b60405160208183030381529060405291505092915050565b8151815160009190811115617900575081515b6020808501519084015160005b838110156179b957825182518082146179895760001960208710156179685760018461793a8960206184d7565b617944919061934a565b61794f906008619566565b61795a906002619664565b61796491906184d7565b1990505b81811683821681810391146179865797506138d09650505050505050565b50505b61799460208661934a565b94506179a160208561934a565b935050506020816179b2919061934a565b905061790d565b508451865161444791906196df565b610c9f806200970083390190565b6119ca806200a39f83390190565b611783806200bd6983390190565b610de0806200d4ec83390190565b610a12806200e2cc83390190565b610b3f806200ecde83390190565b611e01806200f81d83390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001617a6d617a72565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001617a6d6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015617b245783516001600160a01b0316835260209384019390920191600101617afd565b509095945050505050565b60005b83811015617b4a578181015183820152602001617b32565b50506000910152565b60008151808452617b6b816020860160208601617b2f565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015617c61577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018352617c4b848651617b53565b6020958601959094509290920191600101617c11565b509197505050602094850194929092019150600101617ba7565b50929695505050505050565b600081518084526020840193506020830160005b82811015617cdb5781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101617c9b565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752617d516040880182617b53565b9050602082015191508681036020880152617d6c8183617c87565b965050506020938401939190910190600101617d0d565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452617de5858351617b53565b94506020938401939190910190600101617dab565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015617c7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152617e7b6040870182617c87565b9550506020938401939190910190600101617e22565b600060208284031215617ea357600080fd5b815180151581146139c957600080fd5b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff8816604083015286606083015260038610617f6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a0830152617f8e60c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c90821680617feb57607f821691505b602082108103615b92577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561806e57806000526020600020601f840160051c8101602085101561804b5750805b601f840160051c820191505b8181101561806b5760008155600101618057565b50505b505050565b815167ffffffffffffffff81111561808d5761808d617fa8565b6180a18161809b8454617fd7565b84618024565b6020601f8211600181146180d557600083156180bd5750848201515b600019600385901b1c1916600184901b17845561806b565b600084815260208120601f198516915b8281101561810557878501518255602094850194600190920191016180e5565b50848210156181235786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561814457600080fd5b5051919050565b60608152600061815e6060830186617b53565b602083019490945250901515604090910152919050565b600081546001600160a01b038116845260ff8160a01c1615156020850152506001600160a01b0360018301541660408401526002820160806060850152600081546181bf81617fd7565b80608088015260018216600081146181de57600181146182185761824c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00831660a089015260a082151560051b890101935061824c565b84600052602060002060005b838110156182435781548a820160a00152600190910190602001618224565b890160a0019450505b50919695505050505050565b60c08152600061826b60c0830189617b53565b62ffffff881660208401526001600160a01b038716604084015282810360608401526182978187617b53565b905060ff8516608084015282810360a08401526182b48185618175565b9998505050505050505050565b6001600160a01b0384168152826020820152606060408201526000615b786060830184617b53565b60c0815260006182fc60c0830189617b53565b8760208401526001600160a01b038716604084015282810360608401526183238187617b53565b6080840195909552505090151560a090910152949350505050565b6001600160a01b038616815284602082015260a06040820152600061836660a0830186617b53565b6060830194909452509015156080909101529392505050565b8281526040602082015260006152c66040830184617b53565b6001600160a01b03831681526040602082015260006152c66040830184617b53565b6040516060810167ffffffffffffffff811182821017156183dd576183dd617fa8565b60405290565b60008067ffffffffffffffff8411156183fe576183fe617fa8565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561842d5761842d617fa8565b60405283815290508082840185101561844557600080fd5b615695846020830185617b2f565b600082601f83011261846457600080fd5b6139c9838351602085016183e3565b60006020828403121561848557600080fd5b815167ffffffffffffffff81111561849c57600080fd5b6138cc84828501618453565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156138d0576138d06184a8565b610100815260006184ff61010083018b617b53565b6001600160a01b038a16602084015288604084015287606084015286608084015282810360a08401526185328187617b53565b90508460c084015282810360e0840152613bbc8185618175565b60c08152600061855f60c0830189617b53565b8760208401526001600160a01b038716604084015282810360608401526185868187617b53565b905084608084015282810360a08401526182b48185618175565b6080815260006185b36080830187617b53565b82810360208401526185c58187617b53565b9050846040840152828103606084015261777d8185618175565b60a0815260006185f260a0830188617b53565b6001600160a01b038716602084015282810360408401526186138187617b53565b9050846060840152828103608084015261862d8185618175565b98975050505050505050565b60a08152600061864c60a0830188617b53565b6001600160a01b0387166020840152828103604084015261866d8187617b53565b905060ff85166060840152828103608084015261862d8185618175565b60a08152600061869d60a0830188617b53565b6001600160a01b038716602084015282810360408401526186be8187617b53565b606084019590955250509015156080909101529392505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161871081601a850160208801617b2f565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161874d81601c840160208801617b2f565b01601c01949350505050565b6020815260006139c96020830184617b53565b60006020828403121561877e57600080fd5b81516001600160a01b03811681146139c957600080fd5b600083516187a7818460208801617b2f565b8351908301906187bb818360208801617b2f565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e7472616374200000000000008152600083516187fc81601a850160208801617b2f565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351618839816033840160208801617b2f565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f555400000000000000000000000000000000000000000060608201526080602082015260006139c96080830184617b53565b6000602082840312156188c857600080fd5b815167ffffffffffffffff8111156188df57600080fd5b8201601f810184136188f057600080fd5b6138cc848251602084016183e3565b60008551618911818460208a01617b2f565b7f2f00000000000000000000000000000000000000000000000000000000000000908301908152855161894b816001840160208a01617b2f565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451618989816002840160208901617b2f565b6001818301019150507f2f00000000000000000000000000000000000000000000000000000000000000600182015283516189cb816002840160208801617b2f565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000618a166040830184617b53565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251618a8d81601f850160208701617b2f565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000618afa6040830184617b53565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000618b4c6040830184617b53565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251618bc3816014850160208701617b2f565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000618c0a6040830185617b53565b82810360208401526139c58185617b53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251618c83816001850160208701617b2f565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251618cc9818460208701617b2f565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251618d7c81604b850160208701617b2f565b91909101604b0192915050565b600060ff821660ff8103618d9f57618d9f6184a8565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251618e06816029850160208701617b2f565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006139c96080830184617b53565b600060208284031215618e6c57600080fd5b815167ffffffffffffffff811115618e8357600080fd5b820160608185031215618e9557600080fd5b618e9d6183ba565b81518060030b8114618eae57600080fd5b8152602082015167ffffffffffffffff811115618eca57600080fd5b618ed686828501618453565b602083015250604082015167ffffffffffffffff811115618ef657600080fd5b618f0286828501618453565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f2200000000000000000000000000000000000000000000000000000000000000602082015260008251618f6e816021850160208701617b2f565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161915a816021850160208801617b2f565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161919781602e840160208801617b2f565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251618e06816029850160208701617b2f565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161925f816022850160208701617b2f565b9190910160220192915050565b7f436f6e7472616374206e616d65200000000000000000000000000000000000008152600082516192a481600e850160208701617b2f565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b808201808211156138d0576138d06184a8565b7f53504458206c6963656e7365206964656e746966696572200000000000000000815260008351619395816018850160208801617b2f565b7f20696e200000000000000000000000000000000000000000000000000000000060189184019182015283516193d281601c840160208801617b2f565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516194d8818460208701617b2f565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161953f81601c850160208701617b2f565b91909101601c0192915050565b6000600019820361955f5761955f6184a8565b5060010190565b80820281158282048414176138d0576138d06184a8565b6001815b60018411156195b85780850481111561959c5761959c6184a8565b60018416156195aa57908102905b60019390931c928002619581565b935093915050565b6000826195cf575060016138d0565b816195dc575060006138d0565b81600181146195f257600281146195fc57619618565b60019150506138d0565b60ff84111561960d5761960d6184a8565b50506001821b6138d0565b5060208310610133831016604e8410600b841016171561963b575081810a6138d0565b619648600019848461957d565b806000190482111561965c5761965c6184a8565b029392505050565b60006139c983836195c0565b60008161967f5761967f6184a8565b506000190190565b60008351619699818460208801617b2f565b7f3a0000000000000000000000000000000000000000000000000000000000000090830190815283516196d3816001840160208801617b2f565b01600101949350505050565b8181036000831280158383131683831282161715616c8d57616c8d6184a856fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a00336080604052348015600f57600080fd5b50604051610a12380380610a12833981016040819052602c916050565b600080546001600160a01b0319166001600160a01b0392909216919091179055607e565b600060208284031215606157600080fd5b81516001600160a01b0381168114607757600080fd5b9392505050565b6109858061008d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630abd890514610046578063116191b61461005b5780637a34d8bb146100a4575b600080fd5b6100596100543660046105e7565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100596100b2366004610687565b61030c565b60008383836040516024016100ce93929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490915073ffffffffffffffffffffffffffffffffffffffff8087169163095ea7b391166101758960026107ad565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156101e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020991906107ed565b61023f576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160808101825261032180825260016020808401829052838501929092528351918201845260008083526060840192909252905492517f90ad3e23000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff16916390ad3e23916102d0918c918c918c918991899060040161087a565b600060405180830381600087803b1580156102ea57600080fd5b505af11580156102fe573d6000803e3d6000fd5b505050505050505050505050565b600083838360405160240161032393929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905281516080810183526103218082526001828401819052828501919091528351928301845260008084526060830193909352915492517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201526024810183905293945092909188169063095ea7b3906044016020604051808303816000875af1158015610447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046b91906107ed565b506000546040517fdc9ca2e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063dc9ca2e7906102d0908b908b908890879089906004016108e8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261050a57600080fd5b81356020830160008067ffffffffffffffff84111561052b5761052b6104ca565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610578576105786104ca565b60405283815290508082840187101561059057600080fd5b838360208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105d157600080fd5b919050565b80151581146105e457600080fd5b50565b60008060008060008060c0878903121561060057600080fd5b863567ffffffffffffffff81111561061757600080fd5b61062389828a016104f9565b96505060208701359450610639604088016105ad565b9350606087013567ffffffffffffffff81111561065557600080fd5b61066189828a016104f9565b9350506080870135915060a0870135610679816105d6565b809150509295509295509295565b600080600080600060a0868803121561069f57600080fd5b853567ffffffffffffffff8111156106b657600080fd5b6106c2888289016104f9565b9550506106d1602087016105ad565b9350604086013567ffffffffffffffff8111156106ed57600080fd5b6106f9888289016104f9565b935050606086013591506080860135610711816105d6565b809150509295509295909350565b6000815180845260005b8181101561074557602081850181015186830182015201610729565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b606081526000610796606083018661071f565b602083019490945250901515604090910152919050565b808201808211156107e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156107ff57600080fd5b815161080a816105d6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526000606082015160806060850152610872608085018261071f565b949350505050565b60c08152600061088d60c083018961071f565b87602084015273ffffffffffffffffffffffffffffffffffffffff8716604084015282810360608401526108c1818761071f565b905084608084015282810360a08401526108db8185610811565b9998505050505050505050565b60a0815260006108fb60a083018861071f565b73ffffffffffffffffffffffffffffffffffffffff871660208401528281036040840152610929818761071f565b905084606084015282810360808401526109438185610811565b9897505050505050505056fea26469706673582212207447884a874c8537c3ef840e4ddffbc65b7e07105578a7028d806e21fe26e52164736f6c634300081a0033608060405234801561001057600080fd5b50604051610b3f380380610b3f83398101604081905261002f916100b9565b600380546001600160a01b038086166001600160a01b0319928316179092556004805485841690831617905560058054928416929091169190911790556040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a15050506100fc565b80516001600160a01b03811681146100b457600080fd5b919050565b6000806000606084860312156100ce57600080fd5b6100d78461009d565b92506100e56020850161009d565b91506100f36040850161009d565b90509250925092565b610a348061010b6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806397770dff11610081578063d7fd7afb1161005b578063d7fd7afb146101f2578063d936a01214610220578063ee2815ba1461024057600080fd5b806397770dff146101b9578063a7cb0507146101cc578063c63585cc146101df57600080fd5b8063513a9c05116100b2578063513a9c0514610143578063569541b914610179578063842da36d1461019957600080fd5b80630be15547146100ce5780633c669d551461012e575b600080fd5b6101046100dc36600461071e565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61014161013c366004610760565b610253565b005b61010461015136600461071e565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6005546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6101416101c73660046107fd565b6103a0565b6101416101da36600461081f565b610419565b6101046101ed366004610841565b610467565b61021261020036600461071e565b60006020819052908152604090205481565b604051908152602001610125565b6004546101049073ffffffffffffffffffffffffffffffffffffffff1681565b61014161024e366004610884565b61059c565b604080516080810182526000606082019081528152336020820152468183015290517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820186905286169063a9059cbb906044016020604051808303816000875af11580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b91906108b0565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87169063de43156e90610366908490899089908990899060040161091b565b600060405180830381600087803b15801561038057600080fd5b505af1158015610394573d6000803e3d6000fd5b50505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e9060200160405180910390a150565b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b60008060006104768585610620565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012060405160200161055c9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d910161045b565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610688576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106106c25782846106c5565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610717576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b60006020828403121561073057600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461075b57600080fd5b919050565b60008060008060006080868803121561077857600080fd5b61078186610737565b945061078f60208701610737565b935060408601359250606086013567ffffffffffffffff8111156107b257600080fd5b8601601f810188136107c357600080fd5b803567ffffffffffffffff8111156107da57600080fd5b8860208284010111156107ec57600080fd5b959894975092955050506020019190565b60006020828403121561080f57600080fd5b61081882610737565b9392505050565b6000806040838503121561083257600080fd5b50508035926020909101359150565b60008060006060848603121561085657600080fd5b61085f84610737565b925061086d60208501610737565b915061087b60408501610737565b90509250925092565b6000806040838503121561089757600080fd5b823591506108a760208401610737565b90509250929050565b6000602082840312156108c257600080fd5b8151801515811461081857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086516060608084015280518060e085015260005b81811015610953576020818401810151610100878401015201610935565b5060008482016101000152602089015173ffffffffffffffffffffffffffffffffffffffff811660a0860152601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168401915050604088015160c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401526101008382030160608401526109f2610100820185876108d2565b9897505050505050505056fea2646970667358221220fecb52d63ec1b967fad2855018329377964bac04ed54a998543272d32f4338fd64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a264697066735822122001b47e28bf0ca29a3bafb0df28c9893abfaa6d46a939992a975cd96bd59a86e064736f6c634300081a0033", } // GatewayEVMZEVMTestABI is the input ABI used to generate the binding from. @@ -940,13 +940,14 @@ type GatewayEVMZEVMTestCalled0 struct { Zrc20 common.Address Receiver []byte Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterCalled0 is a free log retrieval operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// FilterCalled0 is a free log retrieval operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) FilterCalled0(opts *bind.FilterOpts, sender []common.Address, zrc20 []common.Address) (*GatewayEVMZEVMTestCalled0Iterator, error) { var senderRule []interface{} @@ -965,9 +966,9 @@ func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) FilterCalled0(opts *bind. return &GatewayEVMZEVMTestCalled0Iterator{contract: _GatewayEVMZEVMTest.contract, event: "Called0", logs: logs, sub: sub}, nil } -// WatchCalled0 is a free log subscription operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// WatchCalled0 is a free log subscription operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) WatchCalled0(opts *bind.WatchOpts, sink chan<- *GatewayEVMZEVMTestCalled0, sender []common.Address, zrc20 []common.Address) (event.Subscription, error) { var senderRule []interface{} @@ -1011,9 +1012,9 @@ func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) WatchCalled0(opts *bind.W }), nil } -// ParseCalled0 is a log parse operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// ParseCalled0 is a log parse operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) ParseCalled0(log types.Log) (*GatewayEVMZEVMTestCalled0, error) { event := new(GatewayEVMZEVMTestCalled0) if err := _GatewayEVMZEVMTest.contract.UnpackLog(event, "Called0", log); err != nil { @@ -2395,13 +2396,14 @@ type GatewayEVMZEVMTestWithdrawn struct { Gasfee *big.Int ProtocolFlatFee *big.Int Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawn is a free log retrieval operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, sender []common.Address, chainId []*big.Int) (*GatewayEVMZEVMTestWithdrawnIterator, error) { var senderRule []interface{} @@ -2420,9 +2422,9 @@ func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) FilterWithdrawn(opts *bin return &GatewayEVMZEVMTestWithdrawnIterator{contract: _GatewayEVMZEVMTest.contract, event: "Withdrawn", logs: logs, sub: sub}, nil } -// WatchWithdrawn is a free log subscription operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// WatchWithdrawn is a free log subscription operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayEVMZEVMTestWithdrawn, sender []common.Address, chainId []*big.Int) (event.Subscription, error) { var senderRule []interface{} @@ -2466,9 +2468,9 @@ func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) WatchWithdrawn(opts *bind }), nil } -// ParseWithdrawn is a log parse operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// ParseWithdrawn is a log parse operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayEVMZEVMTest *GatewayEVMZEVMTestFilterer) ParseWithdrawn(log types.Log) (*GatewayEVMZEVMTestWithdrawn, error) { event := new(GatewayEVMZEVMTestWithdrawn) if err := _GatewayEVMZEVMTest.contract.UnpackLog(event, "Withdrawn", log); err != nil { diff --git a/v2/pkg/gatewayzevm.sol/gatewayzevm.go b/v2/pkg/gatewayzevm.sol/gatewayzevm.go index ec32b58e..9ac9dedf 100644 --- a/v2/pkg/gatewayzevm.sol/gatewayzevm.go +++ b/v2/pkg/gatewayzevm.sol/gatewayzevm.go @@ -53,8 +53,8 @@ type ZContext struct { // GatewayZEVMMetaData contains all meta data concerning the GatewayZEVM contract. var GatewayZEVMMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FUNGIBLE_MODULE_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndRevert\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"zetaToken_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"zetaToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516138cf6100fd600039600081816122b7015281816122e001526124b601526138cf6000f3fe6080604052600436106101bb5760003560e01c80638456cb59116100ec578063ad3cb1cc1161008a578063d547741f11610064578063d547741f14610600578063dc9ca2e714610620578063e63ab1e914610640578063f45346dc1461067457600080fd5b8063ad3cb1cc1461056a578063bcf7f32b146105c0578063c39aca37146105e057600080fd5b80639ec60484116100c65780639ec60484146104f5578063a13b8cff14610515578063a217fddf14610535578063aa6585d01461054a57600080fd5b80638456cb591461045b57806390ad3e231461047057806391d148541461049057600080fd5b80633ce4a5bc116101595780634f1ef286116101335780634f1ef286146103dc57806352d1902d146103ef5780635c975abb1461040457806371f6af541461043b57600080fd5b80633ce4a5bc1461037f5780633f4ba83a146103a7578063485cc955146103bc57600080fd5b806321e093b11161019557806321e093b1146102aa578063248a9ca3146102e25780632f2ff15d1461033f57806336568abe1461035f57600080fd5b806301ffc9a7146102355780631e83da291461026a57806321501a951461028a57600080fd5b36610230576101c8610694565b6000546001600160a01b031633148015906101f757503373735b14bb79463307aacbed86daf3322b1e6226ab14155b1561022e576040517f229930b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b34801561024157600080fd5b50610255610250366004612cd8565b6106f2565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061022e610285366004612e76565b61078b565b34801561029657600080fd5b5061022e6102a5366004612f49565b6108b4565b3480156102b657600080fd5b506000546102ca906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b3480156102ee57600080fd5b506103316102fd366004612fd5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610261565b34801561034b57600080fd5b5061022e61035a366004612fee565b610a81565b34801561036b57600080fd5b5061022e61037a366004612fee565b610acb565b34801561038b57600080fd5b506102ca73735b14bb79463307aacbed86daf3322b1e6226ab81565b3480156103b357600080fd5b5061022e610b1c565b3480156103c857600080fd5b5061022e6103d736600461301e565b610b51565b61022e6103ea36600461304c565b610da7565b3480156103fb57600080fd5b50610331610dc6565b34801561041057600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610255565b34801561044757600080fd5b5061022e61045636600461309c565b610df5565b34801561046757600080fd5b5061022e610f60565b34801561047c57600080fd5b5061022e61048b366004613121565b610f92565b34801561049c57600080fd5b506102556104ab366004612fee565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561050157600080fd5b5061022e6105103660046131e1565b611102565b34801561052157600080fd5b5061022e610530366004613245565b61121f565b34801561054157600080fd5b50610331600081565b34801561055657600080fd5b5061022e610565366004613245565b6114ae565b34801561057657600080fd5b506105b36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b604051610261919061336d565b3480156105cc57600080fd5b5061022e6105db366004613380565b611591565b3480156105ec57600080fd5b5061022e6105fb366004613380565b6116fb565b34801561060c57600080fd5b5061022e61061b366004612fee565b61190a565b34801561062c57600080fd5b5061022e61063b36600461341e565b61194e565b34801561064c57600080fd5b506103317f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561068057600080fd5b5061022e61068f3660046134ba565b611bb5565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16156106f0576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061078557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610793611dc4565b61079b610694565b85516000036107d6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84600003610810576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61082e8573735b14bb79463307aacbed86daf3322b1e6226ab611e45565b60008054604051869233927f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de9261087b928c926001600160a01b0316918c919081908c908c908c90613622565b60405180910390a36108ac60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610901576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610909610694565b6001600160a01b038316610949576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003610983576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab14806109b657506001600160a01b03831630145b156109ed576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f78484611e45565b6000546040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b038086169263de43156e92610a48928a92169089908890889060040161368c565b600060405180830381600087803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b505050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610abb81612039565b610ac58383612043565b50505050565b6001600160a01b0381163314610b0d576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b178282612130565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b4681612039565b610b4e6121f4565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610b9c5750825b905060008267ffffffffffffffff166001148015610bb95750303b155b905081158015610bc7575080155b15610bfe576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610c5f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b0387161580610c7c57506001600160a01b038616155b15610cb3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb612284565b610cc3612284565b610ccb61228c565b610cd361229c565b610cde600087612043565b50610d097f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87612043565b50600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790558315610d9e5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610daf6122ac565b610db88261237c565b610dc28282612387565b5050565b6000610dd06124ab565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610dfd611dc4565b610e05610694565b8351600003610e40576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003610e7a576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e86848461250d565b90506000336001600160a01b03167f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de87868886896001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1b9190613709565b89604051610f2e96959493929190613722565b60405180910390a350610ac560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610f8a81612039565b610b4e612582565b610f9a611dc4565b610fa2610694565b8651600003610fdd576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600003611017576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110248787856125fb565b90506000336001600160a01b03167f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de8a898b868c6001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190613709565b8c8c8b6040516110d0989796959493929190613622565b60405180910390a350610d9e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61110a611dc4565b611112610694565b835160000361114d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611187576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a58373735b14bb79463307aacbed86daf3322b1e6226ab611e45565b60008054604051849233927f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de926111ee928a926001600160a01b0316918a919081908a90613722565b60405180910390a3610ac560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461126c576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611274610694565b6001600160a01b038616158061129157506001600160a01b038416155b156112c8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84600003611302576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841673735b14bb79463307aacbed86daf3322b1e6226ab148061133557506001600160a01b03841630145b1561136c576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018790528716906347e7ef24906044016020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190613787565b61142e576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063660b9de0906114739084906004016137a4565b600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b5050505050505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146114fb576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611503610694565b6001600160a01b038616158061152057506001600160a01b038416155b15611557576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460000361142e576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373735b14bb79463307aacbed86daf3322b1e6226ab146115de576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115e6610694565b6001600160a01b038516158061160357506001600160a01b038316155b1561163a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003611674576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063de43156e906116c1908990899089908890889060040161368c565b600060405180830381600087803b1580156116db57600080fd5b505af11580156116ef573d6000803e3d6000fd5b50505050505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611748576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611750610694565b6001600160a01b038516158061176d57506001600160a01b038316155b156117a4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000036117de576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab148061181157506001600160a01b03831630145b15611848576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af11580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190613787565b611674576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461194481612039565b610ac58383612130565b611956611dc4565b61195e610694565b8551600003611999576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008390036119d4576040517fbb1b658000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ffc5fecd50000000000000000000000000000000000000000000000000000000081526004810183905260009081906001600160a01b0388169063fc5fecd5906024016040805180830381865afa158015611a36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5a919061380a565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b039190613787565b611b39576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866001600160a01b0316336001600160a01b03167fde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a8a898988604051611b829493929190613838565b60405180910390a350506108ac60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611c02576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c0a610694565b6001600160a01b0383161580611c2757506001600160a01b038116155b15611c5e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003611c98576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811673735b14bb79463307aacbed86daf3322b1e6226ab1480611ccb57506001600160a01b03811630145b15611d02576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152602482018490528416906347e7ef24906044016020604051808303816000875af1158015611d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8e9190613787565b610b17576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611e3f576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6000546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611eb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed99190613787565b611f0f576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050506000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611fd3576040519150601f19603f3d011682016040523d82523d6000602084013e611fd8565b606091505b5050905080610b17576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610b4e81336128d6565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16612126576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556120dc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610785565b6000915050610785565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615612126576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610785565b6121fc612963565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6106f06129be565b6122946129be565b6106f0612a25565b6122a46129be565b6106f0612a76565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061234557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166123397f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610dc281612039565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156123ff575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123fc91810190613709565b60015b612445576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146124a1576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161243c565b610b178383612a7e565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061257b8383846001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa158015612552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125769190613709565b6125fb565b9392505050565b61258a610694565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612266565b6000806000846001600160a01b031663fc5fecd5856040518263ffffffff1660e01b815260040161262e91815260200190565b6040805180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e919061380a565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af11580156126f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127179190613787565b61274d576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526001600160a01b038616906323b872dd906064016020604051808303816000875af11580156127b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dd9190613787565b612813576040517f4dd9ee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038616906342966c68906024016020604051808303816000875af1158015612873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128979190613787565b6128cd576040517f2c77e05c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610dc2576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440161243c565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166106f0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166106f0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a2d6129be565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6120136129be565b612a8782612ad4565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612acc57610b178282612b7c565b610dc2612be9565b806001600160a01b03163b600003612b23576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161243c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b99919061387d565b600060405180830381855af49150503d8060008114612bd4576040519150601f19603f3d011682016040523d82523d6000602084013e612bd9565b606091505b50915091506128cd858383612c21565b34156106f0576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082612c3657612c3182612c96565b61257b565b8151158015612c4d57506001600160a01b0384163b155b15612c8f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161243c565b508061257b565b805115612ca65780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612cea57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461257b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612d5a57600080fd5b813567ffffffffffffffff811115612d7457612d74612d1a565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612de057612de0612d1a565b604052818152838201602001851015612df857600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f840112612e2757600080fd5b50813567ffffffffffffffff811115612e3f57600080fd5b602083019150836020828501011115612e5757600080fd5b9250929050565b600060808284031215612e7057600080fd5b50919050565b60008060008060008060a08789031215612e8f57600080fd5b863567ffffffffffffffff811115612ea657600080fd5b612eb289828a01612d49565b9650506020870135945060408701359350606087013567ffffffffffffffff811115612edd57600080fd5b612ee989828a01612e15565b909450925050608087013567ffffffffffffffff811115612f0957600080fd5b612f1589828a01612e5e565b9150509295509295509295565b600060608284031215612e7057600080fd5b6001600160a01b0381168114610b4e57600080fd5b600080600080600060808688031215612f6157600080fd5b853567ffffffffffffffff811115612f7857600080fd5b612f8488828901612f22565b955050602086013593506040860135612f9c81612f34565b9250606086013567ffffffffffffffff811115612fb857600080fd5b612fc488828901612e15565b969995985093965092949392505050565b600060208284031215612fe757600080fd5b5035919050565b6000806040838503121561300157600080fd5b82359150602083013561301381612f34565b809150509250929050565b6000806040838503121561303157600080fd5b823561303c81612f34565b9150602083013561301381612f34565b6000806040838503121561305f57600080fd5b823561306a81612f34565b9150602083013567ffffffffffffffff81111561308657600080fd5b61309285828601612d49565b9150509250929050565b600080600080608085870312156130b257600080fd5b843567ffffffffffffffff8111156130c957600080fd5b6130d587828801612d49565b9450506020850135925060408501356130ed81612f34565b9150606085013567ffffffffffffffff81111561310957600080fd5b61311587828801612e5e565b91505092959194509250565b600080600080600080600060c0888a03121561313c57600080fd5b873567ffffffffffffffff81111561315357600080fd5b61315f8a828b01612d49565b97505060208801359550604088013561317781612f34565b9450606088013567ffffffffffffffff81111561319357600080fd5b61319f8a828b01612e15565b9095509350506080880135915060a088013567ffffffffffffffff8111156131c657600080fd5b6131d28a828b01612e5e565b91505092959891949750929550565b600080600080608085870312156131f757600080fd5b843567ffffffffffffffff81111561320e57600080fd5b61321a87828801612d49565b9450506020850135925060408501359150606085013567ffffffffffffffff81111561310957600080fd5b600080600080600080600060c0888a03121561326057600080fd5b873567ffffffffffffffff81111561327757600080fd5b6132838a828b01612f22565b975050602088013561329481612f34565b95506040880135945060608801356132ab81612f34565b9350608088013567ffffffffffffffff8111156132c757600080fd5b6132d38a828b01612e15565b90945092505060a088013567ffffffffffffffff8111156132f357600080fd5b6131d28a828b01612f22565b60005b8381101561331a578181015183820152602001613302565b50506000910152565b6000815180845261333b8160208601602086016132ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061257b6020830184613323565b60008060008060008060a0878903121561339957600080fd5b863567ffffffffffffffff8111156133b057600080fd5b6133bc89828a01612f22565b96505060208701356133cd81612f34565b94506040870135935060608701356133e481612f34565b9250608087013567ffffffffffffffff81111561340057600080fd5b61340c89828a01612e15565b979a9699509497509295939492505050565b60008060008060008060a0878903121561343757600080fd5b863567ffffffffffffffff81111561344e57600080fd5b61345a89828a01612d49565b965050602087013561346b81612f34565b9450604087013567ffffffffffffffff81111561348757600080fd5b61349389828a01612e15565b90955093505060608701359150608087013567ffffffffffffffff811115612f0957600080fd5b6000806000606084860312156134cf57600080fd5b83356134da81612f34565b92506020840135915060408401356134f181612f34565b809150509250925092565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8015158114610b4e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261358857600080fd5b830160208101925035905067ffffffffffffffff8111156135a857600080fd5b803603821315612e5757600080fd5b600081356135c481612f34565b6001600160a01b0316835260208201356135dd81613545565b1515602084015260408201356135f281612f34565b6001600160a01b0316604084015261360d6060830183613553565b608060608601526128cd6080860182846134fc565b60e08152600061363560e083018b613323565b6001600160a01b038a16602084015288604084015287606084015286608084015282810360a08401526136698186886134fc565b905082810360c084015261367d81856135b7565b9b9a5050505050505050505050565b60808152600061369c8788613553565b606060808501526136b160e0850182846134fc565b91505060208801356136c281612f34565b6001600160a01b0390811660a085015260408981013560c08601529088166020850152830186905282810360608401526136fd8185876134fc565b98975050505050505050565b60006020828403121561371b57600080fd5b5051919050565b60e08152600061373560e0830189613323565b6001600160a01b03881660208401528660408401528560608401528460808401528281038060a0850152600082526020810160c08501525061377a60208201856135b7565b9998505050505050505050565b60006020828403121561379957600080fd5b815161257b81613545565b60208152600082356137b581612f34565b6001600160a01b038116602084015250602083013567ffffffffffffffff81168082146137e157600080fd5b80604085015250506137f66040840184613553565b6060808501526128cd6080850182846134fc565b6000806040838503121561381d57600080fd5b825161382881612f34565b6020939093015192949293505050565b60608152600061384b6060830187613323565b828103602084015261385e8186886134fc565b9050828103604084015261387281856135b7565b979650505050505050565b6000825161388f8184602087016132ff565b919091019291505056fea2646970667358221220b3f75408a24f18796592a48a23440fec3420a505839fa08c44de1f9466825d1164736f6c634300081a0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FUNGIBLE_MODULE_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndRevert\",\"inputs\":[{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"zetaToken_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"callerConfirmation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"zetaToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlBadConfirmation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161391b6100fd6000396000818161230a015281816123330152612509015261391b6000f3fe6080604052600436106101bb5760003560e01c8063717d335f116100ec578063ad3cb1cc1161008a578063d547741f11610064578063d547741f14610600578063dc9ca2e714610620578063e63ab1e914610640578063f45346dc1461067457600080fd5b8063ad3cb1cc1461056a578063bcf7f32b146105c0578063c39aca37146105e057600080fd5b806390ad3e23116100c657806390ad3e23146104b057806391d14854146104d05780639ec6048414610535578063a217fddf1461055557600080fd5b8063717d335f1461045b57806371f6af541461047b5780638456cb591461049b57600080fd5b806336568abe11610159578063485cc95511610133578063485cc955146103dc5780634f1ef286146103fc57806352d1902d1461040f5780635c975abb1461042457600080fd5b806336568abe1461037f5780633ce4a5bc1461039f5780633f4ba83a146103c757600080fd5b806321501a951161019557806321501a95146102aa57806321e093b1146102ca578063248a9ca3146103025780632f2ff15d1461035f57600080fd5b806301ffc9a7146102355780630310eb761461026a5780631e83da291461028a57600080fd5b36610230576101c8610694565b6000546001600160a01b031633148015906101f757503373735b14bb79463307aacbed86daf3322b1e6226ab14155b1561022e576040517f229930b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b34801561024157600080fd5b50610255610250366004612d2b565b6106f2565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061022e610285366004612d9a565b61078b565b34801561029657600080fd5b5061022e6102a5366004612f5c565b610a17565b3480156102b657600080fd5b5061022e6102c5366004613008565b610b42565b3480156102d657600080fd5b506000546102ea906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b34801561030e57600080fd5b5061035161031d366004613094565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610261565b34801561036b57600080fd5b5061022e61037a3660046130ad565b610d0f565b34801561038b57600080fd5b5061022e61039a3660046130ad565b610d59565b3480156103ab57600080fd5b506102ea73735b14bb79463307aacbed86daf3322b1e6226ab81565b3480156103d357600080fd5b5061022e610daa565b3480156103e857600080fd5b5061022e6103f73660046130dd565b610ddf565b61022e61040a36600461310b565b611035565b34801561041b57600080fd5b50610351611054565b34801561043057600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610255565b34801561046757600080fd5b5061022e61047636600461315b565b611083565b34801561048757600080fd5b5061022e6104963660046131a1565b61118b565b3480156104a757600080fd5b5061022e611359565b3480156104bc57600080fd5b5061022e6104cb36600461321a565b61138b565b3480156104dc57600080fd5b506102556104eb3660046130ad565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561054157600080fd5b5061022e6105503660046132da565b6114fd565b34801561056157600080fd5b50610351600081565b34801561057657600080fd5b506105b36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161026191906133ac565b3480156105cc57600080fd5b5061022e6105db3660046133bf565b61161c565b3480156105ec57600080fd5b5061022e6105fb3660046133bf565b61174c565b34801561060c57600080fd5b5061022e61061b3660046130ad565b61195b565b34801561062c57600080fd5b5061022e61063b36600461345d565b61199f565b34801561064c57600080fd5b506103517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561068057600080fd5b5061022e61068f3660046134f9565b611c08565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16156106f0576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061078557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146107d8576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107e0610694565b6001600160a01b03841615806107fd57506001600160a01b038216155b15610834576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260000361086e576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821673735b14bb79463307aacbed86daf3322b1e6226ab14806108a157506001600160a01b03821630145b156108d8576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018590528516906347e7ef24906044016020604051808303816000875af1158015610940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109649190613549565b61099a576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063660b9de0906109df908490600401613613565b600060405180830381600087803b1580156109f957600080fd5b505af1158015610a0d573d6000803e3d6000fd5b5050505050505050565b610a1f611e17565b610a27610694565b8551600003610a62576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84600003610a9c576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aba8573735b14bb79463307aacbed86daf3322b1e6226ab611e98565b60008054604051869233927ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c092610b09928c926001600160a01b0316918c919081908c908c9083908d906136e4565b60405180910390a3610b3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610b8f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b97610694565b6001600160a01b038316610bd7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003610c11576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab1480610c4457506001600160a01b03831630145b15610c7b576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c858484611e98565b6000546040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b038086169263de43156e92610cd6928a921690899088908890600401613757565b600060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b505050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610d498161208c565b610d538383612096565b50505050565b6001600160a01b0381163314610d9b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da58282612183565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610dd48161208c565b610ddc612247565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610e2a5750825b905060008267ffffffffffffffff166001148015610e475750303b155b905081158015610e55575080155b15610e8c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610eed5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b0387161580610f0a57506001600160a01b038616155b15610f41576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f496122d7565b610f516122d7565b610f596122df565b610f616122ef565b610f6c600087612096565b50610f977f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87612096565b50600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038916179055831561102c5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61103d6122ff565b611046826123cf565b61105082826123da565b5050565b600061105e6124fe565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3373735b14bb79463307aacbed86daf3322b1e6226ab146110d0576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d8610694565b6001600160a01b038216611118576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063660b9de09061115d908490600401613613565b600060405180830381600087803b15801561117757600080fd5b505af1158015610b3a573d6000803e3d6000fd5b611193611e17565b61119b610694565b83516000036111d6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611210576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061121c8484612560565b90506000336001600160a01b03167ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c087868886896001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b191906137d4565b8a6001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131391906137d4565b8a60405161132797969594939291906137ed565b60405180910390a350610d5360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6113838161208c565b610ddc6125d5565b611393611e17565b61139b610694565b86516000036113d6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600003611410576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061141d87878561264e565b90506000336001600160a01b03167ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c08a898b868c6001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b291906137d4565b8c8c8c8c6040516114cb999897969594939291906136e4565b60405180910390a35061102c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611505611e17565b61150d610694565b8351600003611548576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611582576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115a08373735b14bb79463307aacbed86daf3322b1e6226ab611e98565b60008054604051849233927ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0926115eb928a926001600160a01b0316918a9190819081908b906137ed565b60405180910390a3610d5360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611669576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611671610694565b6001600160a01b038516158061168e57506001600160a01b038316155b156116c5576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063de43156e906117129089908990899088908890600401613757565b600060405180830381600087803b15801561172c57600080fd5b505af1158015611740573d6000803e3d6000fd5b50505050505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611799576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117a1610694565b6001600160a01b03851615806117be57506001600160a01b038316155b156117f5576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360000361182f576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab148061186257506001600160a01b03831630145b15611899576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015611901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119259190613549565b6116c5576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546119958161208c565b610d538383612183565b6119a7611e17565b6119af610694565b85516000036119ea576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000839003611a25576040517fbb1b658000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ffc5fecd50000000000000000000000000000000000000000000000000000000081526004810183905260009081906001600160a01b0388169063fc5fecd5906024016040805180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab919061385b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b549190613549565b611b8a576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866001600160a01b0316336001600160a01b03167f885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d88a89898989604051611bd5959493929190613889565b60405180910390a35050610b3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611c55576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5d610694565b6001600160a01b0383161580611c7a57506001600160a01b038116155b15611cb1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003611ceb576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811673735b14bb79463307aacbed86daf3322b1e6226ab1480611d1e57506001600160a01b03811630145b15611d55576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152602482018490528416906347e7ef24906044016020604051808303816000875af1158015611dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de19190613549565b610da5576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611e92576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6000546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2c9190613549565b611f62576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015611fc157600080fd5b505af1158015611fd5573d6000803e3d6000fd5b505050506000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b5050905080610da5576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ddc8133612929565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16612179576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561212f3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610785565b6000915050610785565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615612179576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610785565b61224f6129b6565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6106f0612a11565b6122e7612a11565b6106f0612a78565b6122f7612a11565b6106f0612ac9565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061239857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661238c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110508161208c565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612452575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261244f918101906137d4565b60015b612498576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146124f4576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161248f565b610da58383612ad1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006125ce8383846001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c991906137d4565b61264e565b9392505050565b6125dd610694565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336122b9565b6000806000846001600160a01b031663fc5fecd5856040518263ffffffff1660e01b815260040161268191815260200190565b6040805180830381865afa15801561269d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c1919061385b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af1158015612746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276a9190613549565b6127a0576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526001600160a01b038616906323b872dd906064016020604051808303816000875af115801561280c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128309190613549565b612866576040517f4dd9ee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038616906342966c68906024016020604051808303816000875af11580156128c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ea9190613549565b612920576040517f2c77e05c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16611050576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440161248f565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166106f0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166106f0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a80612a11565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612066612a11565b612ada82612b27565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612b1f57610da58282612bcf565b611050612c3c565b806001600160a01b03163b600003612b76576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161248f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612bec91906138c9565b600060405180830381855af49150503d8060008114612c27576040519150601f19603f3d011682016040523d82523d6000602084013e612c2c565b606091505b5091509150612920858383612c74565b34156106f0576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082612c8957612c8482612ce9565b6125ce565b8151158015612ca057506001600160a01b0384163b155b15612ce2576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161248f565b50806125ce565b805115612cf95780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3d57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146125ce57600080fd5b6001600160a01b0381168114610ddc57600080fd5b600060608284031215612d9457600080fd5b50919050565b60008060008060808587031215612db057600080fd5b8435612dbb81612d6d565b9350602085013592506040850135612dd281612d6d565b9150606085013567ffffffffffffffff811115612dee57600080fd5b612dfa87828801612d82565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612e4657600080fd5b813567ffffffffffffffff811115612e6057612e60612e06565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612ecc57612ecc612e06565b604052818152838201602001851015612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f840112612f1357600080fd5b50813567ffffffffffffffff811115612f2b57600080fd5b602083019150836020828501011115612f4357600080fd5b9250929050565b600060808284031215612d9457600080fd5b60008060008060008060a08789031215612f7557600080fd5b863567ffffffffffffffff811115612f8c57600080fd5b612f9889828a01612e35565b9650506020870135945060408701359350606087013567ffffffffffffffff811115612fc357600080fd5b612fcf89828a01612f01565b909450925050608087013567ffffffffffffffff811115612fef57600080fd5b612ffb89828a01612f4a565b9150509295509295509295565b60008060008060006080868803121561302057600080fd5b853567ffffffffffffffff81111561303757600080fd5b61304388828901612d82565b95505060208601359350604086013561305b81612d6d565b9250606086013567ffffffffffffffff81111561307757600080fd5b61308388828901612f01565b969995985093965092949392505050565b6000602082840312156130a657600080fd5b5035919050565b600080604083850312156130c057600080fd5b8235915060208301356130d281612d6d565b809150509250929050565b600080604083850312156130f057600080fd5b82356130fb81612d6d565b915060208301356130d281612d6d565b6000806040838503121561311e57600080fd5b823561312981612d6d565b9150602083013567ffffffffffffffff81111561314557600080fd5b61315185828601612e35565b9150509250929050565b6000806040838503121561316e57600080fd5b823561317981612d6d565b9150602083013567ffffffffffffffff81111561319557600080fd5b61315185828601612d82565b600080600080608085870312156131b757600080fd5b843567ffffffffffffffff8111156131ce57600080fd5b6131da87828801612e35565b9450506020850135925060408501356131f281612d6d565b9150606085013567ffffffffffffffff81111561320e57600080fd5b612dfa87828801612f4a565b600080600080600080600060c0888a03121561323557600080fd5b873567ffffffffffffffff81111561324c57600080fd5b6132588a828b01612e35565b97505060208801359550604088013561327081612d6d565b9450606088013567ffffffffffffffff81111561328c57600080fd5b6132988a828b01612f01565b9095509350506080880135915060a088013567ffffffffffffffff8111156132bf57600080fd5b6132cb8a828b01612f4a565b91505092959891949750929550565b600080600080608085870312156132f057600080fd5b843567ffffffffffffffff81111561330757600080fd5b61331387828801612e35565b9450506020850135925060408501359150606085013567ffffffffffffffff81111561320e57600080fd5b60005b83811015613359578181015183820152602001613341565b50506000910152565b6000815180845261337a81602086016020860161333e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006125ce6020830184613362565b60008060008060008060a087890312156133d857600080fd5b863567ffffffffffffffff8111156133ef57600080fd5b6133fb89828a01612d82565b965050602087013561340c81612d6d565b945060408701359350606087013561342381612d6d565b9250608087013567ffffffffffffffff81111561343f57600080fd5b61344b89828a01612f01565b979a9699509497509295939492505050565b60008060008060008060a0878903121561347657600080fd5b863567ffffffffffffffff81111561348d57600080fd5b61349989828a01612e35565b96505060208701356134aa81612d6d565b9450604087013567ffffffffffffffff8111156134c657600080fd5b6134d289828a01612f01565b90955093505060608701359150608087013567ffffffffffffffff811115612fef57600080fd5b60008060006060848603121561350e57600080fd5b833561351981612d6d565b925060208401359150604084013561353081612d6d565b809150509250925092565b8015158114610ddc57600080fd5b60006020828403121561355b57600080fd5b81516125ce8161353b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261359b57600080fd5b830160208101925035905067ffffffffffffffff8111156135bb57600080fd5b803603821315612f4357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000823561362481612d6d565b6001600160a01b038116602084015250602083013567ffffffffffffffff811680821461365057600080fd5b80604085015250506136656040840184613566565b6060808501526129206080850182846135ca565b6000813561368681612d6d565b6001600160a01b03168352602082013561369f8161353b565b1515602084015260408201356136b481612d6d565b6001600160a01b031660408401526136cf6060830183613566565b608060608601526129206080860182846135ca565b610100815260006136f961010083018c613362565b6001600160a01b038b16602084015289604084015288606084015287608084015282810360a084015261372d8187896135ca565b90508460c084015282810360e08401526137478185613679565b9c9b505050505050505050505050565b6080815260006137678788613566565b6060608085015261377c60e0850182846135ca565b915050602088013561378d81612d6d565b6001600160a01b0390811660a085015260408981013560c08601529088166020850152830186905282810360608401526137c88185876135ca565b98975050505050505050565b6000602082840312156137e657600080fd5b5051919050565b6101008152600061380261010083018a613362565b6001600160a01b03891660208401528760408401528660608401528560808401528281038060a0850152600082528560c08501526020810160e08501525061384d6020820185613679565b9a9950505050505050505050565b6000806040838503121561386e57600080fd5b825161387981612d6d565b6020939093015192949293505050565b60808152600061389c6080830188613362565b82810360208401526138af8187896135ca565b905084604084015282810360608401526137c88185613679565b600082516138db81846020870161333e565b919091019291505056fea26469706673582212203f7202f59f76134e10533009447494716bb4d5889a6225405c1acf671fbd184b64736f6c634300081a0033", } // GatewayZEVMABI is the input ABI used to generate the binding from. @@ -618,25 +618,25 @@ func (_GatewayZEVM *GatewayZEVMTransactorSession) DepositAndCall0(context ZConte return _GatewayZEVM.Contract.DepositAndCall0(&_GatewayZEVM.TransactOpts, context, zrc20, amount, target, message) } -// DepositAndRevert is a paid mutator transaction binding the contract method 0xa13b8cff. +// DepositAndRevert is a paid mutator transaction binding the contract method 0x0310eb76. // -// Solidity: function depositAndRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_GatewayZEVM *GatewayZEVMTransactor) DepositAndRevert(opts *bind.TransactOpts, context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _GatewayZEVM.contract.Transact(opts, "depositAndRevert", context, zrc20, amount, target, message, revertContext) +// Solidity: function depositAndRevert(address zrc20, uint256 amount, address target, (address,uint64,bytes) revertContext) returns() +func (_GatewayZEVM *GatewayZEVMTransactor) DepositAndRevert(opts *bind.TransactOpts, zrc20 common.Address, amount *big.Int, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _GatewayZEVM.contract.Transact(opts, "depositAndRevert", zrc20, amount, target, revertContext) } -// DepositAndRevert is a paid mutator transaction binding the contract method 0xa13b8cff. +// DepositAndRevert is a paid mutator transaction binding the contract method 0x0310eb76. // -// Solidity: function depositAndRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_GatewayZEVM *GatewayZEVMSession) DepositAndRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _GatewayZEVM.Contract.DepositAndRevert(&_GatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function depositAndRevert(address zrc20, uint256 amount, address target, (address,uint64,bytes) revertContext) returns() +func (_GatewayZEVM *GatewayZEVMSession) DepositAndRevert(zrc20 common.Address, amount *big.Int, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _GatewayZEVM.Contract.DepositAndRevert(&_GatewayZEVM.TransactOpts, zrc20, amount, target, revertContext) } -// DepositAndRevert is a paid mutator transaction binding the contract method 0xa13b8cff. +// DepositAndRevert is a paid mutator transaction binding the contract method 0x0310eb76. // -// Solidity: function depositAndRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_GatewayZEVM *GatewayZEVMTransactorSession) DepositAndRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _GatewayZEVM.Contract.DepositAndRevert(&_GatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function depositAndRevert(address zrc20, uint256 amount, address target, (address,uint64,bytes) revertContext) returns() +func (_GatewayZEVM *GatewayZEVMTransactorSession) DepositAndRevert(zrc20 common.Address, amount *big.Int, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _GatewayZEVM.Contract.DepositAndRevert(&_GatewayZEVM.TransactOpts, zrc20, amount, target, revertContext) } // Execute is a paid mutator transaction binding the contract method 0xbcf7f32b. @@ -660,25 +660,25 @@ func (_GatewayZEVM *GatewayZEVMTransactorSession) Execute(context ZContext, zrc2 return _GatewayZEVM.Contract.Execute(&_GatewayZEVM.TransactOpts, context, zrc20, amount, target, message) } -// ExecuteRevert is a paid mutator transaction binding the contract method 0xaa6585d0. +// ExecuteRevert is a paid mutator transaction binding the contract method 0x717d335f. // -// Solidity: function executeRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_GatewayZEVM *GatewayZEVMTransactor) ExecuteRevert(opts *bind.TransactOpts, context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _GatewayZEVM.contract.Transact(opts, "executeRevert", context, zrc20, amount, target, message, revertContext) +// Solidity: function executeRevert(address target, (address,uint64,bytes) revertContext) returns() +func (_GatewayZEVM *GatewayZEVMTransactor) ExecuteRevert(opts *bind.TransactOpts, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _GatewayZEVM.contract.Transact(opts, "executeRevert", target, revertContext) } -// ExecuteRevert is a paid mutator transaction binding the contract method 0xaa6585d0. +// ExecuteRevert is a paid mutator transaction binding the contract method 0x717d335f. // -// Solidity: function executeRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_GatewayZEVM *GatewayZEVMSession) ExecuteRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _GatewayZEVM.Contract.ExecuteRevert(&_GatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function executeRevert(address target, (address,uint64,bytes) revertContext) returns() +func (_GatewayZEVM *GatewayZEVMSession) ExecuteRevert(target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _GatewayZEVM.Contract.ExecuteRevert(&_GatewayZEVM.TransactOpts, target, revertContext) } -// ExecuteRevert is a paid mutator transaction binding the contract method 0xaa6585d0. +// ExecuteRevert is a paid mutator transaction binding the contract method 0x717d335f. // -// Solidity: function executeRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_GatewayZEVM *GatewayZEVMTransactorSession) ExecuteRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _GatewayZEVM.Contract.ExecuteRevert(&_GatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function executeRevert(address target, (address,uint64,bytes) revertContext) returns() +func (_GatewayZEVM *GatewayZEVMTransactorSession) ExecuteRevert(target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _GatewayZEVM.Contract.ExecuteRevert(&_GatewayZEVM.TransactOpts, target, revertContext) } // GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. @@ -1006,13 +1006,14 @@ type GatewayZEVMCalled struct { Zrc20 common.Address Receiver []byte Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterCalled is a free log retrieval operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// FilterCalled is a free log retrieval operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVM *GatewayZEVMFilterer) FilterCalled(opts *bind.FilterOpts, sender []common.Address, zrc20 []common.Address) (*GatewayZEVMCalledIterator, error) { var senderRule []interface{} @@ -1031,9 +1032,9 @@ func (_GatewayZEVM *GatewayZEVMFilterer) FilterCalled(opts *bind.FilterOpts, sen return &GatewayZEVMCalledIterator{contract: _GatewayZEVM.contract, event: "Called", logs: logs, sub: sub}, nil } -// WatchCalled is a free log subscription operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// WatchCalled is a free log subscription operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVM *GatewayZEVMFilterer) WatchCalled(opts *bind.WatchOpts, sink chan<- *GatewayZEVMCalled, sender []common.Address, zrc20 []common.Address) (event.Subscription, error) { var senderRule []interface{} @@ -1077,9 +1078,9 @@ func (_GatewayZEVM *GatewayZEVMFilterer) WatchCalled(opts *bind.WatchOpts, sink }), nil } -// ParseCalled is a log parse operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// ParseCalled is a log parse operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVM *GatewayZEVMFilterer) ParseCalled(log types.Log) (*GatewayZEVMCalled, error) { event := new(GatewayZEVMCalled) if err := _GatewayZEVM.contract.UnpackLog(event, "Called", log); err != nil { @@ -2198,13 +2199,14 @@ type GatewayZEVMWithdrawn struct { Gasfee *big.Int ProtocolFlatFee *big.Int Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawn is a free log retrieval operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVM *GatewayZEVMFilterer) FilterWithdrawn(opts *bind.FilterOpts, sender []common.Address, chainId []*big.Int) (*GatewayZEVMWithdrawnIterator, error) { var senderRule []interface{} @@ -2223,9 +2225,9 @@ func (_GatewayZEVM *GatewayZEVMFilterer) FilterWithdrawn(opts *bind.FilterOpts, return &GatewayZEVMWithdrawnIterator{contract: _GatewayZEVM.contract, event: "Withdrawn", logs: logs, sub: sub}, nil } -// WatchWithdrawn is a free log subscription operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// WatchWithdrawn is a free log subscription operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVM *GatewayZEVMFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayZEVMWithdrawn, sender []common.Address, chainId []*big.Int) (event.Subscription, error) { var senderRule []interface{} @@ -2269,9 +2271,9 @@ func (_GatewayZEVM *GatewayZEVMFilterer) WatchWithdrawn(opts *bind.WatchOpts, si }), nil } -// ParseWithdrawn is a log parse operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// ParseWithdrawn is a log parse operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVM *GatewayZEVMFilterer) ParseWithdrawn(log types.Log) (*GatewayZEVMWithdrawn, error) { event := new(GatewayZEVMWithdrawn) if err := _GatewayZEVM.contract.UnpackLog(event, "Withdrawn", log); err != nil { diff --git a/v2/pkg/gatewayzevm.t.sol/gatewayzevminboundtest.go b/v2/pkg/gatewayzevm.t.sol/gatewayzevminboundtest.go index 6b2c1ef1..d7d22a2e 100644 --- a/v2/pkg/gatewayzevm.t.sol/gatewayzevminboundtest.go +++ b/v2/pkg/gatewayzevm.t.sol/gatewayzevminboundtest.go @@ -57,8 +57,8 @@ type StdInvariantFuzzSelector struct { // GatewayZEVMInboundTestMetaData contains all meta data concerning the GatewayZEVMInboundTest contract. var GatewayZEVMInboundTestMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testCall\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testCallFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZETAFailsIfAmountIsReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZETAFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZRC20FailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZRC20FailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETA\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfNoBalance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAWithMessage\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAWithMessageFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfNoBalanceForGasFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfNoBalanceForTransfer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIsAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20WithMessage\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20WithMessageFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LowBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061e9cf8061003c6000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806383ababa91161012a578063ba9adeef116100bd578063e20c9f711161008c578063fa7626d411610071578063fa7626d41461037f578063fbc611c81461038c578063fdad0ad01461039457600080fd5b8063e20c9f711461036f578063ea37902f1461037757600080fd5b8063ba9adeef1461034f578063ceccfab314610357578063dc749dd71461035f578063dde7e9671461036757600080fd5b8063b5508aa9116100f9578063b5508aa91461031f578063b7f0583614610327578063ba414fa61461032f578063ba800c911461034757600080fd5b806383ababa9146102e557806385226c81146102ed578063916a17c614610302578063b0464fdc1461031757600080fd5b806336431b3f116101bd578063423a58741161018c5780635d72228f116101715780635d72228f146102c05780636221b509146102c857806366d9a9a0146102d057600080fd5b8063423a5874146102b05780635006fd80146102b857600080fd5b806336431b3f1461029057806339cbb457146102985780633e5e3c23146102a05780633f7286f4146102a857600080fd5b80631e63d2b9116101f95780631e63d2b91461024d5780631ed7831c1461025557806321aeb18c146102735780632ade38801461027b57600080fd5b806304019fba1461022b5780630a9254e4146102355780631238212c1461023d57806318a4cfdc14610245575b600080fd5b61023361039c565b005b61023361053c565b610233611079565b61023361144e565b6102336118cd565b61025d611cd8565b60405161026a9190618e65565b60405180910390f35b610233611d3a565b610283611e73565b60405161026a9190618f01565b610233611fb5565b610233612129565b61025d6122b3565b61025d612313565b610233612373565b6102336124f4565b6102336129ab565b610233612cf8565b6102d8612f1d565b60405161026a9190619067565b61023361309f565b6102f561319c565b60405161026a9190619105565b61030a61326c565b60405161026a919061917c565b61030a613367565b6102f5613462565b610233613532565b61033761370e565b604051901515815260200161026a565b6102336137e2565b610233613911565b610233613aba565b610233613e1f565b610233613edb565b61025d61431a565b61023361437a565b601f546103379060ff1681565b61023361475f565b610233614ad8565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561049657600080fd5b505af11580156104aa573d6000803e3d6000fd5b5050602080546040805160008152928301908190527f1e83da290000000000000000000000000000000000000000000000000000000090526001600160a01b03169250631e83da2991506105079060018086602860248501619343565b600060405180830381600087803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b5050505050565b602580547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556026805490911661123417905560405161058290618d78565b604051809103906000f08015801561059e573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600f81527f476174657761795a45564d2e736f6c000000000000000000000000000000000060208201526025549151602481019390935292166044820152610682919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc95500000000000000000000000000000000000000000000000000000000179052614c67565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b039384168102919091179182905560208054919092049092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682178155604080517f3ce4a5bc0000000000000000000000000000000000000000000000000000000081529051633ce4a5bc926004808401939192918290030181865afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190619394565b602780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516107ac90618d85565b604051809103906000f0801580156107c8573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161781556027546040517f06447d5600000000000000000000000000000000000000000000000000000000815292166004830152737109709ecfa91a80626ff3989d68f67f5b1dd12d916306447d569101600060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b50505050600080600060405161088d90618d92565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156108c9573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831690811790915560205460405160129360019384936000939192169061091f90618d9f565b61092e969594939291906193bd565b604051809103906000f08015801561094a573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081179091556023546040517fee2815ba0000000000000000000000000000000000000000000000000000000081526001600482015260248101929092529091169063ee2815ba90604401600060405180830381600087803b1580156109e157600080fd5b505af11580156109f5573d6000803e3d6000fd5b50506023546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610af357600080fd5b505af1158015610b07573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0891906194b2565b506021546025546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116906347e7ef24906044016020604051808303816000875af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d91906194b2565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cfc57600080fd5b505af1158015610d10573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610d8657600080fd5b505af1158015610d9a573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116925063095ea7b391506044016020604051808303816000875af1158015610e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3291906194b2565b50602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3091906194b2565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f8f57600080fd5b505af1158015610fa3573d6000803e3d6000fd5b50506040805160808101825261032180825260016020808401918252838501928352845190810190945260008452606083018490528251602880549251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009093166001600160a01b0392831617929092178255915160298054919093167fffffffffffffffffffffffff000000000000000000000000000000000000000091909116179091559093509150602a90611074908261954a565b505050565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156110ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ee9190619609565b6025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561116357600080fd5b505af1158015611177573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d91906194b2565b506026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae7600000000000000000000000000000000000000000000000000000000017905280517ff48448140000000000000000000000000000000000000000000000000000000081529051919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f48448149160048082019260009290919082900301818387803b1580156112e957600080fd5b505af11580156112fd573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506390ad3e23915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1683526113979288916001600160a01b0316908790600190602890600401619622565b600060405180830381600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190619609565b90506114488382614c86565b50505050565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa15801561149f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c39190619609565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190619609565b6027546026546040516001600160a01b03918216602482015292935016319060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b03909216608482015291925090737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff191660208201528493506001600160a01b0390911691507f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de9060340160408051601f19818403018152908290526022546116eb926001600160a01b03909116908c9060009081908b90602890619683565b60405180910390a3602080546026546040516001600160a01b0392831693631e83da29936117339316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405288848660286040518663ffffffff1660e01b8152600401611767959493929190619343565b600060405180830381600087803b15801561178157600080fd5b505af1158015611795573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156117e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180c9190619609565b905061182261181c60018861971a565b82614c86565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118979190619609565b90506118a38682614c86565b6118c36118b186600161972d565b6027546001600160a01b031631614c86565b5050505050505050565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa15801561191e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119429190619609565b6026546040516001600160a01b03909116602482015290915060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b039092166084820152919250908190737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611a4d57600080fd5b505af1158015611a61573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff19166020820152600093506001600160a01b0390911691507f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de9060340160408051601f198184030181528282526021547f4d8943bb000000000000000000000000000000000000000000000000000000008452915190926001600160a01b03909216918b9189918491634d8943bb916004808201926020929091908290030181865afa158015611b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b579190619609565b8a6028604051611b6d9796959493929190619683565b60405180910390a3602080546026546040516001600160a01b03928316936390ad3e2393611bb59316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352611c11928a916001600160a01b03169089908890602890600401619622565b600060405180830381600087803b158015611c2b57600080fd5b505af1158015611c3f573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb69190619609565b9050611cd083611cc6888861971a565b61181c919061971a565b505050505050565b60606016805480602002602001604051908101604052809291908181526020018280548015611d3057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d12575b5050505050905090565b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f19c08f49000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015611dbf57600080fd5b505af1158015611dd3573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250639ec6048491506034015b6040516020818303038152906040526000600160286040518563ffffffff1660e01b8152600401611e459493929190619740565b600060405180830381600087803b158015611e5f57600080fd5b505af1158015611448573d6000803e3d6000fd5b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015611fac57600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015611f95578382906000526020600020018054611f0890619213565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3490619213565b8015611f815780601f10611f5657610100808354040283529160200191611f81565b820191906000526020600020905b815481529060010190602001808311611f6457829003601f168201915b505050505081526020019060010190611ee9565b505050508152505081526020019060010190611e97565b50505050905090565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156120af57600080fd5b505af11580156120c3573d6000803e3d6000fd5b5050602080546040805160008152928301908190526021547f90ad3e23000000000000000000000000000000000000000000000000000000009091526001600160a01b0391821694506390ad3e2393506105079291600191168682602860248601619622565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561222357600080fd5b505af1158015612237573d6000803e3d6000fd5b5050602080546040516001600160a01b03909116935063dc9ca2e79250015b60408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352610507926001600160a01b03909116908690600190602890600401619771565b60606018805480602002602001604051908101604052809291908181526020018280548015611d30576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611d12575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015611d30576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611d12575050505050905090565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f19c08f49000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561246d57600080fd5b505af1158015612481573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250631e83da299150603401604051602081830303815290604052600060018560286040518663ffffffff1660e01b8152600401610507959493929190619343565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015612545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125699190619609565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df9190619609565b6027546026546040516001600160a01b03918216602482015292935016319060009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae7600000000000000000000000000000000000000000000000000000000017905260255490517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156126d357600080fd5b505af11580156126e7573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af1158015612759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277d91906194b2565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156127dc57600080fd5b505af11580156127f0573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250631e83da29915060340160405160208183030381529060405288848660286040518663ffffffff1660e01b8152600401612861959493929190619343565b600060405180830381600087803b15801561287b57600080fd5b505af115801561288f573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156128e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129069190619609565b90506129128682614c86565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129879190619609565b90506129938682614c86565b6027546118c39086906001600160a01b031631614c86565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156129fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a209190619609565b6025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612a9557600080fd5b505af1158015612aa9573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af1158015612b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3f91906194b2565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506371f6af54915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352612c479287916001600160a01b0316906028906004016197bf565b600060405180830381600087803b158015612c6157600080fd5b505af1158015612c75573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cec9190619609565b90506110748282614c86565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6d9190619609565b6022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101236004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015612dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dfe91906194b2565b506000600190507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e6357600080fd5b505af1158015612e77573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250639ec604849150603401604051602081830303815290604052858460286040518563ffffffff1660e01b8152600401612ee69493929190619740565b600060405180830381600087803b158015612f0057600080fd5b505af1158015612f14573d6000803e3d6000fd5b50505050505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015611fac5783829060005260206000209060020201604051806040016040529081600082018054612f7490619213565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa090619213565b8015612fed5780601f10612fc257610100808354040283529160200191612fed565b820191906000526020600020905b815481529060010190602001808311612fd057829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561308757602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116130345790505b50505050508152505081526020019060010190612f41565b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561312457600080fd5b505af1158015613138573d6000803e3d6000fd5b5050602080546040805160008152928301908190526021547f71f6af54000000000000000000000000000000000000000000000000000000009091526001600160a01b0391821694506371f6af549350611e459291600191166028602484016197bf565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015611fac5783829060005260206000200180546131df90619213565b80601f016020809104026020016040519081016040528092919081815260200182805461320b90619213565b80156132585780601f1061322d57610100808354040283529160200191613258565b820191906000526020600020905b81548152906001019060200180831161323b57829003601f168201915b5050505050815260200190600101906131c0565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015611fac5760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561334f57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116132fc5790505b50505050508152505081526020019060010190613290565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015611fac5760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561344a57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116133f75790505b5050505050815250508152602001906001019061338b565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015611fac5783829060005260206000200180546134a590619213565b80601f01602080910402602001604051908101604052809291908181526020018280546134d190619213565b801561351e5780601f106134f35761010080835404028352916020019161351e565b820191906000526020600020905b81548152906001019060200180831161350157829003601f168201915b505050505081526020019060010190613486565b6026546040516001600160a01b03909116602482015260009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561363557600080fd5b505af1158015613649573d6000803e3d6000fd5b505060215460255460265460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039283169450911691507fde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a9060340160408051601f19818403018152908290526136c69186906028906197f9565b60405180910390a3602080546026546040516001600160a01b039283169363dc9ca2e7936122569316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60085460009060ff1615613726575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156137b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137db9190619609565b1415905090565b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561386757600080fd5b505af115801561387b573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506371f6af54915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352611e45926000916001600160a01b0316906028906004016197bf565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f5d67094f000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015613a0b57600080fd5b505af1158015613a1f573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506390ad3e23915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352610507926000916001600160a01b0316908790600190602890600401619622565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015613b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2f9190619609565b6021546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101236004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015613b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc091906194b2565b506027546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613c3357600080fd5b505af1158015613c47573d6000803e3d6000fd5b50506021546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a60048201526001600160a01b03909116925063f687d12a9150602401600060405180830381600087803b158015613caa57600080fd5b505af1158015613cbe573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b158015613d4857600080fd5b505af1158015613d5c573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506371f6af54915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352613df19287916001600160a01b0316906028906004016197bf565b600060405180830381600087803b158015613e0b57600080fd5b505af1158015611cd0573d6000803e3d6000fd5b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015613ea457600080fd5b505af1158015613eb8573d6000803e3d6000fd5b5050602080546040516001600160a01b039091169350639ec60484925001611e11565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015613f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f509190619609565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015613fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fc69190619609565b6027546025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152929350163190600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561404457600080fd5b505af1158015614058573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af11580156140ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ee91906194b2565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561414d57600080fd5b505af1158015614161573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250639ec604849150603401604051602081830303815290604052878460286040518563ffffffff1660e01b81526004016141d09493929190619740565b600060405180830381600087803b1580156141ea57600080fd5b505af11580156141fe573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015614251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142759190619609565b90506142818582614c86565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa1580156142d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f69190619609565b90506143028582614c86565b602754612f149085906001600160a01b031631614c86565b60606015805480602002602001604051908101604052809291908181526020018280548015611d30576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611d12575050505050905090565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156143cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143ef9190619609565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015614441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144659190619609565b6027546020546040517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b0392831660848301529394509116319190737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561450057600080fd5b505af1158015614514573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff191660208201528493506001600160a01b0390911691507f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de9060340160408051601f19818403018152908290526022546145a1926001600160a01b03909116908b906000908190602890619832565b60405180910390a3602080546026546040516001600160a01b0392831693639ec60484936145e99316910160609190911b6bffffffffffffffffffffffff1916815260140190565b604051602081830303815290604052878460286040518563ffffffff1660e01b815260040161461b9493929190619740565b600060405180830381600087803b15801561463557600080fd5b505af1158015614649573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa15801561469c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146c09190619609565b90506146d061181c60018761971a565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015614721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147459190619609565b90506147518582614c86565b612f146118b185600161972d565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156147b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d49190619609565b6020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561486557600080fd5b505af1158015614879573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff19166020820152600093506001600160a01b0390911691507f825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de9060340160408051601f198184030181528282526021547f4d8943bb000000000000000000000000000000000000000000000000000000008452915190926001600160a01b039092169188916000918491634d8943bb916004808201926020929091908290030181865afa15801561494c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149709190619609565b602860405161498496959493929190619832565b60405180910390a3602080546026546040516001600160a01b03928316936371f6af54936149cc9316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352614a249287916001600160a01b0316906028906004016197bf565b600060405180830381600087803b158015614a3e57600080fd5b505af1158015614a52573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015614aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ac99190619609565b905061107461181c848461971a565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260029260009216906370a0823190602401602060405180830381865afa158015614b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b4d9190619609565b6021549091506001600160a01b031663a9059cbb610123614b6f60018561971a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015614bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bf691906194b2565b506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401613d2e565b6000614c71618dac565b614c7c848483614d05565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b158015614cf157600080fd5b505afa158015611cd0573d6000803e3d6000fd5b600080614d128584614d80565b9050614d756040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614d6092919061988a565b60405160208183030381529060405285614d8c565b9150505b9392505050565b6000614d798383614dba565b60c08101515160009015614db057614da984848460c00151614dd5565b9050614d79565b614da98484614f7b565b6000614dc68383615066565b614d7983836020015184614d8c565b600080614de0615076565b90506000614dee8683615149565b90506000614e0582606001518360200151856155ef565b90506000614e1583838989615801565b90506000614e228261667e565b602081015181519192509060030b15614e9557898260400151604051602001614e4c9291906198ac565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252614e8c9160040161992d565b60405180910390fd5b6000614ed86040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a20000000000000000000000081525083600161684d565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90614f2b90849060040161992d565b602060405180830381865afa158015614f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f6c9190619394565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590614fd090879060040161992d565b600060405180830381865afa158015614fed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261501591908101906199f9565b90506000615043828560405160200161502f929190619a2e565b604051602081830303815290604052616a4d565b90506001600160a01b038116614c7c578484604051602001614e4c929190619a5d565b61507282826000616a60565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906150fd908490600401619b08565b600060405180830381865afa15801561511a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526151429190810190619b4f565b9250505090565b61517b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506151c66040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6151cf85616b63565b602082015260006151df86616f48565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015615221573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526152499190810190619b4f565b868385602001516040516020016152639493929190619b98565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906152bb90859060040161992d565b600060405180830381865afa1580156152d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153009190810190619b4f565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690615348908490600401619c9c565b602060405180830381865afa158015615365573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061538991906194b2565b61539e5781604051602001614e4c9190619cee565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906153e3908490600401619d80565b600060405180830381865afa158015615400573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154289190810190619b4f565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061546f908490600401619dd2565b602060405180830381865afa15801561548c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154b091906194b2565b15615545576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906154fa908490600401619dd2565b600060405180830381865afa158015615517573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261553f9190810190619b4f565b60408501525b846001600160a01b03166349c4fac882866000015160405160200161556a9190619e24565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401615596929190619e90565b600060405180830381865afa1580156155b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526155db9190810190619b4f565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161560b5790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061566b5761566b619eb5565b60200260200101819052506040518060400160405280600381526020017f2d726c0000000000000000000000000000000000000000000000000000000000815250816001815181106156bf576156bf619eb5565b6020026020010181905250846040516020016156db9190619ee4565b604051602081830303815290604052816002815181106156fd576156fd619eb5565b6020026020010181905250826040516020016157199190619f50565b6040516020818303038152906040528160038151811061573b5761573b619eb5565b602002602001018190525060006157518261667e565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506157e290604080518082018252600080825260209182015281518083019092528451825280850190820152906171cb565b6157f75785604051602001614e4c9190619f91565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615851565b511590565b6159c55782602001511561590d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401614e8c565b8260c00151156159c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401614e8c565b6040805160ff8082526120008201909252600091816020015b60608152602001906001900390816159de57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280615a399061a022565b935060ff1681518110615a4e57615a4e619eb5565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001615a9f919061a041565b604051602081830303815290604052828280615aba9061a022565b935060ff1681518110615acf57615acf619eb5565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280615b1c9061a022565b935060ff1681518110615b3157615b31619eb5565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280615b7e9061a022565b935060ff1681518110615b9357615b93619eb5565b60200260200101819052508760200151828280615baf9061a022565b935060ff1681518110615bc457615bc4619eb5565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615c119061a022565b935060ff1681518110615c2657615c26619eb5565b602090810291909101015287518282615c3e8161a022565b935060ff1681518110615c5357615c53619eb5565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615ca09061a022565b935060ff1681518110615cb557615cb5619eb5565b6020026020010181905250615cc94661722c565b8282615cd48161a022565b935060ff1681518110615ce957615ce9619eb5565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615d369061a022565b935060ff1681518110615d4b57615d4b619eb5565b602002602001018190525086828280615d639061a022565b935060ff1681518110615d7857615d78619eb5565b6020908102919091010152855115615e9f5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282615dc98161a022565b935060ff1681518110615dde57615dde619eb5565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90615e2e90899060040161992d565b600060405180830381865afa158015615e4b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615e739190810190619b4f565b8282615e7e8161a022565b935060ff1681518110615e9357615e93619eb5565b60200260200101819052505b846020015115615f6f5760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282615ee88161a022565b935060ff1681518110615efd57615efd619eb5565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280615f4a9061a022565b935060ff1681518110615f5f57615f5f619eb5565b6020026020010181905250616136565b615fa761584c8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61603a5760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282615fea8161a022565b935060ff1681518110615fff57615fff619eb5565b60200260200101819052508460a0015160405160200161601f9190619ee4565b604051602081830303815290604052828280615f4a9061a022565b8460c0015115801561607d57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261607b90511590565b155b156161365760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826160c18161a022565b935060ff16815181106160d6576160d6619eb5565b60200260200101819052506160ea886172cc565b6040516020016160fa9190619ee4565b6040516020818303038152906040528282806161159061a022565b935060ff168151811061612a5761612a619eb5565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261616a90511590565b6161ff5760408051808201909152600b81527f2d2d72656c617965724964000000000000000000000000000000000000000000602082015282826161ad8161a022565b935060ff16815181106161c2576161c2619eb5565b602002602001018190525084604001518282806161de9061a022565b935060ff16815181106161f3576161f3619eb5565b60200260200101819052505b6060850151156163205760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826162488161a022565b935060ff168151811061625d5761625d619eb5565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156162cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526162f49190810190619b4f565b82826162ff8161a022565b935060ff168151811061631457616314619eb5565b60200260200101819052505b60e085015151156163c75760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261636a8161a022565b935060ff168151811061637f5761637f619eb5565b602002602001018190525061639b8560e001516000015161722c565b82826163a68161a022565b935060ff16815181106163bb576163bb619eb5565b60200260200101819052505b60e085015160200151156164715760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826164148161a022565b935060ff168151811061642957616429619eb5565b60200260200101819052506164458560e001516020015161722c565b82826164508161a022565b935060ff168151811061646557616465619eb5565b60200260200101819052505b60e0850151604001511561651b5760408051808201909152600e81527f2d2d6d6178466565506572476173000000000000000000000000000000000000602082015282826164be8161a022565b935060ff16815181106164d3576164d3619eb5565b60200260200101819052506164ef8560e001516040015161722c565b82826164fa8161a022565b935060ff168151811061650f5761650f619eb5565b60200260200101819052505b60e085015160600151156165c55760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826165688161a022565b935060ff168151811061657d5761657d619eb5565b60200260200101819052506165998560e001516060015161722c565b82826165a48161a022565b935060ff16815181106165b9576165b9619eb5565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156165e3576165e36194d4565b60405190808252806020026020018201604052801561661657816020015b60608152602001906001900390816166015790505b50905060005b8260ff168160ff16101561666f57838160ff168151811061663f5761663f619eb5565b6020026020010151828260ff168151811061665c5761665c619eb5565b602090810291909101015260010161661c565b5093505050505b949350505050565b6166a56040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161672b9186910161a0ac565b600060405180830381865afa158015616748573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526167709190810190619b4f565b9050600061677e8683617dbb565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016167ae9190619105565b6000604051808303816000875af11580156167cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526167f5919081019061a0f3565b805190915060030b1580159061680e5750602081015151155b801561681d5750604081015151155b156157f7578160008151811061683557616835619eb5565b6020026020010151604051602001614e4c919061a1a9565b606060006168828560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506168b99082905b90617f10565b15616a16576000616936826169308461692a6168fc8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90617f37565b90617f99565b604080518082018252600181527f0a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061699a908290617f10565b15616a0457604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a01905b829061801e565b90505b616a0d81618044565b92505050614d79565b8215616a2f578484604051602001614e4c92919061a395565b5050604080516020810190915260008152614d79565b509392505050565b6000808251602084016000f09392505050565b8160a0015115616a6f57505050565b6000616a7c8484846180ad565b90506000616a898261667e565b602081015181519192509060030b158015616b255750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616b25906040805180820182526000808252602091820152815180830190925284518252808501908201526168b3565b15616b3257505050505050565b60408201515115616b52578160400151604051602001614e4c919061a43c565b80604051602001614e4c919061a49a565b60606000616b988360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616bfd905b82906171cb565b15616c6c57604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d7990616c67908390618648565b618044565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616cce905b82906186d2565b600103616d9b57604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d34906169fa565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d7990616c67905b839061801e565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616dfa90616bf6565b15616f3157604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616e6290839061876c565b905060008160018351616e75919061971a565b81518110616e8557616e85619eb5565b60200260200101519050616f28616c67616efb6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290618648565b95945050505050565b82604051602001614e4c919061a505565b50919050565b60606000616f7d8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616fdf90616bf6565b15616fed57614d7981618044565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261704c90616cc7565b6001036170b657604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d7990616c6790616d94565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261711590616bf6565b15616f3157604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061717d90839061876c565b90506001815111156171b9578060028251617198919061971a565b815181106171a8576171a8619eb5565b602002602001015192505050919050565b5082604051602001614e4c919061a505565b8051825160009111156171e057506000614c80565b815183516020850151600092916171f69161972d565b617200919061971a565b905082602001518103617217576001915050614c80565b82516020840151819020912014905092915050565b6060600061723983618811565b600101905060008167ffffffffffffffff811115617259576172596194d4565b6040519080825280601f01601f191660200182016040528015617283576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461728d57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091617358905b82906188f3565b1561739857505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526173f790617351565b1561743757505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d495400000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261749690617351565b156174d657505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261753590617351565b8061759a5750604080518082018252601081527f47504c2d322e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261759a90617351565b156175da57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261763990617351565b8061769e5750604080518082018252601081527f47504c2d332e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261769e90617351565b156176de57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261773d90617351565b806177a25750604080518082018252601181527f4c47504c2d322e312d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177a290617351565b156177e257505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261784190617351565b806178a65750604080518082018252601181527f4c47504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178a690617351565b156178e657505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261794590617351565b1561798557505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179e490617351565b15617a2457505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617a8390617351565b15617ac357505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617b2290617351565b15617b6257505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617bc190617351565b15617c0157505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617c6090617351565b80617cc55750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617cc590617351565b15617d0557505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d6490617351565b15617da457505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151614e4c929060200161a5e3565b60608060005b8451811015617e465781858281518110617ddd57617ddd619eb5565b6020026020010151604051602001617df6929190619a2e565b604051602081830303815290604052915060018551617e15919061971a565b8114617e3e5781604051602001617e2c919061a74c565b60405160208183030381529060405291505b600101617dc1565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081617e5f5790505090508381600081518110617e8a57617e8a619eb5565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110617ede57617ede619eb5565b60200260200101819052508181600281518110617efd57617efd619eb5565b6020908102919091010152949350505050565b6020808301518351835192840151600093617f2e9291849190618907565b14159392505050565b60408051808201909152600080825260208201526000617f698460000151856020015185600001518660200151618a18565b9050836020015181617f7b919061971a565b84518590617f8a90839061971a565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015617fbe575081614c80565b6020808301519084015160019114617fe55750815160208481015190840151829020919020145b801561801657825184518590617ffc90839061971a565b905250825160208501805161801290839061972d565b9052505b509192915050565b604080518082019091526000808252602082015261803d838383618b38565b5092915050565b60606000826000015167ffffffffffffffff811115618065576180656194d4565b6040519080825280601f01601f19166020018201604052801561808f576020820181803683370190505b509050600060208201905061803d8185602001518660000151618be3565b606060006180b9615076565b6040805160ff808252612000820190925291925060009190816020015b60608152602001906001900390816180d657905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806181319061a022565b935060ff168151811061814657618146619eb5565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001618197919061a78d565b6040516020818303038152906040528282806181b29061a022565b935060ff16815181106181c7576181c7619eb5565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806182149061a022565b935060ff168151811061822957618229619eb5565b6020026020010181905250826040516020016182459190619f50565b6040516020818303038152906040528282806182609061a022565b935060ff168151811061827557618275619eb5565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e7472616374000000000000000000000000000000000000000000008152508282806182c29061a022565b935060ff16815181106182d7576182d7619eb5565b60200260200101819052506182ec8784618c5d565b82826182f78161a022565b935060ff168151811061830c5761830c619eb5565b6020908102919091010152855151156183b85760408051808201909152600b81527f2d2d7265666572656e63650000000000000000000000000000000000000000006020820152828261835e8161a022565b935060ff168151811061837357618373619eb5565b602002602001018190525061838c866000015184618c5d565b82826183978161a022565b935060ff16815181106183ac576183ac619eb5565b60200260200101819052505b8560800151156184265760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b0000000000000000602082015282826184018161a022565b935060ff168151811061841657618416619eb5565b602002602001018190525061848c565b841561848c5760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261846b8161a022565b935060ff168151811061848057618480619eb5565b60200260200101819052505b604086015151156185285760408051808201909152600d81527f2d2d756e73616665416c6c6f7700000000000000000000000000000000000000602082015282826184d68161a022565b935060ff16815181106184eb576184eb619eb5565b602002602001018190525085604001518282806185079061a022565b935060ff168151811061851c5761851c619eb5565b60200260200101819052505b8560600151156185925760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d6573000000000000000000000000602082015282826185718161a022565b935060ff168151811061858657618586619eb5565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156185b0576185b06194d4565b6040519080825280602002602001820160405280156185e357816020015b60608152602001906001900390816185ce5790505b50905060005b8260ff168160ff16101561863c57838160ff168151811061860c5761860c619eb5565b6020026020010151828260ff168151811061862957618629619eb5565b60209081029190910101526001016185e9565b50979650505050505050565b604080518082019091526000808252602082015281518351101561866d575081614c80565b815183516020850151600092916186839161972d565b61868d919061971a565b602084015190915060019082146186ae575082516020840151819020908220145b80156186c9578351855186906186c590839061971a565b9052505b50929392505050565b60008082600001516186f68560000151866020015186600001518760200151618a18565b618700919061972d565b90505b83516020850151618714919061972d565b811161803d57816187248161a7d2565b925050826000015161875b85602001518361873f919061971a565b865161874b919061971a565b8386600001518760200151618a18565b618765919061972d565b9050618703565b6060600061877a84846186d2565b61878590600161972d565b67ffffffffffffffff81111561879d5761879d6194d4565b6040519080825280602002602001820160405280156187d057816020015b60608152602001906001900390816187bb5790505b50905060005b8151811015616a45576187ec616c67868661801e565b8282815181106187fe576187fe619eb5565b60209081029190910101526001016187d6565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061885a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310618886576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106188a457662386f26fc10000830492506010015b6305f5e10083106188bc576305f5e100830492506008015b61271083106188d057612710830492506004015b606483106188e2576064830492506002015b600a8310614c805760010192915050565b60006188ff8383618c9d565b159392505050565b600080858411618a0e57602084116189ba576000841561895257600161892e86602061971a565b61893990600861a7ec565b61894490600261a8ea565b61894e919061971a565b1990505b8351811685618961898961972d565b61896b919061971a565b805190935082165b8181146189a55787841161898d5787945050505050616676565b836189978161a8f6565b945050828451169050618973565b6189af878561972d565b945050505050616676565b8383206189c7858861971a565b6189d1908761972d565b91505b858210618a0c578482208082036189f9576189ef868461972d565b9350505050616676565b618a0460018461971a565b9250506189d4565b505b5092949350505050565b60008381868511618b235760208511618ad25760008515618a64576001618a4087602061971a565b618a4b90600861a7ec565b618a5690600261a8ea565b618a60919061971a565b1990505b84518116600087618a758b8b61972d565b618a7f919061971a565b855190915083165b828114618ac457818610618aac57618a9f8b8b61972d565b9650505050505050616676565b85618ab68161a7d2565b965050838651169050618a87565b859650505050505050616676565b508383206000905b618ae4868961971a565b8211618b2157858320808203618b005783945050505050616676565b618b0b60018561972d565b9350508180618b199061a7d2565b925050618ada565b505b618b2d878761972d565b979650505050505050565b60408051808201909152600080825260208201526000618b6a8560000151866020015186600001518760200151618a18565b602080870180519186019190915251909150618b86908261971a565b835284516020860151618b99919061972d565b8103618ba85760008552618bda565b83518351618bb6919061972d565b85518690618bc590839061971a565b9052508351618bd4908261972d565b60208601525b50909392505050565b60208110618c1b5781518352618bfa60208461972d565b9250618c0760208361972d565b9150618c1460208261971a565b9050618be3565b6000198115618c4a576001618c3183602061971a565b618c3d9061010061a8ea565b618c47919061971a565b90505b9151835183169219169190911790915250565b60606000618c6b8484615149565b8051602080830151604051939450618c859390910161a90d565b60405160208183030381529060405291505092915050565b8151815160009190811115618cb0575081515b6020808501519084015160005b83811015618d695782518251808214618d39576000196020871015618d1857600184618cea89602061971a565b618cf4919061972d565b618cff90600861a7ec565b618d0a90600261a8ea565b618d14919061971a565b1990505b8181168382168181039114618d36579750614c809650505050505050565b50505b618d4460208661972d565b9450618d5160208561972d565b93505050602081618d62919061972d565b9050618cbd565b50845186516157f7919061a965565b610b678061a98683390190565b61063d8061b4ed83390190565b61106f8061bb2a83390190565b611e018061cb9983390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001618def618df4565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001618def6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015618ea65783516001600160a01b0316835260209384019390920191600101618e7f565b509095945050505050565b60005b83811015618ecc578181015183820152602001618eb4565b50506000910152565b60008151808452618eed816020860160208601618eb1565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618ffd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015618fe3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018352618fcd848651618ed5565b6020958601959094509290920191600101618f93565b509197505050602094850194929092019150600101618f29565b50929695505050505050565b600081518084526020840193506020830160005b8281101561905d5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161901d565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618ffd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526190d36040880182618ed5565b90506020820151915086810360208801526190ee8183619009565b96505050602093840193919091019060010161908f565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618ffd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452619167858351618ed5565b9450602093840193919091019060010161912d565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015618ffd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b03815116865260208101519050604060208701526191fd6040870182619009565b95505060209384019391909101906001016191a4565b600181811c9082168061922757607f821691505b602082108103616f42577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546001600160a01b038116845260ff8160a01c1615156020850152506001600160a01b0360018301541660408401526002820160806060850152600081546192aa81619213565b80608088015260018216600081146192c9576001811461930357619337565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00831660a089015260a082151560051b8901019350619337565b84600052602060002060005b8381101561932e5781548a820160a0015260019091019060200161930f565b890160a0019450505b50919695505050505050565b60a08152600061935660a0830188618ed5565b86602084015285604084015282810360608401526193748186618ed5565b905082810360808401526193888185619260565b98975050505050505050565b6000602082840312156193a657600080fd5b81516001600160a01b0381168114614d7957600080fd5b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff8816604083015286606083015260038610619477577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a083015261949860c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b6000602082840312156194c457600080fd5b81518015158114614d7957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561107457806000526020600020601f840160051c8101602085101561952a5750805b601f840160051c820191505b818110156105355760008155600101619536565b815167ffffffffffffffff811115619564576195646194d4565b619578816195728454619213565b84619503565b6020601f8211600181146195ac57600083156195945750848201515b600019600385901b1c1916600184901b178455610535565b600084815260208120601f198516915b828110156195dc57878501518255602094850194600190920191016195bc565b50848210156195fa5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561961b57600080fd5b5051919050565b60c08152600061963560c0830189618ed5565b8760208401526001600160a01b0387166040840152828103606084015261965c8187618ed5565b905084608084015282810360a08401526196768185619260565b9998505050505050505050565b60e08152600061969660e083018a618ed5565b6001600160a01b038916602084015287604084015286606084015285608084015282810360a08401526196c98186618ed5565b905082810360c08401526196dd8185619260565b9a9950505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115614c8057614c806196eb565b80820180821115614c8057614c806196eb565b6080815260006197536080830187618ed5565b8560208401528460408401528281036060840152618b2d8185619260565b60a08152600061978460a0830188618ed5565b6001600160a01b038716602084015282810360408401526197a58187618ed5565b905084606084015282810360808401526193888185619260565b6080815260006197d26080830187618ed5565b8560208401526001600160a01b03851660408401528281036060840152618b2d8185619260565b60608152600061980c6060830186618ed5565b828103602084015261981e8186618ed5565b905082810360408401526157f78185619260565b60e08152600061984560e0830189618ed5565b6001600160a01b03881660208401528660408401528560608401528460808401528281038060a0850152600082526020810160c0850152506196766020820185619260565b6001600160a01b03831681526040602082015260006166766040830184618ed5565b7f4661696c656420746f206465706c6f7920636f6e7472616374200000000000008152600083516198e481601a850160208801618eb1565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161992181601c840160208801618eb1565b01601c01949350505050565b602081526000614d796020830184618ed5565b6040516060810167ffffffffffffffff81118282101715619963576199636194d4565b60405290565b60008067ffffffffffffffff841115619984576199846194d4565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156199b3576199b36194d4565b6040528381529050808284018510156199cb57600080fd5b616a45846020830185618eb1565b600082601f8301126199ea57600080fd5b614d7983835160208501619969565b600060208284031215619a0b57600080fd5b815167ffffffffffffffff811115619a2257600080fd5b614c7c848285016199d9565b60008351619a40818460208801618eb1565b835190830190619a54818360208801618eb1565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351619a9581601a850160208801618eb1565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351619ad2816033840160208801618eb1565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000614d796080830184618ed5565b600060208284031215619b6157600080fd5b815167ffffffffffffffff811115619b7857600080fd5b8201601f81018413619b8957600080fd5b614c7c84825160208401619969565b60008551619baa818460208a01618eb1565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551619be4816001840160208a01618eb1565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451619c22816002840160208901618eb1565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351619c64816002840160208801618eb1565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000619caf6040830184618ed5565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251619d2681601f850160208701618eb1565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000619d936040830184618ed5565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000619de56040830184618ed5565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251619e5c816014850160208701618eb1565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000619ea36040830185618ed5565b8281036020840152614d758185618ed5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251619f1c816001850160208701618eb1565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251619f62818460208701618eb1565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161a01581604b850160208701618eb1565b91909101604b0192915050565b600060ff821660ff810361a0385761a0386196eb565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161a09f816029850160208701618eb1565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000614d796080830184618ed5565b60006020828403121561a10557600080fd5b815167ffffffffffffffff81111561a11c57600080fd5b82016060818503121561a12e57600080fd5b61a136619940565b81518060030b811461a14757600080fd5b8152602082015167ffffffffffffffff81111561a16357600080fd5b61a16f868285016199d9565b602083015250604082015167ffffffffffffffff81111561a18f57600080fd5b61a19b868285016199d9565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161a207816021850160208701618eb1565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161a3f3816021850160208801618eb1565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161a43081602e840160208801618eb1565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161a09f816029850160208701618eb1565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161a4f8816022850160208701618eb1565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161a53d81600e850160208701618eb1565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161a61b816018850160208801618eb1565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161a65881601c840160208801618eb1565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161a75e818460208701618eb1565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161a7c581601c850160208701618eb1565b91909101601c0192915050565b6000600019820361a7e55761a7e56196eb565b5060010190565b8082028115828204841417614c8057614c806196eb565b6001815b600184111561a83e5780850481111561a8225761a8226196eb565b600184161561a83057908102905b60019390931c92800261a807565b935093915050565b60008261a85557506001614c80565b8161a86257506000614c80565b816001811461a878576002811461a8825761a89e565b6001915050614c80565b60ff84111561a8935761a8936196eb565b50506001821b614c80565b5060208310610133831016604e8410600b841016171561a8c1575081810a614c80565b61a8ce600019848461a803565b806000190482111561a8e25761a8e26196eb565b029392505050565b6000614d79838361a846565b60008161a9055761a9056196eb565b506000190190565b6000835161a91f818460208801618eb1565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a959816001840160208801618eb1565b01600101949350505050565b818103600083128015838313168383128216171561803d5761803d6196eb56fe60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610114565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610114565b506002805460ff1916601217905534801561006f57600080fd5b506101d2565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561010f57806000526020600020601f840160051c810160208510156100ec5750805b601f840160051c820191505b8181101561010c57600081556001016100f8565b50505b505050565b81516001600160401b0381111561012d5761012d610075565b6101418161013b845461008b565b846100c5565b6020601f821160018114610175576000831561015d5750848201515b600019600385901b1c1916600184901b17845561010c565b600084815260208120601f198516915b828110156101a55787850151825560209485019460019092019101610185565b50848210156101c35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610986806101e16000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610745565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046107da565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610804565b6103bd565b34801561017857600080fd5b506100cd610187366004610841565b610647565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d336600461085a565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e9610724565b34801561020657600080fd5b5061011f6102153660046107da565b610731565b6100cd61025a565b34801561022e57600080fd5b5061013e61023d366004610875565b600460209081526000928352604080842090915290825290205481565b33600090815260036020526040812080543492906102799084906108d7565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c2906108ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee906108ea565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561042b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600060248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104a1575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105605773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561051a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091528120805484929061055a90849061093d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061059590849061093d565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548492906105cf9084906108d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161063591815260200190565b60405180910390a35060019392505050565b3360009081526003602052604090205481111561069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b33600090815260036020526040812080548392906106b990849061093d565b9091555050604051339082156108fc029083906000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c2906108ea565b600061073e3384846103bd565b9392505050565b602081526000825180602084015260005b818110156107735760208186018101516040868401015201610756565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107d557600080fd5b919050565b600080604083850312156107ed57600080fd5b6107f6836107b1565b946020939093013593505050565b60008060006060848603121561081957600080fd5b610822846107b1565b9250610830602085016107b1565b929592945050506040919091013590565b60006020828403121561085357600080fd5b5035919050565b60006020828403121561086c57600080fd5b61073e826107b1565b6000806040838503121561088857600080fd5b610891836107b1565b915061089f602084016107b1565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76108a8565b600181811c908216806108fe57607f821691505b602082108103610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76108a856fea264697066735822122008d7fc4e09519c5dd9f356b03596f6829a151d0bc7682533f9ceab4e459f5ee264736f6c634300081a00336080604052348015600f57600080fd5b5061061e8061001f6000396000f3fe60806040526004361061002a5760003560e01c8063660b9de014610033578063de43156e1461005357005b3661003157005b005b34801561003f57600080fd5b5061003161004e366004610140565b610073565b34801561005f57600080fd5b5061003161006e3660046101a6565b6100ad565b7f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76816040516100a291906102a7565b60405180910390a150565b606081156100c4576100c1828401846103a2565b90505b7fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e6100ef8780610498565b6100ff60408a0160208b01610504565b8960400135338660405161011896959493929190610526565b60405180910390a1505050505050565b60006060828403121561013a57600080fd5b50919050565b60006020828403121561015257600080fd5b813567ffffffffffffffff81111561016957600080fd5b61017584828501610128565b949350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101a157600080fd5b919050565b6000806000806000608086880312156101be57600080fd5b853567ffffffffffffffff8111156101d557600080fd5b6101e188828901610128565b9550506101f06020870161017d565b935060408601359250606086013567ffffffffffffffff81111561021357600080fd5b8601601f8101881361022457600080fd5b803567ffffffffffffffff81111561023b57600080fd5b88602082840101111561024d57600080fd5b959894975092955050506020019190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff6102c98361017d565b1660208201526000602083013567ffffffffffffffff81168082146102ed57600080fd5b806040850152505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261032a57600080fd5b830160208101903567ffffffffffffffff81111561034757600080fd5b80360382131561035657600080fd5b60608085015261036a60808501828461025e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103b457600080fd5b813567ffffffffffffffff8111156103cb57600080fd5b8201601f810184136103dc57600080fd5b803567ffffffffffffffff8111156103f6576103f6610373565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561046257610462610373565b60405281815282820160200186101561047a57600080fd5b81602084016020830137600091810160200191909152949350505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b6020019150368190038213156104fd57600080fd5b9250929050565b60006020828403121561051657600080fd5b61051f8261017d565b9392505050565b60a08152600061053a60a08301888a61025e565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015273ffffffffffffffffffffffffffffffffffffffff851660608401528281036080840152835180825260005b818110156105a457602081870181015184830182015201610588565b5060006020828401015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168301019250505097965050505050505056fea2646970667358221220bb6e62150859f03aca6fe4999cc24cdd05253b707ded08a7425095e3124a55a564736f6c634300081a003360c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a264697066735822122069510b5251a520a2af7b9d7c5d792fb0b9ae6ea20b81b922358430b0b8c94faa64736f6c634300081a0033", + ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testCall\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testCallFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZETAFailsIfAmountIsReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZETAFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZRC20FailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallZRC20FailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETA\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfNoBalance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAFailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAWithMessage\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZETAWithMessageFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfNoBalanceForGasFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfNoBalanceForTransfer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIfReceiverIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20FailsIsAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20WithMessage\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawZRC20WithMessageFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LowBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061e9f18061003c6000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806383ababa91161012a578063ba9adeef116100bd578063e20c9f711161008c578063fa7626d411610071578063fa7626d41461037f578063fbc611c81461038c578063fdad0ad01461039457600080fd5b8063e20c9f711461036f578063ea37902f1461037757600080fd5b8063ba9adeef1461034f578063ceccfab314610357578063dc749dd71461035f578063dde7e9671461036757600080fd5b8063b5508aa9116100f9578063b5508aa91461031f578063b7f0583614610327578063ba414fa61461032f578063ba800c911461034757600080fd5b806383ababa9146102e557806385226c81146102ed578063916a17c614610302578063b0464fdc1461031757600080fd5b806336431b3f116101bd578063423a58741161018c5780635d72228f116101715780635d72228f146102c05780636221b509146102c857806366d9a9a0146102d057600080fd5b8063423a5874146102b05780635006fd80146102b857600080fd5b806336431b3f1461029057806339cbb457146102985780633e5e3c23146102a05780633f7286f4146102a857600080fd5b80631e63d2b9116101f95780631e63d2b91461024d5780631ed7831c1461025557806321aeb18c146102735780632ade38801461027b57600080fd5b806304019fba1461022b5780630a9254e4146102355780631238212c1461023d57806318a4cfdc14610245575b600080fd5b61023361039c565b005b61023361053c565b610233611079565b61023361144e565b6102336118cf565b61025d611cdc565b60405161026a9190618e71565b60405180910390f35b610233611d3e565b610283611e77565b60405161026a9190618f0d565b610233611fb9565b61023361212d565b61025d6122b7565b61025d612317565b610233612377565b6102336124f8565b6102336129af565b610233612cfc565b6102d8612f21565b60405161026a9190619073565b6102336130a3565b6102f56131a0565b60405161026a9190619111565b61030a613270565b60405161026a9190619188565b61030a61336b565b6102f5613466565b610233613536565b610337613715565b604051901515815260200161026a565b6102336137e9565b610233613918565b610233613ac1565b610233613e26565b610233613ee2565b61025d614321565b610233614381565b601f546103379060ff1681565b610233614768565b610233614ae4565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561049657600080fd5b505af11580156104aa573d6000803e3d6000fd5b5050602080546040805160008152928301908190527f1e83da290000000000000000000000000000000000000000000000000000000090526001600160a01b03169250631e83da299150610507906001808660286024850161934f565b600060405180830381600087803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b5050505050565b602580547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556026805490911661123417905560405161058290618d84565b604051809103906000f08015801561059e573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600f81527f476174657761795a45564d2e736f6c000000000000000000000000000000000060208201526025549151602481019390935292166044820152610682919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc95500000000000000000000000000000000000000000000000000000000179052614c73565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b039384168102919091179182905560208054919092049092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682178155604080517f3ce4a5bc0000000000000000000000000000000000000000000000000000000081529051633ce4a5bc926004808401939192918290030181865afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076891906193a0565b602780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516107ac90618d91565b604051809103906000f0801580156107c8573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161781556027546040517f06447d5600000000000000000000000000000000000000000000000000000000815292166004830152737109709ecfa91a80626ff3989d68f67f5b1dd12d916306447d569101600060405180830381600087803b15801561086457600080fd5b505af1158015610878573d6000803e3d6000fd5b50505050600080600060405161088d90618d9e565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156108c9573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831690811790915560205460405160129360019384936000939192169061091f90618dab565b61092e969594939291906193c9565b604051809103906000f08015801561094a573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081179091556023546040517fee2815ba0000000000000000000000000000000000000000000000000000000081526001600482015260248101929092529091169063ee2815ba90604401600060405180830381600087803b1580156109e157600080fd5b505af11580156109f5573d6000803e3d6000fd5b50506023546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610af357600080fd5b505af1158015610b07573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0891906194be565b506021546025546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116906347e7ef24906044016020604051808303816000875af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d91906194be565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cfc57600080fd5b505af1158015610d10573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610d8657600080fd5b505af1158015610d9a573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116925063095ea7b391506044016020604051808303816000875af1158015610e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3291906194be565b50602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3091906194be565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f8f57600080fd5b505af1158015610fa3573d6000803e3d6000fd5b50506040805160808101825261032180825260016020808401918252838501928352845190810190945260008452606083018490528251602880549251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009093166001600160a01b0392831617929092178255915160298054919093167fffffffffffffffffffffffff000000000000000000000000000000000000000091909116179091559093509150602a906110749082619556565b505050565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156110ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ee9190619615565b6025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561116357600080fd5b505af1158015611177573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d91906194be565b506026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae7600000000000000000000000000000000000000000000000000000000017905280517ff48448140000000000000000000000000000000000000000000000000000000081529051919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f48448149160048082019260009290919082900301818387803b1580156112e957600080fd5b505af11580156112fd573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506390ad3e23915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1683526113979288916001600160a01b031690879060019060289060040161962e565b600060405180830381600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190619615565b90506114488382614c92565b50505050565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa15801561149f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c39190619615565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190619615565b6027546026546040516001600160a01b03918216602482015292935016319060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b03909216608482015291925090737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff191660208201528493506001600160a01b0390911691507ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c09060340160408051601f19818403018152908290526022546116ed926001600160a01b03909116908c9060009081908b90829060289061968f565b60405180910390a3602080546026546040516001600160a01b0392831693631e83da29936117359316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405288848660286040518663ffffffff1660e01b815260040161176995949392919061934f565b600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156117ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180e9190619615565b905061182461181e600188619720565b82614c92565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118999190619615565b90506118a58682614c92565b6118c56118b3866001619733565b6027546001600160a01b031631614c92565b5050505050505050565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190619615565b6026546040516001600160a01b03909116602482015290915060009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b039092166084820152919250908190737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611a4f57600080fd5b505af1158015611a63573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff19166020820152600093506001600160a01b0390911691507ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c09060340160408051601f198184030181528282526021547f4d8943bb000000000000000000000000000000000000000000000000000000008452915190926001600160a01b03909216918b9189918491634d8943bb916004808201926020929091908290030181865afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b599190619615565b8a896028604051611b7198979695949392919061968f565b60405180910390a3602080546026546040516001600160a01b03928316936390ad3e2393611bb99316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352611c15928a916001600160a01b0316908990889060289060040161962e565b600060405180830381600087803b158015611c2f57600080fd5b505af1158015611c43573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cba9190619615565b9050611cd483611cca8888619720565b61181e9190619720565b505050505050565b60606016805480602002602001604051908101604052809291908181526020018280548015611d3457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d16575b5050505050905090565b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f19c08f49000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250639ec6048491506034015b6040516020818303038152906040526000600160286040518563ffffffff1660e01b8152600401611e499493929190619746565b600060405180830381600087803b158015611e6357600080fd5b505af1158015611448573d6000803e3d6000fd5b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015611fb057600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015611f99578382906000526020600020018054611f0c9061921f565b80601f0160208091040260200160405190810160405280929190818152602001828054611f389061921f565b8015611f855780601f10611f5a57610100808354040283529160200191611f85565b820191906000526020600020905b815481529060010190602001808311611f6857829003601f168201915b505050505081526020019060010190611eed565b505050508152505081526020019060010190611e9b565b50505050905090565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156120b357600080fd5b505af11580156120c7573d6000803e3d6000fd5b5050602080546040805160008152928301908190526021547f90ad3e23000000000000000000000000000000000000000000000000000000009091526001600160a01b0391821694506390ad3e239350610507929160019116868260286024860161962e565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561222757600080fd5b505af115801561223b573d6000803e3d6000fd5b5050602080546040516001600160a01b03909116935063dc9ca2e79250015b60408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352610507926001600160a01b03909116908690600190602890600401619777565b60606018805480602002602001604051908101604052809291908181526020018280548015611d34576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611d16575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015611d34576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611d16575050505050905090565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f19c08f49000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250631e83da299150603401604051602081830303815290604052600060018560286040518663ffffffff1660e01b815260040161050795949392919061934f565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190619615565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa1580156125bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e39190619615565b6027546026546040516001600160a01b03918216602482015292935016319060009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae7600000000000000000000000000000000000000000000000000000000017905260255490517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156126d757600080fd5b505af11580156126eb573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af115801561275d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278191906194be565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156127e057600080fd5b505af11580156127f4573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250631e83da29915060340160405160208183030381529060405288848660286040518663ffffffff1660e01b815260040161286595949392919061934f565b600060405180830381600087803b15801561287f57600080fd5b505af1158015612893573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a9190619615565b90506129168682614c92565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298b9190619615565b90506129978682614c92565b6027546118c59086906001600160a01b031631614c92565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015612a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a249190619615565b6025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612a9957600080fd5b505af1158015612aad573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af1158015612b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4391906194be565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ba257600080fd5b505af1158015612bb6573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506371f6af54915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352612c4b9287916001600160a01b0316906028906004016197c5565b600060405180830381600087803b158015612c6557600080fd5b505af1158015612c79573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf09190619615565b90506110748282614c92565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015612d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d719190619615565b6022546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101236004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015612dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e0291906194be565b506000600190507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e6757600080fd5b505af1158015612e7b573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250639ec604849150603401604051602081830303815290604052858460286040518563ffffffff1660e01b8152600401612eea9493929190619746565b600060405180830381600087803b158015612f0457600080fd5b505af1158015612f18573d6000803e3d6000fd5b50505050505050565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015611fb05783829060005260206000209060020201604051806040016040529081600082018054612f789061921f565b80601f0160208091040260200160405190810160405280929190818152602001828054612fa49061921f565b8015612ff15780601f10612fc657610100808354040283529160200191612ff1565b820191906000526020600020905b815481529060010190602001808311612fd457829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561308b57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116130385790505b50505050508152505081526020019060010190612f45565b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561312857600080fd5b505af115801561313c573d6000803e3d6000fd5b5050602080546040805160008152928301908190526021547f71f6af54000000000000000000000000000000000000000000000000000000009091526001600160a01b0391821694506371f6af549350611e499291600191166028602484016197c5565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015611fb05783829060005260206000200180546131e39061921f565b80601f016020809104026020016040519081016040528092919081815260200182805461320f9061921f565b801561325c5780601f106132315761010080835404028352916020019161325c565b820191906000526020600020905b81548152906001019060200180831161323f57829003601f168201915b5050505050815260200190600101906131c4565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015611fb05760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561335357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116133005790505b50505050508152505081526020019060010190613294565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015611fb05760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561344e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116133fb5790505b5050505050815250508152602001906001019061338f565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015611fb05783829060005260206000200180546134a99061921f565b80601f01602080910402602001604051908101604052809291908181526020018280546134d59061921f565b80156135225780601f106134f757610100808354040283529160200191613522565b820191906000526020600020905b81548152906001019060200180831161350557829003601f168201915b50505050508152602001906001019061348a565b6026546040516001600160a01b03909116602482015260009060440160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae760000000000000000000000000000000000000000000000000000000001790525490517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561363957600080fd5b505af115801561364d573d6000803e3d6000fd5b505060215460255460265460405160609190911b6bffffffffffffffffffffffff191660208201526001600160a01b039283169450911691507f885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d89060340160408051601f19818403018152908290526136cd9186906001906028906197ff565b60405180910390a3602080546026546040516001600160a01b039283169363dc9ca2e79361225a9316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60085460009060ff161561372d575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156137be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e29190619615565b1415905090565b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561386e57600080fd5b505af1158015613882573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506371f6af54915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352611e49926000916001600160a01b0316906028906004016197c5565b6026546040516001600160a01b03909116602482015260009060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84fae76000000000000000000000000000000000000000000000000000000000179052517fc31eb0e00000000000000000000000000000000000000000000000000000000081527f5d67094f000000000000000000000000000000000000000000000000000000006004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015613a1257600080fd5b505af1158015613a26573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506390ad3e23915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352610507926000916001600160a01b031690879060019060289060040161962e565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015613b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b369190619615565b6021546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526101236004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015613ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc791906194be565b506027546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613c3a57600080fd5b505af1158015613c4e573d6000803e3d6000fd5b50506021546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a60048201526001600160a01b03909116925063f687d12a9150602401600060405180830381600087803b158015613cb157600080fd5b505af1158015613cc5573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b031692506371f6af54915060340160408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352613df89287916001600160a01b0316906028906004016197c5565b600060405180830381600087803b158015613e1257600080fd5b505af1158015611cd4573d6000803e3d6000fd5b6040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015613eab57600080fd5b505af1158015613ebf573d6000803e3d6000fd5b5050602080546040516001600160a01b039091169350639ec60484925001611e15565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015613f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f579190619615565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015613fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fcd9190619615565b6027546025546040517fca669fa70000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152929350163190600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561404b57600080fd5b505af115801561405f573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600060248201529116925063095ea7b391506044016020604051808303816000875af11580156140d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f591906194be565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561415457600080fd5b505af1158015614168573d6000803e3d6000fd5b50506020805460265460405160609190911b6bffffffffffffffffffffffff1916928101929092526001600160a01b03169250639ec604849150603401604051602081830303815290604052878460286040518563ffffffff1660e01b81526004016141d79493929190619746565b600060405180830381600087803b1580156141f157600080fd5b505af1158015614205573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015614258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427c9190619615565b90506142888582614c92565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa1580156142d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142fd9190619615565b90506143098582614c92565b602754612f189085906001600160a01b031631614c92565b60606015805480602002602001604051908101604052809291908181526020018280548015611d34576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611d16575050505050905090565b6022546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156143d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143f69190619615565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015614448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061446c9190619615565b6027546020546040517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190526024820181905260448201819052606482018190526001600160a01b0392831660848301529394509116319190737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561450757600080fd5b505af115801561451b573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff191660208201528493506001600160a01b0390911691507ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c09060340160408051601f19818403018152908290526022546145aa926001600160a01b03909116908b906000908190819060289061983e565b60405180910390a3602080546026546040516001600160a01b0392831693639ec60484936145f29316910160609190911b6bffffffffffffffffffffffff1916815260140190565b604051602081830303815290604052878460286040518563ffffffff1660e01b81526004016146249493929190619746565b600060405180830381600087803b15801561463e57600080fd5b505af1158015614652573d6000803e3d6000fd5b50506022546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156146a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146c99190619615565b90506146d961181e600187619720565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa15801561472a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474e9190619615565b905061475a8582614c92565b612f186118b3856001619733565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156147b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147dd9190619615565b6020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561486e57600080fd5b505af1158015614882573d6000803e3d6000fd5b505060255460265460405160609190911b6bffffffffffffffffffffffff19166020820152600093506001600160a01b0390911691507ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c09060340160408051601f198184030181528282526021547f4d8943bb000000000000000000000000000000000000000000000000000000008452915190926001600160a01b039092169188916000918491634d8943bb916004808201926020929091908290030181865afa158015614955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149799190619615565b60006028604051614990979695949392919061983e565b60405180910390a3602080546026546040516001600160a01b03928316936371f6af54936149d89316910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152908290526021547fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168352614a309287916001600160a01b0316906028906004016197c5565b600060405180830381600087803b158015614a4a57600080fd5b505af1158015614a5e573d6000803e3d6000fd5b50506021546025546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015614ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ad59190619615565b905061107461181e8484619720565b6021546025546040516370a0823160e01b81526001600160a01b03918216600482015260029260009216906370a0823190602401602060405180830381865afa158015614b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b599190619615565b6021549091506001600160a01b031663a9059cbb610123614b7b600185619720565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015614bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c0291906194be565b506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401613d35565b6000614c7d618db8565b614c88848483614d11565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b158015614cfd57600080fd5b505afa158015611cd4573d6000803e3d6000fd5b600080614d1e8584614d8c565b9050614d816040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614d6c9291906198ac565b60405160208183030381529060405285614d98565b9150505b9392505050565b6000614d858383614dc6565b60c08101515160009015614dbc57614db584848460c00151614de1565b9050614d85565b614db58484614f87565b6000614dd28383615072565b614d8583836020015184614d98565b600080614dec615082565b90506000614dfa8683615155565b90506000614e1182606001518360200151856155fb565b90506000614e218383898961580d565b90506000614e2e8261668a565b602081015181519192509060030b15614ea157898260400151604051602001614e589291906198ce565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252614e989160040161994f565b60405180910390fd5b6000614ee46040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001616859565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90614f3790849060040161994f565b602060405180830381865afa158015614f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f7891906193a0565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590614fdc90879060040161994f565b600060405180830381865afa158015614ff9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526150219190810190619a1b565b9050600061504f828560405160200161503b929190619a50565b604051602081830303815290604052616a59565b90506001600160a01b038116614c88578484604051602001614e58929190619a7f565b61507e82826000616a6c565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90615109908490600401619b2a565b600060405180830381865afa158015615126573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261514e9190810190619b71565b9250505090565b6151876040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506151d26040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6151db85616b6f565b602082015260006151eb86616f54565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa15801561522d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526152559190810190619b71565b8683856020015160405160200161526f9493929190619bba565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906152c790859060040161994f565b600060405180830381865afa1580156152e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261530c9190810190619b71565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690615354908490600401619cbe565b602060405180830381865afa158015615371573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061539591906194be565b6153aa5781604051602001614e589190619d10565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906153ef908490600401619da2565b600060405180830381865afa15801561540c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154349190810190619b71565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061547b908490600401619df4565b602060405180830381865afa158015615498573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154bc91906194be565b15615551576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890615506908490600401619df4565b600060405180830381865afa158015615523573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261554b9190810190619b71565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016155769190619e46565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016155a2929190619eb2565b600060405180830381865afa1580156155bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526155e79190810190619b71565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816156175790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061567757615677619ed7565b60200260200101819052506040518060400160405280600381526020017f2d726c0000000000000000000000000000000000000000000000000000000000815250816001815181106156cb576156cb619ed7565b6020026020010181905250846040516020016156e79190619f06565b6040516020818303038152906040528160028151811061570957615709619ed7565b6020026020010181905250826040516020016157259190619f72565b6040516020818303038152906040528160038151811061574757615747619ed7565b6020026020010181905250600061575d8261668a565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506157ee90604080518082018252600080825260209182015281518083019092528451825280850190820152906171d7565b6158035785604051602001614e589190619fb3565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d901561585d565b511590565b6159d157826020015115615919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401614e98565b8260c00151156159d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401614e98565b6040805160ff8082526120008201909252600091816020015b60608152602001906001900390816159ea57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280615a459061a044565b935060ff1681518110615a5a57615a5a619ed7565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001615aab919061a063565b604051602081830303815290604052828280615ac69061a044565b935060ff1681518110615adb57615adb619ed7565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280615b289061a044565b935060ff1681518110615b3d57615b3d619ed7565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280615b8a9061a044565b935060ff1681518110615b9f57615b9f619ed7565b60200260200101819052508760200151828280615bbb9061a044565b935060ff1681518110615bd057615bd0619ed7565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615c1d9061a044565b935060ff1681518110615c3257615c32619ed7565b602090810291909101015287518282615c4a8161a044565b935060ff1681518110615c5f57615c5f619ed7565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615cac9061a044565b935060ff1681518110615cc157615cc1619ed7565b6020026020010181905250615cd546617238565b8282615ce08161a044565b935060ff1681518110615cf557615cf5619ed7565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615d429061a044565b935060ff1681518110615d5757615d57619ed7565b602002602001018190525086828280615d6f9061a044565b935060ff1681518110615d8457615d84619ed7565b6020908102919091010152855115615eab5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282615dd58161a044565b935060ff1681518110615dea57615dea619ed7565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90615e3a90899060040161994f565b600060405180830381865afa158015615e57573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615e7f9190810190619b71565b8282615e8a8161a044565b935060ff1681518110615e9f57615e9f619ed7565b60200260200101819052505b846020015115615f7b5760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282615ef48161a044565b935060ff1681518110615f0957615f09619ed7565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280615f569061a044565b935060ff1681518110615f6b57615f6b619ed7565b6020026020010181905250616142565b615fb36158588660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6160465760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282615ff68161a044565b935060ff168151811061600b5761600b619ed7565b60200260200101819052508460a0015160405160200161602b9190619f06565b604051602081830303815290604052828280615f569061a044565b8460c0015115801561608957506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261608790511590565b155b156161425760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826160cd8161a044565b935060ff16815181106160e2576160e2619ed7565b60200260200101819052506160f6886172d8565b6040516020016161069190619f06565b6040516020818303038152906040528282806161219061a044565b935060ff168151811061613657616136619ed7565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261617690511590565b61620b5760408051808201909152600b81527f2d2d72656c617965724964000000000000000000000000000000000000000000602082015282826161b98161a044565b935060ff16815181106161ce576161ce619ed7565b602002602001018190525084604001518282806161ea9061a044565b935060ff16815181106161ff576161ff619ed7565b60200260200101819052505b60608501511561632c5760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826162548161a044565b935060ff168151811061626957616269619ed7565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156162d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526163009190810190619b71565b828261630b8161a044565b935060ff168151811061632057616320619ed7565b60200260200101819052505b60e085015151156163d35760408051808201909152600a81527f2d2d6761734c696d697400000000000000000000000000000000000000000000602082015282826163768161a044565b935060ff168151811061638b5761638b619ed7565b60200260200101819052506163a78560e0015160000151617238565b82826163b28161a044565b935060ff16815181106163c7576163c7619ed7565b60200260200101819052505b60e0850151602001511561647d5760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826164208161a044565b935060ff168151811061643557616435619ed7565b60200260200101819052506164518560e0015160200151617238565b828261645c8161a044565b935060ff168151811061647157616471619ed7565b60200260200101819052505b60e085015160400151156165275760408051808201909152600e81527f2d2d6d6178466565506572476173000000000000000000000000000000000000602082015282826164ca8161a044565b935060ff16815181106164df576164df619ed7565b60200260200101819052506164fb8560e0015160400151617238565b82826165068161a044565b935060ff168151811061651b5761651b619ed7565b60200260200101819052505b60e085015160600151156165d15760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826165748161a044565b935060ff168151811061658957616589619ed7565b60200260200101819052506165a58560e0015160600151617238565b82826165b08161a044565b935060ff16815181106165c5576165c5619ed7565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156165ef576165ef6194e0565b60405190808252806020026020018201604052801561662257816020015b606081526020019060019003908161660d5790505b50905060005b8260ff168160ff16101561667b57838160ff168151811061664b5761664b619ed7565b6020026020010151828260ff168151811061666857616668619ed7565b6020908102919091010152600101616628565b5093505050505b949350505050565b6166b16040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916167379186910161a0ce565b600060405180830381865afa158015616754573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261677c9190810190619b71565b9050600061678a8683617dc7565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016167ba9190619111565b6000604051808303816000875af11580156167d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616801919081019061a115565b805190915060030b1580159061681a5750602081015151155b80156168295750604081015151155b15615803578160008151811061684157616841619ed7565b6020026020010151604051602001614e58919061a1cb565b6060600061688e8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506168c59082905b90617f1c565b15616a225760006169428261693c846169366169088a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90617f43565b90617fa5565b604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506169a6908290617f1c565b15616a1057604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a0d905b829061802a565b90505b616a1981618050565b92505050614d85565b8215616a3b578484604051602001614e5892919061a3b7565b5050604080516020810190915260008152614d85565b509392505050565b6000808251602084016000f09392505050565b8160a0015115616a7b57505050565b6000616a888484846180b9565b90506000616a958261668a565b602081015181519192509060030b158015616b315750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616b31906040805180820182526000808252602091820152815180830190925284518252808501908201526168bf565b15616b3e57505050505050565b60408201515115616b5e578160400151604051602001614e58919061a45e565b80604051602001614e58919061a4bc565b60606000616ba48360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616c09905b82906171d7565b15616c7857604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d8590616c73908390618654565b618050565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616cda905b82906186de565b600103616da757604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d4090616a06565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d8590616c73905b839061802a565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e0690616c02565b15616f3d57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616e6e908390618778565b905060008160018351616e819190619720565b81518110616e9157616e91619ed7565b60200260200101519050616f34616c73616f076040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290618654565b95945050505050565b82604051602001614e58919061a527565b50919050565b60606000616f898360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616feb90616c02565b15616ff957614d8581618050565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261705890616cd3565b6001036170c257604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614d8590616c7390616da0565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261712190616c02565b15616f3d57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290617189908390618778565b90506001815111156171c55780600282516171a49190619720565b815181106171b4576171b4619ed7565b602002602001015192505050919050565b5082604051602001614e58919061a527565b8051825160009111156171ec57506000614c8c565b8151835160208501516000929161720291619733565b61720c9190619720565b905082602001518103617223576001915050614c8c565b82516020840151819020912014905092915050565b606060006172458361881d565b600101905060008167ffffffffffffffff811115617265576172656194e0565b6040519080825280601f01601f19166020018201604052801561728f576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461729957509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091617364905b82906188ff565b156173a457505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526174039061735d565b1561744357505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526174a29061735d565b156174e257505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175419061735d565b806175a65750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175a69061735d565b156175e657505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526176459061735d565b806176aa5750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526176aa9061735d565b156176ea57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177499061735d565b806177ae5750604080518082018252601181527f4c47504c2d322e312d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177ae9061735d565b156177ee57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261784d9061735d565b806178b25750604080518082018252601181527f4c47504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178b29061735d565b156178f257505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179519061735d565b1561799157505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179f09061735d565b15617a3057505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617a8f9061735d565b15617acf57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617b2e9061735d565b15617b6e57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617bcd9061735d565b15617c0d57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617c6c9061735d565b80617cd15750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617cd19061735d565b15617d1157505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d709061735d565b15617db057505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151614e58929060200161a605565b60608060005b8451811015617e525781858281518110617de957617de9619ed7565b6020026020010151604051602001617e02929190619a50565b604051602081830303815290604052915060018551617e219190619720565b8114617e4a5781604051602001617e38919061a76e565b60405160208183030381529060405291505b600101617dcd565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081617e6b5790505090508381600081518110617e9657617e96619ed7565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110617eea57617eea619ed7565b60200260200101819052508181600281518110617f0957617f09619ed7565b6020908102919091010152949350505050565b6020808301518351835192840151600093617f3a9291849190618913565b14159392505050565b60408051808201909152600080825260208201526000617f758460000151856020015185600001518660200151618a24565b9050836020015181617f879190619720565b84518590617f96908390619720565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015617fca575081614c8c565b6020808301519084015160019114617ff15750815160208481015190840151829020919020145b801561802257825184518590618008908390619720565b905250825160208501805161801e908390619733565b9052505b509192915050565b6040805180820190915260008082526020820152618049838383618b44565b5092915050565b60606000826000015167ffffffffffffffff811115618071576180716194e0565b6040519080825280601f01601f19166020018201604052801561809b576020820181803683370190505b50905060006020820190506180498185602001518660000151618bef565b606060006180c5615082565b6040805160ff808252612000820190925291925060009190816020015b60608152602001906001900390816180e257905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061813d9061a044565b935060ff168151811061815257618152619ed7565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e33000000000000000000000000000000000000000000000000008152506040516020016181a3919061a7af565b6040516020818303038152906040528282806181be9061a044565b935060ff16815181106181d3576181d3619ed7565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806182209061a044565b935060ff168151811061823557618235619ed7565b6020026020010181905250826040516020016182519190619f72565b60405160208183030381529060405282828061826c9061a044565b935060ff168151811061828157618281619ed7565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e7472616374000000000000000000000000000000000000000000008152508282806182ce9061a044565b935060ff16815181106182e3576182e3619ed7565b60200260200101819052506182f88784618c69565b82826183038161a044565b935060ff168151811061831857618318619ed7565b6020908102919091010152855151156183c45760408051808201909152600b81527f2d2d7265666572656e63650000000000000000000000000000000000000000006020820152828261836a8161a044565b935060ff168151811061837f5761837f619ed7565b6020026020010181905250618398866000015184618c69565b82826183a38161a044565b935060ff16815181106183b8576183b8619ed7565b60200260200101819052505b8560800151156184325760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261840d8161a044565b935060ff168151811061842257618422619ed7565b6020026020010181905250618498565b84156184985760408051808201909152601281527f2d2d726571756972655265666572656e63650000000000000000000000000000602082015282826184778161a044565b935060ff168151811061848c5761848c619ed7565b60200260200101819052505b604086015151156185345760408051808201909152600d81527f2d2d756e73616665416c6c6f7700000000000000000000000000000000000000602082015282826184e28161a044565b935060ff16815181106184f7576184f7619ed7565b602002602001018190525085604001518282806185139061a044565b935060ff168151811061852857618528619ed7565b60200260200101819052505b85606001511561859e5760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261857d8161a044565b935060ff168151811061859257618592619ed7565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156185bc576185bc6194e0565b6040519080825280602002602001820160405280156185ef57816020015b60608152602001906001900390816185da5790505b50905060005b8260ff168160ff16101561864857838160ff168151811061861857618618619ed7565b6020026020010151828260ff168151811061863557618635619ed7565b60209081029190910101526001016185f5565b50979650505050505050565b6040805180820190915260008082526020820152815183511015618679575081614c8c565b8151835160208501516000929161868f91619733565b6186999190619720565b602084015190915060019082146186ba575082516020840151819020908220145b80156186d5578351855186906186d1908390619720565b9052505b50929392505050565b60008082600001516187028560000151866020015186600001518760200151618a24565b61870c9190619733565b90505b835160208501516187209190619733565b811161804957816187308161a7f4565b925050826000015161876785602001518361874b9190619720565b86516187579190619720565b8386600001518760200151618a24565b6187719190619733565b905061870f565b6060600061878684846186de565b618791906001619733565b67ffffffffffffffff8111156187a9576187a96194e0565b6040519080825280602002602001820160405280156187dc57816020015b60608152602001906001900390816187c75790505b50905060005b8151811015616a51576187f8616c73868661802a565b82828151811061880a5761880a619ed7565b60209081029190910101526001016187e2565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310618866577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310618892576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106188b057662386f26fc10000830492506010015b6305f5e10083106188c8576305f5e100830492506008015b61271083106188dc57612710830492506004015b606483106188ee576064830492506002015b600a8310614c8c5760010192915050565b600061890b8383618ca9565b159392505050565b600080858411618a1a57602084116189c6576000841561895e57600161893a866020619720565b61894590600861a80e565b61895090600261a90c565b61895a9190619720565b1990505b835181168561896d8989619733565b6189779190619720565b805190935082165b8181146189b1578784116189995787945050505050616682565b836189a38161a918565b94505082845116905061897f565b6189bb8785619733565b945050505050616682565b8383206189d38588619720565b6189dd9087619733565b91505b858210618a1857848220808203618a05576189fb8684619733565b9350505050616682565b618a10600184619720565b9250506189e0565b505b5092949350505050565b60008381868511618b2f5760208511618ade5760008515618a70576001618a4c876020619720565b618a5790600861a80e565b618a6290600261a90c565b618a6c9190619720565b1990505b84518116600087618a818b8b619733565b618a8b9190619720565b855190915083165b828114618ad057818610618ab857618aab8b8b619733565b9650505050505050616682565b85618ac28161a7f4565b965050838651169050618a93565b859650505050505050616682565b508383206000905b618af08689619720565b8211618b2d57858320808203618b0c5783945050505050616682565b618b17600185619733565b9350508180618b259061a7f4565b925050618ae6565b505b618b398787619733565b979650505050505050565b60408051808201909152600080825260208201526000618b768560000151866020015186600001518760200151618a24565b602080870180519186019190915251909150618b929082619720565b835284516020860151618ba59190619733565b8103618bb45760008552618be6565b83518351618bc29190619733565b85518690618bd1908390619720565b9052508351618be09082619733565b60208601525b50909392505050565b60208110618c275781518352618c06602084619733565b9250618c13602083619733565b9150618c20602082619720565b9050618bef565b6000198115618c56576001618c3d836020619720565b618c499061010061a90c565b618c539190619720565b90505b9151835183169219169190911790915250565b60606000618c778484615155565b8051602080830151604051939450618c919390910161a92f565b60405160208183030381529060405291505092915050565b8151815160009190811115618cbc575081515b6020808501519084015160005b83811015618d755782518251808214618d45576000196020871015618d2457600184618cf6896020619720565b618d009190619733565b618d0b90600861a80e565b618d1690600261a90c565b618d209190619720565b1990505b8181168382168181039114618d42579750614c8c9650505050505050565b50505b618d50602086619733565b9450618d5d602085619733565b93505050602081618d6e9190619733565b9050618cc9565b5084518651615803919061a987565b610b678061a9a883390190565b61063d8061b50f83390190565b61106f8061bb4c83390190565b611e018061cbbb83390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001618dfb618e00565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001618dfb6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015618eb25783516001600160a01b0316835260209384019390920191600101618e8b565b509095945050505050565b60005b83811015618ed8578181015183820152602001618ec0565b50506000910152565b60008151808452618ef9816020860160208601618ebd565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619009577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015618fef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018352618fd9848651618ee1565b6020958601959094509290920191600101618f9f565b509197505050602094850194929092019150600101618f35565b50929695505050505050565b600081518084526020840193506020830160005b828110156190695781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101619029565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619009577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526190df6040880182618ee1565b90506020820151915086810360208801526190fa8183619015565b96505050602093840193919091019060010161909b565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619009577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452619173858351618ee1565b94506020938401939190910190600101619139565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619009577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b03815116865260208101519050604060208701526192096040870182619015565b95505060209384019391909101906001016191b0565b600181811c9082168061923357607f821691505b602082108103616f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546001600160a01b038116845260ff8160a01c1615156020850152506001600160a01b0360018301541660408401526002820160806060850152600081546192b68161921f565b80608088015260018216600081146192d5576001811461930f57619343565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00831660a089015260a082151560051b8901019350619343565b84600052602060002060005b8381101561933a5781548a820160a0015260019091019060200161931b565b890160a0019450505b50919695505050505050565b60a08152600061936260a0830188618ee1565b86602084015285604084015282810360608401526193808186618ee1565b90508281036080840152619394818561926c565b98975050505050505050565b6000602082840312156193b257600080fd5b81516001600160a01b0381168114614d8557600080fd5b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff8816604083015286606083015260038610619483577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a08301526194a460c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b6000602082840312156194d057600080fd5b81518015158114614d8557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561107457806000526020600020601f840160051c810160208510156195365750805b601f840160051c820191505b818110156105355760008155600101619542565b815167ffffffffffffffff811115619570576195706194e0565b6195848161957e845461921f565b8461950f565b6020601f8211600181146195b857600083156195a05750848201515b600019600385901b1c1916600184901b178455610535565b600084815260208120601f198516915b828110156195e857878501518255602094850194600190920191016195c8565b50848210156196065786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561962757600080fd5b5051919050565b60c08152600061964160c0830189618ee1565b8760208401526001600160a01b038716604084015282810360608401526196688187618ee1565b905084608084015282810360a0840152619682818561926c565b9998505050505050505050565b610100815260006196a461010083018b618ee1565b6001600160a01b038a16602084015288604084015287606084015286608084015282810360a08401526196d78187618ee1565b90508460c084015282810360e0840152614f78818561926c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115614c8c57614c8c6196f1565b80820180821115614c8c57614c8c6196f1565b6080815260006197596080830187618ee1565b8560208401528460408401528281036060840152618b39818561926c565b60a08152600061978a60a0830188618ee1565b6001600160a01b038716602084015282810360408401526197ab8187618ee1565b90508460608401528281036080840152619394818561926c565b6080815260006197d86080830187618ee1565b8560208401526001600160a01b03851660408401528281036060840152618b39818561926c565b6080815260006198126080830187618ee1565b82810360208401526198248187618ee1565b90508460408401528281036060840152618b39818561926c565b6101008152600061985361010083018a618ee1565b6001600160a01b03891660208401528760408401528660608401528560808401528281038060a0850152600082528560c08501526020810160e08501525061989e602082018561926c565b9a9950505050505050505050565b6001600160a01b03831681526040602082015260006166826040830184618ee1565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161990681601a850160208801618ebd565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161994381601c840160208801618ebd565b01601c01949350505050565b602081526000614d856020830184618ee1565b6040516060810167ffffffffffffffff81118282101715619985576199856194e0565b60405290565b60008067ffffffffffffffff8411156199a6576199a66194e0565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156199d5576199d56194e0565b6040528381529050808284018510156199ed57600080fd5b616a51846020830185618ebd565b600082601f830112619a0c57600080fd5b614d858383516020850161998b565b600060208284031215619a2d57600080fd5b815167ffffffffffffffff811115619a4457600080fd5b614c88848285016199fb565b60008351619a62818460208801618ebd565b835190830190619a76818360208801618ebd565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351619ab781601a850160208801618ebd565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351619af4816033840160208801618ebd565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000614d856080830184618ee1565b600060208284031215619b8357600080fd5b815167ffffffffffffffff811115619b9a57600080fd5b8201601f81018413619bab57600080fd5b614c888482516020840161998b565b60008551619bcc818460208a01618ebd565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551619c06816001840160208a01618ebd565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451619c44816002840160208901618ebd565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351619c86816002840160208801618ebd565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000619cd16040830184618ee1565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251619d4881601f850160208701618ebd565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000619db56040830184618ee1565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000619e076040830184618ee1565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251619e7e816014850160208701618ebd565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000619ec56040830185618ee1565b8281036020840152614d818185618ee1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251619f3e816001850160208701618ebd565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251619f84818460208701618ebd565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161a03781604b850160208701618ebd565b91909101604b0192915050565b600060ff821660ff810361a05a5761a05a6196f1565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161a0c1816029850160208701618ebd565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000614d856080830184618ee1565b60006020828403121561a12757600080fd5b815167ffffffffffffffff81111561a13e57600080fd5b82016060818503121561a15057600080fd5b61a158619962565b81518060030b811461a16957600080fd5b8152602082015167ffffffffffffffff81111561a18557600080fd5b61a191868285016199fb565b602083015250604082015167ffffffffffffffff81111561a1b157600080fd5b61a1bd868285016199fb565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161a229816021850160208701618ebd565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161a415816021850160208801618ebd565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161a45281602e840160208801618ebd565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161a0c1816029850160208701618ebd565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161a51a816022850160208701618ebd565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161a55f81600e850160208701618ebd565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161a63d816018850160208801618ebd565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161a67a81601c840160208801618ebd565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161a780818460208701618ebd565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161a7e781601c850160208701618ebd565b91909101601c0192915050565b6000600019820361a8075761a8076196f1565b5060010190565b8082028115828204841417614c8c57614c8c6196f1565b6001815b600184111561a8605780850481111561a8445761a8446196f1565b600184161561a85257908102905b60019390931c92800261a829565b935093915050565b60008261a87757506001614c8c565b8161a88457506000614c8c565b816001811461a89a576002811461a8a45761a8c0565b6001915050614c8c565b60ff84111561a8b55761a8b56196f1565b50506001821b614c8c565b5060208310610133831016604e8410600b841016171561a8e3575081810a614c8c565b61a8f0600019848461a825565b806000190482111561a9045761a9046196f1565b029392505050565b6000614d85838361a868565b60008161a9275761a9276196f1565b506000190190565b6000835161a941818460208801618ebd565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a97b816001840160208801618ebd565b01600101949350505050565b8181036000831280158383131683831282161715618049576180496196f156fe60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610114565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610114565b506002805460ff1916601217905534801561006f57600080fd5b506101d2565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561010f57806000526020600020601f840160051c810160208510156100ec5750805b601f840160051c820191505b8181101561010c57600081556001016100f8565b50505b505050565b81516001600160401b0381111561012d5761012d610075565b6101418161013b845461008b565b846100c5565b6020601f821160018114610175576000831561015d5750848201515b600019600385901b1c1916600184901b17845561010c565b600084815260208120601f198516915b828110156101a55787850151825560209485019460019092019101610185565b50848210156101c35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610986806101e16000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610745565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046107da565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610804565b6103bd565b34801561017857600080fd5b506100cd610187366004610841565b610647565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d336600461085a565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e9610724565b34801561020657600080fd5b5061011f6102153660046107da565b610731565b6100cd61025a565b34801561022e57600080fd5b5061013e61023d366004610875565b600460209081526000928352604080842090915290825290205481565b33600090815260036020526040812080543492906102799084906108d7565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c2906108ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee906108ea565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561042b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600060248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104a1575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105605773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561051a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091528120805484929061055a90849061093d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061059590849061093d565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548492906105cf9084906108d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161063591815260200190565b60405180910390a35060019392505050565b3360009081526003602052604090205481111561069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b33600090815260036020526040812080548392906106b990849061093d565b9091555050604051339082156108fc029083906000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c2906108ea565b600061073e3384846103bd565b9392505050565b602081526000825180602084015260005b818110156107735760208186018101516040868401015201610756565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107d557600080fd5b919050565b600080604083850312156107ed57600080fd5b6107f6836107b1565b946020939093013593505050565b60008060006060848603121561081957600080fd5b610822846107b1565b9250610830602085016107b1565b929592945050506040919091013590565b60006020828403121561085357600080fd5b5035919050565b60006020828403121561086c57600080fd5b61073e826107b1565b6000806040838503121561088857600080fd5b610891836107b1565b915061089f602084016107b1565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76108a8565b600181811c908216806108fe57607f821691505b602082108103610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76108a856fea264697066735822122008d7fc4e09519c5dd9f356b03596f6829a151d0bc7682533f9ceab4e459f5ee264736f6c634300081a00336080604052348015600f57600080fd5b5061061e8061001f6000396000f3fe60806040526004361061002a5760003560e01c8063660b9de014610033578063de43156e1461005357005b3661003157005b005b34801561003f57600080fd5b5061003161004e366004610140565b610073565b34801561005f57600080fd5b5061003161006e3660046101a6565b6100ad565b7f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76816040516100a291906102a7565b60405180910390a150565b606081156100c4576100c1828401846103a2565b90505b7fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e6100ef8780610498565b6100ff60408a0160208b01610504565b8960400135338660405161011896959493929190610526565b60405180910390a1505050505050565b60006060828403121561013a57600080fd5b50919050565b60006020828403121561015257600080fd5b813567ffffffffffffffff81111561016957600080fd5b61017584828501610128565b949350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101a157600080fd5b919050565b6000806000806000608086880312156101be57600080fd5b853567ffffffffffffffff8111156101d557600080fd5b6101e188828901610128565b9550506101f06020870161017d565b935060408601359250606086013567ffffffffffffffff81111561021357600080fd5b8601601f8101881361022457600080fd5b803567ffffffffffffffff81111561023b57600080fd5b88602082840101111561024d57600080fd5b959894975092955050506020019190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff6102c98361017d565b1660208201526000602083013567ffffffffffffffff81168082146102ed57600080fd5b806040850152505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261032a57600080fd5b830160208101903567ffffffffffffffff81111561034757600080fd5b80360382131561035657600080fd5b60608085015261036a60808501828461025e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103b457600080fd5b813567ffffffffffffffff8111156103cb57600080fd5b8201601f810184136103dc57600080fd5b803567ffffffffffffffff8111156103f6576103f6610373565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561046257610462610373565b60405281815282820160200186101561047a57600080fd5b81602084016020830137600091810160200191909152949350505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b6020019150368190038213156104fd57600080fd5b9250929050565b60006020828403121561051657600080fd5b61051f8261017d565b9392505050565b60a08152600061053a60a08301888a61025e565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015273ffffffffffffffffffffffffffffffffffffffff851660608401528281036080840152835180825260005b818110156105a457602081870181015184830182015201610588565b5060006020828401015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168301019250505097965050505050505056fea2646970667358221220bb6e62150859f03aca6fe4999cc24cdd05253b707ded08a7425095e3124a55a564736f6c634300081a003360c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a2646970667358221220b63b87b76e4505984d90195a93bf6cfc90c3781a8ee4938dcd5243dd0acc3c5d64736f6c634300081a0033", } // GatewayZEVMInboundTestABI is the input ABI used to generate the binding from. @@ -1135,13 +1135,14 @@ type GatewayZEVMInboundTestCalled struct { Zrc20 common.Address Receiver []byte Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterCalled is a free log retrieval operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// FilterCalled is a free log retrieval operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) FilterCalled(opts *bind.FilterOpts, sender []common.Address, zrc20 []common.Address) (*GatewayZEVMInboundTestCalledIterator, error) { var senderRule []interface{} @@ -1160,9 +1161,9 @@ func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) FilterCalled(opts return &GatewayZEVMInboundTestCalledIterator{contract: _GatewayZEVMInboundTest.contract, event: "Called", logs: logs, sub: sub}, nil } -// WatchCalled is a free log subscription operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// WatchCalled is a free log subscription operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) WatchCalled(opts *bind.WatchOpts, sink chan<- *GatewayZEVMInboundTestCalled, sender []common.Address, zrc20 []common.Address) (event.Subscription, error) { var senderRule []interface{} @@ -1206,9 +1207,9 @@ func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) WatchCalled(opts }), nil } -// ParseCalled is a log parse operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// ParseCalled is a log parse operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) ParseCalled(log types.Log) (*GatewayZEVMInboundTestCalled, error) { event := new(GatewayZEVMInboundTestCalled) if err := _GatewayZEVMInboundTest.contract.UnpackLog(event, "Called", log); err != nil { @@ -1295,13 +1296,14 @@ type GatewayZEVMInboundTestWithdrawn struct { Gasfee *big.Int ProtocolFlatFee *big.Int Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawn is a free log retrieval operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, sender []common.Address, chainId []*big.Int) (*GatewayZEVMInboundTestWithdrawnIterator, error) { var senderRule []interface{} @@ -1320,9 +1322,9 @@ func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) FilterWithdrawn(o return &GatewayZEVMInboundTestWithdrawnIterator{contract: _GatewayZEVMInboundTest.contract, event: "Withdrawn", logs: logs, sub: sub}, nil } -// WatchWithdrawn is a free log subscription operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// WatchWithdrawn is a free log subscription operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayZEVMInboundTestWithdrawn, sender []common.Address, chainId []*big.Int) (event.Subscription, error) { var senderRule []interface{} @@ -1366,9 +1368,9 @@ func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) WatchWithdrawn(op }), nil } -// ParseWithdrawn is a log parse operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// ParseWithdrawn is a log parse operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMInboundTest *GatewayZEVMInboundTestFilterer) ParseWithdrawn(log types.Log) (*GatewayZEVMInboundTestWithdrawn, error) { event := new(GatewayZEVMInboundTestWithdrawn) if err := _GatewayZEVMInboundTest.contract.UnpackLog(event, "Withdrawn", log); err != nil { diff --git a/v2/pkg/gatewayzevm.t.sol/gatewayzevmoutboundtest.go b/v2/pkg/gatewayzevm.t.sol/gatewayzevmoutboundtest.go index c9b984a2..b60ad83d 100644 --- a/v2/pkg/gatewayzevm.t.sol/gatewayzevmoutboundtest.go +++ b/v2/pkg/gatewayzevm.t.sol/gatewayzevmoutboundtest.go @@ -64,8 +64,8 @@ type StdInvariantFuzzSelector struct { // GatewayZEVMOutboundTestMetaData contains all meta data concerning the GatewayZEVMOutboundTest contract. var GatewayZEVMOutboundTestMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testDeposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsITargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsITargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfSenderNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfTargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfTargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversal\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractIfTargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractIfTargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteUniversalContractFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ContextData\",\"inputs\":[{\"name\":\"origin\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"msgSender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ContextDataRevert\",\"inputs\":[{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b506201060e806200003e6000396000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c8063828d267c116101de578063b936be8c1161010f578063e09bc659116100ad578063ec294d9f1161007c578063ec294d9f14610599578063ef2b5394146105a1578063fa7626d4146105a9578063fb339a1c146105b657600080fd5b8063e09bc6591461054c578063e20c9f7114610554578063e63ab1e91461055c578063eab7674e1461059157600080fd5b8063c8814d2e116100e9578063c8814d2e1461052c578063d997851314610534578063d9a4fa161461053c578063df881f6c1461054457600080fd5b8063b936be8c14610504578063ba414fa61461050c578063c7b388b11461052457600080fd5b80639c9acd5d1161017c578063a40b515b11610156578063a40b515b146104e4578063b0464fdc146104ec578063b5508aa9146104f4578063b8f2b821146104fc57600080fd5b80639c9acd5d146104cc5780639ca37e92146104d4578063a0b2c7b1146104dc57600080fd5b8063916a17c6116101b8578063916a17c6146104a757806396d9d876146104bc57806397f7661f14610482578063996b7675146104c457600080fd5b8063828d267c1461048257806385226c811461048a578063884660a31461049f57600080fd5b80633f7286f4116102b85780635cec7db511610256578063671b91e211610230578063671b91e2146104625780636efa04b51461046a5780637cec29b0146104725780637f924c4e1461047a57600080fd5b80635cec7db5146104455780635d19c0491461039a57806366d9a9a01461044d57600080fd5b80634b9324b6116102925780634b9324b61461039a57806351336fb01461043557806358c9987f1461043d5780635b4c90e1146103e057600080fd5b80633f7286f41461041d57806344b2a40b1461042557806348f4fd071461042d57600080fd5b80632468bc0f116103255780632fa381f4116102ff5780632fa381f4146103fd578063339bd828146104055780633ab5b1991461040d5780633e5e3c231461041557600080fd5b80632468bc0f146103d85780632948df41146103e05780632ade3880146103e857600080fd5b806314b7a6da1161036157806314b7a6da146103a2578063198d5ca4146103aa5780631c785a14146103b25780631ed7831c146103ba57600080fd5b8063084fafab146103885780630a9254e4146103925780630bfc4e4a1461039a575b600080fd5b6103906105be565b005b610390610812565b61039061131f565b6103906114d5565b610390611655565b6103906118d8565b6103c26121ef565b6040516103cf919061ab1c565b60405180910390f35b610390612251565b61039061271c565b6103f06128cf565b6040516103cf919061abb8565b610390612a11565b610390612c03565b610390612db7565b6103c2612f68565b6103c2612fc8565b610390613028565b6103906131b0565b610390613366565b610390613522565b6103906136d7565b61045561388e565b6040516103cf919061ad1e565b610390613a10565b610390613bd1565b610390613f75565b6103906141e8565b610390614221565b6104926143cd565b6040516103cf919061adbc565b61039061449d565b6104af61473b565b6040516103cf919061ae33565b610390614836565b610390614989565b610390614add565b610390614c2d565b610390614d64565b610390614f1f565b6104af6150d7565b6104926151d2565b6103906152a2565b610390615463565b610514615746565b60405190151581526020016103cf565b61039061581a565b6103906159d8565b610390615b8c565b610390615cc3565b610390615e81565b610390616036565b6103c26161ef565b6105837f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6040519081526020016103cf565b61039061624f565b610390616407565b6103906165b6565b601f546105149060ff1681565b610390616767565b60006040516020016105cf9061aeca565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156106bd57600080fd5b505af11580156106d1573d6000803e3d6000fd5b505050507f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76602b604051610705919061b029565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b15801561076757600080fd5b505af115801561077b573d6000803e3d6000fd5b50506020546021546024546040517faa6585d00000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063aa6585d094506107dc9387938116926001929116908990602b9060040161b07a565b600060405180830381600087803b1580156107f657600080fd5b505af115801561080a573d6000803e3d6000fd5b505050505050565b602580547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163017909155602680549091166112341790556040516108589061aa2b565b604051809103906000f080158015610874573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600f81527f476174657761795a45564d2e736f6c000000000000000000000000000000000060208201526025549151602481019390935292166044820152610958919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc9550000000000000000000000000000000000000000000000000000000017905261691a565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b039384168102919091179182905560208054919092049092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682178155604080517f3ce4a5bc0000000000000000000000000000000000000000000000000000000081529051633ce4a5bc926004808401939192918290030181865afa158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3e919061b0e4565b602780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055604051610a829061aa39565b604051809103906000f080158015610a9e573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161781556027546040517f06447d5600000000000000000000000000000000000000000000000000000000815292166004830152737109709ecfa91a80626ff3989d68f67f5b1dd12d916306447d569101600060405180830381600087803b158015610b3a57600080fd5b505af1158015610b4e573d6000803e3d6000fd5b505050506000806000604051610b639061aa47565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610b9f573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602054604051601293600193849360009391921690610bf59061aa55565b610c049695949392919061b10d565b604051809103906000f080158015610c20573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081179091556023546040517fee2815ba0000000000000000000000000000000000000000000000000000000081526001600482015260248101929092529091169063ee2815ba90604401600060405180830381600087803b158015610cb757600080fd5b505af1158015610ccb573d6000803e3d6000fd5b50506023546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610d3557600080fd5b505af1158015610d49573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede919061b202565b506021546025546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116906347e7ef24906044016020604051808303816000875af1158015610f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f73919061b202565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fd257600080fd5b505af1158015610fe6573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561105c57600080fd5b505af1158015611070573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116925063095ea7b391506044016020604051808303816000875af11580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611108919061b202565b50602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b15801561115a57600080fd5b505af115801561116e573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af11580156111e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611206919061b202565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126557600080fd5b505af1158015611279573d6000803e3d6000fd5b505060408051606081018252600080825260016020808401918252845190810185529182529282018190528151602b8054945167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009095166001600160a01b039290921691909117939093178355909350909150602c9061131a908261b29a565b505050565b60006040516020016113309061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b1580156113de57600080fd5b505af11580156113f2573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561146257600080fd5b505af1158015611476573d6000803e3d6000fd5b50506020546024546040517faa6585d00000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063aa6585d093506107dc928692600092600192909116908990602b9060040161b07a565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561152e57600080fd5b505af1158015611542573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156115b257600080fd5b505af11580156115c6573d6000803e3d6000fd5b50506020546021546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260016024820152600060448201529116925063f45346dc91506064015b600060405180830381600087803b15801561163b57600080fd5b505af115801561164f573d6000803e3d6000fd5b50505050565b6021546026546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156116a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ca919061b359565b90506116d7600082616939565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561173057600080fd5b505af1158015611744573d6000803e3d6000fd5b5050604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810188905290821660448201529116925063f45346dc9150606401600060405180830381600087803b15801561184057600080fd5b505af1158015611854573d6000803e3d6000fd5b50506021546026546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb919061b359565b905061131a600082616939565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561193157600080fd5b505af1158015611945573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611a30919060040161b372565b600060405180830381600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ab257600080fd5b505af1158015611ac6573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611c22919060040161b372565b600060405180830381600087803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ca457600080fd5b505af1158015611cb8573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611d1557600080fd5b505af1158015611d29573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd93c066500000000000000000000000000000000000000000000000000000000600482015260019250737109709ecfa91a80626ff3989d68f67f5b1dd12d915063c31eb0e090602401600060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611e7557600080fd5b505af1158015611e89573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810187905290821660448201529116925063f45346dc9150606401600060405180830381600087803b158015611f0157600080fd5b505af1158015611f15573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611f7257600080fd5b505af1158015611f86573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611fda57600080fd5b505af1158015611fee573d6000803e3d6000fd5b50506021546026546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a08231906024015b602060405180830381865afa158015612042573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612066919061b359565b9050612073600082616939565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810188905290821660448201529116925063f45346dc9150606401600060405180830381600087803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b50506021546026546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e3919061b359565b905061131a8382616939565b6060601680548060200260200160405190810160405280929190818152602001828054801561224757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612229575b5050505050905090565b6022546027546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156122a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c6919061b359565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015612318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233c919061b359565b6024546040519192506001600160a01b0316319060009061235f9060200161aeca565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561244d57600080fd5b505af1158015612461573d6000803e3d6000fd5b5050602080546040517fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e94506124bc93506001600160a01b03909116910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152908290526027546020546124ec936001600160a01b03928316928c92169061b385565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561254d57600080fd5b505af1158015612561573d6000803e3d6000fd5b50506020546024546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a9593506125b89286928c92911690889060040161b3f8565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b50506022546027546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265d919061b359565b905061267261266c888861b461565b82616939565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa1580156126c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e7919061b359565b90506126f38682616939565b612712612700898761b474565b6024546001600160a01b031631616939565b5050505050505050565b600060405160200161272d9061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b1580156127db57600080fd5b505af11580156127ef573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b50506020546024546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063bcf7f32b93506107dc92869260009260019290911690899060040161b487565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015612a0857600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156129f15783829060005260206000200180546129649061af07565b80601f01602080910402602001604051908101604052809291908181526020018280546129909061af07565b80156129dd5780601f106129b2576101008083540402835291602001916129dd565b820191906000526020600020905b8154815290600101906020018083116129c057829003601f168201915b505050505081526020019060010190612945565b5050505081525050815260200190600101906128f3565b50505050905090565b604051600190600090612a269060200161aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015612af057600080fd5b505af1158015612b04573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612b6157600080fd5b505af1158015612b75573d6000803e3d6000fd5b50506020546024546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a959350612bcc9286928992911690889060040161b3f8565b600060405180830381600087803b158015612be657600080fd5b505af1158015612bfa573d6000803e3d6000fd5b50505050505050565b6000604051602001612c149061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015612cc257600080fd5b505af1158015612cd6573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612d4657600080fd5b505af1158015612d5a573d6000803e3d6000fd5b50506020546021546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063a13b8cff93506107dc92869216906001906000908990602b9060040161b07a565b6000604051602001612dc89061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015612e7657600080fd5b505af1158015612e8a573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612efa57600080fd5b505af1158015612f0e573d6000803e3d6000fd5b50506020546021546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063bcf7f32b93506107dc9286921690600190600090899060040161b487565b60606018805480602002602001604051908101604052809291908181526020018280548015612247576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612229575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015612247576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612229575050505050905090565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561308457600080fd5b505af1158015613098573d6000803e3d6000fd5b5050604051630618f58760e51b81527f82d5d76a000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b50506020546021546027546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810187905290821660448201529116925063f45346dc91506064015b600060405180830381600087803b15801561319557600080fd5b505af11580156131a9573d6000803e3d6000fd5b5050505050565b60006040516020016131c19061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561326f57600080fd5b505af1158015613283573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156132f357600080fd5b505af1158015613307573d6000803e3d6000fd5b50506020546024546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063a13b8cff93506107dc928692600092600192909116908990602b9060040161b07a565b60006040516020016133779061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561344157600080fd5b505af1158015613455573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156134b257600080fd5b505af11580156134c6573d6000803e3d6000fd5b50506020546021546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063a13b8cff93506107dc928692169060019086908990602b9060040161b07a565b60006040516020016135339061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b1580156135e157600080fd5b505af11580156135f5573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561366557600080fd5b505af1158015613679573d6000803e3d6000fd5b50506020546021546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca3794506107dc938793811692600092911690899060040161b487565b6040516001906000906136ec9060200161aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b1580156137b657600080fd5b505af11580156137ca573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561382757600080fd5b505af115801561383b573d6000803e3d6000fd5b50506020546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506321501a959150612bcc90849087908590889060040161b3f8565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015612a0857838290600052602060002090600202016040518060400160405290816000820180546138e59061af07565b80601f01602080910402602001604051908101604052809291908181526020018280546139119061af07565b801561395e5780601f106139335761010080835404028352916020019161395e565b820191906000526020600020905b81548152906001019060200180831161394157829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156139f857602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116139a55790505b505050505081525050815260200190600101906138b2565b6000604051602001613a219061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015613aeb57600080fd5b505af1158015613aff573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015613b5c57600080fd5b505af1158015613b70573d6000803e3d6000fd5b50506020546021546024546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063a13b8cff94506107dc9387938116926001929116908990602b9060040161b07a565b602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009391909116916370a082319101602060405180830381865afa158015613c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c45919061b359565b9050613c52600082616939565b6000604051602001613c639061aeca565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613d5157600080fd5b505af1158015613d65573d6000803e3d6000fd5b5050602080546040517fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e9450613dc093506001600160a01b03909116910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602754602054613df1936001600160a01b0392831692600192169061b385565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613e5257600080fd5b505af1158015613e66573d6000803e3d6000fd5b50506020546021546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca379450613ec4938793811692600192911690899060040161b487565b600060405180830381600087803b158015613ede57600080fd5b505af1158015613ef2573d6000803e3d6000fd5b5050602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009550921692506370a082319101602060405180830381865afa158015613f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f68919061b359565b905061164f600182616939565b6000604051602001613f869061aeca565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561407457600080fd5b505af1158015614088573d6000803e3d6000fd5b5050602080546040517fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e94506140e393506001600160a01b03909116910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602754602054614114936001600160a01b0392831692600192169061b385565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b15801561417657600080fd5b505af115801561418a573d6000803e3d6000fd5b50506020546021546024546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063bcf7f32b94506107dc938793811692600192911690899060040161b487565b6021546026546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401612025565b60006040516020016142329061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b1580156142e057600080fd5b505af11580156142f4573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561436457600080fd5b505af1158015614378573d6000803e3d6000fd5b50506020546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506321501a9591506107dc908490600190600090889060040161b3f8565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015612a085783829060005260206000200180546144109061af07565b80601f016020809104026020016040519081016040528092919081815260200182805461443c9061af07565b80156144895780601f1061445e57610100808354040283529160200191614489565b820191906000526020600020905b81548152906001019060200180831161446c57829003601f168201915b5050505050815260200190600101906143f1565b602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009391909116916370a082319101602060405180830381865afa1580156144ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614511919061b359565b905061451e600082616939565b600060405160200161452f9061aeca565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561461d57600080fd5b505af1158015614631573d6000803e3d6000fd5b505050507f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76602b604051614665919061b029565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156146c657600080fd5b505af11580156146da573d6000803e3d6000fd5b50506020546021546024546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063a13b8cff9450613ec49387938116926001929116908990602b9060040161b07a565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015612a085760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561481e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116147cb5790505b5050505050815250508152602001906001019061475f565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b5050604051630618f58760e51b81527f82d5d76a000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561491657600080fd5b505af115801561492a573d6000803e3d6000fd5b50506020546021546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101869052911660448201819052925063f45346dc915060640161317b565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156149e257600080fd5b505af11580156149f6573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015614a6657600080fd5b505af1158015614a7a573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526000602482015290821660448201529116925063f45346dc9150606401611621565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614b3657600080fd5b505af1158015614b4a573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015614bba57600080fd5b505af1158015614bce573d6000803e3d6000fd5b50506020546026546040517ff45346dc00000000000000000000000000000000000000000000000000000000815260006004820152600160248201526001600160a01b0391821660448201529116925063f45346dc9150606401611621565b6000604051602001614c3e9061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015614d0857600080fd5b505af1158015614d1c573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa7915060240161415c565b604051600190600090614d799060200161aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015614e4357600080fd5b505af1158015614e57573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614eb457600080fd5b505af1158015614ec8573d6000803e3d6000fd5b50506020546027546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a959350612bcc9286928992911690889060040161b3f8565b6000604051602001614f309061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015614fde57600080fd5b505af1158015614ff2573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561506257600080fd5b505af1158015615076573d6000803e3d6000fd5b50506020546021546024546040517faa6585d00000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063aa6585d094506107dc9387938116926000929116908990602b9060040161b07a565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015612a085760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156151ba57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116151675790505b505050505081525050815260200190600101906150fb565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015612a085783829060005260206000200180546152159061af07565b80601f01602080910402602001604051908101604052809291908181526020018280546152419061af07565b801561528e5780601f106152635761010080835404028352916020019161528e565b820191906000526020600020905b81548152906001019060200180831161527157829003601f168201915b5050505050815260200190600101906151f6565b60006040516020016152b39061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561537d57600080fd5b505af1158015615391573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156153ee57600080fd5b505af1158015615402573d6000803e3d6000fd5b50506020546021546027546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063a13b8cff94506107dc9387938116926001929116908990602b9060040161b07a565b6022546027546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156154b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154d8919061b359565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa15801561552a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061554e919061b359565b6024546040519192506001600160a01b031631906000906155719060200161aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561561f57600080fd5b505af1158015615633573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156156a357600080fd5b505af11580156156b7573d6000803e3d6000fd5b50506020546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506321501a95915061570c908490600190600090889060040161b3f8565b600060405180830381600087803b15801561572657600080fd5b505af115801561573a573d6000803e3d6000fd5b50505050505050505050565b60085460009060ff161561575e575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156157ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615813919061b359565b1415905090565b600060405160200161582b9061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b1580156158f557600080fd5b505af1158015615909573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561596657600080fd5b505af115801561597a573d6000803e3d6000fd5b50506020546021546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca3794506107dc938793811692600192911690899060040161b487565b60006040516020016159e99061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015615a9757600080fd5b505af1158015615aab573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015615b1b57600080fd5b505af1158015615b2f573d6000803e3d6000fd5b50506020546021546040517faa6585d00000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063aa6585d093506107dc92869216906001906000908990602b9060040161b07a565b6000604051602001615b9d9061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015615c6757600080fd5b505af1158015615c7b573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa7915060240161074d565b6000604051602001615cd49061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015615d9e57600080fd5b505af1158015615db2573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015615e0f57600080fd5b505af1158015615e23573d6000803e3d6000fd5b50506020546021546027546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca3794506107dc938793811692600192911690899060040161b487565b6000604051602001615e929061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015615f4057600080fd5b505af1158015615f54573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015615fc457600080fd5b505af1158015615fd8573d6000803e3d6000fd5b50506020546021546024546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063bcf7f32b94506107dc938793811692600092911690899060040161b487565b60006040516020016160479061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561611157600080fd5b505af1158015616125573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561618257600080fd5b505af1158015616196573d6000803e3d6000fd5b50506020546021546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c39aca3793506107dc92869216906001908690899060040161b487565b60606015805480602002602001604051908101604052809291908181526020018280548015612247576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612229575050505050905090565b60006040516020016162609061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561630e57600080fd5b505af1158015616322573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561639257600080fd5b505af11580156163a6573d6000803e3d6000fd5b50506020546021546024546040517fa13b8cff0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063a13b8cff94506107dc9387938116926000929116908990602b9060040161b07a565b60006040516020016164189061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b1580156164c657600080fd5b505af11580156164da573d6000803e3d6000fd5b5050604051630618f58760e51b81527f19c08f49000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561654a57600080fd5b505af115801561655e573d6000803e3d6000fd5b50506020546021546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a9593506107dc928692600092911690889060040161b3f8565b60006040516020016165c79061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561667557600080fd5b505af1158015616689573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156166f957600080fd5b505af115801561670d573d6000803e3d6000fd5b50506020546021546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c39aca3793506107dc9286921690600190600090899060040161b487565b60006040516020016167789061aeca565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561682657600080fd5b505af115801561683a573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156168aa57600080fd5b505af11580156168be573d6000803e3d6000fd5b50506020546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c39aca3793506107dc92869260009260019290911690899060040161b487565b600061692461aa63565b61692f8484836169b8565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b1580156169a457600080fd5b505afa15801561080a573d6000803e3d6000fd5b6000806169c58584616a33565b9050616a286040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001616a1392919061b4dc565b60405160208183030381529060405285616a3f565b9150505b9392505050565b6000616a2c8383616a6d565b60c08101515160009015616a6357616a5c84848460c00151616a88565b9050616a2c565b616a5c8484616c2e565b6000616a798383616d19565b616a2c83836020015184616a3f565b600080616a93616d29565b90506000616aa18683616dfc565b90506000616ab882606001518360200151856172a2565b90506000616ac8838389896174b4565b90506000616ad582618331565b602081015181519192509060030b15616b4857898260400151604051602001616aff92919061b4fe565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252616b3f9160040161b372565b60405180910390fd5b6000616b8b6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001618500565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d90616bde90849060040161b372565b602060405180830381865afa158015616bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616c1f919061b0e4565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc92590616c8390879060040161b372565b600060405180830381865afa158015616ca0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616cc8919081019061b638565b90506000616cf68285604051602001616ce292919061b66d565b604051602081830303815290604052618700565b90506001600160a01b03811661692f578484604051602001616aff92919061b69c565b616d2582826000618713565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90616db090849060040161b747565b600060405180830381865afa158015616dcd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616df5919081019061b78e565b9250505090565b616e2e6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d9050616e796040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b616e8285618816565b60208201526000616e9286618bfb565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015616ed4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616efc919081019061b78e565b86838560200151604051602001616f16949392919061b7d7565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190616f6e90859060040161b372565b600060405180830381865afa158015616f8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616fb3919081019061b78e565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690616ffb90849060040161b8db565b602060405180830381865afa158015617018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061703c919061b202565b6170515781604051602001616aff919061b92d565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061709690849060040161b9bf565b600060405180830381865afa1580156170b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526170db919081019061b78e565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061712290849060040161ba11565b602060405180830381865afa15801561713f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190617163919061b202565b156171f8576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906171ad90849060040161ba11565b600060405180830381865afa1580156171ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526171f2919081019061b78e565b60408501525b846001600160a01b03166349c4fac882866000015160405160200161721d919061ba63565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161724992919061bacf565b600060405180830381865afa158015617266573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261728e919081019061b78e565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816172be5790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061731e5761731e61baf4565b60200260200101819052506040518060400160405280600381526020017f2d726c0000000000000000000000000000000000000000000000000000000000815250816001815181106173725761737261baf4565b60200260200101819052508460405160200161738e919061bb23565b604051602081830303815290604052816002815181106173b0576173b061baf4565b6020026020010181905250826040516020016173cc919061bb8f565b604051602081830303815290604052816003815181106173ee576173ee61baf4565b6020026020010181905250600061740482618331565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506174959060408051808201825260008082526020918201528151808301909252845182528085019082015290618e7e565b6174aa5785604051602001616aff919061bbd0565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015617504565b511590565b617678578260200151156175c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401616b3f565b8260c0015115617678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401616b3f565b6040805160ff8082526120008201909252600091816020015b606081526020019060019003908161769157905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806176ec9061bc61565b935060ff16815181106177015761770161baf4565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001617752919061bc80565b60405160208183030381529060405282828061776d9061bc61565b935060ff16815181106177825761778261baf4565b60200260200101819052506040518060400160405280600681526020017f6465706c6f7900000000000000000000000000000000000000000000000000008152508282806177cf9061bc61565b935060ff16815181106177e4576177e461baf4565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d650000000000000000000000000000000000008152508282806178319061bc61565b935060ff16815181106178465761784661baf4565b602002602001018190525087602001518282806178629061bc61565b935060ff16815181106178775761787761baf4565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806178c49061bc61565b935060ff16815181106178d9576178d961baf4565b6020908102919091010152875182826178f18161bc61565b935060ff16815181106179065761790661baf4565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e496400000000000000000000000000000000000000000000008152508282806179539061bc61565b935060ff16815181106179685761796861baf4565b602002602001018190525061797c46618edf565b82826179878161bc61565b935060ff168151811061799c5761799c61baf4565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806179e99061bc61565b935060ff16815181106179fe576179fe61baf4565b602002602001018190525086828280617a169061bc61565b935060ff1681518110617a2b57617a2b61baf4565b6020908102919091010152855115617b525760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282617a7c8161bc61565b935060ff1681518110617a9157617a9161baf4565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90617ae190899060040161b372565b600060405180830381865afa158015617afe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617b26919081019061b78e565b8282617b318161bc61565b935060ff1681518110617b4657617b4661baf4565b60200260200101819052505b846020015115617c225760408051808201909152601281527f2d2d766572696679536f75726365436f6465000000000000000000000000000060208201528282617b9b8161bc61565b935060ff1681518110617bb057617bb061baf4565b60200260200101819052506040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250828280617bfd9061bc61565b935060ff1681518110617c1257617c1261baf4565b6020026020010181905250617de9565b617c5a6174ff8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b617ced5760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282617c9d8161bc61565b935060ff1681518110617cb257617cb261baf4565b60200260200101819052508460a00151604051602001617cd2919061bb23565b604051602081830303815290604052828280617bfd9061bc61565b8460c00151158015617d30575060408089015181518083018352600080825260209182015282518084019093528151835290810190820152617d2e90511590565b155b15617de95760408051808201909152600d81527f2d2d6c6963656e7365547970650000000000000000000000000000000000000060208201528282617d748161bc61565b935060ff1681518110617d8957617d8961baf4565b6020026020010181905250617d9d88618f7f565b604051602001617dad919061bb23565b604051602081830303815290604052828280617dc89061bc61565b935060ff1681518110617ddd57617ddd61baf4565b60200260200101819052505b60408086015181518083018352600080825260209182015282518084019093528151835290810190820152617e1d90511590565b617eb25760408051808201909152600b81527f2d2d72656c61796572496400000000000000000000000000000000000000000060208201528282617e608161bc61565b935060ff1681518110617e7557617e7561baf4565b60200260200101819052508460400151828280617e919061bc61565b935060ff1681518110617ea657617ea661baf4565b60200260200101819052505b606085015115617fd35760408051808201909152600681527f2d2d73616c74000000000000000000000000000000000000000000000000000060208201528282617efb8161bc61565b935060ff1681518110617f1057617f1061baf4565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015617f7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617fa7919081019061b78e565b8282617fb28161bc61565b935060ff1681518110617fc757617fc761baf4565b60200260200101819052505b60e0850151511561807a5760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261801d8161bc61565b935060ff16815181106180325761803261baf4565b602002602001018190525061804e8560e0015160000151618edf565b82826180598161bc61565b935060ff168151811061806e5761806e61baf4565b60200260200101819052505b60e085015160200151156181245760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826180c78161bc61565b935060ff16815181106180dc576180dc61baf4565b60200260200101819052506180f88560e0015160200151618edf565b82826181038161bc61565b935060ff16815181106181185761811861baf4565b60200260200101819052505b60e085015160400151156181ce5760408051808201909152600e81527f2d2d6d6178466565506572476173000000000000000000000000000000000000602082015282826181718161bc61565b935060ff16815181106181865761818661baf4565b60200260200101819052506181a28560e0015160400151618edf565b82826181ad8161bc61565b935060ff16815181106181c2576181c261baf4565b60200260200101819052505b60e085015160600151156182785760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261821b8161bc61565b935060ff16815181106182305761823061baf4565b602002602001018190525061824c8560e0015160600151618edf565b82826182578161bc61565b935060ff168151811061826c5761826c61baf4565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156182965761829661b224565b6040519080825280602002602001820160405280156182c957816020015b60608152602001906001900390816182b45790505b50905060005b8260ff168160ff16101561832257838160ff16815181106182f2576182f261baf4565b6020026020010151828260ff168151811061830f5761830f61baf4565b60209081029190910101526001016182cf565b5093505050505b949350505050565b6183586040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916183de9186910161bceb565b600060405180830381865afa1580156183fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052618423919081019061b78e565b905060006184318683619a6e565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401618461919061adbc565b6000604051808303816000875af1158015618480573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526184a8919081019061bd32565b805190915060030b158015906184c15750602081015151155b80156184d05750604081015151155b156174aa57816000815181106184e8576184e861baf4565b6020026020010151604051602001616aff919061bde8565b606060006185358560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252865182528087019082015290915061856c9082905b90619bc3565b156186c95760006185e9826185e3846185dd6185af8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90619bea565b90619c4c565b604080518082018252600181527f0a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061864d908290619bc3565b156186b757604080518082018252600181527f0a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526186b4905b8290619cd1565b90505b6186c081619cf7565b92505050616a2c565b82156186e2578484604051602001616aff92919061bfd4565b5050604080516020810190915260008152616a2c565b509392505050565b6000808251602084016000f09392505050565b8160a001511561872257505050565b600061872f848484619d60565b9050600061873c82618331565b602081015181519192509060030b1580156187d85750604080518082018252600781527f5355434345535300000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526187d890604080518082018252600080825260209182015281518083019092528451825280850190820152618566565b156187e557505050505050565b60408201515115618805578160400151604051602001616aff919061c07b565b80604051602001616aff919061c0d9565b6060600061884b8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506188b0905b8290618e7e565b1561891f57604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a2c9061891a90839061a2fb565b619cf7565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618981905b829061a385565b600103618a4e57604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526189e7906186ad565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a2c9061891a905b8390619cd1565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618aad906188a9565b15618be457604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290618b1590839061a41f565b905060008160018351618b28919061b461565b81518110618b3857618b3861baf4565b60200260200101519050618bdb61891a618bae6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925285518252808601908201529061a2fb565b95945050505050565b82604051602001616aff919061c144565b50919050565b60606000618c308360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150618c92906188a9565b15618ca057616a2c81619cf7565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618cff9061897a565b600103618d6957604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a2c9061891a90618a47565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618dc8906188a9565b15618be457604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290618e3090839061a41f565b9050600181511115618e6c578060028251618e4b919061b461565b81518110618e5b57618e5b61baf4565b602002602001015192505050919050565b5082604051602001616aff919061c144565b805182516000911115618e9357506000616933565b81518351602085015160009291618ea99161b474565b618eb3919061b461565b905082602001518103618eca576001915050616933565b82516020840151819020912014905092915050565b60606000618eec8361a4c4565b600101905060008167ffffffffffffffff811115618f0c57618f0c61b224565b6040519080825280601f01601f191660200182016040528015618f36576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084618f4057509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e534544000000000000000000000000000000000000000000008184019081528551808701875283815284019290925284518086019095525184529083015260609161900b905b829061a5a6565b1561904b57505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526190aa90619004565b156190ea57505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d495400000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261914990619004565b1561918957505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526191e890619004565b8061924d5750604080518082018252601081527f47504c2d322e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261924d90619004565b1561928d57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526192ec90619004565b806193515750604080518082018252601081527f47504c2d332e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261935190619004565b1561939157505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526193f090619004565b806194555750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261945590619004565b1561949557505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526194f490619004565b806195595750604080518082018252601181527f4c47504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261955990619004565b1561959957505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c617573650000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526195f890619004565b1561963857505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261969790619004565b156196d757505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261973690619004565b1561977657505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e3000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526197d590619004565b1561981557505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261987490619004565b156198b457505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261991390619004565b806199785750604080518082018252601181527f4147504c2d332e302d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261997890619004565b156199b857505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152619a1790619004565b15619a5757505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151616aff929060200161c222565b60608060005b8451811015619af95781858281518110619a9057619a9061baf4565b6020026020010151604051602001619aa992919061b66d565b604051602081830303815290604052915060018551619ac8919061b461565b8114619af15781604051602001619adf919061c38b565b60405160208183030381529060405291505b600101619a74565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081619b125790505090508381600081518110619b3d57619b3d61baf4565b60200260200101819052506040518060400160405280600281526020017f2d6300000000000000000000000000000000000000000000000000000000000081525081600181518110619b9157619b9161baf4565b60200260200101819052508181600281518110619bb057619bb061baf4565b6020908102919091010152949350505050565b6020808301518351835192840151600093619be1929184919061a5ba565b14159392505050565b60408051808201909152600080825260208201526000619c1c846000015185602001518560000151866020015161a6cb565b9050836020015181619c2e919061b461565b84518590619c3d90839061b461565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015619c71575081616933565b6020808301519084015160019114619c985750815160208481015190840151829020919020145b8015619cc957825184518590619caf90839061b461565b9052508251602085018051619cc590839061b474565b9052505b509192915050565b6040805180820190915260008082526020820152619cf083838361a7eb565b5092915050565b60606000826000015167ffffffffffffffff811115619d1857619d1861b224565b6040519080825280601f01601f191660200182016040528015619d42576020820181803683370190505b5090506000602082019050619cf0818560200151866000015161a896565b60606000619d6c616d29565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081619d8957905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280619de49061bc61565b935060ff1681518110619df957619df961baf4565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001619e4a919061c3cc565b604051602081830303815290604052828280619e659061bc61565b935060ff1681518110619e7a57619e7a61baf4565b60200260200101819052506040518060400160405280600881526020017f76616c6964617465000000000000000000000000000000000000000000000000815250828280619ec79061bc61565b935060ff1681518110619edc57619edc61baf4565b602002602001018190525082604051602001619ef8919061bb8f565b604051602081830303815290604052828280619f139061bc61565b935060ff1681518110619f2857619f2861baf4565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e747261637400000000000000000000000000000000000000000000815250828280619f759061bc61565b935060ff1681518110619f8a57619f8a61baf4565b6020026020010181905250619f9f878461a910565b8282619faa8161bc61565b935060ff1681518110619fbf57619fbf61baf4565b60209081029190910101528551511561a06b5760408051808201909152600b81527f2d2d7265666572656e63650000000000000000000000000000000000000000006020820152828261a0118161bc61565b935060ff168151811061a0265761a02661baf4565b602002602001018190525061a03f86600001518461a910565b828261a04a8161bc61565b935060ff168151811061a05f5761a05f61baf4565b60200260200101819052505b85608001511561a0d95760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261a0b48161bc61565b935060ff168151811061a0c95761a0c961baf4565b602002602001018190525061a13f565b841561a13f5760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261a11e8161bc61565b935060ff168151811061a1335761a13361baf4565b60200260200101819052505b6040860151511561a1db5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261a1898161bc61565b935060ff168151811061a19e5761a19e61baf4565b6020026020010181905250856040015182828061a1ba9061bc61565b935060ff168151811061a1cf5761a1cf61baf4565b60200260200101819052505b85606001511561a2455760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261a2248161bc61565b935060ff168151811061a2395761a23961baf4565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561a2635761a26361b224565b60405190808252806020026020018201604052801561a29657816020015b606081526020019060019003908161a2815790505b50905060005b8260ff168160ff16101561a2ef57838160ff168151811061a2bf5761a2bf61baf4565b6020026020010151828260ff168151811061a2dc5761a2dc61baf4565b602090810291909101015260010161a29c565b50979650505050505050565b604080518082019091526000808252602082015281518351101561a320575081616933565b8151835160208501516000929161a3369161b474565b61a340919061b461565b6020840151909150600190821461a361575082516020840151819020908220145b801561a37c5783518551869061a37890839061b461565b9052505b50929392505050565b600080826000015161a3a9856000015186602001518660000151876020015161a6cb565b61a3b3919061b474565b90505b8351602085015161a3c7919061b474565b8111619cf0578161a3d78161c411565b925050826000015161a40e85602001518361a3f2919061b461565b865161a3fe919061b461565b838660000151876020015161a6cb565b61a418919061b474565b905061a3b6565b6060600061a42d848461a385565b61a43890600161b474565b67ffffffffffffffff81111561a4505761a45061b224565b60405190808252806020026020018201604052801561a48357816020015b606081526020019060019003908161a46e5790505b50905060005b81518110156186f85761a49f61891a8686619cd1565b82828151811061a4b15761a4b161baf4565b602090810291909101015260010161a489565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061a50d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061a539576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061a55757662386f26fc10000830492506010015b6305f5e100831061a56f576305f5e100830492506008015b612710831061a58357612710830492506004015b6064831061a595576064830492506002015b600a83106169335760010192915050565b600061a5b2838361a950565b159392505050565b60008085841161a6c1576020841161a66d576000841561a60557600161a5e186602061b461565b61a5ec90600861c42b565b61a5f790600261c529565b61a601919061b461565b1990505b835181168561a614898961b474565b61a61e919061b461565b805190935082165b81811461a6585787841161a6405787945050505050618329565b8361a64a8161c535565b94505082845116905061a626565b61a662878561b474565b945050505050618329565b83832061a67a858861b461565b61a684908761b474565b91505b85821061a6bf5784822080820361a6ac5761a6a2868461b474565b9350505050618329565b61a6b760018461b461565b92505061a687565b505b5092949350505050565b6000838186851161a7d6576020851161a785576000851561a71757600161a6f387602061b461565b61a6fe90600861c42b565b61a70990600261c529565b61a713919061b461565b1990505b8451811660008761a7288b8b61b474565b61a732919061b461565b855190915083165b82811461a7775781861061a75f5761a7528b8b61b474565b9650505050505050618329565b8561a7698161c411565b96505083865116905061a73a565b859650505050505050618329565b508383206000905b61a797868961b461565b821161a7d45785832080820361a7b35783945050505050618329565b61a7be60018561b474565b935050818061a7cc9061c411565b92505061a78d565b505b61a7e0878761b474565b979650505050505050565b6040805180820190915260008082526020820152600061a81d856000015186602001518660000151876020015161a6cb565b60208087018051918601919091525190915061a839908261b461565b83528451602086015161a84c919061b474565b810361a85b576000855261a88d565b8351835161a869919061b474565b8551869061a87890839061b461565b905250835161a887908261b474565b60208601525b50909392505050565b6020811061a8ce578151835261a8ad60208461b474565b925061a8ba60208361b474565b915061a8c760208261b461565b905061a896565b600019811561a8fd57600161a8e483602061b461565b61a8f09061010061c529565b61a8fa919061b461565b90505b9151835183169219169190911790915250565b6060600061a91e8484616dfc565b805160208083015160405193945061a9389390910161c54c565b60405160208183030381529060405291505092915050565b815181516000919081111561a963575081515b6020808501519084015160005b8381101561aa1c578251825180821461a9ec57600019602087101561a9cb5760018461a99d89602061b461565b61a9a7919061b474565b61a9b290600861c42b565b61a9bd90600261c529565b61a9c7919061b461565b1990505b818116838216818103911461a9e95797506169339650505050505050565b50505b61a9f760208661b474565b945061aa0460208561b474565b9350505060208161aa15919061b474565b905061a970565b50845186516174aa919061c5a4565b610b67806200c5c583390190565b61063d806200d12c83390190565b61106f806200d76983390190565b611e01806200e7d883390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161aaa661aaab565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161aaa66040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b8181101561ab5d5783516001600160a01b031683526020938401939092019160010161ab36565b509095945050505050565b60005b8381101561ab8357818101518382015260200161ab6b565b50506000910152565b6000815180845261aba481602086016020860161ab68565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561acb4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b8181101561ac9a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261ac8484865161ab8c565b602095860195909450929092019160010161ac4a565b50919750505060209485019492909201915060010161abe0565b50929695505050505050565b600081518084526020840193506020830160005b8281101561ad145781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161acd4565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561acb4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516040875261ad8a604088018261ab8c565b905060208201519150868103602088015261ada5818361acc0565b96505050602093840193919091019060010161ad46565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561acb4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261ae1e85835161ab8c565b9450602093840193919091019060010161ade4565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561acb4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b038151168652602081015190506040602087015261aeb4604087018261acc0565b955050602093840193919091019060010161ae5b565b60208152600061693360208301600581527f68656c6c6f000000000000000000000000000000000000000000000000000000602082015260400190565b600181811c9082168061af1b57607f821691505b602082108103618bf5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546001600160a01b038116845267ffffffffffffffff8160a01c1660208501525060018201606060408501526000815461af908161af07565b806060880152600182166000811461afaf576001811461afe95761b01d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b890101935061b01d565b84600052602060002060005b8381101561b0145781548a82016080015260019091019060200161aff5565b89016080019450505b50919695505050505050565b602081526000616a2c602083018461af54565b600081516060845261b051606085018261ab8c565b90506001600160a01b036020840151166020850152604083015160408501528091505092915050565b60c08152600061b08d60c083018961b03c565b6001600160a01b03881660208401528660408401526001600160a01b0386166060840152828103608084015261b0c3818661ab8c565b905082810360a084015261b0d7818561af54565b9998505050505050505050565b60006020828403121561b0f657600080fd5b81516001600160a01b0381168114616a2c57600080fd5b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff881660408301528660608301526003861061b1c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a083015261b1e860c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b60006020828403121561b21457600080fd5b81518015158114616a2c57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561131a57806000526020600020601f840160051c8101602085101561b27a5750805b601f840160051c820191505b818110156131a9576000815560010161b286565b815167ffffffffffffffff81111561b2b45761b2b461b224565b61b2c88161b2c2845461af07565b8461b253565b6020601f82116001811461b2fc576000831561b2e45750848201515b600019600385901b1c1916600184901b1784556131a9565b600084815260208120601f198516915b8281101561b32c578785015182556020948501946001909201910161b30c565b508482101561b34a5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561b36b57600080fd5b5051919050565b602081526000616a2c602083018461ab8c565b60a08152600061b39860a083018761ab8c565b6001600160a01b03861660208401528460408401526001600160a01b0384166060840152828103608084015261a7e081600581527f68656c6c6f000000000000000000000000000000000000000000000000000000602082015260400190565b60808152600061b40b608083018761b03c565b8560208401526001600160a01b0385166040840152828103606084015261a7e0818561ab8c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156169335761693361b432565b808201808211156169335761693361b432565b60a08152600061b49a60a083018861b03c565b6001600160a01b03871660208401528560408401526001600160a01b0385166060840152828103608084015261b4d0818561ab8c565b98975050505050505050565b6001600160a01b0383168152604060208201526000618329604083018461ab8c565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161b53681601a85016020880161ab68565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161b57381601c84016020880161ab68565b01601c01949350505050565b6040516060810167ffffffffffffffff8111828210171561b5a25761b5a261b224565b60405290565b60008067ffffffffffffffff84111561b5c35761b5c361b224565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561b5f25761b5f261b224565b60405283815290508082840185101561b60a57600080fd5b6186f884602083018561ab68565b600082601f83011261b62957600080fd5b616a2c8383516020850161b5a8565b60006020828403121561b64a57600080fd5b815167ffffffffffffffff81111561b66157600080fd5b61692f8482850161b618565b6000835161b67f81846020880161ab68565b83519083019061b69381836020880161ab68565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161b6d481601a85016020880161ab68565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161b71181603384016020880161ab68565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000616a2c608083018461ab8c565b60006020828403121561b7a057600080fd5b815167ffffffffffffffff81111561b7b757600080fd5b8201601f8101841361b7c857600080fd5b61692f8482516020840161b5a8565b6000855161b7e9818460208a0161ab68565b7f2f00000000000000000000000000000000000000000000000000000000000000908301908152855161b823816001840160208a0161ab68565b7f2f0000000000000000000000000000000000000000000000000000000000000060019290910191820152845161b86181600284016020890161ab68565b6001818301019150507f2f000000000000000000000000000000000000000000000000000000000000006001820152835161b8a381600284016020880161ab68565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b60408152600061b8ee604083018461ab8c565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e206172746966616374200081526000825161b96581601f85016020870161ab68565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b60408152600061b9d2604083018461ab8c565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b60408152600061ba24604083018461ab8c565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b2700000000000000000000000081526000825161ba9b81601485016020870161ab68565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b60408152600061bae2604083018561ab8c565b8281036020840152616a28818561ab8c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f220000000000000000000000000000000000000000000000000000000000000081526000825161bb5b81600185016020870161ab68565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b6000825161bba181846020870161ab68565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161bc5481604b85016020870161ab68565b91909101604b0192915050565b600060ff821660ff810361bc775761bc7761b432565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161bcde81602985016020870161ab68565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000616a2c608083018461ab8c565b60006020828403121561bd4457600080fd5b815167ffffffffffffffff81111561bd5b57600080fd5b82016060818503121561bd6d57600080fd5b61bd7561b57f565b81518060030b811461bd8657600080fd5b8152602082015167ffffffffffffffff81111561bda257600080fd5b61bdae8682850161b618565b602083015250604082015167ffffffffffffffff81111561bdce57600080fd5b61bdda8682850161b618565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161be4681602185016020870161ab68565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161c03281602185016020880161ab68565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161c06f81602e84016020880161ab68565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161bcde81602985016020870161ab68565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161c13781602285016020870161ab68565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161c17c81600e85016020870161ab68565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161c25a81601885016020880161ab68565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161c29781601c84016020880161ab68565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161c39d81846020870161ab68565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161c40481601c85016020870161ab68565b91909101601c0192915050565b6000600019820361c4245761c42461b432565b5060010190565b80820281158282048414176169335761693361b432565b6001815b600184111561c47d5780850481111561c4615761c46161b432565b600184161561c46f57908102905b60019390931c92800261c446565b935093915050565b60008261c49457506001616933565b8161c4a157506000616933565b816001811461c4b7576002811461c4c15761c4dd565b6001915050616933565b60ff84111561c4d25761c4d261b432565b50506001821b616933565b5060208310610133831016604e8410600b841016171561c500575081810a616933565b61c50d600019848461c442565b806000190482111561c5215761c52161b432565b029392505050565b6000616a2c838361c485565b60008161c5445761c54461b432565b506000190190565b6000835161c55e81846020880161ab68565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161c59881600184016020880161ab68565b01600101949350505050565b8181036000831280158383131683831282161715619cf057619cf061b43256fe60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610114565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610114565b506002805460ff1916601217905534801561006f57600080fd5b506101d2565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561010f57806000526020600020601f840160051c810160208510156100ec5750805b601f840160051c820191505b8181101561010c57600081556001016100f8565b50505b505050565b81516001600160401b0381111561012d5761012d610075565b6101418161013b845461008b565b846100c5565b6020601f821160018114610175576000831561015d5750848201515b600019600385901b1c1916600184901b17845561010c565b600084815260208120601f198516915b828110156101a55787850151825560209485019460019092019101610185565b50848210156101c35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610986806101e16000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610745565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046107da565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610804565b6103bd565b34801561017857600080fd5b506100cd610187366004610841565b610647565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d336600461085a565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e9610724565b34801561020657600080fd5b5061011f6102153660046107da565b610731565b6100cd61025a565b34801561022e57600080fd5b5061013e61023d366004610875565b600460209081526000928352604080842090915290825290205481565b33600090815260036020526040812080543492906102799084906108d7565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c2906108ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee906108ea565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561042b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600060248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104a1575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105605773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561051a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091528120805484929061055a90849061093d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061059590849061093d565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548492906105cf9084906108d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161063591815260200190565b60405180910390a35060019392505050565b3360009081526003602052604090205481111561069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b33600090815260036020526040812080548392906106b990849061093d565b9091555050604051339082156108fc029083906000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c2906108ea565b600061073e3384846103bd565b9392505050565b602081526000825180602084015260005b818110156107735760208186018101516040868401015201610756565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107d557600080fd5b919050565b600080604083850312156107ed57600080fd5b6107f6836107b1565b946020939093013593505050565b60008060006060848603121561081957600080fd5b610822846107b1565b9250610830602085016107b1565b929592945050506040919091013590565b60006020828403121561085357600080fd5b5035919050565b60006020828403121561086c57600080fd5b61073e826107b1565b6000806040838503121561088857600080fd5b610891836107b1565b915061089f602084016107b1565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76108a8565b600181811c908216806108fe57607f821691505b602082108103610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76108a856fea264697066735822122008d7fc4e09519c5dd9f356b03596f6829a151d0bc7682533f9ceab4e459f5ee264736f6c634300081a00336080604052348015600f57600080fd5b5061061e8061001f6000396000f3fe60806040526004361061002a5760003560e01c8063660b9de014610033578063de43156e1461005357005b3661003157005b005b34801561003f57600080fd5b5061003161004e366004610140565b610073565b34801561005f57600080fd5b5061003161006e3660046101a6565b6100ad565b7f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76816040516100a291906102a7565b60405180910390a150565b606081156100c4576100c1828401846103a2565b90505b7fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e6100ef8780610498565b6100ff60408a0160208b01610504565b8960400135338660405161011896959493929190610526565b60405180910390a1505050505050565b60006060828403121561013a57600080fd5b50919050565b60006020828403121561015257600080fd5b813567ffffffffffffffff81111561016957600080fd5b61017584828501610128565b949350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101a157600080fd5b919050565b6000806000806000608086880312156101be57600080fd5b853567ffffffffffffffff8111156101d557600080fd5b6101e188828901610128565b9550506101f06020870161017d565b935060408601359250606086013567ffffffffffffffff81111561021357600080fd5b8601601f8101881361022457600080fd5b803567ffffffffffffffff81111561023b57600080fd5b88602082840101111561024d57600080fd5b959894975092955050506020019190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff6102c98361017d565b1660208201526000602083013567ffffffffffffffff81168082146102ed57600080fd5b806040850152505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261032a57600080fd5b830160208101903567ffffffffffffffff81111561034757600080fd5b80360382131561035657600080fd5b60608085015261036a60808501828461025e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103b457600080fd5b813567ffffffffffffffff8111156103cb57600080fd5b8201601f810184136103dc57600080fd5b803567ffffffffffffffff8111156103f6576103f6610373565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561046257610462610373565b60405281815282820160200186101561047a57600080fd5b81602084016020830137600091810160200191909152949350505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b6020019150368190038213156104fd57600080fd5b9250929050565b60006020828403121561051657600080fd5b61051f8261017d565b9392505050565b60a08152600061053a60a08301888a61025e565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015273ffffffffffffffffffffffffffffffffffffffff851660608401528281036080840152835180825260005b818110156105a457602081870181015184830182015201610588565b5060006020828401015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168301019250505097965050505050505056fea2646970667358221220bb6e62150859f03aca6fe4999cc24cdd05253b707ded08a7425095e3124a55a564736f6c634300081a003360c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a2646970667358221220910d81c83d9edc40abf4687991f8e6349744976b3a49ef70bb05dbf669b1ae1b64736f6c634300081a0033", + ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testDeposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsITargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsITargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositAndRevertZRC20AndCallUniversalContractFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfAmountIs0\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfSenderNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfTargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfTargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversal\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZETAAndCallUniversalContractFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfAmountIsZero\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractIfTargetIsFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositZRC20AndCallUniversalContractIfTargetIsGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteFailsIfZRC20IsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractFailsIfTargetIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteRevertUniversalContractIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteUniversalContract\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteUniversalContractFailsIfSenderIsNotFungibleModule\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testExecuteUniversalContractFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ContextData\",\"inputs\":[{\"name\":\"origin\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"msgSender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ContextDataRevert\",\"inputs\":[{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061fcd78061003c6000396000f3fe608060405234801561001057600080fd5b506004361061034c5760003560e01c806385226c81116101bd578063ba414fa6116100f9578063e20c9f71116100a2578063ec294d9f1161007c578063ec294d9f1461054a578063ef2b539414610552578063fa7626d41461055a578063fb339a1c1461056757600080fd5b8063e20c9f7114610505578063e63ab1e91461050d578063eab7674e1461054257600080fd5b8063d9978513116100d3578063d9978513146104ed578063d9a4fa16146104f5578063e09bc659146104fd57600080fd5b8063ba414fa6146104c5578063c7b388b1146104dd578063c8814d2e146104e557600080fd5b80639c9acd5d11610166578063b0464fdc11610140578063b0464fdc146104a5578063b5508aa9146104ad578063b8f2b821146104b5578063b936be8c146104bd57600080fd5b80639c9acd5d1461048d5780639ca37e9214610495578063a0b2c7b11461049d57600080fd5b806396d9d8761161019757806396d9d8761461047d57806397f7661f14610443578063996b76751461048557600080fd5b806385226c811461044b578063884660a314610460578063916a17c61461046857600080fd5b80633f7286f41161028c5780635cec7db5116102355780636efa04b51161020f5780636efa04b51461042b5780637cec29b0146104335780637f924c4e1461043b578063828d267c1461044357600080fd5b80635cec7db51461040657806366d9a9a01461040e578063671b91e21461042357600080fd5b806351336fb01161026657806351336fb0146103f657806358c9987f146103fe5780635b4c90e1146103a157600080fd5b80633f7286f4146103de57806344b2a40b146103e657806348f4fd07146103ee57600080fd5b80632468bc0f116102f95780632fa381f4116102d35780632fa381f4146103be578063339bd828146103c65780633ab5b199146103ce5780633e5e3c23146103d657600080fd5b80632468bc0f146103995780632948df41146103a15780632ade3880146103a957600080fd5b8063198d5ca41161032a578063198d5ca41461036b5780631c785a14146103735780631ed7831c1461037b57600080fd5b8063084fafab146103515780630a9254e41461035b57806314b7a6da14610363575b600080fd5b61035961056f565b005b610359610745565b610359611252565b6103596113a2565b610359611625565b610383611f3c565b604051610390919061a1f6565b60405180910390f35b610359611f9e565b610359612469565b6103b1612652565b604051610390919061a292565b610359612794565b610359612986565b610359612ad2565b610383612c83565b610383612ce3565b610359612d43565b610359612ecb565b610359613016565b610359613161565b610359613316565b6104166134cd565b604051610390919061a3f8565b61035961364f565b61035961379d565b610359613b41565b610359613db4565b610359613ded565b610453613f99565b604051610390919061a496565b610359614069565b610470614348565b604051610390919061a50d565b610359614443565b610359614596565b6103596146ea565b61035961483a565b610359614971565b610470614b2c565b610453614c27565b610359614cf7565b610359614e45565b6104cd615128565b6040519015158152602001610390565b6103596151fc565b6103596153ba565b6103596154fc565b6103596155c4565b610359615782565b61038361593b565b6105347f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b604051908152602001610390565b61035961599b565b610359615ae9565b610359615c98565b601f546104cd9060ff1681565b610359615e49565b602480546040517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190529281018390526044810183905260648101929092526001600160a01b03166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156105fe57600080fd5b505af1158015610612573d6000803e3d6000fd5b505050507f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76602b604051610646919061a6c6565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b1580156106a857600080fd5b505af11580156106bc573d6000803e3d6000fd5b50506020546024546040517f717d335f0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063717d335f93506107119290911690602b9060040161a6d9565b600060405180830381600087803b15801561072b57600080fd5b505af115801561073f573d6000803e3d6000fd5b50505050565b602580547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556026805490911661123417905560405161078b9061a109565b604051809103906000f0801580156107a7573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600f81527f476174657761795a45564d2e736f6c00000000000000000000000000000000006020820152602554915160248101939093529216604482015261088b919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc95500000000000000000000000000000000000000000000000000000000179052615ffc565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b039384168102919091179182905560208054919092049092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682178155604080517f3ce4a5bc0000000000000000000000000000000000000000000000000000000081529051633ce4a5bc926004808401939192918290030181865afa15801561094d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610971919061a6fb565b602780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556040516109b59061a116565b604051809103906000f0801580156109d1573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161781556027546040517f06447d5600000000000000000000000000000000000000000000000000000000815292166004830152737109709ecfa91a80626ff3989d68f67f5b1dd12d916306447d569101600060405180830381600087803b158015610a6d57600080fd5b505af1158015610a81573d6000803e3d6000fd5b505050506000806000604051610a969061a123565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610ad2573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602054604051601293600193849360009391921690610b289061a130565b610b379695949392919061a724565b604051809103906000f080158015610b53573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081179091556023546040517fee2815ba0000000000000000000000000000000000000000000000000000000081526001600482015260248101929092529091169063ee2815ba90604401600060405180830381600087803b158015610bea57600080fd5b505af1158015610bfe573d6000803e3d6000fd5b50506023546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610c6857600080fd5b505af1158015610c7c573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610cfc57600080fd5b505af1158015610d10573d6000803e3d6000fd5b50505050602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d6557600080fd5b505af1158015610d79573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e11919061a819565b506021546025546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116906347e7ef24906044016020604051808303816000875af1158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061a819565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610f0557600080fd5b505af1158015610f19573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b158015610f8f57600080fd5b505af1158015610fa3573d6000803e3d6000fd5b50506021546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a060248201529116925063095ea7b391506044016020604051808303816000875af1158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b919061a819565b50602260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0600a6040518263ffffffff1660e01b81526004016000604051808303818588803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b50506022546020546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600a60248201529116935063095ea7b3925060440190506020604051808303816000875af1158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061a819565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b505af11580156111ac573d6000803e3d6000fd5b505060408051606081018252600080825260016020808401918252845190810185529182529282018190528151602b8054945167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009095166001600160a01b039290921691909117939093178355909350909150602c9061124d908261a8b1565b505050565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156112ab57600080fd5b505af11580156112bf573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561132f57600080fd5b505af1158015611343573d6000803e3d6000fd5b50506020546021546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260016024820152600060448201529116925063f45346dc9150606401610711565b6021546026546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa1580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611417919061a970565b905061142460008261601b565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b5050604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561150157600080fd5b505af1158015611515573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810188905290821660448201529116925063f45346dc9150606401600060405180830381600087803b15801561158d57600080fd5b505af11580156115a1573d6000803e3d6000fd5b50506021546026546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa1580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611618919061a970565b905061124d60008261601b565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061177d919060040161a989565b600060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117ff57600080fd5b505af1158015611813573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561187057600080fd5b505af1158015611884573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061196f919060040161a989565b600060405180830381600087803b15801561198957600080fd5b505af115801561199d573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119f157600080fd5b505af1158015611a05573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611a6257600080fd5b505af1158015611a76573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611aca57600080fd5b505af1158015611ade573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd93c066500000000000000000000000000000000000000000000000000000000600482015260019250737109709ecfa91a80626ff3989d68f67f5b1dd12d915063c31eb0e090602401600060405180830381600087803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611bc257600080fd5b505af1158015611bd6573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810187905290821660448201529116925063f45346dc9150606401600060405180830381600087803b158015611c4e57600080fd5b505af1158015611c62573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611cbf57600080fd5b505af1158015611cd3573d6000803e3d6000fd5b50505050602060009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d2757600080fd5b505af1158015611d3b573d6000803e3d6000fd5b50506021546026546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a08231906024015b602060405180830381865afa158015611d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db3919061a970565b9050611dc060008261601b565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810188905290821660448201529116925063f45346dc9150606401600060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b50506021546026546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015611f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f30919061a970565b905061124d838261601b565b60606016805480602002602001604051908101604052809291908181526020018280548015611f9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f76575b5050505050905090565b6022546027546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015611fef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612013919061a970565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612089919061a970565b6024546040519192506001600160a01b031631906000906120ac9060200161a99c565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561219a57600080fd5b505af11580156121ae573d6000803e3d6000fd5b5050602080546040517fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e945061220993506001600160a01b03909116910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602754602054612239936001600160a01b03928316928c92169061a9d9565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561229a57600080fd5b505af11580156122ae573d6000803e3d6000fd5b50506020546024546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a9593506123059286928c92911690889060040161aa8a565b600060405180830381600087803b15801561231f57600080fd5b505af1158015612333573d6000803e3d6000fd5b50506022546027546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa919061a970565b90506123bf6123b9888861aaf3565b8261601b565b6022546020546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612434919061a970565b9050612440868261601b565b61245f61244d898761ab06565b6024546001600160a01b03163161601b565b5050505050505050565b600060405160200161247a9061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561252857600080fd5b505af115801561253c573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156125ac57600080fd5b505af11580156125c0573d6000803e3d6000fd5b50506020546024546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063bcf7f32b935061261c92869260009260019290911690899060040161ab19565b600060405180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b505050505050565b6060601e805480602002602001604051908101604052809291908181526020016000905b8282101561278b57600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156127745783829060005260206000200180546126e79061a5a4565b80601f01602080910402602001604051908101604052809291908181526020018280546127139061a5a4565b80156127605780601f1061273557610100808354040283529160200191612760565b820191906000526020600020905b81548152906001019060200180831161274357829003601f168201915b5050505050815260200190600101906126c8565b505050508152505081526020019060010190612676565b50505050905090565b6040516001906000906127a99060200161a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561287357600080fd5b505af1158015612887573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156128e457600080fd5b505af11580156128f8573d6000803e3d6000fd5b50506020546024546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a95935061294f9286928992911690889060040161aa8a565b600060405180830381600087803b15801561296957600080fd5b505af115801561297d573d6000803e3d6000fd5b50505050505050565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156129df57600080fd5b505af11580156129f3573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612a6357600080fd5b505af1158015612a77573d6000803e3d6000fd5b50506020546021546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450630310eb7693506107119290911690600190600090602b9060040161ab6e565b6000604051602001612ae39061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015612b9157600080fd5b505af1158015612ba5573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612c1557600080fd5b505af1158015612c29573d6000803e3d6000fd5b50506020546021546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063bcf7f32b935061261c9286921690600190600090899060040161ab19565b60606018805480602002602001604051908101604052809291908181526020018280548015611f94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611f76575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015611f94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611f76575050505050905090565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612d9f57600080fd5b505af1158015612db3573d6000803e3d6000fd5b5050604051630618f58760e51b81527f82d5d76a000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612e2357600080fd5b505af1158015612e37573d6000803e3d6000fd5b50506020546021546027546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810187905290821660448201529116925063f45346dc91506064015b600060405180830381600087803b158015612eb057600080fd5b505af1158015612ec4573d6000803e3d6000fd5b5050505050565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612f2457600080fd5b505af1158015612f38573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612fa857600080fd5b505af1158015612fbc573d6000803e3d6000fd5b50506020546024546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450630310eb76935061071192600092600192911690602b9060040161ab6e565b604051630618f58760e51b81527f82d5d76a000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561308257600080fd5b505af1158015613096573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b50506020546021546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450630310eb76935061071192909116906001908590602b9060040161ab6e565b60006040516020016131729061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561322057600080fd5b505af1158015613234573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156132a457600080fd5b505af11580156132b8573d6000803e3d6000fd5b50506020546021546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca37945061261c938793811692600092911690899060040161ab19565b60405160019060009061332b9060200161a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b1580156133f557600080fd5b505af1158015613409573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561346657600080fd5b505af115801561347a573d6000803e3d6000fd5b50506020546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506321501a95915061294f90849087908590889060040161aa8a565b6060601b805480602002602001604051908101604052809291908181526020016000905b8282101561278b57838290600052602060002090600202016040518060400160405290816000820180546135249061a5a4565b80601f01602080910402602001604051908101604052809291908181526020018280546135509061a5a4565b801561359d5780601f106135725761010080835404028352916020019161359d565b820191906000526020600020905b81548152906001019060200180831161358057829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561363757602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116135e45790505b505050505081525050815260200190600101906134f1565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156136bb57600080fd5b505af11580156136cf573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561372c57600080fd5b505af1158015613740573d6000803e3d6000fd5b50506020546021546024546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039384169550630310eb76945061071193928316926001921690602b9060040161ab6e565b602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009391909116916370a082319101602060405180830381865afa1580156137ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613811919061a970565b905061381e60008261601b565b600060405160200161382f9061a99c565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561391d57600080fd5b505af1158015613931573d6000803e3d6000fd5b5050602080546040517fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e945061398c93506001600160a01b03909116910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152908290526027546020546139bd936001600160a01b0392831692600192169061a9d9565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613a1e57600080fd5b505af1158015613a32573d6000803e3d6000fd5b50506020546021546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca379450613a90938793811692600192911690899060040161ab19565b600060405180830381600087803b158015613aaa57600080fd5b505af1158015613abe573d6000803e3d6000fd5b5050602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009550921692506370a082319101602060405180830381865afa158015613b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b34919061a970565b905061073f60018261601b565b6000604051602001613b529061a99c565b60408051601f19818403018152606080840190925260205490911b6bffffffffffffffffffffffff191660808301529150600090806094810160408051808303601f190181529181529082526027546001600160a01b03908116602084015260019282018390526024805492517f81bad6f300000000000000000000000000000000000000000000000000000000815260048101859052908101849052604481018490526064810193909352166084820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613c4057600080fd5b505af1158015613c54573d6000803e3d6000fd5b5050602080546040517fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e9450613caf93506001600160a01b03909116910160609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052602754602054613ce0936001600160a01b0392831692600192169061a9d9565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa7906024015b600060405180830381600087803b158015613d4257600080fd5b505af1158015613d56573d6000803e3d6000fd5b50506020546021546024546040517fbcf7f32b0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063bcf7f32b945061261c938793811692600192911690899060040161ab19565b6021546026546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401611d72565b6000604051602001613dfe9061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015613eac57600080fd5b505af1158015613ec0573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015613f3057600080fd5b505af1158015613f44573d6000803e3d6000fd5b50506020546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506321501a95915061261c908490600190600090889060040161aa8a565b6060601a805480602002602001604051908101604052809291908181526020016000905b8282101561278b578382906000526020600020018054613fdc9061a5a4565b80601f01602080910402602001604051908101604052809291908181526020018280546140089061a5a4565b80156140555780601f1061402a57610100808354040283529160200191614055565b820191906000526020600020905b81548152906001019060200180831161403857829003601f168201915b505050505081526020019060010190613fbd565b602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009391909116916370a082319101602060405180830381865afa1580156140b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dd919061a970565b90506140ea60008261601b565b602480546040517f81bad6f30000000000000000000000000000000000000000000000000000000081526001600482018190529281018390526044810183905260648101929092526001600160a01b03166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561417957600080fd5b505af115801561418d573d6000803e3d6000fd5b505050507f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76602b6040516141c1919061a6c6565b60405180910390a160275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561422257600080fd5b505af1158015614236573d6000803e3d6000fd5b50506020546021546024546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039384169550630310eb76945061429393928316926001921690602b9060040161ab6e565b600060405180830381600087803b1580156142ad57600080fd5b505af11580156142c1573d6000803e3d6000fd5b5050602154602480546040516370a0823160e01b81526001600160a01b03918216600482015260009550921692506370a082319101602060405180830381865afa158015614313573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614337919061a970565b905061434460018261601b565b5050565b6060601d805480602002602001604051908101604052809291908181526020016000905b8282101561278b5760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561442b57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116143d85790505b5050505050815250508152602001906001019061436c565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152600190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561449f57600080fd5b505af11580156144b3573d6000803e3d6000fd5b5050604051630618f58760e51b81527f82d5d76a000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561452357600080fd5b505af1158015614537573d6000803e3d6000fd5b50506020546021546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101869052911660448201819052925063f45346dc9150606401612e96565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156145ef57600080fd5b505af1158015614603573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561467357600080fd5b505af1158015614687573d6000803e3d6000fd5b50506020546021546026546040517ff45346dc0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526000602482015290821660448201529116925063f45346dc9150606401610711565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561474357600080fd5b505af1158015614757573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156147c757600080fd5b505af11580156147db573d6000803e3d6000fd5b50506020546026546040517ff45346dc00000000000000000000000000000000000000000000000000000000815260006004820152600160248201526001600160a01b0391821660448201529116925063f45346dc9150606401610711565b600060405160200161484b9061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561491557600080fd5b505af1158015614929573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401613d28565b6040516001906000906149869060200161a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b158015614a5057600080fd5b505af1158015614a64573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614ac157600080fd5b505af1158015614ad5573d6000803e3d6000fd5b50506020546027546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a95935061294f9286928992911690889060040161aa8a565b6060601c805480602002602001604051908101604052809291908181526020016000905b8282101561278b5760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015614c0f57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411614bbc5790505b50505050508152505081526020019060010190614b50565b60606019805480602002602001604051908101604052809291908181526020016000905b8282101561278b578382906000526020600020018054614c6a9061a5a4565b80601f0160208091040260200160405190810160405280929190818152602001828054614c969061a5a4565b8015614ce35780601f10614cb857610100808354040283529160200191614ce3565b820191906000526020600020905b815481529060010190602001808311614cc657829003601f168201915b505050505081526020019060010190614c4b565b604051630618f58760e51b81527f82d5d76a000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015614d6357600080fd5b505af1158015614d77573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015614dd457600080fd5b505af1158015614de8573d6000803e3d6000fd5b50506020546021546027546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039384169550630310eb76945061071193928316926001921690602b9060040161ab6e565b6022546027546040516370a0823160e01b81526001600160a01b03918216600482015260019260009216906370a0823190602401602060405180830381865afa158015614e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614eba919061a970565b6022546020546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015614f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f30919061a970565b6024546040519192506001600160a01b03163190600090614f539060200161a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b15801561500157600080fd5b505af1158015615015573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561508557600080fd5b505af1158015615099573d6000803e3d6000fd5b50506020546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911692506321501a9591506150ee908490600190600090889060040161aa8a565b600060405180830381600087803b15801561510857600080fd5b505af115801561511c573d6000803e3d6000fd5b50505050505050505050565b60085460009060ff1615615140575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa1580156151d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151f5919061a970565b1415905090565b600060405160200161520d9061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f2b2add3d0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b1580156152d757600080fd5b505af11580156152eb573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561534857600080fd5b505af115801561535c573d6000803e3d6000fd5b50506020546021546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca37945061261c938793811692600192911690899060040161ab19565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561541357600080fd5b505af1158015615427573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561549757600080fd5b505af11580156154ab573d6000803e3d6000fd5b50506020546040517f717d335f0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116925063717d335f915061071190600090602b9060040161a6d9565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561556857600080fd5b505af115801561557c573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa7915060240161068e565b60006040516020016155d59061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561569f57600080fd5b505af11580156156b3573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561571057600080fd5b505af1158015615724573d6000803e3d6000fd5b50506020546021546027546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03938416955063c39aca37945061261c938793811692600192911690899060040161ab19565b60006040516020016157939061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401526001838301528151630618f58760e51b81527f82d5d76a0000000000000000000000000000000000000000000000000000000060048201529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163c31eb0e091602480830192600092919082900301818387803b15801561585d57600080fd5b505af1158015615871573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156158ce57600080fd5b505af11580156158e2573d6000803e3d6000fd5b50506020546021546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c39aca37935061261c92869216906001908690899060040161ab19565b60606015805480602002602001604051908101604052809291908181526020018280548015611f94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611f76575050505050905090565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156159f457600080fd5b505af1158015615a08573d6000803e3d6000fd5b5050604051630618f58760e51b81527f5d67094f000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015615a7857600080fd5b505af1158015615a8c573d6000803e3d6000fd5b50506020546021546024546040517f0310eb760000000000000000000000000000000000000000000000000000000081526001600160a01b039384169550630310eb76945061071193928316926000921690602b9060040161ab6e565b6000604051602001615afa9061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015615ba857600080fd5b505af1158015615bbc573d6000803e3d6000fd5b5050604051630618f58760e51b81527f19c08f49000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015615c2c57600080fd5b505af1158015615c40573d6000803e3d6000fd5b50506020546021546040517f21501a950000000000000000000000000000000000000000000000000000000081526001600160a01b0392831694506321501a95935061261c928692600092911690889060040161aa8a565b6000604051602001615ca99061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015615d5757600080fd5b505af1158015615d6b573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015615ddb57600080fd5b505af1158015615def573d6000803e3d6000fd5b50506020546021546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c39aca37935061261c9286921690600190600090899060040161ab19565b6000604051602001615e5a9061a99c565b60408051601f19818403018152606080840183526020805490911b6bffffffffffffffffffffffff191660808501528251808503607401815260948501845284526027546001600160a01b0316908401819052600184840152825163ca669fa760e01b815260048101919091529151909350737109709ecfa91a80626ff3989d68f67f5b1dd12d9163ca669fa791602480830192600092919082900301818387803b158015615f0857600080fd5b505af1158015615f1c573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015615f8c57600080fd5b505af1158015615fa0573d6000803e3d6000fd5b50506020546024546040517fc39aca370000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063c39aca37935061261c92869260009260019290911690899060040161ab19565b600061600661a13d565b61601184848361609a565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561608657600080fd5b505afa15801561264a573d6000803e3d6000fd5b6000806160a78584616115565b905061610a6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016160f592919061aba5565b60405160208183030381529060405285616121565b9150505b9392505050565b600061610e838361614f565b60c081015151600090156161455761613e84848460c0015161616a565b905061610e565b61613e8484616310565b600061615b83836163fb565b61610e83836020015184616121565b600080616175616407565b9050600061618386836164da565b9050600061619a8260600151836020015185616980565b905060006161aa83838989616b92565b905060006161b782617a0f565b602081015181519192509060030b1561622a578982604001516040516020016161e192919061abc7565b60408051601f19818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526162219160040161a989565b60405180910390fd5b600061626d6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001617bde565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906162c090849060040161a989565b602060405180830381865afa1580156162dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616301919061a6fb565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061636590879060040161a989565b600060405180830381865afa158015616382573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526163aa919081019061ad01565b905060006163d882856040516020016163c492919061ad36565b604051602081830303815290604052617dde565b90506001600160a01b0381166160115784846040516020016161e192919061ad65565b61434482826000617df1565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c9061648e90849060040161ae10565b600060405180830381865afa1580156164ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526164d3919081019061ae57565b9250505090565b61650c6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506165576040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61656085617ef4565b60208201526000616570866182d9565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156165b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526165da919081019061ae57565b868385602001516040516020016165f4949392919061aea0565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb119061664c90859060040161a989565b600060405180830381865afa158015616669573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616691919081019061ae57565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f6906166d990849060040161afa4565b602060405180830381865afa1580156166f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061671a919061a819565b61672f57816040516020016161e1919061aff6565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061677490849060040161b088565b600060405180830381865afa158015616791573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526167b9919081019061ae57565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061680090849060040161b0da565b602060405180830381865afa15801561681d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616841919061a819565b156168d6576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061688b90849060040161b0da565b600060405180830381865afa1580156168a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526168d0919081019061ae57565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016168fb919061b12c565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161692792919061b198565b600060405180830381865afa158015616944573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261696c919081019061ae57565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b606081526020019060019003908161699c5790505090506040518060400160405280600481526020017f6772657000000000000000000000000000000000000000000000000000000000815250816000815181106169fc576169fc61b1bd565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110616a5057616a5061b1bd565b602002602001018190525084604051602001616a6c919061b1ec565b60405160208183030381529060405281600281518110616a8e57616a8e61b1bd565b602002602001018190525082604051602001616aaa919061b258565b60405160208183030381529060405281600381518110616acc57616acc61b1bd565b60200260200101819052506000616ae282617a0f565b602080820151604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000008185019081528251808401845260008082529086015282518084019093529051825292810192909252919250616b73906040805180820182526000808252602091820152815180830190925284518252808501908201529061855c565b616b8857856040516020016161e1919061b299565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015616be2565b511590565b616d5657826020015115616c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401616221565b8260c0015115616d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401616221565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081616d6f57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280616dca9061b32a565b935060ff1681518110616ddf57616ddf61b1bd565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001616e30919061b349565b604051602081830303815290604052828280616e4b9061b32a565b935060ff1681518110616e6057616e6061b1bd565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280616ead9061b32a565b935060ff1681518110616ec257616ec261b1bd565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280616f0f9061b32a565b935060ff1681518110616f2457616f2461b1bd565b60200260200101819052508760200151828280616f409061b32a565b935060ff1681518110616f5557616f5561b1bd565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280616fa29061b32a565b935060ff1681518110616fb757616fb761b1bd565b602090810291909101015287518282616fcf8161b32a565b935060ff1681518110616fe457616fe461b1bd565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e496400000000000000000000000000000000000000000000008152508282806170319061b32a565b935060ff16815181106170465761704661b1bd565b602002602001018190525061705a466185bd565b82826170658161b32a565b935060ff168151811061707a5761707a61b1bd565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806170c79061b32a565b935060ff16815181106170dc576170dc61b1bd565b6020026020010181905250868282806170f49061b32a565b935060ff16815181106171095761710961b1bd565b60209081029190910101528551156172305760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261715a8161b32a565b935060ff168151811061716f5761716f61b1bd565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906171bf90899060040161a989565b600060405180830381865afa1580156171dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617204919081019061ae57565b828261720f8161b32a565b935060ff16815181106172245761722461b1bd565b60200260200101819052505b8460200151156173005760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826172798161b32a565b935060ff168151811061728e5761728e61b1bd565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806172db9061b32a565b935060ff16815181106172f0576172f061b1bd565b60200260200101819052506174c7565b617338616bdd8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6173cb5760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261737b8161b32a565b935060ff16815181106173905761739061b1bd565b60200260200101819052508460a001516040516020016173b0919061b1ec565b6040516020818303038152906040528282806172db9061b32a565b8460c0015115801561740e57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261740c90511590565b155b156174c75760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826174528161b32a565b935060ff16815181106174675761746761b1bd565b602002602001018190525061747b8861865d565b60405160200161748b919061b1ec565b6040516020818303038152906040528282806174a69061b32a565b935060ff16815181106174bb576174bb61b1bd565b60200260200101819052505b604080860151815180830183526000808252602091820152825180840190935281518352908101908201526174fb90511590565b6175905760408051808201909152600b81527f2d2d72656c6179657249640000000000000000000000000000000000000000006020820152828261753e8161b32a565b935060ff16815181106175535761755361b1bd565b6020026020010181905250846040015182828061756f9061b32a565b935060ff16815181106175845761758461b1bd565b60200260200101819052505b6060850151156176b15760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826175d98161b32a565b935060ff16815181106175ee576175ee61b1bd565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa15801561765d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617685919081019061ae57565b82826176908161b32a565b935060ff16815181106176a5576176a561b1bd565b60200260200101819052505b60e085015151156177585760408051808201909152600a81527f2d2d6761734c696d697400000000000000000000000000000000000000000000602082015282826176fb8161b32a565b935060ff16815181106177105761771061b1bd565b602002602001018190525061772c8560e00151600001516185bd565b82826177378161b32a565b935060ff168151811061774c5761774c61b1bd565b60200260200101819052505b60e085015160200151156178025760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826177a58161b32a565b935060ff16815181106177ba576177ba61b1bd565b60200260200101819052506177d68560e00151602001516185bd565b82826177e18161b32a565b935060ff16815181106177f6576177f661b1bd565b60200260200101819052505b60e085015160400151156178ac5760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261784f8161b32a565b935060ff16815181106178645761786461b1bd565b60200260200101819052506178808560e00151604001516185bd565b828261788b8161b32a565b935060ff16815181106178a0576178a061b1bd565b60200260200101819052505b60e085015160600151156179565760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826178f98161b32a565b935060ff168151811061790e5761790e61b1bd565b602002602001018190525061792a8560e00151606001516185bd565b82826179358161b32a565b935060ff168151811061794a5761794a61b1bd565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156179745761797461a83b565b6040519080825280602002602001820160405280156179a757816020015b60608152602001906001900390816179925790505b50905060005b8260ff168160ff161015617a0057838160ff16815181106179d0576179d061b1bd565b6020026020010151828260ff16815181106179ed576179ed61b1bd565b60209081029190910101526001016179ad565b5093505050505b949350505050565b617a366040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c91617abc9186910161b3b4565b600060405180830381865afa158015617ad9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617b01919081019061ae57565b90506000617b0f868361914c565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401617b3f919061a496565b6000604051808303816000875af1158015617b5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052617b86919081019061b3fb565b805190915060030b15801590617b9f5750602081015151155b8015617bae5750604081015151155b15616b885781600081518110617bc657617bc661b1bd565b60200260200101516040516020016161e1919061b4b1565b60606000617c138560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150617c4a9082905b906192a1565b15617da7576000617cc782617cc184617cbb617c8d8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906192c8565b9061932a565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150617d2b9082906192a1565b15617d9557604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d92905b82906193af565b90505b617d9e816193d5565b9250505061610e565b8215617dc05784846040516020016161e192919061b69d565b505060408051602081019091526000815261610e565b509392505050565b6000808251602084016000f09392505050565b8160a0015115617e0057505050565b6000617e0d84848461943e565b90506000617e1a82617a0f565b602081015181519192509060030b158015617eb65750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617eb690604080518082018252600080825260209182015281518083019092528451825280850190820152617c44565b15617ec357505050505050565b60408201515115617ee35781604001516040516020016161e1919061b744565b806040516020016161e1919061b7a2565b60606000617f298360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150617f8e905b829061855c565b15617ffd57604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261610e90617ff89083906199d9565b6193d5565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261805f905b8290619a63565b60010361812c57604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526180c590617d8b565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261610e90617ff8905b83906193af565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261818b90617f87565b156182c257604080518082018252600181527f2f000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201819052845180860190955292518452830152906181f3908390619afd565b905060008160018351618206919061aaf3565b815181106182165761821661b1bd565b602002602001015190506182b9617ff861828c6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528551825280860190820152906199d9565b95945050505050565b826040516020016161e1919061b80d565b50919050565b6060600061830e8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061837090617f87565b1561837e5761610e816193d5565b604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526183dd90618058565b60010361844757604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261610e90617ff890618125565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526184a690617f87565b156182c257604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061850e908390619afd565b905060018151111561854a578060028251618529919061aaf3565b815181106185395761853961b1bd565b602002602001015192505050919050565b50826040516020016161e1919061b80d565b80518251600091111561857157506000616015565b815183516020850151600092916185879161ab06565b618591919061aaf3565b9050826020015181036185a8576001915050616015565b82516020840151819020912014905092915050565b606060006185ca83619ba2565b600101905060008167ffffffffffffffff8111156185ea576185ea61a83b565b6040519080825280601f01601f191660200182016040528015618614576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461861e57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e53454400000000000000000000000000000000000000000000818401908152855180870187528381528401929092528451808601909552518452908301526060916186e9905b8290619c84565b1561872957505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618788906186e2565b156187c857505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618827906186e2565b1561886757505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526188c6906186e2565b8061892b5750604080518082018252601081527f47504c2d322e302d6f722d6c61746572000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261892b906186e2565b1561896b57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526189ca906186e2565b80618a2f5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618a2f906186e2565b15618a6f57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618ace906186e2565b80618b335750604080518082018252601181527f4c47504c2d322e312d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618b33906186e2565b15618b7357505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618bd2906186e2565b80618c375750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618c37906186e2565b15618c7757505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618cd6906186e2565b15618d1657505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618d75906186e2565b15618db557505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618e14906186e2565b15618e5457505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618eb3906186e2565b15618ef357505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618f52906186e2565b15618f9257505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152618ff1906186e2565b806190565750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152619056906186e2565b1561909657505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e31000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526190f5906186e2565b1561913557505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b604080840151845191516161e1929060200161b8eb565b60608060005b84518110156191d7578185828151811061916e5761916e61b1bd565b602002602001015160405160200161918792919061ad36565b6040516020818303038152906040529150600185516191a6919061aaf3565b81146191cf57816040516020016191bd919061ba54565b60405160208183030381529060405291505b600101619152565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816191f0579050509050838160008151811061921b5761921b61b1bd565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061926f5761926f61b1bd565b6020026020010181905250818160028151811061928e5761928e61b1bd565b6020908102919091010152949350505050565b60208083015183518351928401516000936192bf9291849190619c98565b14159392505050565b604080518082019091526000808252602082015260006192fa8460000151856020015185600001518660200151619da9565b905083602001518161930c919061aaf3565b8451859061931b90839061aaf3565b90525060208401525090919050565b604080518082019091526000808252602082015281518351101561934f575081616015565b60208083015190840151600191146193765750815160208481015190840151829020919020145b80156193a75782518451859061938d90839061aaf3565b90525082516020850180516193a390839061ab06565b9052505b509192915050565b60408051808201909152600080825260208201526193ce838383619ec9565b5092915050565b60606000826000015167ffffffffffffffff8111156193f6576193f661a83b565b6040519080825280601f01601f191660200182016040528015619420576020820181803683370190505b50905060006020820190506193ce8185602001518660000151619f74565b6060600061944a616407565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161946757905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806194c29061b32a565b935060ff16815181106194d7576194d761b1bd565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001619528919061ba95565b6040516020818303038152906040528282806195439061b32a565b935060ff16815181106195585761955861b1bd565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806195a59061b32a565b935060ff16815181106195ba576195ba61b1bd565b6020026020010181905250826040516020016195d6919061b258565b6040516020818303038152906040528282806195f19061b32a565b935060ff16815181106196065761960661b1bd565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e7472616374000000000000000000000000000000000000000000008152508282806196539061b32a565b935060ff16815181106196685761966861b1bd565b602002602001018190525061967d8784619fee565b82826196888161b32a565b935060ff168151811061969d5761969d61b1bd565b6020908102919091010152855151156197495760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826196ef8161b32a565b935060ff16815181106197045761970461b1bd565b602002602001018190525061971d866000015184619fee565b82826197288161b32a565b935060ff168151811061973d5761973d61b1bd565b60200260200101819052505b8560800151156197b75760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b0000000000000000602082015282826197928161b32a565b935060ff16815181106197a7576197a761b1bd565b602002602001018190525061981d565b841561981d5760408051808201909152601281527f2d2d726571756972655265666572656e63650000000000000000000000000000602082015282826197fc8161b32a565b935060ff16815181106198115761981161b1bd565b60200260200101819052505b604086015151156198b95760408051808201909152600d81527f2d2d756e73616665416c6c6f7700000000000000000000000000000000000000602082015282826198678161b32a565b935060ff168151811061987c5761987c61b1bd565b602002602001018190525085604001518282806198989061b32a565b935060ff16815181106198ad576198ad61b1bd565b60200260200101819052505b8560600151156199235760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d6573000000000000000000000000602082015282826199028161b32a565b935060ff16815181106199175761991761b1bd565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156199415761994161a83b565b60405190808252806020026020018201604052801561997457816020015b606081526020019060019003908161995f5790505b50905060005b8260ff168160ff1610156199cd57838160ff168151811061999d5761999d61b1bd565b6020026020010151828260ff16815181106199ba576199ba61b1bd565b602090810291909101015260010161997a565b50979650505050505050565b60408051808201909152600080825260208201528151835110156199fe575081616015565b81518351602085015160009291619a149161ab06565b619a1e919061aaf3565b60208401519091506001908214619a3f575082516020840151819020908220145b8015619a5a57835185518690619a5690839061aaf3565b9052505b50929392505050565b6000808260000151619a878560000151866020015186600001518760200151619da9565b619a91919061ab06565b90505b83516020850151619aa5919061ab06565b81116193ce5781619ab58161bada565b9250508260000151619aec856020015183619ad0919061aaf3565b8651619adc919061aaf3565b8386600001518760200151619da9565b619af6919061ab06565b9050619a94565b60606000619b0b8484619a63565b619b1690600161ab06565b67ffffffffffffffff811115619b2e57619b2e61a83b565b604051908082528060200260200182016040528015619b6157816020015b6060815260200190600190039081619b4c5790505b50905060005b8151811015617dd657619b7d617ff886866193af565b828281518110619b8f57619b8f61b1bd565b6020908102919091010152600101619b67565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310619beb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310619c17576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310619c3557662386f26fc10000830492506010015b6305f5e1008310619c4d576305f5e100830492506008015b6127108310619c6157612710830492506004015b60648310619c73576064830492506002015b600a83106160155760010192915050565b6000619c90838361a02e565b159392505050565b600080858411619d9f5760208411619d4b5760008415619ce3576001619cbf86602061aaf3565b619cca90600861baf4565b619cd590600261bbf2565b619cdf919061aaf3565b1990505b8351811685619cf2898961ab06565b619cfc919061aaf3565b805190935082165b818114619d3657878411619d1e5787945050505050617a07565b83619d288161bbfe565b945050828451169050619d04565b619d40878561ab06565b945050505050617a07565b838320619d58858861aaf3565b619d62908761ab06565b91505b858210619d9d57848220808203619d8a57619d80868461ab06565b9350505050617a07565b619d9560018461aaf3565b925050619d65565b505b5092949350505050565b60008381868511619eb45760208511619e635760008515619df5576001619dd187602061aaf3565b619ddc90600861baf4565b619de790600261bbf2565b619df1919061aaf3565b1990505b84518116600087619e068b8b61ab06565b619e10919061aaf3565b855190915083165b828114619e5557818610619e3d57619e308b8b61ab06565b9650505050505050617a07565b85619e478161bada565b965050838651169050619e18565b859650505050505050617a07565b508383206000905b619e75868961aaf3565b8211619eb257858320808203619e915783945050505050617a07565b619e9c60018561ab06565b9350508180619eaa9061bada565b925050619e6b565b505b619ebe878761ab06565b979650505050505050565b60408051808201909152600080825260208201526000619efb8560000151866020015186600001518760200151619da9565b602080870180519186019190915251909150619f17908261aaf3565b835284516020860151619f2a919061ab06565b8103619f395760008552619f6b565b83518351619f47919061ab06565b85518690619f5690839061aaf3565b9052508351619f65908261ab06565b60208601525b50909392505050565b60208110619fac5781518352619f8b60208461ab06565b9250619f9860208361ab06565b9150619fa560208261aaf3565b9050619f74565b6000198115619fdb576001619fc283602061aaf3565b619fce9061010061bbf2565b619fd8919061aaf3565b90505b9151835183169219169190911790915250565b60606000619ffc84846164da565b805160208083015160405193945061a0169390910161bc15565b60405160208183030381529060405291505092915050565b815181516000919081111561a041575081515b6020808501519084015160005b8381101561a0fa578251825180821461a0ca57600019602087101561a0a95760018461a07b89602061aaf3565b61a085919061ab06565b61a09090600861baf4565b61a09b90600261bbf2565b61a0a5919061aaf3565b1990505b818116838216818103911461a0c75797506160159650505050505050565b50505b61a0d560208661ab06565b945061a0e260208561ab06565b9350505060208161a0f3919061ab06565b905061a04e565b5084518651616b88919061bc6d565b610b678061bc8e83390190565b61063d8061c7f583390190565b61106f8061ce3283390190565b611e018061dea183390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161a18061a185565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161a1806040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b8181101561a2375783516001600160a01b031683526020938401939092019160010161a210565b509095945050505050565b60005b8381101561a25d57818101518382015260200161a245565b50506000910152565b6000815180845261a27e81602086016020860161a242565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a38e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b8181101561a374577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261a35e84865161a266565b602095860195909450929092019160010161a324565b50919750505060209485019492909201915060010161a2ba565b50929695505050505050565b600081518084526020840193506020830160005b8281101561a3ee5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161a3ae565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a38e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516040875261a464604088018261a266565b905060208201519150868103602088015261a47f818361a39a565b96505050602093840193919091019060010161a420565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a38e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261a4f885835161a266565b9450602093840193919091019060010161a4be565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561a38e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b038151168652602081015190506040602087015261a58e604087018261a39a565b955050602093840193919091019060010161a535565b600181811c9082168061a5b857607f821691505b6020821081036182d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600081546001600160a01b038116845267ffffffffffffffff8160a01c1660208501525060018201606060408501526000815461a62d8161a5a4565b806060880152600182166000811461a64c576001811461a6865761a6ba565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b890101935061a6ba565b84600052602060002060005b8381101561a6b15781548a82016080015260019091019060200161a692565b89016080019450505b50919695505050505050565b60208152600061610e602083018461a5f1565b6001600160a01b0383168152604060208201526000617a07604083018461a5f1565b60006020828403121561a70d57600080fd5b81516001600160a01b038116811461610e57600080fd5b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff881660408301528660608301526003861061a7de577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a083015261a7ff60c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b60006020828403121561a82b57600080fd5b8151801515811461610e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561124d57806000526020600020601f840160051c8101602085101561a8915750805b601f840160051c820191505b81811015612ec4576000815560010161a89d565b815167ffffffffffffffff81111561a8cb5761a8cb61a83b565b61a8df8161a8d9845461a5a4565b8461a86a565b6020601f82116001811461a913576000831561a8fb5750848201515b600019600385901b1c1916600184901b178455612ec4565b600084815260208120601f198516915b8281101561a943578785015182556020948501946001909201910161a923565b508482101561a9615786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561a98257600080fd5b5051919050565b60208152600061610e602083018461a266565b60208152600061601560208301600581527f68656c6c6f000000000000000000000000000000000000000000000000000000602082015260400190565b60a08152600061a9ec60a083018761a266565b6001600160a01b03861660208401528460408401526001600160a01b03841660608401528281036080840152619ebe81600581527f68656c6c6f000000000000000000000000000000000000000000000000000000602082015260400190565b600081516060845261aa61606085018261a266565b90506001600160a01b036020840151166020850152604083015160408501528091505092915050565b60808152600061aa9d608083018761aa4c565b8560208401526001600160a01b03851660408401528281036060840152619ebe818561a266565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156160155761601561aac4565b808201808211156160155761601561aac4565b60a08152600061ab2c60a083018861aa4c565b6001600160a01b03871660208401528560408401526001600160a01b0385166060840152828103608084015261ab62818561a266565b98975050505050505050565b6001600160a01b03851681528360208201526001600160a01b0383166040820152608060608201526000616b88608083018461a5f1565b6001600160a01b0383168152604060208201526000617a07604083018461a266565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161abff81601a85016020880161a242565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161ac3c81601c84016020880161a242565b01601c01949350505050565b6040516060810167ffffffffffffffff8111828210171561ac6b5761ac6b61a83b565b60405290565b60008067ffffffffffffffff84111561ac8c5761ac8c61a83b565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561acbb5761acbb61a83b565b60405283815290508082840185101561acd357600080fd5b617dd684602083018561a242565b600082601f83011261acf257600080fd5b61610e8383516020850161ac71565b60006020828403121561ad1357600080fd5b815167ffffffffffffffff81111561ad2a57600080fd5b6160118482850161ace1565b6000835161ad4881846020880161a242565b83519083019061ad5c81836020880161a242565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161ad9d81601a85016020880161a242565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161adda81603384016020880161a242565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f5554000000000000000000000000000000000000000000606082015260806020820152600061610e608083018461a266565b60006020828403121561ae6957600080fd5b815167ffffffffffffffff81111561ae8057600080fd5b8201601f8101841361ae9157600080fd5b6160118482516020840161ac71565b6000855161aeb2818460208a0161a242565b7f2f00000000000000000000000000000000000000000000000000000000000000908301908152855161aeec816001840160208a0161a242565b7f2f0000000000000000000000000000000000000000000000000000000000000060019290910191820152845161af2a81600284016020890161a242565b6001818301019150507f2f000000000000000000000000000000000000000000000000000000000000006001820152835161af6c81600284016020880161a242565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b60408152600061afb7604083018461a266565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e206172746966616374200081526000825161b02e81601f85016020870161a242565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b60408152600061b09b604083018461a266565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b60408152600061b0ed604083018461a266565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b2700000000000000000000000081526000825161b16481601485016020870161a242565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b60408152600061b1ab604083018561a266565b828103602084015261610a818561a266565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f220000000000000000000000000000000000000000000000000000000000000081526000825161b22481600185016020870161a242565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b6000825161b26a81846020870161a242565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161b31d81604b85016020870161a242565b91909101604b0192915050565b600060ff821660ff810361b3405761b34061aac4565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161b3a781602985016020870161a242565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f5041544800000000000000000000606082015260806020820152600061610e608083018461a266565b60006020828403121561b40d57600080fd5b815167ffffffffffffffff81111561b42457600080fd5b82016060818503121561b43657600080fd5b61b43e61ac48565b81518060030b811461b44f57600080fd5b8152602082015167ffffffffffffffff81111561b46b57600080fd5b61b4778682850161ace1565b602083015250604082015167ffffffffffffffff81111561b49757600080fd5b61b4a38682850161ace1565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161b50f81602185016020870161a242565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161b6fb81602185016020880161a242565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161b73881602e84016020880161a242565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161b3a781602985016020870161a242565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161b80081602285016020870161a242565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161b84581600e85016020870161a242565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161b92381601885016020880161a242565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161b96081601c84016020880161a242565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161ba6681846020870161a242565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161bacd81601c85016020870161a242565b91909101601c0192915050565b6000600019820361baed5761baed61aac4565b5060010190565b80820281158282048414176160155761601561aac4565b6001815b600184111561bb465780850481111561bb2a5761bb2a61aac4565b600184161561bb3857908102905b60019390931c92800261bb0f565b935093915050565b60008261bb5d57506001616015565b8161bb6a57506000616015565b816001811461bb80576002811461bb8a5761bba6565b6001915050616015565b60ff84111561bb9b5761bb9b61aac4565b50506001821b616015565b5060208310610133831016604e8410600b841016171561bbc9575081810a616015565b61bbd6600019848461bb0b565b806000190482111561bbea5761bbea61aac4565b029392505050565b600061610e838361bb4e565b60008161bc0d5761bc0d61aac4565b506000190190565b6000835161bc2781846020880161a242565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161bc6181600184016020880161a242565b01600101949350505050565b81810360008312801583831316838312821617156193ce576193ce61aac456fe60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610114565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610114565b506002805460ff1916601217905534801561006f57600080fd5b506101d2565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561010f57806000526020600020601f840160051c810160208510156100ec5750805b601f840160051c820191505b8181101561010c57600081556001016100f8565b50505b505050565b81516001600160401b0381111561012d5761012d610075565b6101418161013b845461008b565b846100c5565b6020601f821160018114610175576000831561015d5750848201515b600019600385901b1c1916600184901b17845561010c565b600084815260208120601f198516915b828110156101a55787850151825560209485019460019092019101610185565b50848210156101c35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610986806101e16000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610745565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046107da565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610804565b6103bd565b34801561017857600080fd5b506100cd610187366004610841565b610647565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d336600461085a565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e9610724565b34801561020657600080fd5b5061011f6102153660046107da565b610731565b6100cd61025a565b34801561022e57600080fd5b5061013e61023d366004610875565b600460209081526000928352604080842090915290825290205481565b33600090815260036020526040812080543492906102799084906108d7565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c2906108ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee906108ea565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561042b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600060248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104a1575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105605773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561051a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091528120805484929061055a90849061093d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061059590849061093d565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548492906105cf9084906108d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161063591815260200190565b60405180910390a35060019392505050565b3360009081526003602052604090205481111561069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b33600090815260036020526040812080548392906106b990849061093d565b9091555050604051339082156108fc029083906000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c2906108ea565b600061073e3384846103bd565b9392505050565b602081526000825180602084015260005b818110156107735760208186018101516040868401015201610756565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107d557600080fd5b919050565b600080604083850312156107ed57600080fd5b6107f6836107b1565b946020939093013593505050565b60008060006060848603121561081957600080fd5b610822846107b1565b9250610830602085016107b1565b929592945050506040919091013590565b60006020828403121561085357600080fd5b5035919050565b60006020828403121561086c57600080fd5b61073e826107b1565b6000806040838503121561088857600080fd5b610891836107b1565b915061089f602084016107b1565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76108a8565b600181811c908216806108fe57607f821691505b602082108103610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76108a856fea264697066735822122008d7fc4e09519c5dd9f356b03596f6829a151d0bc7682533f9ceab4e459f5ee264736f6c634300081a00336080604052348015600f57600080fd5b5061061e8061001f6000396000f3fe60806040526004361061002a5760003560e01c8063660b9de014610033578063de43156e1461005357005b3661003157005b005b34801561003f57600080fd5b5061003161004e366004610140565b610073565b34801561005f57600080fd5b5061003161006e3660046101a6565b6100ad565b7f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76816040516100a291906102a7565b60405180910390a150565b606081156100c4576100c1828401846103a2565b90505b7fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e6100ef8780610498565b6100ff60408a0160208b01610504565b8960400135338660405161011896959493929190610526565b60405180910390a1505050505050565b60006060828403121561013a57600080fd5b50919050565b60006020828403121561015257600080fd5b813567ffffffffffffffff81111561016957600080fd5b61017584828501610128565b949350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101a157600080fd5b919050565b6000806000806000608086880312156101be57600080fd5b853567ffffffffffffffff8111156101d557600080fd5b6101e188828901610128565b9550506101f06020870161017d565b935060408601359250606086013567ffffffffffffffff81111561021357600080fd5b8601601f8101881361022457600080fd5b803567ffffffffffffffff81111561023b57600080fd5b88602082840101111561024d57600080fd5b959894975092955050506020019190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff6102c98361017d565b1660208201526000602083013567ffffffffffffffff81168082146102ed57600080fd5b806040850152505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261032a57600080fd5b830160208101903567ffffffffffffffff81111561034757600080fd5b80360382131561035657600080fd5b60608085015261036a60808501828461025e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103b457600080fd5b813567ffffffffffffffff8111156103cb57600080fd5b8201601f810184136103dc57600080fd5b803567ffffffffffffffff8111156103f6576103f6610373565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561046257610462610373565b60405281815282820160200186101561047a57600080fd5b81602084016020830137600091810160200191909152949350505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b6020019150368190038213156104fd57600080fd5b9250929050565b60006020828403121561051657600080fd5b61051f8261017d565b9392505050565b60a08152600061053a60a08301888a61025e565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015273ffffffffffffffffffffffffffffffffffffffff851660608401528281036080840152835180825260005b818110156105a457602081870181015184830182015201610588565b5060006020828401015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168301019250505097965050505050505056fea2646970667358221220bb6e62150859f03aca6fe4999cc24cdd05253b707ded08a7425095e3124a55a564736f6c634300081a003360c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a2646970667358221220f6b74c297ff18695597707abcd90e287e1104307c22767bea8e26146ff76253c64736f6c634300081a0033", } // GatewayZEVMOutboundTestABI is the input ABI used to generate the binding from. @@ -1289,27 +1289,6 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestDe return _GatewayZEVMOutboundTest.Contract.TestDepositZRC20AndCallUniversalContractIfTargetIsGateway(&_GatewayZEVMOutboundTest.TransactOpts) } -// TestExecuteFailsIfAmountIsZero is a paid mutator transaction binding the contract method 0xdf881f6c. -// -// Solidity: function testExecuteFailsIfAmountIsZero() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactor) TestExecuteFailsIfAmountIsZero(opts *bind.TransactOpts) (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.contract.Transact(opts, "testExecuteFailsIfAmountIsZero") -} - -// TestExecuteFailsIfAmountIsZero is a paid mutator transaction binding the contract method 0xdf881f6c. -// -// Solidity: function testExecuteFailsIfAmountIsZero() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestSession) TestExecuteFailsIfAmountIsZero() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteFailsIfAmountIsZero(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteFailsIfAmountIsZero is a paid mutator transaction binding the contract method 0xdf881f6c. -// -// Solidity: function testExecuteFailsIfAmountIsZero() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestExecuteFailsIfAmountIsZero() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteFailsIfAmountIsZero(&_GatewayZEVMOutboundTest.TransactOpts) -} - // TestExecuteFailsIfTargetIsZeroAddress is a paid mutator transaction binding the contract method 0x3ab5b199. // // Solidity: function testExecuteFailsIfTargetIsZeroAddress() returns() @@ -1373,27 +1352,6 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestEx return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContract(&_GatewayZEVMOutboundTest.TransactOpts) } -// TestExecuteRevertUniversalContractFailsIfAmountIsZero is a paid mutator transaction binding the contract method 0xa40b515b. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfAmountIsZero() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactor) TestExecuteRevertUniversalContractFailsIfAmountIsZero(opts *bind.TransactOpts) (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.contract.Transact(opts, "testExecuteRevertUniversalContractFailsIfAmountIsZero") -} - -// TestExecuteRevertUniversalContractFailsIfAmountIsZero is a paid mutator transaction binding the contract method 0xa40b515b. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfAmountIsZero() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestSession) TestExecuteRevertUniversalContractFailsIfAmountIsZero() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfAmountIsZero(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteRevertUniversalContractFailsIfAmountIsZero is a paid mutator transaction binding the contract method 0xa40b515b. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfAmountIsZero() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestExecuteRevertUniversalContractFailsIfAmountIsZero() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfAmountIsZero(&_GatewayZEVMOutboundTest.TransactOpts) -} - // TestExecuteRevertUniversalContractFailsIfTargetIsZeroAddress is a paid mutator transaction binding the contract method 0xc8814d2e. // // Solidity: function testExecuteRevertUniversalContractFailsIfTargetIsZeroAddress() returns() @@ -1415,69 +1373,6 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestEx return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfTargetIsZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) } -// TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress is a paid mutator transaction binding the contract method 0x5d19c049. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactor) TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress(opts *bind.TransactOpts) (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.contract.Transact(opts, "testExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress") -} - -// TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress is a paid mutator transaction binding the contract method 0x5d19c049. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestSession) TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress is a paid mutator transaction binding the contract method 0x5d19c049. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteRevertUniversalContractFailsIfZeroAddress is a paid mutator transaction binding the contract method 0x0bfc4e4a. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactor) TestExecuteRevertUniversalContractFailsIfZeroAddress(opts *bind.TransactOpts) (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.contract.Transact(opts, "testExecuteRevertUniversalContractFailsIfZeroAddress") -} - -// TestExecuteRevertUniversalContractFailsIfZeroAddress is a paid mutator transaction binding the contract method 0x0bfc4e4a. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestSession) TestExecuteRevertUniversalContractFailsIfZeroAddress() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteRevertUniversalContractFailsIfZeroAddress is a paid mutator transaction binding the contract method 0x0bfc4e4a. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestExecuteRevertUniversalContractFailsIfZeroAddress() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress is a paid mutator transaction binding the contract method 0x4b9324b6. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactor) TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress(opts *bind.TransactOpts) (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.contract.Transact(opts, "testExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress") -} - -// TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress is a paid mutator transaction binding the contract method 0x4b9324b6. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestSession) TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) -} - -// TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress is a paid mutator transaction binding the contract method 0x4b9324b6. -// -// Solidity: function testExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress() returns() -func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestTransactorSession) TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress() (*types.Transaction, error) { - return _GatewayZEVMOutboundTest.Contract.TestExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress(&_GatewayZEVMOutboundTest.TransactOpts) -} - // TestExecuteRevertUniversalContractIfSenderIsNotFungibleModule is a paid mutator transaction binding the contract method 0xd9978513. // // Solidity: function testExecuteRevertUniversalContractIfSenderIsNotFungibleModule() returns() @@ -1635,13 +1530,14 @@ type GatewayZEVMOutboundTestCalled struct { Zrc20 common.Address Receiver []byte Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterCalled is a free log retrieval operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// FilterCalled is a free log retrieval operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) FilterCalled(opts *bind.FilterOpts, sender []common.Address, zrc20 []common.Address) (*GatewayZEVMOutboundTestCalledIterator, error) { var senderRule []interface{} @@ -1660,9 +1556,9 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) FilterCalled(op return &GatewayZEVMOutboundTestCalledIterator{contract: _GatewayZEVMOutboundTest.contract, event: "Called", logs: logs, sub: sub}, nil } -// WatchCalled is a free log subscription operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// WatchCalled is a free log subscription operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) WatchCalled(opts *bind.WatchOpts, sink chan<- *GatewayZEVMOutboundTestCalled, sender []common.Address, zrc20 []common.Address) (event.Subscription, error) { var senderRule []interface{} @@ -1706,9 +1602,9 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) WatchCalled(opt }), nil } -// ParseCalled is a log parse operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// ParseCalled is a log parse operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) ParseCalled(log types.Log) (*GatewayZEVMOutboundTestCalled, error) { event := new(GatewayZEVMOutboundTestCalled) if err := _GatewayZEVMOutboundTest.contract.UnpackLog(event, "Called", log); err != nil { @@ -2067,13 +1963,14 @@ type GatewayZEVMOutboundTestWithdrawn struct { Gasfee *big.Int ProtocolFlatFee *big.Int Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawn is a free log retrieval operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) FilterWithdrawn(opts *bind.FilterOpts, sender []common.Address, chainId []*big.Int) (*GatewayZEVMOutboundTestWithdrawnIterator, error) { var senderRule []interface{} @@ -2092,9 +1989,9 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) FilterWithdrawn return &GatewayZEVMOutboundTestWithdrawnIterator{contract: _GatewayZEVMOutboundTest.contract, event: "Withdrawn", logs: logs, sub: sub}, nil } -// WatchWithdrawn is a free log subscription operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// WatchWithdrawn is a free log subscription operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayZEVMOutboundTestWithdrawn, sender []common.Address, chainId []*big.Int) (event.Subscription, error) { var senderRule []interface{} @@ -2138,9 +2035,9 @@ func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) WatchWithdrawn( }), nil } -// ParseWithdrawn is a log parse operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// ParseWithdrawn is a log parse operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_GatewayZEVMOutboundTest *GatewayZEVMOutboundTestFilterer) ParseWithdrawn(log types.Log) (*GatewayZEVMOutboundTestWithdrawn, error) { event := new(GatewayZEVMOutboundTestWithdrawn) if err := _GatewayZEVMOutboundTest.contract.UnpackLog(event, "Withdrawn", log); err != nil { diff --git a/v2/pkg/ierc20custody.sol/ierc20custody.go b/v2/pkg/ierc20custody.sol/ierc20custody.go index 0510f496..85ba1ea7 100644 --- a/v2/pkg/ierc20custody.sol/ierc20custody.go +++ b/v2/pkg/ierc20custody.sol/ierc20custody.go @@ -38,7 +38,7 @@ type RevertContext struct { // IERC20CustodyMetaData contains all meta data concerning the IERC20Custody contract. var IERC20CustodyMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndRevert\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndRevert\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"NotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", } // IERC20CustodyABI is the input ABI used to generate the binding from. @@ -638,27 +638,27 @@ func (it *IERC20CustodyWithdrawnIterator) Close() error { // IERC20CustodyWithdrawn represents a Withdrawn event raised by the IERC20Custody contract. type IERC20CustodyWithdrawn struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterWithdrawn is a free log retrieval operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawn(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*IERC20CustodyWithdrawnIterator, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawn(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*IERC20CustodyWithdrawnIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20Custody.contract.FilterLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _IERC20Custody.contract.FilterLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -667,19 +667,19 @@ func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawn(opts *bind.FilterOp // WatchWithdrawn is a free log subscription operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *IERC20CustodyWithdrawn, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *IERC20CustodyWithdrawn, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20Custody.contract.WatchLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _IERC20Custody.contract.WatchLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -713,7 +713,7 @@ func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawn(opts *bind.WatchOpts // ParseWithdrawn is a log parse operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) func (_IERC20Custody *IERC20CustodyFilterer) ParseWithdrawn(log types.Log) (*IERC20CustodyWithdrawn, error) { event := new(IERC20CustodyWithdrawn) if err := _IERC20Custody.contract.UnpackLog(event, "Withdrawn", log); err != nil { @@ -792,8 +792,8 @@ func (it *IERC20CustodyWithdrawnAndCalledIterator) Close() error { // IERC20CustodyWithdrawnAndCalled represents a WithdrawnAndCalled event raised by the IERC20Custody contract. type IERC20CustodyWithdrawnAndCalled struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte Raw types.Log // Blockchain specific contextual infos @@ -801,19 +801,19 @@ type IERC20CustodyWithdrawnAndCalled struct { // FilterWithdrawnAndCalled is a free log retrieval operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*IERC20CustodyWithdrawnAndCalledIterator, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*IERC20CustodyWithdrawnAndCalledIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20Custody.contract.FilterLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _IERC20Custody.contract.FilterLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -822,19 +822,19 @@ func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawnAndCalled(opts *bind // WatchWithdrawnAndCalled is a free log subscription operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *IERC20CustodyWithdrawnAndCalled, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *IERC20CustodyWithdrawnAndCalled, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20Custody.contract.WatchLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _IERC20Custody.contract.WatchLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -868,7 +868,7 @@ func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawnAndCalled(opts *bind. // ParseWithdrawnAndCalled is a log parse operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) func (_IERC20Custody *IERC20CustodyFilterer) ParseWithdrawnAndCalled(log types.Log) (*IERC20CustodyWithdrawnAndCalled, error) { event := new(IERC20CustodyWithdrawnAndCalled) if err := _IERC20Custody.contract.UnpackLog(event, "WithdrawnAndCalled", log); err != nil { @@ -947,8 +947,8 @@ func (it *IERC20CustodyWithdrawnAndRevertedIterator) Close() error { // IERC20CustodyWithdrawnAndReverted represents a WithdrawnAndReverted event raised by the IERC20Custody contract. type IERC20CustodyWithdrawnAndReverted struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte RevertContext RevertContext @@ -957,19 +957,19 @@ type IERC20CustodyWithdrawnAndReverted struct { // FilterWithdrawnAndReverted is a free log retrieval operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*IERC20CustodyWithdrawnAndRevertedIterator, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*IERC20CustodyWithdrawnAndRevertedIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20Custody.contract.FilterLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _IERC20Custody.contract.FilterLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -978,19 +978,19 @@ func (_IERC20Custody *IERC20CustodyFilterer) FilterWithdrawnAndReverted(opts *bi // WatchWithdrawnAndReverted is a free log subscription operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *IERC20CustodyWithdrawnAndReverted, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *IERC20CustodyWithdrawnAndReverted, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20Custody.contract.WatchLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _IERC20Custody.contract.WatchLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -1024,7 +1024,7 @@ func (_IERC20Custody *IERC20CustodyFilterer) WatchWithdrawnAndReverted(opts *bin // ParseWithdrawnAndReverted is a log parse operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) func (_IERC20Custody *IERC20CustodyFilterer) ParseWithdrawnAndReverted(log types.Log) (*IERC20CustodyWithdrawnAndReverted, error) { event := new(IERC20CustodyWithdrawnAndReverted) if err := _IERC20Custody.contract.UnpackLog(event, "WithdrawnAndReverted", log); err != nil { diff --git a/v2/pkg/ierc20custody.sol/ierc20custodyevents.go b/v2/pkg/ierc20custody.sol/ierc20custodyevents.go index 191ec171..fbf24b46 100644 --- a/v2/pkg/ierc20custody.sol/ierc20custodyevents.go +++ b/v2/pkg/ierc20custody.sol/ierc20custodyevents.go @@ -38,7 +38,7 @@ type RevertContext struct { // IERC20CustodyEventsMetaData contains all meta data concerning the IERC20CustodyEvents contract. var IERC20CustodyEventsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"event\",\"name\":\"Unwhitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Whitelisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false}]", } // IERC20CustodyEventsABI is the input ABI used to generate the binding from. @@ -544,27 +544,27 @@ func (it *IERC20CustodyEventsWithdrawnIterator) Close() error { // IERC20CustodyEventsWithdrawn represents a Withdrawn event raised by the IERC20CustodyEvents contract. type IERC20CustodyEventsWithdrawn struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterWithdrawn is a free log retrieval operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawn(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*IERC20CustodyEventsWithdrawnIterator, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawn(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*IERC20CustodyEventsWithdrawnIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20CustodyEvents.contract.FilterLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _IERC20CustodyEvents.contract.FilterLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -573,19 +573,19 @@ func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawn(opts *b // WatchWithdrawn is a free log subscription operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) -func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *IERC20CustodyEventsWithdrawn, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) +func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *IERC20CustodyEventsWithdrawn, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20CustodyEvents.contract.WatchLogs(opts, "Withdrawn", tokenRule, toRule) + logs, sub, err := _IERC20CustodyEvents.contract.WatchLogs(opts, "Withdrawn", toRule, tokenRule) if err != nil { return nil, err } @@ -619,7 +619,7 @@ func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawn(opts *bi // ParseWithdrawn is a log parse operation binding the contract event 0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb. // -// Solidity: event Withdrawn(address indexed token, address indexed to, uint256 amount) +// Solidity: event Withdrawn(address indexed to, address indexed token, uint256 amount) func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) ParseWithdrawn(log types.Log) (*IERC20CustodyEventsWithdrawn, error) { event := new(IERC20CustodyEventsWithdrawn) if err := _IERC20CustodyEvents.contract.UnpackLog(event, "Withdrawn", log); err != nil { @@ -698,8 +698,8 @@ func (it *IERC20CustodyEventsWithdrawnAndCalledIterator) Close() error { // IERC20CustodyEventsWithdrawnAndCalled represents a WithdrawnAndCalled event raised by the IERC20CustodyEvents contract. type IERC20CustodyEventsWithdrawnAndCalled struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte Raw types.Log // Blockchain specific contextual infos @@ -707,19 +707,19 @@ type IERC20CustodyEventsWithdrawnAndCalled struct { // FilterWithdrawnAndCalled is a free log retrieval operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*IERC20CustodyEventsWithdrawnAndCalledIterator, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawnAndCalled(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*IERC20CustodyEventsWithdrawnAndCalledIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20CustodyEvents.contract.FilterLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _IERC20CustodyEvents.contract.FilterLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -728,19 +728,19 @@ func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawnAndCalle // WatchWithdrawnAndCalled is a free log subscription operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) -func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *IERC20CustodyEventsWithdrawnAndCalled, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) +func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawnAndCalled(opts *bind.WatchOpts, sink chan<- *IERC20CustodyEventsWithdrawnAndCalled, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20CustodyEvents.contract.WatchLogs(opts, "WithdrawnAndCalled", tokenRule, toRule) + logs, sub, err := _IERC20CustodyEvents.contract.WatchLogs(opts, "WithdrawnAndCalled", toRule, tokenRule) if err != nil { return nil, err } @@ -774,7 +774,7 @@ func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawnAndCalled // ParseWithdrawnAndCalled is a log parse operation binding the contract event 0x6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d5. // -// Solidity: event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data) +// Solidity: event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data) func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) ParseWithdrawnAndCalled(log types.Log) (*IERC20CustodyEventsWithdrawnAndCalled, error) { event := new(IERC20CustodyEventsWithdrawnAndCalled) if err := _IERC20CustodyEvents.contract.UnpackLog(event, "WithdrawnAndCalled", log); err != nil { @@ -853,8 +853,8 @@ func (it *IERC20CustodyEventsWithdrawnAndRevertedIterator) Close() error { // IERC20CustodyEventsWithdrawnAndReverted represents a WithdrawnAndReverted event raised by the IERC20CustodyEvents contract. type IERC20CustodyEventsWithdrawnAndReverted struct { - Token common.Address To common.Address + Token common.Address Amount *big.Int Data []byte RevertContext RevertContext @@ -863,19 +863,19 @@ type IERC20CustodyEventsWithdrawnAndReverted struct { // FilterWithdrawnAndReverted is a free log retrieval operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*IERC20CustodyEventsWithdrawnAndRevertedIterator, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawnAndReverted(opts *bind.FilterOpts, to []common.Address, token []common.Address) (*IERC20CustodyEventsWithdrawnAndRevertedIterator, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20CustodyEvents.contract.FilterLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _IERC20CustodyEvents.contract.FilterLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -884,19 +884,19 @@ func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) FilterWithdrawnAndRever // WatchWithdrawnAndReverted is a free log subscription operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) -func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *IERC20CustodyEventsWithdrawnAndReverted, token []common.Address, to []common.Address) (event.Subscription, error) { +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawnAndReverted(opts *bind.WatchOpts, sink chan<- *IERC20CustodyEventsWithdrawnAndReverted, to []common.Address, token []common.Address) (event.Subscription, error) { - var tokenRule []interface{} - for _, tokenItem := range token { - tokenRule = append(tokenRule, tokenItem) - } var toRule []interface{} for _, toItem := range to { toRule = append(toRule, toItem) } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } - logs, sub, err := _IERC20CustodyEvents.contract.WatchLogs(opts, "WithdrawnAndReverted", tokenRule, toRule) + logs, sub, err := _IERC20CustodyEvents.contract.WatchLogs(opts, "WithdrawnAndReverted", toRule, tokenRule) if err != nil { return nil, err } @@ -930,7 +930,7 @@ func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) WatchWithdrawnAndRevert // ParseWithdrawnAndReverted is a log parse operation binding the contract event 0x2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b. // -// Solidity: event WithdrawnAndReverted(address indexed token, address indexed to, uint256 amount, bytes data, (address,uint64,bytes) revertContext) +// Solidity: event WithdrawnAndReverted(address indexed to, address indexed token, uint256 amount, bytes data, (address,uint64,bytes) revertContext) func (_IERC20CustodyEvents *IERC20CustodyEventsFilterer) ParseWithdrawnAndReverted(log types.Log) (*IERC20CustodyEventsWithdrawnAndReverted, error) { event := new(IERC20CustodyEventsWithdrawnAndReverted) if err := _IERC20CustodyEvents.contract.UnpackLog(event, "WithdrawnAndReverted", log); err != nil { diff --git a/v2/pkg/igatewayzevm.sol/igatewayzevm.go b/v2/pkg/igatewayzevm.sol/igatewayzevm.go index 8a6f8ff8..f99f5bf2 100644 --- a/v2/pkg/igatewayzevm.sol/igatewayzevm.go +++ b/v2/pkg/igatewayzevm.sol/igatewayzevm.go @@ -53,7 +53,7 @@ type ZContext struct { // IGatewayZEVMMetaData contains all meta data concerning the IGatewayZEVM contract. var IGatewayZEVMMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndRevert\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"call\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndCall\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositAndRevert\",\"inputs\":[{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"context\",\"type\":\"tuple\",\"internalType\":\"structzContext\",\"components\":[{\"name\":\"origin\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainID\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeRevert\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawAndCall\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedZetaSent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZRC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientZetaAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyWZETAOrFungible\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20BurnFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZRC20TransferFailed\",\"inputs\":[]}]", } // IGatewayZEVMABI is the input ABI used to generate the binding from. @@ -286,25 +286,25 @@ func (_IGatewayZEVM *IGatewayZEVMTransactorSession) DepositAndCall0(context ZCon return _IGatewayZEVM.Contract.DepositAndCall0(&_IGatewayZEVM.TransactOpts, context, zrc20, amount, target, message) } -// DepositAndRevert is a paid mutator transaction binding the contract method 0xa13b8cff. +// DepositAndRevert is a paid mutator transaction binding the contract method 0x0310eb76. // -// Solidity: function depositAndRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_IGatewayZEVM *IGatewayZEVMTransactor) DepositAndRevert(opts *bind.TransactOpts, context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _IGatewayZEVM.contract.Transact(opts, "depositAndRevert", context, zrc20, amount, target, message, revertContext) +// Solidity: function depositAndRevert(address zrc20, uint256 amount, address target, (address,uint64,bytes) revertContext) returns() +func (_IGatewayZEVM *IGatewayZEVMTransactor) DepositAndRevert(opts *bind.TransactOpts, zrc20 common.Address, amount *big.Int, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _IGatewayZEVM.contract.Transact(opts, "depositAndRevert", zrc20, amount, target, revertContext) } -// DepositAndRevert is a paid mutator transaction binding the contract method 0xa13b8cff. +// DepositAndRevert is a paid mutator transaction binding the contract method 0x0310eb76. // -// Solidity: function depositAndRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_IGatewayZEVM *IGatewayZEVMSession) DepositAndRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _IGatewayZEVM.Contract.DepositAndRevert(&_IGatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function depositAndRevert(address zrc20, uint256 amount, address target, (address,uint64,bytes) revertContext) returns() +func (_IGatewayZEVM *IGatewayZEVMSession) DepositAndRevert(zrc20 common.Address, amount *big.Int, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _IGatewayZEVM.Contract.DepositAndRevert(&_IGatewayZEVM.TransactOpts, zrc20, amount, target, revertContext) } -// DepositAndRevert is a paid mutator transaction binding the contract method 0xa13b8cff. +// DepositAndRevert is a paid mutator transaction binding the contract method 0x0310eb76. // -// Solidity: function depositAndRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_IGatewayZEVM *IGatewayZEVMTransactorSession) DepositAndRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _IGatewayZEVM.Contract.DepositAndRevert(&_IGatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function depositAndRevert(address zrc20, uint256 amount, address target, (address,uint64,bytes) revertContext) returns() +func (_IGatewayZEVM *IGatewayZEVMTransactorSession) DepositAndRevert(zrc20 common.Address, amount *big.Int, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _IGatewayZEVM.Contract.DepositAndRevert(&_IGatewayZEVM.TransactOpts, zrc20, amount, target, revertContext) } // Execute is a paid mutator transaction binding the contract method 0xbcf7f32b. @@ -328,25 +328,25 @@ func (_IGatewayZEVM *IGatewayZEVMTransactorSession) Execute(context ZContext, zr return _IGatewayZEVM.Contract.Execute(&_IGatewayZEVM.TransactOpts, context, zrc20, amount, target, message) } -// ExecuteRevert is a paid mutator transaction binding the contract method 0xaa6585d0. +// ExecuteRevert is a paid mutator transaction binding the contract method 0x717d335f. // -// Solidity: function executeRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_IGatewayZEVM *IGatewayZEVMTransactor) ExecuteRevert(opts *bind.TransactOpts, context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _IGatewayZEVM.contract.Transact(opts, "executeRevert", context, zrc20, amount, target, message, revertContext) +// Solidity: function executeRevert(address target, (address,uint64,bytes) revertContext) returns() +func (_IGatewayZEVM *IGatewayZEVMTransactor) ExecuteRevert(opts *bind.TransactOpts, target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _IGatewayZEVM.contract.Transact(opts, "executeRevert", target, revertContext) } -// ExecuteRevert is a paid mutator transaction binding the contract method 0xaa6585d0. +// ExecuteRevert is a paid mutator transaction binding the contract method 0x717d335f. // -// Solidity: function executeRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_IGatewayZEVM *IGatewayZEVMSession) ExecuteRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _IGatewayZEVM.Contract.ExecuteRevert(&_IGatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function executeRevert(address target, (address,uint64,bytes) revertContext) returns() +func (_IGatewayZEVM *IGatewayZEVMSession) ExecuteRevert(target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _IGatewayZEVM.Contract.ExecuteRevert(&_IGatewayZEVM.TransactOpts, target, revertContext) } -// ExecuteRevert is a paid mutator transaction binding the contract method 0xaa6585d0. +// ExecuteRevert is a paid mutator transaction binding the contract method 0x717d335f. // -// Solidity: function executeRevert((bytes,address,uint256) context, address zrc20, uint256 amount, address target, bytes message, (address,uint64,bytes) revertContext) returns() -func (_IGatewayZEVM *IGatewayZEVMTransactorSession) ExecuteRevert(context ZContext, zrc20 common.Address, amount *big.Int, target common.Address, message []byte, revertContext RevertContext) (*types.Transaction, error) { - return _IGatewayZEVM.Contract.ExecuteRevert(&_IGatewayZEVM.TransactOpts, context, zrc20, amount, target, message, revertContext) +// Solidity: function executeRevert(address target, (address,uint64,bytes) revertContext) returns() +func (_IGatewayZEVM *IGatewayZEVMTransactorSession) ExecuteRevert(target common.Address, revertContext RevertContext) (*types.Transaction, error) { + return _IGatewayZEVM.Contract.ExecuteRevert(&_IGatewayZEVM.TransactOpts, target, revertContext) } // Withdraw is a paid mutator transaction binding the contract method 0x71f6af54. @@ -506,13 +506,14 @@ type IGatewayZEVMCalled struct { Zrc20 common.Address Receiver []byte Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterCalled is a free log retrieval operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// FilterCalled is a free log retrieval operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVM *IGatewayZEVMFilterer) FilterCalled(opts *bind.FilterOpts, sender []common.Address, zrc20 []common.Address) (*IGatewayZEVMCalledIterator, error) { var senderRule []interface{} @@ -531,9 +532,9 @@ func (_IGatewayZEVM *IGatewayZEVMFilterer) FilterCalled(opts *bind.FilterOpts, s return &IGatewayZEVMCalledIterator{contract: _IGatewayZEVM.contract, event: "Called", logs: logs, sub: sub}, nil } -// WatchCalled is a free log subscription operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// WatchCalled is a free log subscription operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVM *IGatewayZEVMFilterer) WatchCalled(opts *bind.WatchOpts, sink chan<- *IGatewayZEVMCalled, sender []common.Address, zrc20 []common.Address) (event.Subscription, error) { var senderRule []interface{} @@ -577,9 +578,9 @@ func (_IGatewayZEVM *IGatewayZEVMFilterer) WatchCalled(opts *bind.WatchOpts, sin }), nil } -// ParseCalled is a log parse operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// ParseCalled is a log parse operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVM *IGatewayZEVMFilterer) ParseCalled(log types.Log) (*IGatewayZEVMCalled, error) { event := new(IGatewayZEVMCalled) if err := _IGatewayZEVM.contract.UnpackLog(event, "Called", log); err != nil { @@ -666,13 +667,14 @@ type IGatewayZEVMWithdrawn struct { Gasfee *big.Int ProtocolFlatFee *big.Int Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawn is a free log retrieval operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVM *IGatewayZEVMFilterer) FilterWithdrawn(opts *bind.FilterOpts, sender []common.Address, chainId []*big.Int) (*IGatewayZEVMWithdrawnIterator, error) { var senderRule []interface{} @@ -691,9 +693,9 @@ func (_IGatewayZEVM *IGatewayZEVMFilterer) FilterWithdrawn(opts *bind.FilterOpts return &IGatewayZEVMWithdrawnIterator{contract: _IGatewayZEVM.contract, event: "Withdrawn", logs: logs, sub: sub}, nil } -// WatchWithdrawn is a free log subscription operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// WatchWithdrawn is a free log subscription operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVM *IGatewayZEVMFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *IGatewayZEVMWithdrawn, sender []common.Address, chainId []*big.Int) (event.Subscription, error) { var senderRule []interface{} @@ -737,9 +739,9 @@ func (_IGatewayZEVM *IGatewayZEVMFilterer) WatchWithdrawn(opts *bind.WatchOpts, }), nil } -// ParseWithdrawn is a log parse operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// ParseWithdrawn is a log parse operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVM *IGatewayZEVMFilterer) ParseWithdrawn(log types.Log) (*IGatewayZEVMWithdrawn, error) { event := new(IGatewayZEVMWithdrawn) if err := _IGatewayZEVM.contract.UnpackLog(event, "Withdrawn", log); err != nil { diff --git a/v2/pkg/igatewayzevm.sol/igatewayzevmevents.go b/v2/pkg/igatewayzevm.sol/igatewayzevmevents.go index 680a32c2..9537423f 100644 --- a/v2/pkg/igatewayzevm.sol/igatewayzevmevents.go +++ b/v2/pkg/igatewayzevm.sol/igatewayzevmevents.go @@ -39,7 +39,7 @@ type RevertOptions struct { // IGatewayZEVMEventsMetaData contains all meta data concerning the IGatewayZEVMEvents contract. var IGatewayZEVMEventsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasfee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"protocolFlatFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false}]", } // IGatewayZEVMEventsABI is the input ABI used to generate the binding from. @@ -261,13 +261,14 @@ type IGatewayZEVMEventsCalled struct { Zrc20 common.Address Receiver []byte Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterCalled is a free log retrieval operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// FilterCalled is a free log retrieval operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) FilterCalled(opts *bind.FilterOpts, sender []common.Address, zrc20 []common.Address) (*IGatewayZEVMEventsCalledIterator, error) { var senderRule []interface{} @@ -286,9 +287,9 @@ func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) FilterCalled(opts *bind.F return &IGatewayZEVMEventsCalledIterator{contract: _IGatewayZEVMEvents.contract, event: "Called", logs: logs, sub: sub}, nil } -// WatchCalled is a free log subscription operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// WatchCalled is a free log subscription operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) WatchCalled(opts *bind.WatchOpts, sink chan<- *IGatewayZEVMEventsCalled, sender []common.Address, zrc20 []common.Address) (event.Subscription, error) { var senderRule []interface{} @@ -332,9 +333,9 @@ func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) WatchCalled(opts *bind.Wa }), nil } -// ParseCalled is a log parse operation binding the contract event 0xde84a55ab1385013b845981b153da57b967875a9a8dee2f36ae7faa6c70c6a4a. +// ParseCalled is a log parse operation binding the contract event 0x885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d8. // -// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Called(address indexed sender, address indexed zrc20, bytes receiver, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) ParseCalled(log types.Log) (*IGatewayZEVMEventsCalled, error) { event := new(IGatewayZEVMEventsCalled) if err := _IGatewayZEVMEvents.contract.UnpackLog(event, "Called", log); err != nil { @@ -421,13 +422,14 @@ type IGatewayZEVMEventsWithdrawn struct { Gasfee *big.Int ProtocolFlatFee *big.Int Message []byte + GasLimit *big.Int RevertOptions RevertOptions Raw types.Log // Blockchain specific contextual infos } -// FilterWithdrawn is a free log retrieval operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) FilterWithdrawn(opts *bind.FilterOpts, sender []common.Address, chainId []*big.Int) (*IGatewayZEVMEventsWithdrawnIterator, error) { var senderRule []interface{} @@ -446,9 +448,9 @@ func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) FilterWithdrawn(opts *bin return &IGatewayZEVMEventsWithdrawnIterator{contract: _IGatewayZEVMEvents.contract, event: "Withdrawn", logs: logs, sub: sub}, nil } -// WatchWithdrawn is a free log subscription operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// WatchWithdrawn is a free log subscription operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *IGatewayZEVMEventsWithdrawn, sender []common.Address, chainId []*big.Int) (event.Subscription, error) { var senderRule []interface{} @@ -492,9 +494,9 @@ func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) WatchWithdrawn(opts *bind }), nil } -// ParseWithdrawn is a log parse operation binding the contract event 0x825680a85a6ce5a93f30c15adc240e7ed18c08cd0abbcc890aa2d2df04eeb7de. +// ParseWithdrawn is a log parse operation binding the contract event 0xf6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0. // -// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, (address,bool,address,bytes) revertOptions) +// Solidity: event Withdrawn(address indexed sender, uint256 indexed chainId, bytes receiver, address zrc20, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message, uint256 gasLimit, (address,bool,address,bytes) revertOptions) func (_IGatewayZEVMEvents *IGatewayZEVMEventsFilterer) ParseWithdrawn(log types.Log) (*IGatewayZEVMEventsWithdrawn, error) { event := new(IGatewayZEVMEventsWithdrawn) if err := _IGatewayZEVMEvents.contract.UnpackLog(event, "Withdrawn", log); err != nil { diff --git a/v2/pkg/senderzevm.sol/senderzevm.go b/v2/pkg/senderzevm.sol/senderzevm.go index 6b999f96..6b30cfd5 100644 --- a/v2/pkg/senderzevm.sol/senderzevm.go +++ b/v2/pkg/senderzevm.sol/senderzevm.go @@ -32,7 +32,7 @@ var ( // SenderZEVMMetaData contains all meta data concerning the SenderZEVM contract. var SenderZEVMMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"gateway_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"callReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"gateway\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawAndCallReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"zrc20\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]}]", - Bin: "0x6080604052348015600f57600080fd5b50604051610a12380380610a12833981016040819052602c916050565b600080546001600160a01b0319166001600160a01b0392909216919091179055607e565b600060208284031215606157600080fd5b81516001600160a01b0381168114607757600080fd5b9392505050565b6109858061008d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630abd890514610046578063116191b61461005b5780637a34d8bb146100a4575b600080fd5b6100596100543660046105e7565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100596100b2366004610687565b61030c565b60008383836040516024016100ce93929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490915073ffffffffffffffffffffffffffffffffffffffff8087169163095ea7b391166101758960026107ad565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156101e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020991906107ed565b61023f576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160808101825261032180825260016020808401829052838501929092528351918201845260008083526060840192909252905492517f90ad3e23000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff16916390ad3e23916102d0918c918c918c918991899060040161087a565b600060405180830381600087803b1580156102ea57600080fd5b505af11580156102fe573d6000803e3d6000fd5b505050505050505050505050565b600083838360405160240161032393929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905281516080810183526103218082526001828401819052828501919091528351928301845260008084526060830193909352915492517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201526024810183905293945092909188169063095ea7b3906044016020604051808303816000875af1158015610447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046b91906107ed565b506000546040517fdc9ca2e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063dc9ca2e7906102d0908b908b908890879089906004016108e8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261050a57600080fd5b81356020830160008067ffffffffffffffff84111561052b5761052b6104ca565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610578576105786104ca565b60405283815290508082840187101561059057600080fd5b838360208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105d157600080fd5b919050565b80151581146105e457600080fd5b50565b60008060008060008060c0878903121561060057600080fd5b863567ffffffffffffffff81111561061757600080fd5b61062389828a016104f9565b96505060208701359450610639604088016105ad565b9350606087013567ffffffffffffffff81111561065557600080fd5b61066189828a016104f9565b9350506080870135915060a0870135610679816105d6565b809150509295509295509295565b600080600080600060a0868803121561069f57600080fd5b853567ffffffffffffffff8111156106b657600080fd5b6106c2888289016104f9565b9550506106d1602087016105ad565b9350604086013567ffffffffffffffff8111156106ed57600080fd5b6106f9888289016104f9565b935050606086013591506080860135610711816105d6565b809150509295509295909350565b6000815180845260005b8181101561074557602081850181015186830182015201610729565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b606081526000610796606083018661071f565b602083019490945250901515604090910152919050565b808201808211156107e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156107ff57600080fd5b815161080a816105d6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526000606082015160806060850152610872608085018261071f565b949350505050565b60c08152600061088d60c083018961071f565b87602084015273ffffffffffffffffffffffffffffffffffffffff8716604084015282810360608401526108c1818761071f565b905084608084015282810360a08401526108db8185610811565b9998505050505050505050565b60a0815260006108fb60a083018861071f565b73ffffffffffffffffffffffffffffffffffffffff871660208401528281036040840152610929818761071f565b905084606084015282810360808401526109438185610811565b9897505050505050505056fea264697066735822122081a08bbd8f6b6c1e3e73e92df5ac001d9e383817e2faa175b98d3c6cd01edab664736f6c634300081a0033", + Bin: "0x6080604052348015600f57600080fd5b50604051610a12380380610a12833981016040819052602c916050565b600080546001600160a01b0319166001600160a01b0392909216919091179055607e565b600060208284031215606157600080fd5b81516001600160a01b0381168114607757600080fd5b9392505050565b6109858061008d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630abd890514610046578063116191b61461005b5780637a34d8bb146100a4575b600080fd5b6100596100543660046105e7565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100596100b2366004610687565b61030c565b60008383836040516024016100ce93929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490915073ffffffffffffffffffffffffffffffffffffffff8087169163095ea7b391166101758960026107ad565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156101e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020991906107ed565b61023f576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160808101825261032180825260016020808401829052838501929092528351918201845260008083526060840192909252905492517f90ad3e23000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff16916390ad3e23916102d0918c918c918c918991899060040161087a565b600060405180830381600087803b1580156102ea57600080fd5b505af11580156102fe573d6000803e3d6000fd5b505050505050505050505050565b600083838360405160240161032393929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905281516080810183526103218082526001828401819052828501919091528351928301845260008084526060830193909352915492517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201526024810183905293945092909188169063095ea7b3906044016020604051808303816000875af1158015610447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046b91906107ed565b506000546040517fdc9ca2e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063dc9ca2e7906102d0908b908b908890879089906004016108e8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261050a57600080fd5b81356020830160008067ffffffffffffffff84111561052b5761052b6104ca565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610578576105786104ca565b60405283815290508082840187101561059057600080fd5b838360208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105d157600080fd5b919050565b80151581146105e457600080fd5b50565b60008060008060008060c0878903121561060057600080fd5b863567ffffffffffffffff81111561061757600080fd5b61062389828a016104f9565b96505060208701359450610639604088016105ad565b9350606087013567ffffffffffffffff81111561065557600080fd5b61066189828a016104f9565b9350506080870135915060a0870135610679816105d6565b809150509295509295509295565b600080600080600060a0868803121561069f57600080fd5b853567ffffffffffffffff8111156106b657600080fd5b6106c2888289016104f9565b9550506106d1602087016105ad565b9350604086013567ffffffffffffffff8111156106ed57600080fd5b6106f9888289016104f9565b935050606086013591506080860135610711816105d6565b809150509295509295909350565b6000815180845260005b8181101561074557602081850181015186830182015201610729565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b606081526000610796606083018661071f565b602083019490945250901515604090910152919050565b808201808211156107e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156107ff57600080fd5b815161080a816105d6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526000606082015160806060850152610872608085018261071f565b949350505050565b60c08152600061088d60c083018961071f565b87602084015273ffffffffffffffffffffffffffffffffffffffff8716604084015282810360608401526108c1818761071f565b905084608084015282810360a08401526108db8185610811565b9998505050505050505050565b60a0815260006108fb60a083018861071f565b73ffffffffffffffffffffffffffffffffffffffff871660208401528281036040840152610929818761071f565b905084606084015282810360808401526109438185610811565b9897505050505050505056fea26469706673582212207447884a874c8537c3ef840e4ddffbc65b7e07105578a7028d806e21fe26e52164736f6c634300081a0033", } // SenderZEVMABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/zetaconnectornative.t.sol/zetaconnectornativetest.go b/v2/pkg/zetaconnectornative.t.sol/zetaconnectornativetest.go index 296f3e3d..9996547d 100644 --- a/v2/pkg/zetaconnectornative.t.sol/zetaconnectornativetest.go +++ b/v2/pkg/zetaconnectornative.t.sol/zetaconnectornativetest.go @@ -65,7 +65,7 @@ type StdInvariantFuzzSelector struct { // ZetaConnectorNativeTestMetaData contains all meta data concerning the ZetaConnectorNativeTest contract. var ZetaConnectorNativeTestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testWithdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveERC20\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveERC20FailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveERC20Partial\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveNoParams\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevert\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061e9158061003c6000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063b0464fdc116100e3578063dcf7d0371161008c578063e63ab1e911610066578063e63ab1e9146102ce578063fa7626d4146102f5578063fe574f841461030257600080fd5b8063dcf7d037146102b6578063de1cb76c146102be578063e20c9f71146102c657600080fd5b8063c1909972116100bd578063c19099721461029e578063ccb0e3f2146102a6578063d509b16c146102ae57600080fd5b8063b0464fdc14610276578063b5508aa91461027e578063ba414fa61461028657600080fd5b8063493465581161014557806385226c811161011f57806385226c811461021757806385f438c11461022c578063916a17c61461026157600080fd5b806349346558146101f257806366d9a9a0146101fa578063828320141461020f57600080fd5b80633cba0107116101765780633cba0107146101da5780633e5e3c23146101e25780633f7286f4146101ea57600080fd5b80630a9254e41461019d5780631ed7831c146101a75780632ade3880146101c5575b600080fd5b6101a561030a565b005b6101af610b0d565b6040516101bc9190618303565b60405180910390f35b6101cd610b6f565b6040516101bc919061839f565b6101a5610cb1565b6101af61146b565b6101af6114cb565b6101a561152b565b610202611b6e565b6040516101bc9190618505565b6101a5611cf0565b61021f611f4c565b6040516101bc91906185a3565b6102537f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6040519081526020016101bc565b61026961201c565b6040516101bc919061861a565b610269612117565b61021f612212565b61028e6122e2565b60405190151581526020016101bc565b6101a56123b6565b6101a5612621565b6101a561314d565b6101a5613189565b6101a5613830565b6101af613e87565b6102537f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b601f5461028e9060ff1681565b6101a5613ee7565b602580547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556026805482166112341790556027805490911661567817905560405161035c90618216565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156103e0573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602754602554925190861694810194909452604484019290925290921660648201526104d1919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b00000000000000000000000000000000000000000000000000000000179052614105565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560275460255460405192939182169291169061055d90618223565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610599573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460245460275460255460405193851694928316939183169216906105f490618230565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610638573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560405161067d9061823d565b604051809103906000f080158015610699573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556027546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b15801561074557600080fd5b505af1158015610759573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b15801561084957600080fd5b505af115801561085d573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b1580156108c357600080fd5b505af11580156108d7573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561093957600080fd5b505af115801561094d573d6000803e3d6000fd5b5050602480546023546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152624c4b40938101939093521692506340c10f199150604401600060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b039081168252600160208084019182528451908101855260008152938301849052825160288054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602990610b089082618774565b505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610b6557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b47575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015610ca857600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610c91578382906000526020600020018054610c04906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c30906186e0565b8015610c7d5780601f10610c5257610100808354040283529160200191610c7d565b820191906000526020600020905b815481529060010190602001808311610c6057829003601f168201915b505050505081526020019060010190610be5565b505050508152505081526020019060010190610b93565b50505050905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a2000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db09190618833565b9050610dbd816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391610f14916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b158015610f2e57600080fd5b505af1158015610f42573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015610fd457600080fd5b505af1158015610fe8573d6000803e3d6000fd5b505060208054602454602654604080516001600160a01b0394851681529485018d905291831684830152919091166060830152517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609350908190036080019150a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156110d757600080fd5b505af11580156110eb573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506111309089908890618874565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561119157600080fd5b505af11580156111a5573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506111fd92909116908a9089908b9060040161888d565b600060405180830381600087803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190618833565b90506112ae8188614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113229190618833565b9050611337816113328a876188f5565b614124565b602480546020546021546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169381019390935260009291169063dd62ed3e90604401602060405180830381865afa1580156113ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d19190618833565b90506113de816000614124565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561142e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114529190618833565b905061145f816000614124565b50505050505050505050565b60606018805480602002602001604051908101604052809291908181526020018280548015610b65576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b47575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610b65576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b47575050505050905090565b604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed70169000000000000000000000000000000000000000000000000000000001790525460265493516370a0823160e01b8152620186a0946000949385936001600160a01b03908116936370a08231936115cc93921691016001600160a01b0391909116815260200190565b602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d9190618833565b905061161a816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561166a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168e9190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391611771916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561183157600080fd5b505af1158015611845573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561191757600080fd5b505af115801561192b573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506119709089908890618874565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef9350611a3d92909116908a9089908b9060040161888d565b600060405180830381600087803b158015611a5757600080fd5b505af1158015611a6b573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611abd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae19190618833565b9050611aee816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190618833565b90506113378185614124565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015610ca85783829060005260206000209060020201604051806040016040529081600082018054611bc5906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf1906186e0565b8015611c3e5780601f10611c1357610100808354040283529160200191611c3e565b820191906000526020600020905b815481529060010190602001808311611c2157829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611cd857602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611c855790505b50505050508152505081526020019060010190611b92565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f190181529082905260255463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611d8d57600080fd5b505af1158015611da1573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611e8c9190600401618908565b600060405180830381600087803b158015611ea657600080fd5b505af1158015611eba573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f259350611f1592909116908790869088906028906004016189f0565b600060405180830381600087803b158015611f2f57600080fd5b505af1158015611f43573d6000803e3d6000fd5b50505050505050565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015610ca8578382906000526020600020018054611f8f906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbb906186e0565b80156120085780601f10611fdd57610100808354040283529160200191612008565b820191906000526020600020905b815481529060010190602001808311611feb57829003601f168201915b505050505081526020019060010190611f70565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015610ca85760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156120ff57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116120ac5790505b50505050508152505081526020019060010190612040565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015610ca85760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156121fa57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116121a75790505b5050505050815250508152602001906001019061213b565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015610ca8578382906000526020600020018054612255906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612281906186e0565b80156122ce5780601f106122a3576101008083540402835291602001916122ce565b820191906000526020600020905b8154815290600101906020018083116122b157829003601f168201915b505050505081526020019060010190612236565b60085460009060ff16156122fa575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa15801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190618833565b1415905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602554905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061259b9190600401618908565b600060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef9350611f15929091169087908690889060040161888d565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561268257600080fd5b505af1158015612696573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506127819190600401618908565b600060405180830381600087803b15801561279b57600080fd5b505af11580156127af573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561280357600080fd5b505af1158015612817573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561287457600080fd5b505af1158015612888573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506129739190600401618908565b600060405180830381600087803b15801561298d57600080fd5b505af11580156129a1573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156129f557600080fd5b505af1158015612a09573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612a6657600080fd5b505af1158015612a7a573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ace57600080fd5b505af1158015612ae2573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd93c0665000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612b6b57600080fd5b505af1158015612b7f573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612bdc57600080fd5b505af1158015612bf0573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401600060405180830381600087803b158015612c6457600080fd5b505af1158015612c78573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612cd557600080fd5b505af1158015612ce9573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa158015612da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc89190618833565b9050612dd5816000614124565b6026546040516001600160a01b0390911660248201526044810184905260009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391612eb5916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b158015612ecf57600080fd5b505af1158015612ee3573d6000803e3d6000fd5b50506023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612f7557600080fd5b505af1158015612f89573d6000803e3d6000fd5b50506026546040518781526001600160a01b0390911692507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5915060200160405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561302857600080fd5b505af115801561303c573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101899052604481018890529116925063106e62909150606401600060405180830381600087803b1580156130b057600080fd5b505af11580156130c4573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015613116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313a9190618833565b90506131468186614124565b5050505050565b602480546026546040516370a0823160e01b81526001600160a01b039182166004820152620186a093600093849316916370a082319101612d87565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc5131691000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132889190618833565b9050613295816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133099190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba3916133ec916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b15801561340657600080fd5b505af115801561341a573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156134ac57600080fd5b505af11580156134c0573d6000803e3d6000fd5b50506020547f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af6092506001600160a01b031690506134fe600289618a3c565b602454602654604080516001600160a01b03958616815260208101949094529184168383015292909216606082015290519081900360800190a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156135c657600080fd5b505af11580156135da573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d915061361f9089908890618874565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561368057600080fd5b505af1158015613694573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506136ec92909116908a9089908b9060040161888d565b600060405180830381600087803b15801561370657600080fd5b505af115801561371a573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa15801561376c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137909190618833565b90506137a18161133260028a618a3c565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138159190618833565b90506113378161382660028b618a3c565b61133290876188f5565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f1901815290829052602480546021546370a0823160e01b85526001600160a01b0390811660048601529294506000939216916370a082319101602060405180830381865afa1580156138c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e99190618833565b90506138f6816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396a9190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613a4d916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b158015613a6757600080fd5b505af1158015613a7b573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613b0d57600080fd5b505af1158015613b21573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e9350613b6592506001600160a01b0390911690602890618a77565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613bfb57600080fd5b505af1158015613c0f573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690613c5d908a908990602890618a99565b60405180910390a36023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613cf357600080fd5b505af1158015613d07573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c9150613d4f9089908890602890618a99565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613db057600080fd5b505af1158015613dc4573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f259350613e1f92909116908a9089908b906028906004016189f0565b600060405180830381600087803b158015613e3957600080fd5b505af1158015613e4d573d6000803e3d6000fd5b5050602480546021546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101611261565b60606015805480602002602001604051908101604052809291908181526020018280548015610b65576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b47575050505050905090565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613f4857600080fd5b505af1158015613f5c573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506140479190600401618908565b600060405180830381600087803b15801561406157600080fd5b505af1158015614075573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401600060405180830381600087803b1580156140e957600080fd5b505af11580156140fd573d6000803e3d6000fd5b505050505050565b600061410f61824a565b61411a8484836141a3565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561418f57600080fd5b505afa1580156140fd573d6000803e3d6000fd5b6000806141b0858461421e565b90506142136040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016141fe929190618ac4565b6040516020818303038152906040528561422a565b9150505b9392505050565b60006142178383614258565b60c0810151516000901561424e5761424784848460c00151614273565b9050614217565b6142478484614419565b60006142648383614504565b6142178383602001518461422a565b60008061427e614514565b9050600061428c86836145e7565b905060006142a38260600151836020015185614a8d565b905060006142b383838989614c9f565b905060006142c082615b1c565b602081015181519192509060030b15614333578982604001516040516020016142ea929190618ae6565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261432a91600401618908565b60405180910390fd5b60006143766040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001615ceb565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906143c9908490600401618908565b602060405180830381865afa1580156143e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061440a9190618b67565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061446e908790600401618908565b600060405180830381865afa15801561448b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144b39190810190618c49565b905060006144e182856040516020016144cd929190618c7e565b604051602081830303815290604052615eeb565b90506001600160a01b03811661411a5784846040516020016142ea929190618cad565b61451082826000615efe565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c9061459b908490600401618d58565b600060405180830381865afa1580156145b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145e09190810190618d9f565b9250505090565b6146196040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506146646040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61466d85616001565b6020820152600061467d866163e6565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156146bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526146e79190810190618d9f565b868385602001516040516020016147019493929190618de8565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190614759908590600401618908565b600060405180830381865afa158015614776573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261479e9190810190618d9f565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f6906147e6908490600401618eec565b602060405180830381865afa158015614803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148279190618f3e565b61483c57816040516020016142ea9190618f60565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614881908490600401618ff2565b600060405180830381865afa15801561489e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526148c69190810190618d9f565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061490d908490600401619044565b602060405180830381865afa15801561492a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494e9190618f3e565b156149e3576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614998908490600401619044565b600060405180830381865afa1580156149b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526149dd9190810190618d9f565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001614a089190619096565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401614a34929190619102565b600060405180830381865afa158015614a51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614a799190810190618d9f565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081614aa95790505090506040518060400160405280600481526020017f677265700000000000000000000000000000000000000000000000000000000081525081600081518110614b0957614b09619127565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110614b5d57614b5d619127565b602002602001018190525084604051602001614b799190619156565b60405160208183030381529060405281600281518110614b9b57614b9b619127565b602002602001018190525082604051602001614bb791906191c2565b60405160208183030381529060405281600381518110614bd957614bd9619127565b60200260200101819052506000614bef82615b1c565b602080820151604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000008185019081528251808401845260008082529086015282518084019093529051825292810192909252919250614c809060408051808201825260008082526020918201528151808301909252845182528085019082015290616669565b614c9557856040516020016142ea9190619203565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015614cef565b511590565b614e6357826020015115614dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a40161432a565b8260c0015115614e63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a40161432a565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081614e7c57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280614ed790619294565b935060ff1681518110614eec57614eec619127565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001614f3d91906192b3565b604051602081830303815290604052828280614f5890619294565b935060ff1681518110614f6d57614f6d619127565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280614fba90619294565b935060ff1681518110614fcf57614fcf619127565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061501c90619294565b935060ff168151811061503157615031619127565b6020026020010181905250876020015182828061504d90619294565b935060ff168151811061506257615062619127565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806150af90619294565b935060ff16815181106150c4576150c4619127565b6020908102919091010152875182826150dc81619294565b935060ff16815181106150f1576150f1619127565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e4964000000000000000000000000000000000000000000000081525082828061513e90619294565b935060ff168151811061515357615153619127565b6020026020010181905250615167466166ca565b828261517281619294565b935060ff168151811061518757615187619127565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806151d490619294565b935060ff16815181106151e9576151e9619127565b60200260200101819052508682828061520190619294565b935060ff168151811061521657615216619127565b602090810291909101015285511561533d5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261526781619294565b935060ff168151811061527c5761527c619127565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906152cc908990600401618908565b600060405180830381865afa1580156152e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153119190810190618d9f565b828261531c81619294565b935060ff168151811061533157615331619127565b60200260200101819052505b84602001511561540d5760408051808201909152601281527f2d2d766572696679536f75726365436f646500000000000000000000000000006020820152828261538681619294565b935060ff168151811061539b5761539b619127565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806153e890619294565b935060ff16815181106153fd576153fd619127565b60200260200101819052506155d4565b615445614cea8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6154d85760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261548881619294565b935060ff168151811061549d5761549d619127565b60200260200101819052508460a001516040516020016154bd9190619156565b6040516020818303038152906040528282806153e890619294565b8460c0015115801561551b57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261551990511590565b155b156155d45760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261555f81619294565b935060ff168151811061557457615574619127565b60200260200101819052506155888861676a565b6040516020016155989190619156565b6040516020818303038152906040528282806155b390619294565b935060ff16815181106155c8576155c8619127565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261560890511590565b61569d5760408051808201909152600b81527f2d2d72656c6179657249640000000000000000000000000000000000000000006020820152828261564b81619294565b935060ff168151811061566057615660619127565b6020026020010181905250846040015182828061567c90619294565b935060ff168151811061569157615691619127565b60200260200101819052505b6060850151156157be5760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826156e681619294565b935060ff16815181106156fb576156fb619127565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa15801561576a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157929190810190618d9f565b828261579d81619294565b935060ff16815181106157b2576157b2619127565b60200260200101819052505b60e085015151156158655760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261580881619294565b935060ff168151811061581d5761581d619127565b60200260200101819052506158398560e00151600001516166ca565b828261584481619294565b935060ff168151811061585957615859619127565b60200260200101819052505b60e0850151602001511561590f5760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826158b281619294565b935060ff16815181106158c7576158c7619127565b60200260200101819052506158e38560e00151602001516166ca565b82826158ee81619294565b935060ff168151811061590357615903619127565b60200260200101819052505b60e085015160400151156159b95760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261595c81619294565b935060ff168151811061597157615971619127565b602002602001018190525061598d8560e00151604001516166ca565b828261599881619294565b935060ff16815181106159ad576159ad619127565b60200260200101819052505b60e08501516060015115615a635760408051808201909152601681527f2d2d6d61785072696f726974794665655065724761730000000000000000000060208201528282615a0681619294565b935060ff1681518110615a1b57615a1b619127565b6020026020010181905250615a378560e00151606001516166ca565b8282615a4281619294565b935060ff1681518110615a5757615a57619127565b60200260200101819052505b60008160ff1667ffffffffffffffff811115615a8157615a816186b1565b604051908082528060200260200182016040528015615ab457816020015b6060815260200190600190039081615a9f5790505b50905060005b8260ff168160ff161015615b0d57838160ff1681518110615add57615add619127565b6020026020010151828260ff1681518110615afa57615afa619127565b6020908102919091010152600101615aba565b5093505050505b949350505050565b615b436040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c91615bc99186910161931e565b600060405180830381865afa158015615be6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615c0e9190810190618d9f565b90506000615c1c8683617259565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401615c4c91906185a3565b6000604051808303816000875af1158015615c6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615c939190810190619365565b805190915060030b15801590615cac5750602081015151155b8015615cbb5750604081015151155b15614c955781600081518110615cd357615cd3619127565b60200260200101516040516020016142ea919061941b565b60606000615d208560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150615d579082905b906173ae565b15615eb4576000615dd482615dce84615dc8615d9a8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906173d5565b90617437565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615e389082906173ae565b15615ea257604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615e9f905b82906174bc565b90505b615eab816174e2565b92505050614217565b8215615ecd5784846040516020016142ea929190619607565b5050604080516020810190915260008152614217565b509392505050565b6000808251602084016000f09392505050565b8160a0015115615f0d57505050565b6000615f1a84848461754b565b90506000615f2782615b1c565b602081015181519192509060030b158015615fc35750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615fc390604080518082018252600080825260209182015281518083019092528451825280850190820152615d51565b15615fd057505050505050565b60408201515115615ff05781604001516040516020016142ea91906196ae565b806040516020016142ea919061970c565b606060006160368360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061609b905b8290616669565b1561610a57604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261421790616105908390617ae6565b6174e2565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261616c905b8290617b70565b60010361623957604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526161d290615e98565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261421790616105905b83906174bc565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261629890616094565b156163cf57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616300908390617c0a565b90506000816001835161631391906188f5565b8151811061632357616323619127565b602002602001015190506163c66161056163996040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290617ae6565b95945050505050565b826040516020016142ea9190619777565b50919050565b6060600061641b8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061647d90616094565b1561648b57614217816174e2565b604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526164ea90616165565b60010361655457604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526142179061610590616232565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526165b390616094565b156163cf57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061661b908390617c0a565b905060018151111561665757806002825161663691906188f5565b8151811061664657616646619127565b602002602001015192505050919050565b50826040516020016142ea9190619777565b80518251600091111561667e5750600061411e565b8151835160208501516000929161669491619855565b61669e91906188f5565b9050826020015181036166b557600191505061411e565b82516020840151819020912014905092915050565b606060006166d783617caf565b600101905060008167ffffffffffffffff8111156166f7576166f76186b1565b6040519080825280601f01601f191660200182016040528015616721576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461672b57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e53454400000000000000000000000000000000000000000000818401908152855180870187528381528401929092528451808601909552518452908301526060916167f6905b8290617d91565b1561683657505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616895906167ef565b156168d557505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616934906167ef565b1561697457505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526169d3906167ef565b80616a385750604080518082018252601081527f47504c2d322e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a38906167ef565b15616a7857505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ad7906167ef565b80616b3c5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616b3c906167ef565b15616b7c57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616bdb906167ef565b80616c405750604080518082018252601181527f4c47504c2d322e312d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616c40906167ef565b15616c8057505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616cdf906167ef565b80616d445750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d44906167ef565b15616d8457505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616de3906167ef565b15616e2357505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e82906167ef565b15616ec257505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f21906167ef565b15616f6157505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616fc0906167ef565b1561700057505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261705f906167ef565b1561709f57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526170fe906167ef565b806171635750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617163906167ef565b156171a357505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617202906167ef565b1561724257505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b604080840151845191516142ea9290602001619868565b60608060005b84518110156172e4578185828151811061727b5761727b619127565b6020026020010151604051602001617294929190618c7e565b6040516020818303038152906040529150600185516172b391906188f5565b81146172dc57816040516020016172ca91906199d1565b60405160208183030381529060405291505b60010161725f565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816172fd579050509050838160008151811061732857617328619127565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061737c5761737c619127565b6020026020010181905250818160028151811061739b5761739b619127565b6020908102919091010152949350505050565b60208083015183518351928401516000936173cc9291849190617da5565b14159392505050565b604080518082019091526000808252602082015260006174078460000151856020015185600001518660200151617eb6565b905083602001518161741991906188f5565b845185906174289083906188f5565b90525060208401525090919050565b604080518082019091526000808252602082015281518351101561745c57508161411e565b60208083015190840151600191146174835750815160208481015190840151829020919020145b80156174b45782518451859061749a9083906188f5565b90525082516020850180516174b0908390619855565b9052505b509192915050565b60408051808201909152600080825260208201526174db838383617fd6565b5092915050565b60606000826000015167ffffffffffffffff811115617503576175036186b1565b6040519080825280601f01601f19166020018201604052801561752d576020820181803683370190505b50905060006020820190506174db8185602001518660000151618081565b60606000617557614514565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161757457905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806175cf90619294565b935060ff16815181106175e4576175e4619127565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e33000000000000000000000000000000000000000000000000008152506040516020016176359190619a12565b60405160208183030381529060405282828061765090619294565b935060ff168151811061766557617665619127565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806176b290619294565b935060ff16815181106176c7576176c7619127565b6020026020010181905250826040516020016176e391906191c2565b6040516020818303038152906040528282806176fe90619294565b935060ff168151811061771357617713619127565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e74726163740000000000000000000000000000000000000000000081525082828061776090619294565b935060ff168151811061777557617775619127565b602002602001018190525061778a87846180fb565b828261779581619294565b935060ff16815181106177aa576177aa619127565b6020908102919091010152855151156178565760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826177fc81619294565b935060ff168151811061781157617811619127565b602002602001018190525061782a8660000151846180fb565b828261783581619294565b935060ff168151811061784a5761784a619127565b60200260200101819052505b8560800151156178c45760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261789f81619294565b935060ff16815181106178b4576178b4619127565b602002602001018190525061792a565b841561792a5760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261790981619294565b935060ff168151811061791e5761791e619127565b60200260200101819052505b604086015151156179c65760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261797481619294565b935060ff168151811061798957617989619127565b602002602001018190525085604001518282806179a590619294565b935060ff16815181106179ba576179ba619127565b60200260200101819052505b856060015115617a305760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282617a0f81619294565b935060ff1681518110617a2457617a24619127565b60200260200101819052505b60008160ff1667ffffffffffffffff811115617a4e57617a4e6186b1565b604051908082528060200260200182016040528015617a8157816020015b6060815260200190600190039081617a6c5790505b50905060005b8260ff168160ff161015617ada57838160ff1681518110617aaa57617aaa619127565b6020026020010151828260ff1681518110617ac757617ac7619127565b6020908102919091010152600101617a87565b50979650505050505050565b6040805180820190915260008082526020820152815183511015617b0b57508161411e565b81518351602085015160009291617b2191619855565b617b2b91906188f5565b60208401519091506001908214617b4c575082516020840151819020908220145b8015617b6757835185518690617b639083906188f5565b9052505b50929392505050565b6000808260000151617b948560000151866020015186600001518760200151617eb6565b617b9e9190619855565b90505b83516020850151617bb29190619855565b81116174db5781617bc281619a57565b9250508260000151617bf9856020015183617bdd91906188f5565b8651617be991906188f5565b8386600001518760200151617eb6565b617c039190619855565b9050617ba1565b60606000617c188484617b70565b617c23906001619855565b67ffffffffffffffff811115617c3b57617c3b6186b1565b604051908082528060200260200182016040528015617c6e57816020015b6060815260200190600190039081617c595790505b50905060005b8151811015615ee357617c8a61610586866174bc565b828281518110617c9c57617c9c619127565b6020908102919091010152600101617c74565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310617cf8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310617d24576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310617d4257662386f26fc10000830492506010015b6305f5e1008310617d5a576305f5e100830492506008015b6127108310617d6e57612710830492506004015b60648310617d80576064830492506002015b600a831061411e5760010192915050565b6000617d9d838361813b565b159392505050565b600080858411617eac5760208411617e585760008415617df0576001617dcc8660206188f5565b617dd7906008619a71565b617de2906002619b6f565b617dec91906188f5565b1990505b8351811685617dff8989619855565b617e0991906188f5565b805190935082165b818114617e4357878411617e2b5787945050505050615b14565b83617e3581619b7b565b945050828451169050617e11565b617e4d8785619855565b945050505050615b14565b838320617e6585886188f5565b617e6f9087619855565b91505b858210617eaa57848220808203617e9757617e8d8684619855565b9350505050615b14565b617ea26001846188f5565b925050617e72565b505b5092949350505050565b60008381868511617fc15760208511617f705760008515617f02576001617ede8760206188f5565b617ee9906008619a71565b617ef4906002619b6f565b617efe91906188f5565b1990505b84518116600087617f138b8b619855565b617f1d91906188f5565b855190915083165b828114617f6257818610617f4a57617f3d8b8b619855565b9650505050505050615b14565b85617f5481619a57565b965050838651169050617f25565b859650505050505050615b14565b508383206000905b617f8286896188f5565b8211617fbf57858320808203617f9e5783945050505050615b14565b617fa9600185619855565b9350508180617fb790619a57565b925050617f78565b505b617fcb8787619855565b979650505050505050565b604080518082019091526000808252602082015260006180088560000151866020015186600001518760200151617eb6565b60208087018051918601919091525190915061802490826188f5565b8352845160208601516180379190619855565b81036180465760008552618078565b835183516180549190619855565b855186906180639083906188f5565b90525083516180729082619855565b60208601525b50909392505050565b602081106180b95781518352618098602084619855565b92506180a5602083619855565b91506180b26020826188f5565b9050618081565b60001981156180e85760016180cf8360206188f5565b6180db90610100619b6f565b6180e591906188f5565b90505b9151835183169219169190911790915250565b6060600061810984846145e7565b805160208083015160405193945061812393909101619b92565b60405160208183030381529060405291505092915050565b815181516000919081111561814e575081515b6020808501519084015160005b8381101561820757825182518082146181d75760001960208710156181b6576001846181888960206188f5565b6181929190619855565b61819d906008619a71565b6181a8906002619b6f565b6181b291906188f5565b1990505b81811683821681810391146181d457975061411e9650505050505050565b50505b6181e2602086619855565b94506181ef602085619855565b935050506020816182009190619855565b905061815b565b5084518651614c959190619bea565b610c9f80619c0b83390190565b6119ca8061a8aa83390190565b61188c8061c27483390190565b610de08061db0083390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161828d618292565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161828d6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b818110156183445783516001600160a01b031683526020938401939092019160010161831d565b509095945050505050565b60005b8381101561836a578181015183820152602001618352565b50506000910152565b6000815180845261838b81602086016020860161834f565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015618481577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261846b848651618373565b6020958601959094509290920191600101618431565b5091975050506020948501949290920191506001016183c7565b50929695505050505050565b600081518084526020840193506020830160005b828110156184fb5781517fffffffff00000000000000000000000000000000000000000000000000000000168652602095860195909101906001016184bb565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526185716040880182618373565b905060208201519150868103602088015261858c81836184a7565b96505050602093840193919091019060010161852d565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452618605858351618373565b945060209384019391909101906001016185cb565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b038151168652602081015190506040602087015261869b60408701826184a7565b9550506020938401939190910190600101618642565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806186f457607f821691505b6020821081036163e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610b0857806000526020600020601f840160051c810160208510156187545750805b601f840160051c820191505b818110156131465760008155600101618760565b815167ffffffffffffffff81111561878e5761878e6186b1565b6187a28161879c84546186e0565b8461872d565b6020601f8211600181146187d657600083156187be5750848201515b600019600385901b1c1916600184901b178455613146565b600084815260208120601f198516915b8281101561880657878501518255602094850194600190920191016187e6565b50848210156188245786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561884557600080fd5b5051919050565b6001600160a01b03841681528260208201526060604082015260006163c66060830184618373565b828152604060208201526000615b146040830184618373565b6001600160a01b03851681528360208201526080604082015260006188b56080830185618373565b905082606083015295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561411e5761411e6188c6565b6020815260006142176020830184618373565b600081546001600160a01b038116845267ffffffffffffffff8160a01c16602085015250600182016060604085015260008154618957816186e0565b806060880152600182166000811461897657600181146189b0576189e4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b89010193506189e4565b84600052602060002060005b838110156189db5781548a8201608001526001909101906020016189bc565b89016080019450505b50919695505050505050565b6001600160a01b038616815284602082015260a060408201526000618a1860a0830186618373565b8460608401528281036080840152618a30818561891b565b98975050505050505050565b600082618a72577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6001600160a01b0383168152604060208201526000615b14604083018461891b565b838152606060208201526000618ab26060830185618373565b8281036040840152614c95818561891b565b6001600160a01b0383168152604060208201526000615b146040830184618373565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351618b1e81601a85016020880161834f565b7f3a20000000000000000000000000000000000000000000000000000000000000601a918401918201528351618b5b81601c84016020880161834f565b01601c01949350505050565b600060208284031215618b7957600080fd5b81516001600160a01b038116811461421757600080fd5b6040516060810167ffffffffffffffff81118282101715618bb357618bb36186b1565b60405290565b60008067ffffffffffffffff841115618bd457618bd46186b1565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715618c0357618c036186b1565b604052838152905080828401851015618c1b57600080fd5b615ee384602083018561834f565b600082601f830112618c3a57600080fd5b61421783835160208501618bb9565b600060208284031215618c5b57600080fd5b815167ffffffffffffffff811115618c7257600080fd5b61411a84828501618c29565b60008351618c9081846020880161834f565b835190830190618ca481836020880161834f565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351618ce581601a85016020880161834f565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351618d2281603384016020880161834f565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f555400000000000000000000000000000000000000000060608201526080602082015260006142176080830184618373565b600060208284031215618db157600080fd5b815167ffffffffffffffff811115618dc857600080fd5b8201601f81018413618dd957600080fd5b61411a84825160208401618bb9565b60008551618dfa818460208a0161834f565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551618e34816001840160208a0161834f565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451618e7281600284016020890161834f565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351618eb481600284016020880161834f565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000618eff6040830184618373565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b600060208284031215618f5057600080fd5b8151801515811461421757600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251618f9881601f85016020870161834f565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b6040815260006190056040830184618373565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b6040815260006190576040830184618373565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b270000000000000000000000008152600082516190ce81601485016020870161834f565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b6040815260006191156040830185618373565b82810360208401526142138185618373565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f220000000000000000000000000000000000000000000000000000000000000081526000825161918e81600185016020870161834f565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b600082516191d481846020870161834f565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161928781604b85016020870161834f565b91909101604b0192915050565b600060ff821660ff81036192aa576192aa6188c6565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161931181602985016020870161834f565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006142176080830184618373565b60006020828403121561937757600080fd5b815167ffffffffffffffff81111561938e57600080fd5b8201606081850312156193a057600080fd5b6193a8618b90565b81518060030b81146193b957600080fd5b8152602082015167ffffffffffffffff8111156193d557600080fd5b6193e186828501618c29565b602083015250604082015167ffffffffffffffff81111561940157600080fd5b61940d86828501618c29565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161947981602185016020870161834f565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161966581602185016020880161834f565b7f2720696e206f75747075743a200000000000000000000000000000000000000060219184019182015283516196a281602e84016020880161834f565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161931181602985016020870161834f565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161976a81602285016020870161834f565b9190910160220192915050565b7f436f6e7472616374206e616d65200000000000000000000000000000000000008152600082516197af81600e85016020870161834f565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b8082018082111561411e5761411e6188c6565b7f53504458206c6963656e7365206964656e7469666965722000000000000000008152600083516198a081601885016020880161834f565b7f20696e200000000000000000000000000000000000000000000000000000000060189184019182015283516198dd81601c84016020880161834f565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516199e381846020870161834f565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f72654000000000815260008251619a4a81601c85016020870161834f565b91909101601c0192915050565b60006000198203619a6a57619a6a6188c6565b5060010190565b808202811582820484141761411e5761411e6188c6565b6001815b6001841115619ac357808504811115619aa757619aa76188c6565b6001841615619ab557908102905b60019390931c928002619a8c565b935093915050565b600082619ada5750600161411e565b81619ae75750600061411e565b8160018114619afd5760028114619b0757619b23565b600191505061411e565b60ff841115619b1857619b186188c6565b50506001821b61411e565b5060208310610133831016604e8410600b8410161715619b46575081810a61411e565b619b536000198484619a88565b8060001904821115619b6757619b676188c6565b029392505050565b60006142178383619acb565b600081619b8a57619b8a6188c6565b506000190190565b60008351619ba481846020880161834f565b7f3a000000000000000000000000000000000000000000000000000000000000009083019081528351619bde81600184016020880161834f565b01600101949350505050565b81810360008312801583831316838312821617156174db576174db6188c656fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405234801561001057600080fd5b5060405161188c38038061188c83398101604081905261002f9161021a565b60016000819055805460ff19169055838383836001600160a01b038416158061005f57506001600160a01b038316155b8061007157506001600160a01b038216155b8061008357506001600160a01b038116155b156100a15760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100bf60008261014e565b506100ea7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e48361014e565b506101157f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb8361014e565b506101407f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8261014e565b50505050505050505061026e565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101f45760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101ac3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101f8565b5060005b92915050565b80516001600160a01b038116811461021557600080fd5b919050565b6000806000806080858703121561023057600080fd5b610239856101fe565b9350610247602086016101fe565b9250610255604086016101fe565b9150610263606086016101fe565b905092959194509250565b60805160a0516115b36102d9600039600081816101f7015281816104740152818161052501528181610644015281816107d80152818161088901526109710152600081816101ab01528181610496015281816104f8015281816107fa015261085c01526115b36000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80635c975abb116100cd57806391d1485411610081578063a783c78911610066578063a783c78914610326578063d547741f1461034d578063e63ab1e91461036057600080fd5b806391d14854146102d8578063a217fddf1461031e57600080fd5b8063743e0c9b116100b2578063743e0c9b146102965780638456cb59146102a957806385f438c1146102b157600080fd5b80635c975abb146102785780635e3e9fef1461028357600080fd5b806321e093b1116101245780632f2ff15d116101095780632f2ff15d1461024a57806336568abe1461025d5780633f4ba83a1461027057600080fd5b806321e093b1146101f2578063248a9ca31461021957600080fd5b806301ffc9a714610156578063057e0f251461017e578063106e629014610193578063116191b6146101a6575b600080fd5b6101696101643660046110e4565b610387565b60405190151581526020015b60405180910390f35b61019161018c366004611198565b610420565b005b6101916101a1366004611230565b6105f0565b6101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6101cd7f000000000000000000000000000000000000000000000000000000000000000081565b61023c610227366004611263565b60009081526002602052604090206001015490565b604051908152602001610175565b61019161025836600461127c565b6106cb565b61019161026b36600461127c565b6106f6565b61019161074f565b60015460ff16610169565b6101916102913660046112a8565b610784565b6101916102a4366004611263565b61094f565b610191610999565b61023c7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101696102e636600461127c565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61023c600081565b61023c7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b61019161035b36600461127c565b6109cb565b61023c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061041a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6104286109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461045281610a33565b61045a610a3d565b6104bb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000088610a7c565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610557907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a90600401611418565b600060405180830381600087803b15801561057157600080fd5b505af1158015610585573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105d59493929190611489565b60405180910390a2506105e86001600055565b505050505050565b6105f86109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062281610a33565b61062a610a3d565b61066b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168585610a7c565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5846040516106b391815260200190565b60405180910390a2506106c66001600055565b505050565b6000828152600260205260409020600101546106e681610a33565b6106f08383610afd565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610745576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c68282610bfd565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61077981610a33565b610781610cbc565b50565b61078c6109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46107b681610a33565b6107be610a3d565b61081f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000087610a7c565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab59906108b9907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016114c0565b600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d86868660405161093593929190611512565b60405180910390a2506109486001600055565b5050505050565b610957610a3d565b61078173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610d39565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109c381610a33565b610781610d7f565b6000828152600260205260409020600101546109e681610a33565b6106f08383610bfd565b600260005403610a2c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107818133610dd8565b60015460ff1615610a7a576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60405173ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390526106c691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e69565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610bf557600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610b933390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161041a565b50600061041a565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610bf557600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161041a565b610cc4610eff565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401610ab6565b610d87610a3d565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610d0f565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610e65576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610e8b73ffffffffffffffffffffffffffffffffffffffff841683610f3b565b90508051600014158015610eb0575080806020019051810190610eae919061152c565b155b156106c6576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610e5c565b60015460ff16610a7a576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610f4983836000610f50565b9392505050565b606081471015610f8e576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610e5c565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051610fb7919061154e565b60006040518083038185875af1925050503d8060008114610ff4576040519150601f19603f3d011682016040523d82523d6000602084013e610ff9565b606091505b5091509150611009868383611013565b9695505050505050565b60608261102857611023826110a2565b610f49565b815115801561104c575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561109b576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610e5c565b5080610f49565b8051156110b25780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156110f657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4957600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461114a57600080fd5b919050565b60008083601f84011261116157600080fd5b50813567ffffffffffffffff81111561117957600080fd5b60208301915083602082850101111561119157600080fd5b9250929050565b60008060008060008060a087890312156111b157600080fd5b6111ba87611126565b955060208701359450604087013567ffffffffffffffff8111156111dd57600080fd5b6111e989828a0161114f565b90955093505060608701359150608087013567ffffffffffffffff81111561121057600080fd5b87016060818a03121561122257600080fd5b809150509295509295509295565b60008060006060848603121561124557600080fd5b61124e84611126565b95602085013595506040909401359392505050565b60006020828403121561127557600080fd5b5035919050565b6000806040838503121561128f57600080fd5b8235915061129f60208401611126565b90509250929050565b6000806000806000608086880312156112c057600080fd5b6112c986611126565b945060208601359350604086013567ffffffffffffffff8111156112ec57600080fd5b6112f88882890161114f565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff61137182611126565b1682526000602082013567ffffffffffffffff811680821461139257600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126113ce57600080fd5b820160208101903567ffffffffffffffff8111156113eb57600080fd5b8036038213156113fa57600080fd5b6060604086015261140f60608601828461130a565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061146a60a08301858761130a565b828103608084015261147c8185611353565b9998505050505050505050565b8481526060602082015260006114a360608301858761130a565b82810360408401526114b58185611353565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006114b560808301848661130a565b83815260406020820152600061140f60408301848661130a565b60006020828403121561153e57600080fd5b81518015158114610f4957600080fd5b6000825160005b8181101561156f5760208186018101518583015201611555565b50600092019182525091905056fea26469706673582212209d5e0f021d5693e9892c17d94d8884fd81287eed442c49865c927a0f8528df5364736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a26469706673582212208c107cc3d8cea27a4816fa1f9bbe9a8893b166cf05d613052bd10da395f539ad64736f6c634300081a0033", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061e9158061003c6000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063b0464fdc116100e3578063dcf7d0371161008c578063e63ab1e911610066578063e63ab1e9146102ce578063fa7626d4146102f5578063fe574f841461030257600080fd5b8063dcf7d037146102b6578063de1cb76c146102be578063e20c9f71146102c657600080fd5b8063c1909972116100bd578063c19099721461029e578063ccb0e3f2146102a6578063d509b16c146102ae57600080fd5b8063b0464fdc14610276578063b5508aa91461027e578063ba414fa61461028657600080fd5b8063493465581161014557806385226c811161011f57806385226c811461021757806385f438c11461022c578063916a17c61461026157600080fd5b806349346558146101f257806366d9a9a0146101fa578063828320141461020f57600080fd5b80633cba0107116101765780633cba0107146101da5780633e5e3c23146101e25780633f7286f4146101ea57600080fd5b80630a9254e41461019d5780631ed7831c146101a75780632ade3880146101c5575b600080fd5b6101a561030a565b005b6101af610b0d565b6040516101bc9190618303565b60405180910390f35b6101cd610b6f565b6040516101bc919061839f565b6101a5610cb1565b6101af61146b565b6101af6114cb565b6101a561152b565b610202611b6e565b6040516101bc9190618505565b6101a5611cf0565b61021f611f4c565b6040516101bc91906185a3565b6102537f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6040519081526020016101bc565b61026961201c565b6040516101bc919061861a565b610269612117565b61021f612212565b61028e6122e2565b60405190151581526020016101bc565b6101a56123b6565b6101a5612621565b6101a561314d565b6101a5613189565b6101a5613830565b6101af613e87565b6102537f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b601f5461028e9060ff1681565b6101a5613ee7565b602580547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556026805482166112341790556027805490911661567817905560405161035c90618216565b604080825260049082018190527f7a6574610000000000000000000000000000000000000000000000000000000060608301526080602083018190528201527f5a4554410000000000000000000000000000000000000000000000000000000060a082015260c001604051809103906000f0801580156103e0573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c0000000000000000000000000000000000006020820152602754602554925190861694810194909452604484019290925290921660648201526104d1919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b00000000000000000000000000000000000000000000000000000000179052614105565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560275460255460405192939182169291169061055d90618223565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610599573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560205460245460275460255460405193851694928316939183169216906105f490618230565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610638573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905560405161067d9061823d565b604051809103906000f080158015610699573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556027546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b15801561074557600080fd5b505af1158015610759573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b15801561084957600080fd5b505af115801561085d573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b1580156108c357600080fd5b505af11580156108d7573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561093957600080fd5b505af115801561094d573d6000803e3d6000fd5b5050602480546023546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152624c4b40938101939093521692506340c10f199150604401600060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b50506027546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b039081168252600160208084019182528451908101855260008152938301849052825160288054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602990610b089082618774565b505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610b6557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b47575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015610ca857600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610c91578382906000526020600020018054610c04906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c30906186e0565b8015610c7d5780601f10610c5257610100808354040283529160200191610c7d565b820191906000526020600020905b815481529060010190602001808311610c6057829003601f168201915b505050505081526020019060010190610be5565b505050508152505081526020019060010190610b93565b50505050905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a2000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db09190618833565b9050610dbd816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391610f14916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b158015610f2e57600080fd5b505af1158015610f42573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015610fd457600080fd5b505af1158015610fe8573d6000803e3d6000fd5b505060208054602454602654604080516001600160a01b0394851681529485018d905291831684830152919091166060830152517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609350908190036080019150a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156110d757600080fd5b505af11580156110eb573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506111309089908890618874565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561119157600080fd5b505af11580156111a5573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506111fd92909116908a9089908b9060040161888d565b600060405180830381600087803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190618833565b90506112ae8188614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113229190618833565b9050611337816113328a876188f5565b614124565b602480546020546021546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169381019390935260009291169063dd62ed3e90604401602060405180830381865afa1580156113ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d19190618833565b90506113de816000614124565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561142e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114529190618833565b905061145f816000614124565b50505050505050505050565b60606018805480602002602001604051908101604052809291908181526020018280548015610b65576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b47575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610b65576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b47575050505050905090565b604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed70169000000000000000000000000000000000000000000000000000000001790525460265493516370a0823160e01b8152620186a0946000949385936001600160a01b03908116936370a08231936115cc93921691016001600160a01b0391909116815260200190565b602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d9190618833565b905061161a816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561166a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168e9190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391611771916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561183157600080fd5b505af1158015611845573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561191757600080fd5b505af115801561192b573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506119709089908890618874565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef9350611a3d92909116908a9089908b9060040161888d565b600060405180830381600087803b158015611a5757600080fd5b505af1158015611a6b573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611abd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae19190618833565b9050611aee816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190618833565b90506113378185614124565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015610ca85783829060005260206000209060020201604051806040016040529081600082018054611bc5906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf1906186e0565b8015611c3e5780601f10611c1357610100808354040283529160200191611c3e565b820191906000526020600020905b815481529060010190602001808311611c2157829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611cd857602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611c855790505b50505050508152505081526020019060010190611b92565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f190181529082905260255463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611d8d57600080fd5b505af1158015611da1573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250611e8c9190600401618908565b600060405180830381600087803b158015611ea657600080fd5b505af1158015611eba573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f259350611f1592909116908790869088906028906004016189f0565b600060405180830381600087803b158015611f2f57600080fd5b505af1158015611f43573d6000803e3d6000fd5b50505050505050565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015610ca8578382906000526020600020018054611f8f906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbb906186e0565b80156120085780601f10611fdd57610100808354040283529160200191612008565b820191906000526020600020905b815481529060010190602001808311611feb57829003601f168201915b505050505081526020019060010190611f70565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015610ca85760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156120ff57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116120ac5790505b50505050508152505081526020019060010190612040565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015610ca85760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156121fa57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116121a75790505b5050505050815250508152602001906001019061213b565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015610ca8578382906000526020600020018054612255906186e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612281906186e0565b80156122ce5780601f106122a3576101008083540402835291602001916122ce565b820191906000526020600020905b8154815290600101906020018083116122b157829003601f168201915b505050505081526020019060010190612236565b60085460009060ff16156122fa575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa15801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190618833565b1415905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602554905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061259b9190600401618908565b600060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef9350611f15929091169087908690889060040161888d565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561268257600080fd5b505af1158015612696573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506127819190600401618908565b600060405180830381600087803b15801561279b57600080fd5b505af11580156127af573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561280357600080fd5b505af1158015612817573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561287457600080fd5b505af1158015612888573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506129739190600401618908565b600060405180830381600087803b15801561298d57600080fd5b505af11580156129a1573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156129f557600080fd5b505af1158015612a09573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612a6657600080fd5b505af1158015612a7a573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ace57600080fd5b505af1158015612ae2573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd93c0665000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015612b6b57600080fd5b505af1158015612b7f573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612bdc57600080fd5b505af1158015612bf0573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401600060405180830381600087803b158015612c6457600080fd5b505af1158015612c78573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612cd557600080fd5b505af1158015612ce9573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a0823191015b602060405180830381865afa158015612da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc89190618833565b9050612dd5816000614124565b6026546040516001600160a01b0390911660248201526044810184905260009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391612eb5916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b158015612ecf57600080fd5b505af1158015612ee3573d6000803e3d6000fd5b50506023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015612f7557600080fd5b505af1158015612f89573d6000803e3d6000fd5b50506026546040518781526001600160a01b0390911692507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5915060200160405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561302857600080fd5b505af115801561303c573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101899052604481018890529116925063106e62909150606401600060405180830381600087803b1580156130b057600080fd5b505af11580156130c4573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015613116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313a9190618833565b90506131468186614124565b5050505050565b602480546026546040516370a0823160e01b81526001600160a01b039182166004820152620186a093600093849316916370a082319101612d87565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc5131691000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132889190618833565b9050613295816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133099190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba3916133ec916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b15801561340657600080fd5b505af115801561341a573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156134ac57600080fd5b505af11580156134c0573d6000803e3d6000fd5b50506020547f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af6092506001600160a01b031690506134fe600289618a3c565b602454602654604080516001600160a01b03958616815260208101949094529184168383015292909216606082015290519081900360800190a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156135c657600080fd5b505af11580156135da573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d915061361f9089908890618874565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561368057600080fd5b505af1158015613694573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506136ec92909116908a9089908b9060040161888d565b600060405180830381600087803b15801561370657600080fd5b505af115801561371a573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa15801561376c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137909190618833565b90506137a18161133260028a618a3c565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138159190618833565b90506113378161382660028b618a3c565b61133290876188f5565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f1901815290829052602480546021546370a0823160e01b85526001600160a01b0390811660048601529294506000939216916370a082319101602060405180830381865afa1580156138c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e99190618833565b90506138f6816000614124565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396a9190618833565b6020546040516001600160a01b0390911660248201526044810187905290915060009060640160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613a4d916001600160a01b039190911690600090869060040161884c565b600060405180830381600087803b158015613a6757600080fd5b505af1158015613a7b573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613b0d57600080fd5b505af1158015613b21573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e9350613b6592506001600160a01b0390911690602890618a77565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613bfb57600080fd5b505af1158015613c0f573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690613c5d908a908990602890618a99565b60405180910390a36023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015613cf357600080fd5b505af1158015613d07573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c9150613d4f9089908890602890618a99565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613db057600080fd5b505af1158015613dc4573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f259350613e1f92909116908a9089908b906028906004016189f0565b600060405180830381600087803b158015613e3957600080fd5b505af1158015613e4d573d6000803e3d6000fd5b5050602480546021546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101611261565b60606015805480602002602001604051908101604052809291908181526020018280548015610b65576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b47575050505050905090565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613f4857600080fd5b505af1158015613f5c573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506140479190600401618908565b600060405180830381600087803b15801561406157600080fd5b505af1158015614075573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401600060405180830381600087803b1580156140e957600080fd5b505af11580156140fd573d6000803e3d6000fd5b505050505050565b600061410f61824a565b61411a8484836141a3565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b15801561418f57600080fd5b505afa1580156140fd573d6000803e3d6000fd5b6000806141b0858461421e565b90506142136040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016141fe929190618ac4565b6040516020818303038152906040528561422a565b9150505b9392505050565b60006142178383614258565b60c0810151516000901561424e5761424784848460c00151614273565b9050614217565b6142478484614419565b60006142648383614504565b6142178383602001518461422a565b60008061427e614514565b9050600061428c86836145e7565b905060006142a38260600151836020015185614a8d565b905060006142b383838989614c9f565b905060006142c082615b1c565b602081015181519192509060030b15614333578982604001516040516020016142ea929190618ae6565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261432a91600401618908565b60405180910390fd5b60006143766040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001615ceb565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906143c9908490600401618908565b602060405180830381865afa1580156143e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061440a9190618b67565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc9259061446e908790600401618908565b600060405180830381865afa15801561448b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144b39190810190618c49565b905060006144e182856040516020016144cd929190618c7e565b604051602081830303815290604052615eeb565b90506001600160a01b03811661411a5784846040516020016142ea929190618cad565b61451082826000615efe565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c9061459b908490600401618d58565b600060405180830381865afa1580156145b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145e09190810190618d9f565b9250505090565b6146196040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506146646040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61466d85616001565b6020820152600061467d866163e6565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156146bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526146e79190810190618d9f565b868385602001516040516020016147019493929190618de8565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb1190614759908590600401618908565b600060405180830381865afa158015614776573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261479e9190810190618d9f565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f6906147e6908490600401618eec565b602060405180830381865afa158015614803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148279190618f3e565b61483c57816040516020016142ea9190618f60565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614881908490600401618ff2565b600060405180830381865afa15801561489e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526148c69190810190618d9f565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061490d908490600401619044565b602060405180830381865afa15801561492a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494e9190618f3e565b156149e3576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890614998908490600401619044565b600060405180830381865afa1580156149b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526149dd9190810190618d9f565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001614a089190619096565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401614a34929190619102565b600060405180830381865afa158015614a51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614a799190810190618d9f565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081614aa95790505090506040518060400160405280600481526020017f677265700000000000000000000000000000000000000000000000000000000081525081600081518110614b0957614b09619127565b60200260200101819052506040518060400160405280600381526020017f2d726c000000000000000000000000000000000000000000000000000000000081525081600181518110614b5d57614b5d619127565b602002602001018190525084604051602001614b799190619156565b60405160208183030381529060405281600281518110614b9b57614b9b619127565b602002602001018190525082604051602001614bb791906191c2565b60405160208183030381529060405281600381518110614bd957614bd9619127565b60200260200101819052506000614bef82615b1c565b602080820151604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000008185019081528251808401845260008082529086015282518084019093529051825292810192909252919250614c809060408051808201825260008082526020918201528151808301909252845182528085019082015290616669565b614c9557856040516020016142ea9190619203565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015614cef565b511590565b614e6357826020015115614dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a40161432a565b8260c0015115614e63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a40161432a565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081614e7c57905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280614ed790619294565b935060ff1681518110614eec57614eec619127565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001614f3d91906192b3565b604051602081830303815290604052828280614f5890619294565b935060ff1681518110614f6d57614f6d619127565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280614fba90619294565b935060ff1681518110614fcf57614fcf619127565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d6500000000000000000000000000000000000081525082828061501c90619294565b935060ff168151811061503157615031619127565b6020026020010181905250876020015182828061504d90619294565b935060ff168151811061506257615062619127565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e7472616374506174680000000000000000000000000000000000008152508282806150af90619294565b935060ff16815181106150c4576150c4619127565b6020908102919091010152875182826150dc81619294565b935060ff16815181106150f1576150f1619127565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e4964000000000000000000000000000000000000000000000081525082828061513e90619294565b935060ff168151811061515357615153619127565b6020026020010181905250615167466166ca565b828261517281619294565b935060ff168151811061518757615187619127565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c6500000000000000000000000000000000008152508282806151d490619294565b935060ff16815181106151e9576151e9619127565b60200260200101819052508682828061520190619294565b935060ff168151811061521657615216619127565b602090810291909101015285511561533d5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f646500000000000000000000006020820152828261526781619294565b935060ff168151811061527c5761527c619127565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d906152cc908990600401618908565b600060405180830381865afa1580156152e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526153119190810190618d9f565b828261531c81619294565b935060ff168151811061533157615331619127565b60200260200101819052505b84602001511561540d5760408051808201909152601281527f2d2d766572696679536f75726365436f646500000000000000000000000000006020820152828261538681619294565b935060ff168151811061539b5761539b619127565b60200260200101819052506040518060400160405280600581526020017f66616c73650000000000000000000000000000000000000000000000000000008152508282806153e890619294565b935060ff16815181106153fd576153fd619127565b60200260200101819052506155d4565b615445614cea8660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6154d85760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261548881619294565b935060ff168151811061549d5761549d619127565b60200260200101819052508460a001516040516020016154bd9190619156565b6040516020818303038152906040528282806153e890619294565b8460c0015115801561551b57506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261551990511590565b155b156155d45760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261555f81619294565b935060ff168151811061557457615574619127565b60200260200101819052506155888861676a565b6040516020016155989190619156565b6040516020818303038152906040528282806155b390619294565b935060ff16815181106155c8576155c8619127565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261560890511590565b61569d5760408051808201909152600b81527f2d2d72656c6179657249640000000000000000000000000000000000000000006020820152828261564b81619294565b935060ff168151811061566057615660619127565b6020026020010181905250846040015182828061567c90619294565b935060ff168151811061569157615691619127565b60200260200101819052505b6060850151156157be5760408051808201909152600681527f2d2d73616c740000000000000000000000000000000000000000000000000000602082015282826156e681619294565b935060ff16815181106156fb576156fb619127565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa15801561576a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157929190810190618d9f565b828261579d81619294565b935060ff16815181106157b2576157b2619127565b60200260200101819052505b60e085015151156158655760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261580881619294565b935060ff168151811061581d5761581d619127565b60200260200101819052506158398560e00151600001516166ca565b828261584481619294565b935060ff168151811061585957615859619127565b60200260200101819052505b60e0850151602001511561590f5760408051808201909152600a81527f2d2d676173507269636500000000000000000000000000000000000000000000602082015282826158b281619294565b935060ff16815181106158c7576158c7619127565b60200260200101819052506158e38560e00151602001516166ca565b82826158ee81619294565b935060ff168151811061590357615903619127565b60200260200101819052505b60e085015160400151156159b95760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261595c81619294565b935060ff168151811061597157615971619127565b602002602001018190525061598d8560e00151604001516166ca565b828261599881619294565b935060ff16815181106159ad576159ad619127565b60200260200101819052505b60e08501516060015115615a635760408051808201909152601681527f2d2d6d61785072696f726974794665655065724761730000000000000000000060208201528282615a0681619294565b935060ff1681518110615a1b57615a1b619127565b6020026020010181905250615a378560e00151606001516166ca565b8282615a4281619294565b935060ff1681518110615a5757615a57619127565b60200260200101819052505b60008160ff1667ffffffffffffffff811115615a8157615a816186b1565b604051908082528060200260200182016040528015615ab457816020015b6060815260200190600190039081615a9f5790505b50905060005b8260ff168160ff161015615b0d57838160ff1681518110615add57615add619127565b6020026020010151828260ff1681518110615afa57615afa619127565b6020908102919091010152600101615aba565b5093505050505b949350505050565b615b436040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c91615bc99186910161931e565b600060405180830381865afa158015615be6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615c0e9190810190618d9f565b90506000615c1c8683617259565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401615c4c91906185a3565b6000604051808303816000875af1158015615c6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615c939190810190619365565b805190915060030b15801590615cac5750602081015151155b8015615cbb5750604081015151155b15614c955781600081518110615cd357615cd3619127565b60200260200101516040516020016142ea919061941b565b60606000615d208560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150615d579082905b906173ae565b15615eb4576000615dd482615dce84615dc8615d9a8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b906173d5565b90617437565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150615e389082906173ae565b15615ea257604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615e9f905b82906174bc565b90505b615eab816174e2565b92505050614217565b8215615ecd5784846040516020016142ea929190619607565b5050604080516020810190915260008152614217565b509392505050565b6000808251602084016000f09392505050565b8160a0015115615f0d57505050565b6000615f1a84848461754b565b90506000615f2782615b1c565b602081015181519192509060030b158015615fc35750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152615fc390604080518082018252600080825260209182015281518083019092528451825280850190820152615d51565b15615fd057505050505050565b60408201515115615ff05781604001516040516020016142ea91906196ae565b806040516020016142ea919061970c565b606060006160368360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061609b905b8290616669565b1561610a57604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261421790616105908390617ae6565b6174e2565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261616c905b8290617b70565b60010361623957604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526161d290615e98565b50604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261421790616105905b83906174bc565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261629890616094565b156163cf57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616300908390617c0a565b90506000816001835161631391906188f5565b8151811061632357616323619127565b602002602001015190506163c66161056163996040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290617ae6565b95945050505050565b826040516020016142ea9190619777565b50919050565b6060600061641b8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061647d90616094565b1561648b57614217816174e2565b604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526164ea90616165565b60010361655457604080518082018252600181527f3a00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526142179061610590616232565b604080518082018252600581527f2e6a736f6e000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526165b390616094565b156163cf57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061661b908390617c0a565b905060018151111561665757806002825161663691906188f5565b8151811061664657616646619127565b602002602001015192505050919050565b50826040516020016142ea9190619777565b80518251600091111561667e5750600061411e565b8151835160208501516000929161669491619855565b61669e91906188f5565b9050826020015181036166b557600191505061411e565b82516020840151819020912014905092915050565b606060006166d783617caf565b600101905060008167ffffffffffffffff8111156166f7576166f76186b1565b6040519080825280601f01601f191660200182016040528015616721576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461672b57509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e53454400000000000000000000000000000000000000000000818401908152855180870187528381528401929092528451808601909552518452908301526060916167f6905b8290617d91565b1561683657505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e7365000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616895906167ef565b156168d557505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d4954000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616934906167ef565b1561697457505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526169d3906167ef565b80616a385750604080518082018252601081527f47504c2d322e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616a38906167ef565b15616a7857505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c79000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ad7906167ef565b80616b3c5750604080518082018252601081527f47504c2d332e302d6f722d6c617465720000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616b3c906167ef565b15616b7c57505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616bdb906167ef565b80616c405750604080518082018252601181527f4c47504c2d322e312d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616c40906167ef565b15616c8057505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616cdf906167ef565b80616d445750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d44906167ef565b15616d8457505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616de3906167ef565b15616e2357505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e82906167ef565b15616ec257505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f21906167ef565b15616f6157505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616fc0906167ef565b1561700057505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261705f906167ef565b1561709f57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526170fe906167ef565b806171635750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617163906167ef565b156171a357505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617202906167ef565b1561724257505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b604080840151845191516142ea9290602001619868565b60608060005b84518110156172e4578185828151811061727b5761727b619127565b6020026020010151604051602001617294929190618c7e565b6040516020818303038152906040529150600185516172b391906188f5565b81146172dc57816040516020016172ca91906199d1565b60405160208183030381529060405291505b60010161725f565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816172fd579050509050838160008151811061732857617328619127565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061737c5761737c619127565b6020026020010181905250818160028151811061739b5761739b619127565b6020908102919091010152949350505050565b60208083015183518351928401516000936173cc9291849190617da5565b14159392505050565b604080518082019091526000808252602082015260006174078460000151856020015185600001518660200151617eb6565b905083602001518161741991906188f5565b845185906174289083906188f5565b90525060208401525090919050565b604080518082019091526000808252602082015281518351101561745c57508161411e565b60208083015190840151600191146174835750815160208481015190840151829020919020145b80156174b45782518451859061749a9083906188f5565b90525082516020850180516174b0908390619855565b9052505b509192915050565b60408051808201909152600080825260208201526174db838383617fd6565b5092915050565b60606000826000015167ffffffffffffffff811115617503576175036186b1565b6040519080825280601f01601f19166020018201604052801561752d576020820181803683370190505b50905060006020820190506174db8185602001518660000151618081565b60606000617557614514565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161757457905050905060006040518060400160405280600381526020017f6e707800000000000000000000000000000000000000000000000000000000008152508282806175cf90619294565b935060ff16815181106175e4576175e4619127565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e33000000000000000000000000000000000000000000000000008152506040516020016176359190619a12565b60405160208183030381529060405282828061765090619294565b935060ff168151811061766557617665619127565b60200260200101819052506040518060400160405280600881526020017f76616c69646174650000000000000000000000000000000000000000000000008152508282806176b290619294565b935060ff16815181106176c7576176c7619127565b6020026020010181905250826040516020016176e391906191c2565b6040516020818303038152906040528282806176fe90619294565b935060ff168151811061771357617713619127565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e74726163740000000000000000000000000000000000000000000081525082828061776090619294565b935060ff168151811061777557617775619127565b602002602001018190525061778a87846180fb565b828261779581619294565b935060ff16815181106177aa576177aa619127565b6020908102919091010152855151156178565760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826177fc81619294565b935060ff168151811061781157617811619127565b602002602001018190525061782a8660000151846180fb565b828261783581619294565b935060ff168151811061784a5761784a619127565b60200260200101819052505b8560800151156178c45760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261789f81619294565b935060ff16815181106178b4576178b4619127565b602002602001018190525061792a565b841561792a5760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261790981619294565b935060ff168151811061791e5761791e619127565b60200260200101819052505b604086015151156179c65760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261797481619294565b935060ff168151811061798957617989619127565b602002602001018190525085604001518282806179a590619294565b935060ff16815181106179ba576179ba619127565b60200260200101819052505b856060015115617a305760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d657300000000000000000000000060208201528282617a0f81619294565b935060ff1681518110617a2457617a24619127565b60200260200101819052505b60008160ff1667ffffffffffffffff811115617a4e57617a4e6186b1565b604051908082528060200260200182016040528015617a8157816020015b6060815260200190600190039081617a6c5790505b50905060005b8260ff168160ff161015617ada57838160ff1681518110617aaa57617aaa619127565b6020026020010151828260ff1681518110617ac757617ac7619127565b6020908102919091010152600101617a87565b50979650505050505050565b6040805180820190915260008082526020820152815183511015617b0b57508161411e565b81518351602085015160009291617b2191619855565b617b2b91906188f5565b60208401519091506001908214617b4c575082516020840151819020908220145b8015617b6757835185518690617b639083906188f5565b9052505b50929392505050565b6000808260000151617b948560000151866020015186600001518760200151617eb6565b617b9e9190619855565b90505b83516020850151617bb29190619855565b81116174db5781617bc281619a57565b9250508260000151617bf9856020015183617bdd91906188f5565b8651617be991906188f5565b8386600001518760200151617eb6565b617c039190619855565b9050617ba1565b60606000617c188484617b70565b617c23906001619855565b67ffffffffffffffff811115617c3b57617c3b6186b1565b604051908082528060200260200182016040528015617c6e57816020015b6060815260200190600190039081617c595790505b50905060005b8151811015615ee357617c8a61610586866174bc565b828281518110617c9c57617c9c619127565b6020908102919091010152600101617c74565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310617cf8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310617d24576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310617d4257662386f26fc10000830492506010015b6305f5e1008310617d5a576305f5e100830492506008015b6127108310617d6e57612710830492506004015b60648310617d80576064830492506002015b600a831061411e5760010192915050565b6000617d9d838361813b565b159392505050565b600080858411617eac5760208411617e585760008415617df0576001617dcc8660206188f5565b617dd7906008619a71565b617de2906002619b6f565b617dec91906188f5565b1990505b8351811685617dff8989619855565b617e0991906188f5565b805190935082165b818114617e4357878411617e2b5787945050505050615b14565b83617e3581619b7b565b945050828451169050617e11565b617e4d8785619855565b945050505050615b14565b838320617e6585886188f5565b617e6f9087619855565b91505b858210617eaa57848220808203617e9757617e8d8684619855565b9350505050615b14565b617ea26001846188f5565b925050617e72565b505b5092949350505050565b60008381868511617fc15760208511617f705760008515617f02576001617ede8760206188f5565b617ee9906008619a71565b617ef4906002619b6f565b617efe91906188f5565b1990505b84518116600087617f138b8b619855565b617f1d91906188f5565b855190915083165b828114617f6257818610617f4a57617f3d8b8b619855565b9650505050505050615b14565b85617f5481619a57565b965050838651169050617f25565b859650505050505050615b14565b508383206000905b617f8286896188f5565b8211617fbf57858320808203617f9e5783945050505050615b14565b617fa9600185619855565b9350508180617fb790619a57565b925050617f78565b505b617fcb8787619855565b979650505050505050565b604080518082019091526000808252602082015260006180088560000151866020015186600001518760200151617eb6565b60208087018051918601919091525190915061802490826188f5565b8352845160208601516180379190619855565b81036180465760008552618078565b835183516180549190619855565b855186906180639083906188f5565b90525083516180729082619855565b60208601525b50909392505050565b602081106180b95781518352618098602084619855565b92506180a5602083619855565b91506180b26020826188f5565b9050618081565b60001981156180e85760016180cf8360206188f5565b6180db90610100619b6f565b6180e591906188f5565b90505b9151835183169219169190911790915250565b6060600061810984846145e7565b805160208083015160405193945061812393909101619b92565b60405160208183030381529060405291505092915050565b815181516000919081111561814e575081515b6020808501519084015160005b8381101561820757825182518082146181d75760001960208710156181b6576001846181888960206188f5565b6181929190619855565b61819d906008619a71565b6181a8906002619b6f565b6181b291906188f5565b1990505b81811683821681810391146181d457975061411e9650505050505050565b50505b6181e2602086619855565b94506181ef602085619855565b935050506020816182009190619855565b905061815b565b5084518651614c959190619bea565b610c9f80619c0b83390190565b6119ca8061a8aa83390190565b61188c8061c27483390190565b610de08061db0083390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161828d618292565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161828d6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b818110156183445783516001600160a01b031683526020938401939092019160010161831d565b509095945050505050565b60005b8381101561836a578181015183820152602001618352565b50506000910152565b6000815180845261838b81602086016020860161834f565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015618481577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261846b848651618373565b6020958601959094509290920191600101618431565b5091975050506020948501949290920191506001016183c7565b50929695505050505050565b600081518084526020840193506020830160005b828110156184fb5781517fffffffff00000000000000000000000000000000000000000000000000000000168652602095860195909101906001016184bb565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526185716040880182618373565b905060208201519150868103602088015261858c81836184a7565b96505050602093840193919091019060010161852d565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452618605858351618373565b945060209384019391909101906001016185cb565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561849b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b038151168652602081015190506040602087015261869b60408701826184a7565b9550506020938401939190910190600101618642565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806186f457607f821691505b6020821081036163e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610b0857806000526020600020601f840160051c810160208510156187545750805b601f840160051c820191505b818110156131465760008155600101618760565b815167ffffffffffffffff81111561878e5761878e6186b1565b6187a28161879c84546186e0565b8461872d565b6020601f8211600181146187d657600083156187be5750848201515b600019600385901b1c1916600184901b178455613146565b600084815260208120601f198516915b8281101561880657878501518255602094850194600190920191016187e6565b50848210156188245786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561884557600080fd5b5051919050565b6001600160a01b03841681528260208201526060604082015260006163c66060830184618373565b828152604060208201526000615b146040830184618373565b6001600160a01b03851681528360208201526080604082015260006188b56080830185618373565b905082606083015295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561411e5761411e6188c6565b6020815260006142176020830184618373565b600081546001600160a01b038116845267ffffffffffffffff8160a01c16602085015250600182016060604085015260008154618957816186e0565b806060880152600182166000811461897657600181146189b0576189e4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b89010193506189e4565b84600052602060002060005b838110156189db5781548a8201608001526001909101906020016189bc565b89016080019450505b50919695505050505050565b6001600160a01b038616815284602082015260a060408201526000618a1860a0830186618373565b8460608401528281036080840152618a30818561891b565b98975050505050505050565b600082618a72577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6001600160a01b0383168152604060208201526000615b14604083018461891b565b838152606060208201526000618ab26060830185618373565b8281036040840152614c95818561891b565b6001600160a01b0383168152604060208201526000615b146040830184618373565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351618b1e81601a85016020880161834f565b7f3a20000000000000000000000000000000000000000000000000000000000000601a918401918201528351618b5b81601c84016020880161834f565b01601c01949350505050565b600060208284031215618b7957600080fd5b81516001600160a01b038116811461421757600080fd5b6040516060810167ffffffffffffffff81118282101715618bb357618bb36186b1565b60405290565b60008067ffffffffffffffff841115618bd457618bd46186b1565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715618c0357618c036186b1565b604052838152905080828401851015618c1b57600080fd5b615ee384602083018561834f565b600082601f830112618c3a57600080fd5b61421783835160208501618bb9565b600060208284031215618c5b57600080fd5b815167ffffffffffffffff811115618c7257600080fd5b61411a84828501618c29565b60008351618c9081846020880161834f565b835190830190618ca481836020880161834f565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351618ce581601a85016020880161834f565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351618d2281603384016020880161834f565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f555400000000000000000000000000000000000000000060608201526080602082015260006142176080830184618373565b600060208284031215618db157600080fd5b815167ffffffffffffffff811115618dc857600080fd5b8201601f81018413618dd957600080fd5b61411a84825160208401618bb9565b60008551618dfa818460208a0161834f565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551618e34816001840160208a0161834f565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451618e7281600284016020890161834f565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351618eb481600284016020880161834f565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000618eff6040830184618373565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b600060208284031215618f5057600080fd5b8151801515811461421757600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251618f9881601f85016020870161834f565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b6040815260006190056040830184618373565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b6040815260006190576040830184618373565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b270000000000000000000000008152600082516190ce81601485016020870161834f565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b6040815260006191156040830185618373565b82810360208401526142138185618373565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f220000000000000000000000000000000000000000000000000000000000000081526000825161918e81600185016020870161834f565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b600082516191d481846020870161834f565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e74726163742000000000000000000000000000000000000000000060408201526000825161928781604b85016020870161834f565b91909101604b0192915050565b600060ff821660ff81036192aa576192aa6188c6565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161931181602985016020870161834f565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006142176080830184618373565b60006020828403121561937757600080fd5b815167ffffffffffffffff81111561938e57600080fd5b8201606081850312156193a057600080fd5b6193a8618b90565b81518060030b81146193b957600080fd5b8152602082015167ffffffffffffffff8111156193d557600080fd5b6193e186828501618c29565b602083015250604082015167ffffffffffffffff81111561940157600080fd5b61940d86828501618c29565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161947981602185016020870161834f565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161966581602185016020880161834f565b7f2720696e206f75747075743a200000000000000000000000000000000000000060219184019182015283516196a281602e84016020880161834f565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161931181602985016020870161834f565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161976a81602285016020870161834f565b9190910160220192915050565b7f436f6e7472616374206e616d65200000000000000000000000000000000000008152600082516197af81600e85016020870161834f565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b8082018082111561411e5761411e6188c6565b7f53504458206c6963656e7365206964656e7469666965722000000000000000008152600083516198a081601885016020880161834f565b7f20696e200000000000000000000000000000000000000000000000000000000060189184019182015283516198dd81601c84016020880161834f565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516199e381846020870161834f565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f72654000000000815260008251619a4a81601c85016020870161834f565b91909101601c0192915050565b60006000198203619a6a57619a6a6188c6565b5060010190565b808202811582820484141761411e5761411e6188c6565b6001815b6001841115619ac357808504811115619aa757619aa76188c6565b6001841615619ab557908102905b60019390931c928002619a8c565b935093915050565b600082619ada5750600161411e565b81619ae75750600061411e565b8160018114619afd5760028114619b0757619b23565b600191505061411e565b60ff841115619b1857619b186188c6565b50506001821b61411e565b5060208310610133831016604e8410600b8410161715619b46575081810a61411e565b619b536000198484619a88565b8060001904821115619b6757619b676188c6565b029392505050565b60006142178383619acb565b600081619b8a57619b8a6188c6565b506000190190565b60008351619ba481846020880161834f565b7f3a000000000000000000000000000000000000000000000000000000000000009083019081528351619bde81600184016020880161834f565b01600101949350505050565b81810360008312801583831316838312821617156174db576174db6188c656fe608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405234801561001057600080fd5b5060405161188c38038061188c83398101604081905261002f9161021a565b60016000819055805460ff19169055838383836001600160a01b038416158061005f57506001600160a01b038316155b8061007157506001600160a01b038216155b8061008357506001600160a01b038116155b156100a15760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100bf60008261014e565b506100ea7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e48361014e565b506101157f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb8361014e565b506101407f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8261014e565b50505050505050505061026e565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101f45760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101ac3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101f8565b5060005b92915050565b80516001600160a01b038116811461021557600080fd5b919050565b6000806000806080858703121561023057600080fd5b610239856101fe565b9350610247602086016101fe565b9250610255604086016101fe565b9150610263606086016101fe565b905092959194509250565b60805160a0516115b36102d9600039600081816101f7015281816104740152818161052501528181610644015281816107d80152818161088901526109710152600081816101ab01528181610496015281816104f8015281816107fa015261085c01526115b36000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80635c975abb116100cd57806391d1485411610081578063a783c78911610066578063a783c78914610326578063d547741f1461034d578063e63ab1e91461036057600080fd5b806391d14854146102d8578063a217fddf1461031e57600080fd5b8063743e0c9b116100b2578063743e0c9b146102965780638456cb59146102a957806385f438c1146102b157600080fd5b80635c975abb146102785780635e3e9fef1461028357600080fd5b806321e093b1116101245780632f2ff15d116101095780632f2ff15d1461024a57806336568abe1461025d5780633f4ba83a1461027057600080fd5b806321e093b1146101f2578063248a9ca31461021957600080fd5b806301ffc9a714610156578063057e0f251461017e578063106e629014610193578063116191b6146101a6575b600080fd5b6101696101643660046110e4565b610387565b60405190151581526020015b60405180910390f35b61019161018c366004611198565b610420565b005b6101916101a1366004611230565b6105f0565b6101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6101cd7f000000000000000000000000000000000000000000000000000000000000000081565b61023c610227366004611263565b60009081526002602052604090206001015490565b604051908152602001610175565b61019161025836600461127c565b6106cb565b61019161026b36600461127c565b6106f6565b61019161074f565b60015460ff16610169565b6101916102913660046112a8565b610784565b6101916102a4366004611263565b61094f565b610191610999565b61023c7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101696102e636600461127c565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61023c600081565b61023c7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b61019161035b36600461127c565b6109cb565b61023c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061041a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6104286109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461045281610a33565b61045a610a3d565b6104bb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000088610a7c565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610557907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a90600401611418565b600060405180830381600087803b15801561057157600080fd5b505af1158015610585573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105d59493929190611489565b60405180910390a2506105e86001600055565b505050505050565b6105f86109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062281610a33565b61062a610a3d565b61066b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168585610a7c565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5846040516106b391815260200190565b60405180910390a2506106c66001600055565b505050565b6000828152600260205260409020600101546106e681610a33565b6106f08383610afd565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610745576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c68282610bfd565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61077981610a33565b610781610cbc565b50565b61078c6109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46107b681610a33565b6107be610a3d565b61081f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000087610a7c565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab59906108b9907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016114c0565b600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d86868660405161093593929190611512565b60405180910390a2506109486001600055565b5050505050565b610957610a3d565b61078173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610d39565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109c381610a33565b610781610d7f565b6000828152600260205260409020600101546109e681610a33565b6106f08383610bfd565b600260005403610a2c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107818133610dd8565b60015460ff1615610a7a576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60405173ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390526106c691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e69565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610bf557600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610b933390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161041a565b50600061041a565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610bf557600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161041a565b610cc4610eff565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401610ab6565b610d87610a3d565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610d0f565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610e65576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610e8b73ffffffffffffffffffffffffffffffffffffffff841683610f3b565b90508051600014158015610eb0575080806020019051810190610eae919061152c565b155b156106c6576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610e5c565b60015460ff16610a7a576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610f4983836000610f50565b9392505050565b606081471015610f8e576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610e5c565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051610fb7919061154e565b60006040518083038185875af1925050503d8060008114610ff4576040519150601f19603f3d011682016040523d82523d6000602084013e610ff9565b606091505b5091509150611009868383611013565b9695505050505050565b60608261102857611023826110a2565b610f49565b815115801561104c575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561109b576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610e5c565b5080610f49565b8051156110b25780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156110f657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4957600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461114a57600080fd5b919050565b60008083601f84011261116157600080fd5b50813567ffffffffffffffff81111561117957600080fd5b60208301915083602082850101111561119157600080fd5b9250929050565b60008060008060008060a087890312156111b157600080fd5b6111ba87611126565b955060208701359450604087013567ffffffffffffffff8111156111dd57600080fd5b6111e989828a0161114f565b90955093505060608701359150608087013567ffffffffffffffff81111561121057600080fd5b87016060818a03121561122257600080fd5b809150509295509295509295565b60008060006060848603121561124557600080fd5b61124e84611126565b95602085013595506040909401359392505050565b60006020828403121561127557600080fd5b5035919050565b6000806040838503121561128f57600080fd5b8235915061129f60208401611126565b90509250929050565b6000806000806000608086880312156112c057600080fd5b6112c986611126565b945060208601359350604086013567ffffffffffffffff8111156112ec57600080fd5b6112f88882890161114f565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff61137182611126565b1682526000602082013567ffffffffffffffff811680821461139257600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126113ce57600080fd5b820160208101903567ffffffffffffffff8111156113eb57600080fd5b8036038213156113fa57600080fd5b6060604086015261140f60608601828461130a565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061146a60a08301858761130a565b828103608084015261147c8185611353565b9998505050505050505050565b8481526060602082015260006114a360608301858761130a565b82810360408401526114b58185611353565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006114b560808301848661130a565b83815260406020820152600061140f60408301848661130a565b60006020828403121561153e57600080fd5b81518015158114610f4957600080fd5b6000825160005b8181101561156f5760208186018101518583015201611555565b50600092019182525091905056fea26469706673582212209d5e0f021d5693e9892c17d94d8884fd81287eed442c49865c927a0f8528df5364736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220b54464c9195fd739155da6c7559e08de5a4538460f12e2f63eb9e5247f6dd96364736f6c634300081a0033", } // ZetaConnectorNativeTestABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/zetaconnectornonnative.t.sol/zetaconnectornonnativetest.go b/v2/pkg/zetaconnectornonnative.t.sol/zetaconnectornonnativetest.go index afd0a838..9f591a9f 100644 --- a/v2/pkg/zetaconnectornonnative.t.sol/zetaconnectornonnativetest.go +++ b/v2/pkg/zetaconnectornonnative.t.sol/zetaconnectornonnativetest.go @@ -65,7 +65,7 @@ type StdInvariantFuzzSelector struct { // ZetaConnectorNonNativeTestMetaData contains all meta data concerning the ZetaConnectorNonNativeTest contract. var ZetaConnectorNonNativeTestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TSS_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WITHDRAWER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testSexMaxSupplyFailsIfSenderIsNotTss\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallFailsIfMaxSupplyIsReached\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveERC20\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveERC20FailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveERC20Partial\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndCallReceiveNoParams\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndFailsIfMaxSupplyIsReached\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevert\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertFailsIfMaxSupplyIsReached\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawAndRevertFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawFailsIfSenderIsNotWithdrawer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawTogglePause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Called\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"receiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertOptions\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertOptions\",\"components\":[{\"name\":\"revertAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callOnRevert\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"abortAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Executed\",\"inputs\":[{\"name\":\"destination\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutedWithERC20\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedERC20\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNoParams\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedNonPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strs\",\"type\":\"string[]\",\"indexed\":false,\"internalType\":\"string[]\"},{\"name\":\"nums\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedPayable\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"str\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"num\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceivedRevert\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Reverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndCalled\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawnAndReverted\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"revertContext\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRevertContext\",\"components\":[{\"name\":\"asset\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revertMessage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessControlUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"neededRole\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ApprovalFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConnectorInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustodyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DepositFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExceedsMaxSupply\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutionFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientERC20Amount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientETHAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotWhitelistedInCustody\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061fb348061003c6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063a783c78911610104578063d509b16c116100a2578063e63ab1e911610071578063e63ab1e914610344578063fa7626d41461036b578063fdca905214610378578063fe574f841461038057600080fd5b8063d509b16c14610324578063dcf7d0371461032c578063de1cb76c14610334578063e20c9f711461033c57600080fd5b8063b5508aa9116100de578063b5508aa9146102f4578063ba414fa6146102fc578063c190997214610314578063ccb0e3f21461031c57600080fd5b8063a783c789146102bd578063aaf74192146102e4578063b0464fdc146102ec57600080fd5b80634934655811610171578063828320141161014b578063828320141461025657806385226c811461025e57806385f438c114610273578063916a17c6146102a857600080fd5b8063493465581461023157806366d9a9a0146102395780637db20efb1461024e57600080fd5b80632ade3880116101ad5780632ade3880146102045780633cba0107146102195780633e5e3c23146102215780633f7286f41461022957600080fd5b80630a9254e4146101d45780631ed7831c146101de5780632506ef03146101fc575b600080fd5b6101dc610388565b005b6101e6610b0b565b6040516101f39190618faa565b60405180910390f35b6101dc610b6d565b61020c610e21565b6040516101f39190619046565b6101dc610f63565b6101e6611725565b6101e6611785565b6101dc6117e5565b610241611db9565b6040516101f391906191ac565b6101dc611f3b565b6101dc6121da565b610266612436565b6040516101f3919061924a565b61029a7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6040519081526020016101f3565b6102b0612506565b6040516101f391906192c1565b61029a7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101dc612601565b6102b061287c565b610266612977565b610304612a47565b60405190151581526020016101f3565b6101dc612b1b565b6101dc612d86565b6101dc6138b2565b6101dc613c07565b6101dc614235565b6101e661495b565b61029a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b601f546103049060ff1681565b6101dc6149bb565b6101dc614bbf565b60258054307fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155602680546112349083161790556027805461567892168217905560405181906103dd90618ebd565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610410573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c000000000000000000000000000000000000602082015260275460255492519086169481019490945260448401929092529092166064820152610501919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b00000000000000000000000000000000000000000000000000000000179052614dac565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560275460255460405192939182169291169061058d90618eca565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156105c9573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055602054602454602754602554604051938516949283169391831692169061062490618ed7565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610668573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560275460405163ca669fa760e01b815291166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156106ed57600080fd5b505af1158015610701573d6000803e3d6000fd5b5050602480546027546023546040517f15d57fd40000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216938101939093521692506315d57fd49150604401600060405180830381600087803b15801561077457600080fd5b505af1158015610788573d6000803e3d6000fd5b5050505060405161079890618ee4565b604051809103906000f0801580156107b4573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556027546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b1580156108ea57600080fd5b505af11580156108fe573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b15801561096457600080fd5b505af1158015610978573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b1580156109de57600080fd5b505af11580156109f2573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a5457600080fd5b505af1158015610a68573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b039081168252600160208084019182528451908101855260008152938301849052825160288054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602990610b06908261941b565b505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610b6357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b45575b5050505050905090565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f190181529082905260275463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015610c0857600080fd5b505af1158015610c1c573d6000803e3d6000fd5b50506023546040517f6f8b44b0000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fc30436e9000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015610d8d57600080fd5b505af1158015610da1573d6000803e3d6000fd5b50506023546021546001600160a01b03918216935063057e0f25925016610dc9856001619509565b8460286040518563ffffffff1660e01b8152600401610deb94939291906195f1565b600060405180830381600087803b158015610e0557600080fd5b505af1158015610e19573d6000803e3d6000fd5b505050505050565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015610f5a57600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610f43578382906000526020600020018054610eb690619387565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee290619387565b8015610f2f5780601f10610f0457610100808354040283529160200191610f2f565b820191906000526020600020905b815481529060010190602001808311610f1257829003601f168201915b505050505081526020019060010190610e97565b505050508152505081526020019060010190610e45565b50505050905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a2000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110629190619632565b905061106f816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156110bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e39190619632565b90506110f0816000614dcb565b6020546040516001600160a01b039091166024820152604481018690526064810185905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba3916111d7916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b1580156111f157600080fd5b505af1158015611205573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561129757600080fd5b505af11580156112ab573d6000803e3d6000fd5b505060208054602454602654604080516001600160a01b0394851681529485018d905291831684830152919091166060830152517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609350908190036080019150a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561139a57600080fd5b505af11580156113ae573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506113f39089908890619673565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561145457600080fd5b505af1158015611468573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506114c092909116908a9089908b9060040161968c565b600060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611540573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115649190619632565b90506115708188614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e49190619632565b90506115f1816000614dcb565b602480546020546021546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169381019390935260009291169063dd62ed3e90604401602060405180830381865afa158015611667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168b9190619632565b9050611698816000614dcb565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c9190619632565b9050611719816000614dcb565b50505050505050505050565b60606018805480602002602001604051908101604052809291908181526020018280548015610b63576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b45575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610b63576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b45575050505050905090565b604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed70169000000000000000000000000000000000000000000000000000000001790525460265493516370a0823160e01b8152620186a0946000949385936001600160a01b03908116936370a082319361188693921691016001600160a01b0391909116815260200190565b602060405180830381865afa1580156118a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c79190619632565b90506118d4816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119489190619632565b9050611955816000614dcb565b6020546040516001600160a01b039091166024820152604481018690526064810185905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391611a3c916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b158015611a5657600080fd5b505af1158015611a6a573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015611afc57600080fd5b505af1158015611b10573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611be257600080fd5b505af1158015611bf6573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d9150611c3b9089908890619673565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611c9c57600080fd5b505af1158015611cb0573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef9350611d0892909116908a9089908b9060040161968c565b600060405180830381600087803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac9190619632565b9050611570816000614dcb565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5783829060005260206000209060020201604051806040016040529081600082018054611e1090619387565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3c90619387565b8015611e895780601f10611e5e57610100808354040283529160200191611e89565b820191906000526020600020905b815481529060010190602001808311611e6c57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611f2357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611ed05790505b50505050508152505081526020019060010190611ddd565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611f9957600080fd5b505af1158015611fad573d6000803e3d6000fd5b50506023546040517f6f8b44b0000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b15801561201057600080fd5b505af1158015612024573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561208157600080fd5b505af1158015612095573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fc30436e9000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561211e57600080fd5b505af1158015612132573d6000803e3d6000fd5b50506023546021546001600160a01b03918216935063106e629092501661215a846001619509565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260006044820152606401600060405180830381600087803b1580156121bf57600080fd5b505af11580156121d3573d6000803e3d6000fd5b5050505050565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f190181529082905260255463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561227757600080fd5b505af115801561228b573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061237691906004016196c5565b600060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f2593506123ff92909116908790869088906028906004016196d8565b600060405180830381600087803b15801561241957600080fd5b505af115801561242d573d6000803e3d6000fd5b50505050505050565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015610f5a57838290600052602060002001805461247990619387565b80601f01602080910402602001604051908101604052809291908181526020018280546124a590619387565b80156124f25780601f106124c7576101008083540402835291602001916124f2565b820191906000526020600020905b8154815290600101906020018083116124d557829003601f168201915b50505050508152602001906001019061245a565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156125e957602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116125965790505b5050505050815250508152602001906001019061252a565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f190181529082905260275463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561269c57600080fd5b505af11580156126b0573d6000803e3d6000fd5b50506023546040517f6f8b44b0000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b15801561271357600080fd5b505af1158015612727573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fc30436e9000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561282157600080fd5b505af1158015612835573d6000803e3d6000fd5b50506023546021546001600160a01b039182169350635e3e9fef92501661285d856001619509565b846040518463ffffffff1660e01b8152600401610deb93929190619724565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561295f57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161290c5790505b505050505081525050815260200190600101906128a0565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5783829060005260206000200180546129ba90619387565b80601f01602080910402602001604051908101604052809291908181526020018280546129e690619387565b8015612a335780601f10612a0857610100808354040283529160200191612a33565b820191906000526020600020905b815481529060010190602001808311612a1657829003601f168201915b50505050508152602001906001019061299b565b60085460009060ff1615612a5f575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015612af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b149190619632565b1415905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602554905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612c0157600080fd5b505af1158015612c15573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250612d0091906004016196c5565b600060405180830381600087803b158015612d1a57600080fd5b505af1158015612d2e573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506123ff929091169087908690889060040161968c565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612de757600080fd5b505af1158015612dfb573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250612ee691906004016196c5565b600060405180830381600087803b158015612f0057600080fd5b505af1158015612f14573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f6857600080fd5b505af1158015612f7c573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612fd957600080fd5b505af1158015612fed573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506130d891906004016196c5565b600060405180830381600087803b1580156130f257600080fd5b505af1158015613106573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561315a57600080fd5b505af115801561316e573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156131cb57600080fd5b505af11580156131df573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561323357600080fd5b505af1158015613247573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd93c0665000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156132d057600080fd5b505af11580156132e4573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561334157600080fd5b505af1158015613355573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401600060405180830381600087803b1580156133c957600080fd5b505af11580156133dd573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561343a57600080fd5b505af115801561344e573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156134a257600080fd5b505af11580156134b6573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015613508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352c9190619632565b9050613539816000614dcb565b6026546040516001600160a01b039091166024820152604481018490526064810183905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613620916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b15801561363a57600080fd5b505af115801561364e573d6000803e3d6000fd5b50506023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156136e057600080fd5b505af11580156136f4573d6000803e3d6000fd5b50506026546040518781526001600160a01b0390911692507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5915060200160405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101899052604481018890529116925063106e629091506064015b600060405180830381600087803b15801561381c57600080fd5b505af1158015613830573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015613882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a69190619632565b90506121d38186614dcb565b602480546026546040516370a0823160e01b81526001600160a01b039182166004820152620186a09360009392909216916370a082319101602060405180830381865afa158015613907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392b9190619632565b9050613938816000614dcb565b6026546040516001600160a01b0390911660248201526044810183905260006064820181905290819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613a21916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b158015613a3b57600080fd5b505af1158015613a4f573d6000803e3d6000fd5b50506023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613ae157600080fd5b505af1158015613af5573d6000803e3d6000fd5b50506026546040518781526001600160a01b0390911692507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5915060200160405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613b9457600080fd5b505af1158015613ba8573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101899052604481018790529116925063106e62909150606401613802565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc5131691000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015613ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d069190619632565b9050613d13816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d879190619632565b9050613d94816000614dcb565b6020546040516001600160a01b039091166024820152604481018690526064810185905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613e7b916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b158015613e9557600080fd5b505af1158015613ea9573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613f3b57600080fd5b505af1158015613f4f573d6000803e3d6000fd5b50506020547f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af6092506001600160a01b03169050613f8d60028961975d565b602454602654604080516001600160a01b03958616815260208101949094529184168383015292909216606082015290519081900360800190a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561405557600080fd5b505af1158015614069573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506140ae9089908890619673565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561410f57600080fd5b505af1158015614123573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef935061417b92909116908a9089908b9060040161968c565b600060405180830381600087803b15801561419557600080fd5b505af11580156141a9573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa1580156141fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421f9190619632565b90506115708161423060028a61975d565b614dcb565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f1901815290829052602480546021546370a0823160e01b85526001600160a01b0390811660048601529294506000939216916370a082319101602060405180830381865afa1580156142ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142ee9190619632565b90506142fb816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561434b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061436f9190619632565b6020546040516001600160a01b039091166024820152604481018790526064810186905290915060009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391614459916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b15801561447357600080fd5b505af1158015614487573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561451957600080fd5b505af115801561452d573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e935061457192506001600160a01b0390911690602890619798565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561460757600080fd5b505af115801561461b573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690614669908a9089906028906197ba565b60405180910390a36023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156146ff57600080fd5b505af1158015614713573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c915061475b90899088906028906197ba565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156147bc57600080fd5b505af11580156147d0573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f25935061482b92909116908a9089908b906028906004016196d8565b600060405180830381600087803b15801561484557600080fd5b505af1158015614859573d6000803e3d6000fd5b5050602480546021546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa1580156148ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148cf9190619632565b90506148db8188614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561492b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494f9190619632565b90506115f18185614dcb565b60606015805480602002602001604051908101604052809291908181526020018280548015610b63576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b45575050505050905090565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614a1457600080fd5b505af1158015614a28573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614b1391906004016196c5565b600060405180830381600087803b158015614b2d57600080fd5b505af1158015614b41573d6000803e3d6000fd5b50506023546040517f6f8b44b000000000000000000000000000000000000000000000000000000000815261271060048201526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b158015614ba557600080fd5b505af1158015614bb9573d6000803e3d6000fd5b50505050565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614c2057600080fd5b505af1158015614c34573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614d1f91906004016196c5565b600060405180830381600087803b158015614d3957600080fd5b505af1158015614d4d573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401610deb565b6000614db6618ef1565b614dc1848483614e4a565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b158015614e3657600080fd5b505afa158015610e19573d6000803e3d6000fd5b600080614e578584614ec5565b9050614eba6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614ea59291906197e5565b60405160208183030381529060405285614ed1565b9150505b9392505050565b6000614ebe8383614eff565b60c08101515160009015614ef557614eee84848460c00151614f1a565b9050614ebe565b614eee84846150c0565b6000614f0b83836151ab565b614ebe83836020015184614ed1565b600080614f256151bb565b90506000614f33868361528e565b90506000614f4a8260600151836020015185615734565b90506000614f5a83838989615946565b90506000614f67826167c3565b602081015181519192509060030b15614fda57898260400151604051602001614f91929190619807565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252614fd1916004016196c5565b60405180910390fd5b600061501d6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001616992565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906150709084906004016196c5565b602060405180830381865afa15801561508d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150b19190619888565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906151159087906004016196c5565b600060405180830381865afa158015615132573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261515a919081019061996a565b90506000615188828560405160200161517492919061999f565b604051602081830303815290604052616b92565b90506001600160a01b038116614dc1578484604051602001614f919291906199ce565b6151b782826000616ba5565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90615242908490600401619a79565b600060405180830381865afa15801561525f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526152879190810190619ac0565b9250505090565b6152c06040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d905061530b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61531485616ca8565b602082015260006153248661708d565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015615366573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261538e9190810190619ac0565b868385602001516040516020016153a89493929190619b09565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906154009085906004016196c5565b600060405180830381865afa15801561541d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154459190810190619ac0565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f69061548d908490600401619c0d565b602060405180830381865afa1580156154aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154ce9190619c5f565b6154e35781604051602001614f919190619c81565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890615528908490600401619d13565b600060405180830381865afa158015615545573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261556d9190810190619ac0565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f6906155b4908490600401619d65565b602060405180830381865afa1580156155d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155f59190619c5f565b1561568a576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061563f908490600401619d65565b600060405180830381865afa15801561565c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526156849190810190619ac0565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016156af9190619db7565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016156db929190619e23565b600060405180830381865afa1580156156f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157209190810190619ac0565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816157505790505090506040518060400160405280600481526020017f6772657000000000000000000000000000000000000000000000000000000000815250816000815181106157b0576157b0619e48565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061580457615804619e48565b6020026020010181905250846040516020016158209190619e77565b6040516020818303038152906040528160028151811061584257615842619e48565b60200260200101819052508260405160200161585e9190619ee3565b6040516020818303038152906040528160038151811061588057615880619e48565b60200260200101819052506000615896826167c3565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506159279060408051808201825260008082526020918201528151808301909252845182528085019082015290617310565b61593c5785604051602001614f919190619f24565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615996565b511590565b615b0a57826020015115615a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401614fd1565b8260c0015115615b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401614fd1565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081615b2357905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280615b7e90619fb5565b935060ff1681518110615b9357615b93619e48565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001615be49190619fd4565b604051602081830303815290604052828280615bff90619fb5565b935060ff1681518110615c1457615c14619e48565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280615c6190619fb5565b935060ff1681518110615c7657615c76619e48565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280615cc390619fb5565b935060ff1681518110615cd857615cd8619e48565b60200260200101819052508760200151828280615cf490619fb5565b935060ff1681518110615d0957615d09619e48565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615d5690619fb5565b935060ff1681518110615d6b57615d6b619e48565b602090810291909101015287518282615d8381619fb5565b935060ff1681518110615d9857615d98619e48565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615de590619fb5565b935060ff1681518110615dfa57615dfa619e48565b6020026020010181905250615e0e46617371565b8282615e1981619fb5565b935060ff1681518110615e2e57615e2e619e48565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615e7b90619fb5565b935060ff1681518110615e9057615e90619e48565b602002602001018190525086828280615ea890619fb5565b935060ff1681518110615ebd57615ebd619e48565b6020908102919091010152855115615fe45760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282615f0e81619fb5565b935060ff1681518110615f2357615f23619e48565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90615f739089906004016196c5565b600060405180830381865afa158015615f90573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615fb89190810190619ac0565b8282615fc381619fb5565b935060ff1681518110615fd857615fd8619e48565b60200260200101819052505b8460200151156160b45760408051808201909152601281527f2d2d766572696679536f75726365436f646500000000000000000000000000006020820152828261602d81619fb5565b935060ff168151811061604257616042619e48565b60200260200101819052506040518060400160405280600581526020017f66616c736500000000000000000000000000000000000000000000000000000081525082828061608f90619fb5565b935060ff16815181106160a4576160a4619e48565b602002602001018190525061627b565b6160ec6159918660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61617f5760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261612f81619fb5565b935060ff168151811061614457616144619e48565b60200260200101819052508460a001516040516020016161649190619e77565b60405160208183030381529060405282828061608f90619fb5565b8460c001511580156161c25750604080890151815180830183526000808252602091820152825180840190935281518352908101908201526161c090511590565b155b1561627b5760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261620681619fb5565b935060ff168151811061621b5761621b619e48565b602002602001018190525061622f88617411565b60405160200161623f9190619e77565b60405160208183030381529060405282828061625a90619fb5565b935060ff168151811061626f5761626f619e48565b60200260200101819052505b604080860151815180830183526000808252602091820152825180840190935281518352908101908201526162af90511590565b6163445760408051808201909152600b81527f2d2d72656c617965724964000000000000000000000000000000000000000000602082015282826162f281619fb5565b935060ff168151811061630757616307619e48565b6020026020010181905250846040015182828061632390619fb5565b935060ff168151811061633857616338619e48565b60200260200101819052505b6060850151156164655760408051808201909152600681527f2d2d73616c7400000000000000000000000000000000000000000000000000006020820152828261638d81619fb5565b935060ff16815181106163a2576163a2619e48565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015616411573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526164399190810190619ac0565b828261644481619fb5565b935060ff168151811061645957616459619e48565b60200260200101819052505b60e0850151511561650c5760408051808201909152600a81527f2d2d6761734c696d697400000000000000000000000000000000000000000000602082015282826164af81619fb5565b935060ff16815181106164c4576164c4619e48565b60200260200101819052506164e08560e0015160000151617371565b82826164eb81619fb5565b935060ff168151811061650057616500619e48565b60200260200101819052505b60e085015160200151156165b65760408051808201909152600a81527f2d2d6761735072696365000000000000000000000000000000000000000000006020820152828261655981619fb5565b935060ff168151811061656e5761656e619e48565b602002602001018190525061658a8560e0015160200151617371565b828261659581619fb5565b935060ff16815181106165aa576165aa619e48565b60200260200101819052505b60e085015160400151156166605760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261660381619fb5565b935060ff168151811061661857616618619e48565b60200260200101819052506166348560e0015160400151617371565b828261663f81619fb5565b935060ff168151811061665457616654619e48565b60200260200101819052505b60e0850151606001511561670a5760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826166ad81619fb5565b935060ff16815181106166c2576166c2619e48565b60200260200101819052506166de8560e0015160600151617371565b82826166e981619fb5565b935060ff16815181106166fe576166fe619e48565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561672857616728619358565b60405190808252806020026020018201604052801561675b57816020015b60608152602001906001900390816167465790505b50905060005b8260ff168160ff1610156167b457838160ff168151811061678457616784619e48565b6020026020010151828260ff16815181106167a1576167a1619e48565b6020908102919091010152600101616761565b5093505050505b949350505050565b6167ea6040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916168709186910161a03f565b600060405180830381865afa15801561688d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526168b59190810190619ac0565b905060006168c38683617f00565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016168f3919061924a565b6000604051808303816000875af1158015616912573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261693a919081019061a086565b805190915060030b158015906169535750602081015151155b80156169625750604081015151155b1561593c578160008151811061697a5761697a619e48565b6020026020010151604051602001614f91919061a13c565b606060006169c78560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506169fe9082905b90618055565b15616b5b576000616a7b82616a7584616a6f616a418a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b9061807c565b906180de565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616adf908290618055565b15616b4957604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616b46905b8290618163565b90505b616b5281618189565b92505050614ebe565b8215616b74578484604051602001614f9192919061a328565b5050604080516020810190915260008152614ebe565b509392505050565b6000808251602084016000f09392505050565b8160a0015115616bb457505050565b6000616bc18484846181f2565b90506000616bce826167c3565b602081015181519192509060030b158015616c6a5750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616c6a906040805180820182526000808252602091820152815180830190925284518252808501908201526169f8565b15616c7757505050505050565b60408201515115616c97578160400151604051602001614f91919061a3cf565b80604051602001614f91919061a42d565b60606000616cdd8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616d42905b8290617310565b15616db157604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614ebe90616dac90839061878d565b618189565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e13905b8290618817565b600103616ee057604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e7990616b3f565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614ebe90616dac905b8390618163565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f3f90616d3b565b1561707657604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616fa79083906188b1565b905060008160018351616fba919061a498565b81518110616fca57616fca619e48565b6020026020010151905061706d616dac6170406040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925285518252808601908201529061878d565b95945050505050565b82604051602001614f91919061a4ab565b50919050565b606060006170c28360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061712490616d3b565b1561713257614ebe81618189565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261719190616e0c565b6001036171fb57604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614ebe90616dac90616ed9565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261725a90616d3b565b1561707657604080518082018252600181527f2f000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201819052845180860190955292518452830152906172c29083906188b1565b90506001815111156172fe5780600282516172dd919061a498565b815181106172ed576172ed619e48565b602002602001015192505050919050565b5082604051602001614f91919061a4ab565b80518251600091111561732557506000614dc5565b8151835160208501516000929161733b91619509565b617345919061a498565b90508260200151810361735c576001915050614dc5565b82516020840151819020912014905092915050565b6060600061737e83618956565b600101905060008167ffffffffffffffff81111561739e5761739e619358565b6040519080825280601f01601f1916602001820160405280156173c8576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846173d257509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e534544000000000000000000000000000000000000000000008184019081528551808701875283815284019290925284518086019095525184529083015260609161749d905b8290618a38565b156174dd57505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261753c90617496565b1561757c57505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175db90617496565b1561761b57505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261767a90617496565b806176df5750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526176df90617496565b1561771f57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261777e90617496565b806177e35750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177e390617496565b1561782357505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261788290617496565b806178e75750604080518082018252601181527f4c47504c2d322e312d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178e790617496565b1561792757505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261798690617496565b806179eb5750604080518082018252601181527f4c47504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179eb90617496565b15617a2b57505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617a8a90617496565b15617aca57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617b2990617496565b15617b6957505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617bc890617496565b15617c0857505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617c6790617496565b15617ca757505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d0690617496565b15617d4657505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617da590617496565b80617e0a5750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617e0a90617496565b15617e4a57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617ea990617496565b15617ee957505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151614f91929060200161a589565b60608060005b8451811015617f8b5781858281518110617f2257617f22619e48565b6020026020010151604051602001617f3b92919061999f565b604051602081830303815290604052915060018551617f5a919061a498565b8114617f835781604051602001617f71919061a6f2565b60405160208183030381529060405291505b600101617f06565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081617fa45790505090508381600081518110617fcf57617fcf619e48565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061802357618023619e48565b6020026020010181905250818160028151811061804257618042619e48565b6020908102919091010152949350505050565b60208083015183518351928401516000936180739291849190618a4c565b14159392505050565b604080518082019091526000808252602082015260006180ae8460000151856020015185600001518660200151618b5d565b90508360200151816180c0919061a498565b845185906180cf90839061a498565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015618103575081614dc5565b602080830151908401516001911461812a5750815160208481015190840151829020919020145b801561815b5782518451859061814190839061a498565b9052508251602085018051618157908390619509565b9052505b509192915050565b6040805180820190915260008082526020820152618182838383618c7d565b5092915050565b60606000826000015167ffffffffffffffff8111156181aa576181aa619358565b6040519080825280601f01601f1916602001820160405280156181d4576020820181803683370190505b50905060006020820190506181828185602001518660000151618d28565b606060006181fe6151bb565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161821b57905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061827690619fb5565b935060ff168151811061828b5761828b619e48565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e33000000000000000000000000000000000000000000000000008152506040516020016182dc919061a733565b6040516020818303038152906040528282806182f790619fb5565b935060ff168151811061830c5761830c619e48565b60200260200101819052506040518060400160405280600881526020017f76616c696461746500000000000000000000000000000000000000000000000081525082828061835990619fb5565b935060ff168151811061836e5761836e619e48565b60200260200101819052508260405160200161838a9190619ee3565b6040516020818303038152906040528282806183a590619fb5565b935060ff16815181106183ba576183ba619e48565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e74726163740000000000000000000000000000000000000000000081525082828061840790619fb5565b935060ff168151811061841c5761841c619e48565b60200260200101819052506184318784618da2565b828261843c81619fb5565b935060ff168151811061845157618451619e48565b6020908102919091010152855151156184fd5760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826184a381619fb5565b935060ff16815181106184b8576184b8619e48565b60200260200101819052506184d1866000015184618da2565b82826184dc81619fb5565b935060ff16815181106184f1576184f1619e48565b60200260200101819052505b85608001511561856b5760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261854681619fb5565b935060ff168151811061855b5761855b619e48565b60200260200101819052506185d1565b84156185d15760408051808201909152601281527f2d2d726571756972655265666572656e63650000000000000000000000000000602082015282826185b081619fb5565b935060ff16815181106185c5576185c5619e48565b60200260200101819052505b6040860151511561866d5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261861b81619fb5565b935060ff168151811061863057618630619e48565b6020026020010181905250856040015182828061864c90619fb5565b935060ff168151811061866157618661619e48565b60200260200101819052505b8560600151156186d75760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d6573000000000000000000000000602082015282826186b681619fb5565b935060ff16815181106186cb576186cb619e48565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156186f5576186f5619358565b60405190808252806020026020018201604052801561872857816020015b60608152602001906001900390816187135790505b50905060005b8260ff168160ff16101561878157838160ff168151811061875157618751619e48565b6020026020010151828260ff168151811061876e5761876e619e48565b602090810291909101015260010161872e565b50979650505050505050565b60408051808201909152600080825260208201528151835110156187b2575081614dc5565b815183516020850151600092916187c891619509565b6187d2919061a498565b602084015190915060019082146187f3575082516020840151819020908220145b801561880e5783518551869061880a90839061a498565b9052505b50929392505050565b600080826000015161883b8560000151866020015186600001518760200151618b5d565b6188459190619509565b90505b835160208501516188599190619509565b811161818257816188698161a778565b92505082600001516188a0856020015183618884919061a498565b8651618890919061a498565b8386600001518760200151618b5d565b6188aa9190619509565b9050618848565b606060006188bf8484618817565b6188ca906001619509565b67ffffffffffffffff8111156188e2576188e2619358565b60405190808252806020026020018201604052801561891557816020015b60608152602001906001900390816189005790505b50905060005b8151811015616b8a57618931616dac8686618163565b82828151811061894357618943619e48565b602090810291909101015260010161891b565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061899f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106189cb576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106189e957662386f26fc10000830492506010015b6305f5e1008310618a01576305f5e100830492506008015b6127108310618a1557612710830492506004015b60648310618a27576064830492506002015b600a8310614dc55760010192915050565b6000618a448383618de2565b159392505050565b600080858411618b535760208411618aff5760008415618a97576001618a7386602061a498565b618a7e90600861a792565b618a8990600261a890565b618a93919061a498565b1990505b8351811685618aa68989619509565b618ab0919061a498565b805190935082165b818114618aea57878411618ad257879450505050506167bb565b83618adc8161a89c565b945050828451169050618ab8565b618af48785619509565b9450505050506167bb565b838320618b0c858861a498565b618b169087619509565b91505b858210618b5157848220808203618b3e57618b348684619509565b93505050506167bb565b618b4960018461a498565b925050618b19565b505b5092949350505050565b60008381868511618c685760208511618c175760008515618ba9576001618b8587602061a498565b618b9090600861a792565b618b9b90600261a890565b618ba5919061a498565b1990505b84518116600087618bba8b8b619509565b618bc4919061a498565b855190915083165b828114618c0957818610618bf157618be48b8b619509565b96505050505050506167bb565b85618bfb8161a778565b965050838651169050618bcc565b8596505050505050506167bb565b508383206000905b618c29868961a498565b8211618c6657858320808203618c4557839450505050506167bb565b618c50600185619509565b9350508180618c5e9061a778565b925050618c1f565b505b618c728787619509565b979650505050505050565b60408051808201909152600080825260208201526000618caf8560000151866020015186600001518760200151618b5d565b602080870180519186019190915251909150618ccb908261a498565b835284516020860151618cde9190619509565b8103618ced5760008552618d1f565b83518351618cfb9190619509565b85518690618d0a90839061a498565b9052508351618d199082619509565b60208601525b50909392505050565b60208110618d605781518352618d3f602084619509565b9250618d4c602083619509565b9150618d5960208261a498565b9050618d28565b6000198115618d8f576001618d7683602061a498565b618d829061010061a890565b618d8c919061a498565b90505b9151835183169219169190911790915250565b60606000618db0848461528e565b8051602080830151604051939450618dca9390910161a8b3565b60405160208183030381529060405291505092915050565b8151815160009190811115618df5575081515b6020808501519084015160005b83811015618eae5782518251808214618e7e576000196020871015618e5d57600184618e2f89602061a498565b618e399190619509565b618e4490600861a792565b618e4f90600261a890565b618e59919061a498565b1990505b8181168382168181039114618e7b579750614dc59650505050505050565b50505b618e89602086619509565b9450618e96602085619509565b93505050602081618ea79190619509565b9050618e02565b508451865161593c919061a90b565b6112a68061a92c83390190565b6119ca8061bbd283390190565b6117838061d59c83390190565b610de08061ed1f83390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001618f34618f39565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001618f346040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015618feb5783516001600160a01b0316835260209384019390920191600101618fc4565b509095945050505050565b60005b83811015619011578181015183820152602001618ff9565b50506000910152565b60008151808452619032816020860160208601618ff6565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015619128577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261911284865161901a565b60209586019590945092909201916001016190d8565b50919750505060209485019492909201915060010161906e565b50929695505050505050565b600081518084526020840193506020830160005b828110156191a25781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101619162565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752619218604088018261901a565b9050602082015191508681036020880152619233818361914e565b9650505060209384019391909101906001016191d4565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184526192ac85835161901a565b94506020938401939190910190600101619272565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152619342604087018261914e565b95505060209384019391909101906001016192e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c9082168061939b57607f821691505b602082108103617087577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610b0657806000526020600020601f840160051c810160208510156193fb5750805b601f840160051c820191505b818110156121d35760008155600101619407565b815167ffffffffffffffff81111561943557619435619358565b619449816194438454619387565b846193d4565b6020601f82116001811461947d57600083156194655750848201515b600019600385901b1c1916600184901b1784556121d3565b600084815260208120601f198516915b828110156194ad578785015182556020948501946001909201910161948d565b50848210156194cb5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115614dc557614dc56194da565b600081546001600160a01b038116845267ffffffffffffffff8160a01c1660208501525060018201606060408501526000815461955881619387565b806060880152600182166000811461957757600181146195b1576195e5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b89010193506195e5565b84600052602060002060005b838110156195dc5781548a8201608001526001909101906020016195bd565b89016080019450505b50919695505050505050565b6001600160a01b038516815283602082015260a06040820152600061961960a083018561901a565b600060608401528281036080840152618c72818561951c565b60006020828403121561964457600080fd5b5051919050565b6001600160a01b038416815282602082015260606040820152600061706d606083018461901a565b8281526040602082015260006167bb604083018461901a565b6001600160a01b03851681528360208201526080604082015260006196b4608083018561901a565b905082606083015295945050505050565b602081526000614ebe602083018461901a565b6001600160a01b038616815284602082015260a06040820152600061970060a083018661901a565b8460608401528281036080840152619718818561951c565b98975050505050505050565b6001600160a01b038416815282602082015260806040820152600061974c608083018461901a565b905060006060830152949350505050565b600082619793577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6001600160a01b03831681526040602082015260006167bb604083018461951c565b8381526060602082015260006197d3606083018561901a565b828103604084015261593c818561951c565b6001600160a01b03831681526040602082015260006167bb604083018461901a565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161983f81601a850160208801618ff6565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161987c81601c840160208801618ff6565b01601c01949350505050565b60006020828403121561989a57600080fd5b81516001600160a01b0381168114614ebe57600080fd5b6040516060810167ffffffffffffffff811182821017156198d4576198d4619358565b60405290565b60008067ffffffffffffffff8411156198f5576198f5619358565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561992457619924619358565b60405283815290508082840185101561993c57600080fd5b616b8a846020830185618ff6565b600082601f83011261995b57600080fd5b614ebe838351602085016198da565b60006020828403121561997c57600080fd5b815167ffffffffffffffff81111561999357600080fd5b614dc18482850161994a565b600083516199b1818460208801618ff6565b8351908301906199c5818360208801618ff6565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351619a0681601a850160208801618ff6565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351619a43816033840160208801618ff6565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000614ebe608083018461901a565b600060208284031215619ad257600080fd5b815167ffffffffffffffff811115619ae957600080fd5b8201601f81018413619afa57600080fd5b614dc1848251602084016198da565b60008551619b1b818460208a01618ff6565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551619b55816001840160208a01618ff6565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451619b93816002840160208901618ff6565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351619bd5816002840160208801618ff6565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000619c20604083018461901a565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b600060208284031215619c7157600080fd5b81518015158114614ebe57600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251619cb981601f850160208701618ff6565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000619d26604083018461901a565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000619d78604083018461901a565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251619def816014850160208701618ff6565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000619e36604083018561901a565b8281036020840152614eba818561901a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251619eaf816001850160208701618ff6565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251619ef5818460208701618ff6565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251619fa881604b850160208701618ff6565b91909101604b0192915050565b600060ff821660ff8103619fcb57619fcb6194da565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161a032816029850160208701618ff6565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000614ebe608083018461901a565b60006020828403121561a09857600080fd5b815167ffffffffffffffff81111561a0af57600080fd5b82016060818503121561a0c157600080fd5b61a0c96198b1565b81518060030b811461a0da57600080fd5b8152602082015167ffffffffffffffff81111561a0f657600080fd5b61a1028682850161994a565b602083015250604082015167ffffffffffffffff81111561a12257600080fd5b61a12e8682850161994a565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161a19a816021850160208701618ff6565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161a386816021850160208801618ff6565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161a3c381602e840160208801618ff6565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161a032816029850160208701618ff6565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161a48b816022850160208701618ff6565b9190910160220192915050565b81810381811115614dc557614dc56194da565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161a4e381600e850160208701618ff6565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161a5c1816018850160208801618ff6565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161a5fe81601c840160208801618ff6565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161a704818460208701618ff6565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161a76b81601c850160208701618ff6565b91909101601c0192915050565b6000600019820361a78b5761a78b6194da565b5060010190565b8082028115828204841417614dc557614dc56194da565b6001815b600184111561a7e45780850481111561a7c85761a7c86194da565b600184161561a7d657908102905b60019390931c92800261a7ad565b935093915050565b60008261a7fb57506001614dc5565b8161a80857506000614dc5565b816001811461a81e576002811461a8285761a844565b6001915050614dc5565b60ff84111561a8395761a8396194da565b50506001821b614dc5565b5060208310610133831016604e8410600b841016171561a867575081810a614dc5565b61a874600019848461a7a9565b806000190482111561a8885761a8886194da565b029392505050565b6000614ebe838361a7ec565b60008161a8ab5761a8ab6194da565b506000190190565b6000835161a8c5818460208801618ff6565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a8ff816001840160208801618ff6565b01600101949350505050565b8181036000831280158383131683831282161715618182576181826194da56fe608060405234801561001057600080fd5b506040516112a63803806112a683398101604081905261002f91610110565b604051806040016040528060048152602001635a65746160e01b815250604051806040016040528060048152602001635a45544160e01b815250816003908161007891906101e2565b50600461008582826101e2565b5050506001600160a01b03821615806100a557506001600160a01b038116155b156100c35760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b039384166001600160a01b031991821617909155600780549290931691161790556102a0565b80516001600160a01b038116811461010b57600080fd5b919050565b6000806040838503121561012357600080fd5b61012c836100f4565b915061013a602084016100f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061016d57607f821691505b60208210810361018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101dd57806000526020600020601f840160051c810160208510156101ba5750805b601f840160051c820191505b818110156101da57600081556001016101c6565b50505b505050565b81516001600160401b038111156101fb576101fb610143565b61020f816102098454610159565b84610193565b6020601f821160018114610243576000831561022b5750848201515b600019600385901b1c1916600184901b1784556101da565b600084815260208120601f198516915b828110156102735787850151825560209485019460019092019101610253565b50848210156102915786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610ff7806102af6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806379cc679011610081578063a9059cbb11610066578063a9059cbb1461028e578063bff9662a146102a1578063dd62ed3e146102c157600080fd5b806379cc67901461027357806395d89b411461028657600080fd5b806342966c68146102025780635b1125911461021557806370a0823114610235578063779e3b631461026b57600080fd5b80631e458bee116100ee5780631e458bee1461018857806323b872dd1461019b578063313ce567146101ae578063328a01d0146101bd57600080fd5b806306fdde0314610120578063095ea7b31461013e57806315d57fd41461016157806318160ddd14610176575b600080fd5b610128610307565b6040516101359190610d97565b60405180910390f35b61015161014c366004610e2c565b610399565b6040519015158152602001610135565b61017461016f366004610e56565b6103b3565b005b6002545b604051908152602001610135565b610174610196366004610e89565b61057e565b6101516101a9366004610ebc565b610631565b60405160128152602001610135565b6007546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610174610210366004610ef9565b610655565b6006546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a610243366004610f12565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610174610662565b610174610281366004610e2c565b610786565b610128610837565b61015161029c366004610e2c565b610846565b6005546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a6102cf366004610e56565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461031690610f34565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610f34565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b5050505050905090565b6000336103a7818585610854565b60019150505b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1633148015906103f3575060065473ffffffffffffffffffffffffffffffffffffffff163314155b15610431576040517fcdfcef970000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82161580610468575073ffffffffffffffffffffffffffffffffffffffff8116155b1561049f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560058054918516919092161790556040805133815260208101929092527fe79965b5c67dcfb2cf5fe152715e4a7256cee62a3d5dd8484fd8a8539eb8beff910160405180910390a16040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201527f1b9352454524a57a51f24f67dc66d898f616922cd1f7a12d73570ece12b1975c910160405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146105d1576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6105db8383610866565b808373ffffffffffffffffffffffffffffffffffffffff167fc263b302aec62d29105026245f19e16f8e0137066ccd4a8bd941f716bd4096bb8460405161062491815260200190565b60405180910390a3505050565b60003361063f8582856108c6565b61064a858585610995565b506001949350505050565b61065f3382610a40565b50565b60075473ffffffffffffffffffffffffffffffffffffffff1633146106b5576040517fe700765e000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b60065473ffffffffffffffffffffffffffffffffffffffff16610704576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040805133815260208101929092527f5104c9abdc7d111c2aeb4ce890ac70274a4be2ee83f46a62551be5e6ebc82dd0910160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6107e38282610a9c565b8173ffffffffffffffffffffffffffffffffffffffff167f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b18260405161082b91815260200190565b60405180910390a25050565b60606004805461031690610f34565b6000336103a7818585610995565b6108618383836001610ab1565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166108b6576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c260008383610bf9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f5781811015610980576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610428565b61098f84848484036000610ab1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166109e5576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8216610a35576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b610861838383610bf9565b73ffffffffffffffffffffffffffffffffffffffff8216610a90576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c282600083610bf9565b610aa78233836108c6565b6108c28282610a40565b73ffffffffffffffffffffffffffffffffffffffff8416610b01576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8316610b51576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561098f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610beb91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c31578060026000828254610c269190610f87565b90915550610ce39050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cb7576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610428565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610d0c57600280548290039055610d38565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161062491815260200190565b602081526000825180602084015260005b81811015610dc55760208186018101516040868401015201610da8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e2757600080fd5b919050565b60008060408385031215610e3f57600080fd5b610e4883610e03565b946020939093013593505050565b60008060408385031215610e6957600080fd5b610e7283610e03565b9150610e8060208401610e03565b90509250929050565b600080600060608486031215610e9e57600080fd5b610ea784610e03565b95602085013595506040909401359392505050565b600080600060608486031215610ed157600080fd5b610eda84610e03565b9250610ee860208501610e03565b929592945050506040919091013590565b600060208284031215610f0b57600080fd5b5035919050565b600060208284031215610f2457600080fd5b610f2d82610e03565b9392505050565b600181811c90821680610f4857607f821691505b602082108103610f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156103ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220085f01204b33dc17013c78c74fbca32a3da2c0b384ce7c8878c889551af28c6164736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212207c49d30b0605b064d35bbcebc6cb6183e67c99c35afc6eb1f1e24f43be61a79b64736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220ca4447386e9b7e2d2a9416c17964e96eb10e0ac9d4d482f4f288c3aac839893464736f6c634300081a0033", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061fb348061003c6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063a783c78911610104578063d509b16c116100a2578063e63ab1e911610071578063e63ab1e914610344578063fa7626d41461036b578063fdca905214610378578063fe574f841461038057600080fd5b8063d509b16c14610324578063dcf7d0371461032c578063de1cb76c14610334578063e20c9f711461033c57600080fd5b8063b5508aa9116100de578063b5508aa9146102f4578063ba414fa6146102fc578063c190997214610314578063ccb0e3f21461031c57600080fd5b8063a783c789146102bd578063aaf74192146102e4578063b0464fdc146102ec57600080fd5b80634934655811610171578063828320141161014b578063828320141461025657806385226c811461025e57806385f438c114610273578063916a17c6146102a857600080fd5b8063493465581461023157806366d9a9a0146102395780637db20efb1461024e57600080fd5b80632ade3880116101ad5780632ade3880146102045780633cba0107146102195780633e5e3c23146102215780633f7286f41461022957600080fd5b80630a9254e4146101d45780631ed7831c146101de5780632506ef03146101fc575b600080fd5b6101dc610388565b005b6101e6610b0b565b6040516101f39190618faa565b60405180910390f35b6101dc610b6d565b61020c610e21565b6040516101f39190619046565b6101dc610f63565b6101e6611725565b6101e6611785565b6101dc6117e5565b610241611db9565b6040516101f391906191ac565b6101dc611f3b565b6101dc6121da565b610266612436565b6040516101f3919061924a565b61029a7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6040519081526020016101f3565b6102b0612506565b6040516101f391906192c1565b61029a7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101dc612601565b6102b061287c565b610266612977565b610304612a47565b60405190151581526020016101f3565b6101dc612b1b565b6101dc612d86565b6101dc6138b2565b6101dc613c07565b6101dc614235565b6101e661495b565b61029a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b601f546103049060ff1681565b6101dc6149bb565b6101dc614bbf565b60258054307fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155602680546112349083161790556027805461567892168217905560405181906103dd90618ebd565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610410573d6000803e3d6000fd5b50602480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283169081178255604080518082018252600e81527f4761746577617945564d2e736f6c000000000000000000000000000000000000602082015260275460255492519086169481019490945260448401929092529092166064820152610501919060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc0c53b8b00000000000000000000000000000000000000000000000000000000179052614dac565b601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0393841681029190911791829055602080549190920483167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560275460255460405192939182169291169061058d90618eca565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156105c9573d6000803e3d6000fd5b50602280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055602054602454602754602554604051938516949283169391831692169061062490618ed7565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f080158015610668573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905560275460405163ca669fa760e01b815291166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156106ed57600080fd5b505af1158015610701573d6000803e3d6000fd5b5050602480546027546023546040517f15d57fd40000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216938101939093521692506315d57fd49150604401600060405180830381600087803b15801561077457600080fd5b505af1158015610788573d6000803e3d6000fd5b5050505060405161079890618ee4565b604051809103906000f0801580156107b4573d6000803e3d6000fd5b50602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790556027546040517fc88a5e6d00000000000000000000000000000000000000000000000000000000815291166004820152670de0b6b3a76400006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c88a5e6d90604401600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b50506025546040517f06447d560000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b1580156108ea57600080fd5b505af11580156108fe573d6000803e3d6000fd5b50506020546022546040517fae7a3a6f0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116925063ae7a3a6f9150602401600060405180830381600087803b15801561096457600080fd5b505af1158015610978573d6000803e3d6000fd5b50506020546023546040517f10188aef0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911692506310188aef9150602401600060405180830381600087803b1580156109de57600080fd5b505af11580156109f2573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a5457600080fd5b505af1158015610a68573d6000803e3d6000fd5b5050604080516060810182526024546001600160a01b039081168252600160208084019182528451908101855260008152938301849052825160288054925167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931691909316171781559093509150602990610b06908261941b565b505050565b60606016805480602002602001604051908101604052809291908181526020018280548015610b6357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b45575b5050505050905090565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f190181529082905260275463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015610c0857600080fd5b505af1158015610c1c573d6000803e3d6000fd5b50506023546040517f6f8b44b0000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fc30436e9000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b158015610d8d57600080fd5b505af1158015610da1573d6000803e3d6000fd5b50506023546021546001600160a01b03918216935063057e0f25925016610dc9856001619509565b8460286040518563ffffffff1660e01b8152600401610deb94939291906195f1565b600060405180830381600087803b158015610e0557600080fd5b505af1158015610e19573d6000803e3d6000fd5b505050505050565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015610f5a57600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015610f43578382906000526020600020018054610eb690619387565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee290619387565b8015610f2f5780601f10610f0457610100808354040283529160200191610f2f565b820191906000526020600020905b815481529060010190602001808311610f1257829003601f168201915b505050505081526020019060010190610e97565b505050508152505081526020019060010190610e45565b50505050905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a2000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110629190619632565b905061106f816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156110bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e39190619632565b90506110f0816000614dcb565b6020546040516001600160a01b039091166024820152604481018690526064810185905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba3916111d7916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b1580156111f157600080fd5b505af1158015611205573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561129757600080fd5b505af11580156112ab573d6000803e3d6000fd5b505060208054602454602654604080516001600160a01b0394851681529485018d905291831684830152919091166060830152517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609350908190036080019150a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561139a57600080fd5b505af11580156113ae573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506113f39089908890619673565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561145457600080fd5b505af1158015611468573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506114c092909116908a9089908b9060040161968c565b600060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611540573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115649190619632565b90506115708188614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e49190619632565b90506115f1816000614dcb565b602480546020546021546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169381019390935260009291169063dd62ed3e90604401602060405180830381865afa158015611667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168b9190619632565b9050611698816000614dcb565b602480546020546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c9190619632565b9050611719816000614dcb565b50505050505050505050565b60606018805480602002602001604051908101604052809291908181526020018280548015610b63576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b45575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610b63576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b45575050505050905090565b604080516004808252602480830184526020830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6ed70169000000000000000000000000000000000000000000000000000000001790525460265493516370a0823160e01b8152620186a0946000949385936001600160a01b03908116936370a082319361188693921691016001600160a01b0391909116815260200190565b602060405180830381865afa1580156118a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c79190619632565b90506118d4816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015611924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119489190619632565b9050611955816000614dcb565b6020546040516001600160a01b039091166024820152604481018690526064810185905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391611a3c916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b158015611a5657600080fd5b505af1158015611a6a573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015611afc57600080fd5b505af1158015611b10573d6000803e3d6000fd5b5050602080546040516001600160a01b0390911681527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a0935001905060405180910390a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b158015611be257600080fd5b505af1158015611bf6573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d9150611c3b9089908890619673565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611c9c57600080fd5b505af1158015611cb0573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef9350611d0892909116908a9089908b9060040161968c565b600060405180830381600087803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015611d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dac9190619632565b9050611570816000614dcb565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5783829060005260206000209060020201604051806040016040529081600082018054611e1090619387565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3c90619387565b8015611e895780601f10611e5e57610100808354040283529160200191611e89565b820191906000526020600020905b815481529060010190602001808311611e6c57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611f2357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611ed05790505b50505050508152505081526020019060010190611ddd565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611f9957600080fd5b505af1158015611fad573d6000803e3d6000fd5b50506023546040517f6f8b44b0000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b15801561201057600080fd5b505af1158015612024573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561208157600080fd5b505af1158015612095573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fc30436e9000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561211e57600080fd5b505af1158015612132573d6000803e3d6000fd5b50506023546021546001600160a01b03918216935063106e629092501661215a846001619509565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039092166004830152602482015260006044820152606401600060405180830381600087803b1580156121bf57600080fd5b505af11580156121d3573d6000803e3d6000fd5b5050505050565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f190181529082905260255463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561227757600080fd5b505af115801561228b573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb3925061237691906004016196c5565b600060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f2593506123ff92909116908790869088906028906004016196d8565b600060405180830381600087803b15801561241957600080fd5b505af115801561242d573d6000803e3d6000fd5b50505050505050565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015610f5a57838290600052602060002001805461247990619387565b80601f01602080910402602001604051908101604052809291908181526020018280546124a590619387565b80156124f25780601f106124c7576101008083540402835291602001916124f2565b820191906000526020600020905b8154815290600101906020018083116124d557829003601f168201915b50505050508152602001906001019061245a565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156125e957602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116125965790505b5050505050815250508152602001906001019061252a565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a09060009060250160408051808303601f190181529082905260275463ca669fa760e01b83526001600160a01b031660048301529150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561269c57600080fd5b505af11580156126b0573d6000803e3d6000fd5b50506023546040517f6f8b44b0000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b15801561271357600080fd5b505af1158015612727573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fc30436e9000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561282157600080fd5b505af1158015612835573d6000803e3d6000fd5b50506023546021546001600160a01b039182169350635e3e9fef92501661285d856001619509565b846040518463ffffffff1660e01b8152600401610deb93929190619724565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561295f57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001906004019060208260030104928301926001038202915080841161290c5790505b505050505081525050815260200190600101906128a0565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015610f5a5783829060005260206000200180546129ba90619387565b80601f01602080910402602001604051908101604052809291908181526020018280546129e690619387565b8015612a335780601f10612a0857610100808354040283529160200191612a33565b820191906000526020600020905b815481529060010190602001808311612a1657829003601f168201915b50505050508152602001906001019061299b565b60085460009060ff1615612a5f575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015612af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b149190619632565b1415905090565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f357fc5a200000000000000000000000000000000000000000000000000000000179052602554905163ca669fa760e01b81526001600160a01b039091166004820152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612c0157600080fd5b505af1158015612c15573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250612d0091906004016196c5565b600060405180830381600087803b158015612d1a57600080fd5b505af1158015612d2e573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef93506123ff929091169087908690889060040161968c565b60275460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015612de757600080fd5b505af1158015612dfb573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250612ee691906004016196c5565b600060405180830381600087803b158015612f0057600080fd5b505af1158015612f14573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f6857600080fd5b505af1158015612f7c573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015612fd957600080fd5b505af1158015612fed573d6000803e3d6000fd5b5050602754604080516001600160a01b0390921660248301527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb392506130d891906004016196c5565b600060405180830381600087803b1580156130f257600080fd5b505af1158015613106573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561315a57600080fd5b505af115801561316e573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b1580156131cb57600080fd5b505af11580156131df573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561323357600080fd5b505af1158015613247573d6000803e3d6000fd5b50506040517fc31eb0e00000000000000000000000000000000000000000000000000000000081527fd93c0665000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156132d057600080fd5b505af11580156132e4573d6000803e3d6000fd5b505060275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561334157600080fd5b505af1158015613355573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401600060405180830381600087803b1580156133c957600080fd5b505af11580156133dd573d6000803e3d6000fd5b505060255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561343a57600080fd5b505af115801561344e573d6000803e3d6000fd5b50505050602360009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156134a257600080fd5b505af11580156134b6573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015613508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352c9190619632565b9050613539816000614dcb565b6026546040516001600160a01b039091166024820152604481018490526064810183905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613620916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b15801561363a57600080fd5b505af115801561364e573d6000803e3d6000fd5b50506023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b1580156136e057600080fd5b505af11580156136f4573d6000803e3d6000fd5b50506026546040518781526001600160a01b0390911692507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5915060200160405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101899052604481018890529116925063106e629091506064015b600060405180830381600087803b15801561381c57600080fd5b505af1158015613830573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa158015613882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a69190619632565b90506121d38186614dcb565b602480546026546040516370a0823160e01b81526001600160a01b039182166004820152620186a09360009392909216916370a082319101602060405180830381865afa158015613907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392b9190619632565b9050613938816000614dcb565b6026546040516001600160a01b0390911660248201526044810183905260006064820181905290819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613a21916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b158015613a3b57600080fd5b505af1158015613a4f573d6000803e3d6000fd5b50506023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613ae157600080fd5b505af1158015613af5573d6000803e3d6000fd5b50506026546040518781526001600160a01b0390911692507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5915060200160405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613b9457600080fd5b505af1158015613ba8573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101899052604481018790529116925063106e62909150606401613802565b60248054602654604051620186a09381018490526001600160a01b03928316604482015291166064820152600090819060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc5131691000000000000000000000000000000000000000000000000000000001790526024805460265492516370a0823160e01b81526001600160a01b0393841660048201529394506000939216916370a082319101602060405180830381865afa158015613ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d069190619632565b9050613d13816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa158015613d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d879190619632565b9050613d94816000614dcb565b6020546040516001600160a01b039091166024820152604481018690526064810185905260009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391613e7b916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b158015613e9557600080fd5b505af1158015613ea9573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b158015613f3b57600080fd5b505af1158015613f4f573d6000803e3d6000fd5b50506020547f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af6092506001600160a01b03169050613f8d60028961975d565b602454602654604080516001600160a01b03958616815260208101949094529184168383015292909216606082015290519081900360800190a16023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561405557600080fd5b505af1158015614069573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d91506140ae9089908890619673565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561410f57600080fd5b505af1158015614123573d6000803e3d6000fd5b50506023546021546040517f5e3e9fef0000000000000000000000000000000000000000000000000000000081526001600160a01b039283169450635e3e9fef935061417b92909116908a9089908b9060040161968c565b600060405180830381600087803b15801561419557600080fd5b505af11580156141a9573d6000803e3d6000fd5b5050602480546026546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa1580156141fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421f9190619632565b90506115708161423060028a61975d565b614dcb565b6040517f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152620186a090600090819060250160408051808303601f1901815290829052602480546021546370a0823160e01b85526001600160a01b0390811660048601529294506000939216916370a082319101602060405180830381865afa1580156142ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142ee9190619632565b90506142fb816000614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561434b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061436f9190619632565b6020546040516001600160a01b039091166024820152604481018790526064810186905290915060009060840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1e458bee0000000000000000000000000000000000000000000000000000000017905260245490517ff30c7ba3000000000000000000000000000000000000000000000000000000008152919250737109709ecfa91a80626ff3989d68f67f5b1dd12d9163f30c7ba391614459916001600160a01b039190911690600090869060040161964b565b600060405180830381600087803b15801561447357600080fd5b505af1158015614487573d6000803e3d6000fd5b50506021546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506381bad6f3915060a401600060405180830381600087803b15801561451957600080fd5b505af115801561452d573d6000803e3d6000fd5b50506020546040517f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e935061457192506001600160a01b0390911690602890619798565b60405180910390a16020546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b15801561460757600080fd5b505af115801561461b573d6000803e3d6000fd5b50506024546021546040516001600160a01b039283169450911691507f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143690614669908a9089906028906197ba565b60405180910390a36023546040517f81bad6f3000000000000000000000000000000000000000000000000000000008152600160048201819052602482018190526044820181905260648201526001600160a01b039091166084820152737109709ecfa91a80626ff3989d68f67f5b1dd12d906381bad6f39060a401600060405180830381600087803b1580156146ff57600080fd5b505af1158015614713573d6000803e3d6000fd5b50506021546040516001600160a01b0390911692507f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c915061475b90899088906028906197ba565b60405180910390a260275460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156147bc57600080fd5b505af11580156147d0573d6000803e3d6000fd5b50506023546021546040517f057e0f250000000000000000000000000000000000000000000000000000000081526001600160a01b03928316945063057e0f25935061482b92909116908a9089908b906028906004016196d8565b600060405180830381600087803b15801561484557600080fd5b505af1158015614859573d6000803e3d6000fd5b5050602480546021546040516370a0823160e01b81526001600160a01b03918216600482015260009550911692506370a082319101602060405180830381865afa1580156148ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148cf9190619632565b90506148db8188614dcb565b602480546023546040516370a0823160e01b81526001600160a01b03918216600482015260009391909216916370a082319101602060405180830381865afa15801561492b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494f9190619632565b90506115f18185614dcb565b60606015805480602002602001604051908101604052809291908181526020018280548015610b63576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b45575050505050905090565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614a1457600080fd5b505af1158015614a28573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb60448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614b1391906004016196c5565b600060405180830381600087803b158015614b2d57600080fd5b505af1158015614b41573d6000803e3d6000fd5b50506023546040517f6f8b44b000000000000000000000000000000000000000000000000000000000815261271060048201526001600160a01b039091169250636f8b44b09150602401600060405180830381600087803b158015614ba557600080fd5b505af1158015614bb9573d6000803e3d6000fd5b50505050565b60255460405163ca669fa760e01b81526001600160a01b039091166004820152620186a090600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614c2057600080fd5b505af1158015614c34573d6000803e3d6000fd5b5050602554604080516001600160a01b0390921660248301527f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e460448084019190915281518084039091018152606490920181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe2517d3f00000000000000000000000000000000000000000000000000000000179052517ff28dceb3000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d935063f28dceb39250614d1f91906004016196c5565b600060405180830381600087803b158015614d3957600080fd5b505af1158015614d4d573d6000803e3d6000fd5b50506023546026546040517f106e62900000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260248101879052604481018690529116925063106e62909150606401610deb565b6000614db6618ef1565b614dc1848483614e4a565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c549060440160006040518083038186803b158015614e3657600080fd5b505afa158015610e19573d6000803e3d6000fd5b600080614e578584614ec5565b9050614eba6040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614ea59291906197e5565b60405160208183030381529060405285614ed1565b9150505b9392505050565b6000614ebe8383614eff565b60c08101515160009015614ef557614eee84848460c00151614f1a565b9050614ebe565b614eee84846150c0565b6000614f0b83836151ab565b614ebe83836020015184614ed1565b600080614f256151bb565b90506000614f33868361528e565b90506000614f4a8260600151836020015185615734565b90506000614f5a83838989615946565b90506000614f67826167c3565b602081015181519192509060030b15614fda57898260400151604051602001614f91929190619807565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252614fd1916004016196c5565b60405180910390fd5b600061501d6040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001616992565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d906150709084906004016196c5565b602060405180830381865afa15801561508d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150b19190619888565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906151159087906004016196c5565b600060405180830381865afa158015615132573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261515a919081019061996a565b90506000615188828560405160200161517492919061999f565b604051602081830303815290604052616b92565b90506001600160a01b038116614dc1578484604051602001614f919291906199ce565b6151b782826000616ba5565b5050565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c90615242908490600401619a79565b600060405180830381865afa15801561525f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526152879190810190619ac0565b9250505090565b6152c06040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d905061530b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61531485616ca8565b602082015260006153248661708d565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa158015615366573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261538e9190810190619ac0565b868385602001516040516020016153a89493929190619b09565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906154009085906004016196c5565b600060405180830381865afa15801561541d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154459190810190619ac0565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f69061548d908490600401619c0d565b602060405180830381865afa1580156154aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154ce9190619c5f565b6154e35781604051602001614f919190619c81565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac890615528908490600401619d13565b600060405180830381865afa158015615545573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261556d9190810190619ac0565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f6906155b4908490600401619d65565b602060405180830381865afa1580156155d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155f59190619c5f565b1561568a576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac89061563f908490600401619d65565b600060405180830381865afa15801561565c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526156849190810190619ac0565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016156af9190619db7565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016156db929190619e23565b600060405180830381865afa1580156156f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157209190810190619ac0565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816157505790505090506040518060400160405280600481526020017f6772657000000000000000000000000000000000000000000000000000000000815250816000815181106157b0576157b0619e48565b60200260200101819052506040518060400160405280600381526020017f2d726c00000000000000000000000000000000000000000000000000000000008152508160018151811061580457615804619e48565b6020026020010181905250846040516020016158209190619e77565b6040516020818303038152906040528160028151811061584257615842619e48565b60200260200101819052508260405160200161585e9190619ee3565b6040516020818303038152906040528160038151811061588057615880619e48565b60200260200101819052506000615896826167c3565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506159279060408051808201825260008082526020918201528151808301909252845182528085019082015290617310565b61593c5785604051602001614f919190619f24565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615996565b511590565b615b0a57826020015115615a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401614fd1565b8260c0015115615b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401614fd1565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081615b2357905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280615b7e90619fb5565b935060ff1681518110615b9357615b93619e48565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001615be49190619fd4565b604051602081830303815290604052828280615bff90619fb5565b935060ff1681518110615c1457615c14619e48565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280615c6190619fb5565b935060ff1681518110615c7657615c76619e48565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280615cc390619fb5565b935060ff1681518110615cd857615cd8619e48565b60200260200101819052508760200151828280615cf490619fb5565b935060ff1681518110615d0957615d09619e48565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615d5690619fb5565b935060ff1681518110615d6b57615d6b619e48565b602090810291909101015287518282615d8381619fb5565b935060ff1681518110615d9857615d98619e48565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615de590619fb5565b935060ff1681518110615dfa57615dfa619e48565b6020026020010181905250615e0e46617371565b8282615e1981619fb5565b935060ff1681518110615e2e57615e2e619e48565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615e7b90619fb5565b935060ff1681518110615e9057615e90619e48565b602002602001018190525086828280615ea890619fb5565b935060ff1681518110615ebd57615ebd619e48565b6020908102919091010152855115615fe45760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282615f0e81619fb5565b935060ff1681518110615f2357615f23619e48565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90615f739089906004016196c5565b600060405180830381865afa158015615f90573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615fb89190810190619ac0565b8282615fc381619fb5565b935060ff1681518110615fd857615fd8619e48565b60200260200101819052505b8460200151156160b45760408051808201909152601281527f2d2d766572696679536f75726365436f646500000000000000000000000000006020820152828261602d81619fb5565b935060ff168151811061604257616042619e48565b60200260200101819052506040518060400160405280600581526020017f66616c736500000000000000000000000000000000000000000000000000000081525082828061608f90619fb5565b935060ff16815181106160a4576160a4619e48565b602002602001018190525061627b565b6160ec6159918660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b61617f5760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261612f81619fb5565b935060ff168151811061614457616144619e48565b60200260200101819052508460a001516040516020016161649190619e77565b60405160208183030381529060405282828061608f90619fb5565b8460c001511580156161c25750604080890151815180830183526000808252602091820152825180840190935281518352908101908201526161c090511590565b155b1561627b5760408051808201909152600d81527f2d2d6c6963656e736554797065000000000000000000000000000000000000006020820152828261620681619fb5565b935060ff168151811061621b5761621b619e48565b602002602001018190525061622f88617411565b60405160200161623f9190619e77565b60405160208183030381529060405282828061625a90619fb5565b935060ff168151811061626f5761626f619e48565b60200260200101819052505b604080860151815180830183526000808252602091820152825180840190935281518352908101908201526162af90511590565b6163445760408051808201909152600b81527f2d2d72656c617965724964000000000000000000000000000000000000000000602082015282826162f281619fb5565b935060ff168151811061630757616307619e48565b6020026020010181905250846040015182828061632390619fb5565b935060ff168151811061633857616338619e48565b60200260200101819052505b6060850151156164655760408051808201909152600681527f2d2d73616c7400000000000000000000000000000000000000000000000000006020820152828261638d81619fb5565b935060ff16815181106163a2576163a2619e48565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa158015616411573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526164399190810190619ac0565b828261644481619fb5565b935060ff168151811061645957616459619e48565b60200260200101819052505b60e0850151511561650c5760408051808201909152600a81527f2d2d6761734c696d697400000000000000000000000000000000000000000000602082015282826164af81619fb5565b935060ff16815181106164c4576164c4619e48565b60200260200101819052506164e08560e0015160000151617371565b82826164eb81619fb5565b935060ff168151811061650057616500619e48565b60200260200101819052505b60e085015160200151156165b65760408051808201909152600a81527f2d2d6761735072696365000000000000000000000000000000000000000000006020820152828261655981619fb5565b935060ff168151811061656e5761656e619e48565b602002602001018190525061658a8560e0015160200151617371565b828261659581619fb5565b935060ff16815181106165aa576165aa619e48565b60200260200101819052505b60e085015160400151156166605760408051808201909152600e81527f2d2d6d61784665655065724761730000000000000000000000000000000000006020820152828261660381619fb5565b935060ff168151811061661857616618619e48565b60200260200101819052506166348560e0015160400151617371565b828261663f81619fb5565b935060ff168151811061665457616654619e48565b60200260200101819052505b60e0850151606001511561670a5760408051808201909152601681527f2d2d6d61785072696f7269747946656550657247617300000000000000000000602082015282826166ad81619fb5565b935060ff16815181106166c2576166c2619e48565b60200260200101819052506166de8560e0015160600151617371565b82826166e981619fb5565b935060ff16815181106166fe576166fe619e48565b60200260200101819052505b60008160ff1667ffffffffffffffff81111561672857616728619358565b60405190808252806020026020018201604052801561675b57816020015b60608152602001906001900390816167465790505b50905060005b8260ff168160ff1610156167b457838160ff168151811061678457616784619e48565b6020026020010151828260ff16815181106167a1576167a1619e48565b6020908102919091010152600101616761565b5093505050505b949350505050565b6167ea6040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c916168709186910161a03f565b600060405180830381865afa15801561688d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526168b59190810190619ac0565b905060006168c38683617f00565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016168f3919061924a565b6000604051808303816000875af1158015616912573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261693a919081019061a086565b805190915060030b158015906169535750602081015151155b80156169625750604081015151155b1561593c578160008151811061697a5761697a619e48565b6020026020010151604051602001614f91919061a13c565b606060006169c78560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925286518252808701908201529091506169fe9082905b90618055565b15616b5b576000616a7b82616a7584616a6f616a418a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b9061807c565b906180de565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616adf908290618055565b15616b4957604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616b46905b8290618163565b90505b616b5281618189565b92505050614ebe565b8215616b74578484604051602001614f9192919061a328565b5050604080516020810190915260008152614ebe565b509392505050565b6000808251602084016000f09392505050565b8160a0015115616bb457505050565b6000616bc18484846181f2565b90506000616bce826167c3565b602081015181519192509060030b158015616c6a5750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616c6a906040805180820182526000808252602091820152815180830190925284518252808501908201526169f8565b15616c7757505050505050565b60408201515115616c97578160400151604051602001614f91919061a3cf565b80604051602001614f91919061a42d565b60606000616cdd8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616d42905b8290617310565b15616db157604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614ebe90616dac90839061878d565b618189565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e13905b8290618817565b600103616ee057604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616e7990616b3f565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614ebe90616dac905b8390618163565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f3f90616d3b565b1561707657604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290616fa79083906188b1565b905060008160018351616fba919061a498565b81518110616fca57616fca619e48565b6020026020010151905061706d616dac6170406040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925285518252808601908201529061878d565b95945050505050565b82604051602001614f91919061a4ab565b50919050565b606060006170c28360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015290915061712490616d3b565b1561713257614ebe81618189565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261719190616e0c565b6001036171fb57604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614ebe90616dac90616ed9565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261725a90616d3b565b1561707657604080518082018252600181527f2f000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201819052845180860190955292518452830152906172c29083906188b1565b90506001815111156172fe5780600282516172dd919061a498565b815181106172ed576172ed619e48565b602002602001015192505050919050565b5082604051602001614f91919061a4ab565b80518251600091111561732557506000614dc5565b8151835160208501516000929161733b91619509565b617345919061a498565b90508260200151810361735c576001915050614dc5565b82516020840151819020912014905092915050565b6060600061737e83618956565b600101905060008167ffffffffffffffff81111561739e5761739e619358565b6040519080825280601f01601f1916602001820160405280156173c8576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846173d257509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e534544000000000000000000000000000000000000000000008184019081528551808701875283815284019290925284518086019095525184529083015260609161749d905b8290618a38565b156174dd57505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261753c90617496565b1561757c57505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175db90617496565b1561761b57505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261767a90617496565b806176df5750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526176df90617496565b1561771f57505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c7900000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261777e90617496565b806177e35750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177e390617496565b1561782357505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261788290617496565b806178e75750604080518082018252601181527f4c47504c2d322e312d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178e790617496565b1561792757505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c79000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261798690617496565b806179eb5750604080518082018252601181527f4c47504c2d332e302d6f722d6c61746572000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179eb90617496565b15617a2b57505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617a8a90617496565b15617aca57505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617b2990617496565b15617b6957505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617bc890617496565b15617c0857505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617c6790617496565b15617ca757505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d0690617496565b15617d4657505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617da590617496565b80617e0a5750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617e0a90617496565b15617e4a57505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617ea990617496565b15617ee957505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b60408084015184519151614f91929060200161a589565b60608060005b8451811015617f8b5781858281518110617f2257617f22619e48565b6020026020010151604051602001617f3b92919061999f565b604051602081830303815290604052915060018551617f5a919061a498565b8114617f835781604051602001617f71919061a6f2565b60405160208183030381529060405291505b600101617f06565b5060408051600380825260808201909252600091816020015b6060815260200190600190039081617fa45790505090508381600081518110617fcf57617fcf619e48565b60200260200101819052506040518060400160405280600281526020017f2d630000000000000000000000000000000000000000000000000000000000008152508160018151811061802357618023619e48565b6020026020010181905250818160028151811061804257618042619e48565b6020908102919091010152949350505050565b60208083015183518351928401516000936180739291849190618a4c565b14159392505050565b604080518082019091526000808252602082015260006180ae8460000151856020015185600001518660200151618b5d565b90508360200151816180c0919061a498565b845185906180cf90839061a498565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015618103575081614dc5565b602080830151908401516001911461812a5750815160208481015190840151829020919020145b801561815b5782518451859061814190839061a498565b9052508251602085018051618157908390619509565b9052505b509192915050565b6040805180820190915260008082526020820152618182838383618c7d565b5092915050565b60606000826000015167ffffffffffffffff8111156181aa576181aa619358565b6040519080825280601f01601f1916602001820160405280156181d4576020820181803683370190505b50905060006020820190506181828185602001518660000151618d28565b606060006181fe6151bb565b6040805160ff808252612000820190925291925060009190816020015b606081526020019060019003908161821b57905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061827690619fb5565b935060ff168151811061828b5761828b619e48565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e33000000000000000000000000000000000000000000000000008152506040516020016182dc919061a733565b6040516020818303038152906040528282806182f790619fb5565b935060ff168151811061830c5761830c619e48565b60200260200101819052506040518060400160405280600881526020017f76616c696461746500000000000000000000000000000000000000000000000081525082828061835990619fb5565b935060ff168151811061836e5761836e619e48565b60200260200101819052508260405160200161838a9190619ee3565b6040516020818303038152906040528282806183a590619fb5565b935060ff16815181106183ba576183ba619e48565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e74726163740000000000000000000000000000000000000000000081525082828061840790619fb5565b935060ff168151811061841c5761841c619e48565b60200260200101819052506184318784618da2565b828261843c81619fb5565b935060ff168151811061845157618451619e48565b6020908102919091010152855151156184fd5760408051808201909152600b81527f2d2d7265666572656e6365000000000000000000000000000000000000000000602082015282826184a381619fb5565b935060ff16815181106184b8576184b8619e48565b60200260200101819052506184d1866000015184618da2565b82826184dc81619fb5565b935060ff16815181106184f1576184f1619e48565b60200260200101819052505b85608001511561856b5760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b00000000000000006020820152828261854681619fb5565b935060ff168151811061855b5761855b619e48565b60200260200101819052506185d1565b84156185d15760408051808201909152601281527f2d2d726571756972655265666572656e63650000000000000000000000000000602082015282826185b081619fb5565b935060ff16815181106185c5576185c5619e48565b60200260200101819052505b6040860151511561866d5760408051808201909152600d81527f2d2d756e73616665416c6c6f77000000000000000000000000000000000000006020820152828261861b81619fb5565b935060ff168151811061863057618630619e48565b6020026020010181905250856040015182828061864c90619fb5565b935060ff168151811061866157618661619e48565b60200260200101819052505b8560600151156186d75760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d6573000000000000000000000000602082015282826186b681619fb5565b935060ff16815181106186cb576186cb619e48565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156186f5576186f5619358565b60405190808252806020026020018201604052801561872857816020015b60608152602001906001900390816187135790505b50905060005b8260ff168160ff16101561878157838160ff168151811061875157618751619e48565b6020026020010151828260ff168151811061876e5761876e619e48565b602090810291909101015260010161872e565b50979650505050505050565b60408051808201909152600080825260208201528151835110156187b2575081614dc5565b815183516020850151600092916187c891619509565b6187d2919061a498565b602084015190915060019082146187f3575082516020840151819020908220145b801561880e5783518551869061880a90839061a498565b9052505b50929392505050565b600080826000015161883b8560000151866020015186600001518760200151618b5d565b6188459190619509565b90505b835160208501516188599190619509565b811161818257816188698161a778565b92505082600001516188a0856020015183618884919061a498565b8651618890919061a498565b8386600001518760200151618b5d565b6188aa9190619509565b9050618848565b606060006188bf8484618817565b6188ca906001619509565b67ffffffffffffffff8111156188e2576188e2619358565b60405190808252806020026020018201604052801561891557816020015b60608152602001906001900390816189005790505b50905060005b8151811015616b8a57618931616dac8686618163565b82828151811061894357618943619e48565b602090810291909101015260010161891b565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061899f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106189cb576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106189e957662386f26fc10000830492506010015b6305f5e1008310618a01576305f5e100830492506008015b6127108310618a1557612710830492506004015b60648310618a27576064830492506002015b600a8310614dc55760010192915050565b6000618a448383618de2565b159392505050565b600080858411618b535760208411618aff5760008415618a97576001618a7386602061a498565b618a7e90600861a792565b618a8990600261a890565b618a93919061a498565b1990505b8351811685618aa68989619509565b618ab0919061a498565b805190935082165b818114618aea57878411618ad257879450505050506167bb565b83618adc8161a89c565b945050828451169050618ab8565b618af48785619509565b9450505050506167bb565b838320618b0c858861a498565b618b169087619509565b91505b858210618b5157848220808203618b3e57618b348684619509565b93505050506167bb565b618b4960018461a498565b925050618b19565b505b5092949350505050565b60008381868511618c685760208511618c175760008515618ba9576001618b8587602061a498565b618b9090600861a792565b618b9b90600261a890565b618ba5919061a498565b1990505b84518116600087618bba8b8b619509565b618bc4919061a498565b855190915083165b828114618c0957818610618bf157618be48b8b619509565b96505050505050506167bb565b85618bfb8161a778565b965050838651169050618bcc565b8596505050505050506167bb565b508383206000905b618c29868961a498565b8211618c6657858320808203618c4557839450505050506167bb565b618c50600185619509565b9350508180618c5e9061a778565b925050618c1f565b505b618c728787619509565b979650505050505050565b60408051808201909152600080825260208201526000618caf8560000151866020015186600001518760200151618b5d565b602080870180519186019190915251909150618ccb908261a498565b835284516020860151618cde9190619509565b8103618ced5760008552618d1f565b83518351618cfb9190619509565b85518690618d0a90839061a498565b9052508351618d199082619509565b60208601525b50909392505050565b60208110618d605781518352618d3f602084619509565b9250618d4c602083619509565b9150618d5960208261a498565b9050618d28565b6000198115618d8f576001618d7683602061a498565b618d829061010061a890565b618d8c919061a498565b90505b9151835183169219169190911790915250565b60606000618db0848461528e565b8051602080830151604051939450618dca9390910161a8b3565b60405160208183030381529060405291505092915050565b8151815160009190811115618df5575081515b6020808501519084015160005b83811015618eae5782518251808214618e7e576000196020871015618e5d57600184618e2f89602061a498565b618e399190619509565b618e4490600861a792565b618e4f90600261a890565b618e59919061a498565b1990505b8181168382168181039114618e7b579750614dc59650505050505050565b50505b618e89602086619509565b9450618e96602085619509565b93505050602081618ea79190619509565b9050618e02565b508451865161593c919061a90b565b6112a68061a92c83390190565b6119ca8061bbd283390190565b6117838061d59c83390190565b610de08061ed1f83390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001618f34618f39565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001618f346040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b81811015618feb5783516001600160a01b0316835260209384019390920191600101618fc4565b509095945050505050565b60005b83811015619011578181015183820152602001618ff9565b50506000910152565b60008151808452619032816020860160208601618ff6565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b81811015619128577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a850301835261911284865161901a565b60209586019590945092909201916001016190d8565b50919750505060209485019492909201915060010161906e565b50929695505050505050565b600081518084526020840193506020830160005b828110156191a25781517fffffffff0000000000000000000000000000000000000000000000000000000016865260209586019590910190600101619162565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160408752619218604088018261901a565b9050602082015191508681036020880152619233818361914e565b9650505060209384019391909101906001016191d4565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184526192ac85835161901a565b94506020938401939190910190600101619272565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015619142577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b0381511686526020810151905060406020870152619342604087018261914e565b95505060209384019391909101906001016192e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c9082168061939b57607f821691505b602082108103617087577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115610b0657806000526020600020601f840160051c810160208510156193fb5750805b601f840160051c820191505b818110156121d35760008155600101619407565b815167ffffffffffffffff81111561943557619435619358565b619449816194438454619387565b846193d4565b6020601f82116001811461947d57600083156194655750848201515b600019600385901b1c1916600184901b1784556121d3565b600084815260208120601f198516915b828110156194ad578785015182556020948501946001909201910161948d565b50848210156194cb5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115614dc557614dc56194da565b600081546001600160a01b038116845267ffffffffffffffff8160a01c1660208501525060018201606060408501526000815461955881619387565b806060880152600182166000811461957757600181146195b1576195e5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083166080890152608082151560051b89010193506195e5565b84600052602060002060005b838110156195dc5781548a8201608001526001909101906020016195bd565b89016080019450505b50919695505050505050565b6001600160a01b038516815283602082015260a06040820152600061961960a083018561901a565b600060608401528281036080840152618c72818561951c565b60006020828403121561964457600080fd5b5051919050565b6001600160a01b038416815282602082015260606040820152600061706d606083018461901a565b8281526040602082015260006167bb604083018461901a565b6001600160a01b03851681528360208201526080604082015260006196b4608083018561901a565b905082606083015295945050505050565b602081526000614ebe602083018461901a565b6001600160a01b038616815284602082015260a06040820152600061970060a083018661901a565b8460608401528281036080840152619718818561951c565b98975050505050505050565b6001600160a01b038416815282602082015260806040820152600061974c608083018461901a565b905060006060830152949350505050565b600082619793577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6001600160a01b03831681526040602082015260006167bb604083018461951c565b8381526060602082015260006197d3606083018561901a565b828103604084015261593c818561951c565b6001600160a01b03831681526040602082015260006167bb604083018461901a565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161983f81601a850160208801618ff6565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161987c81601c840160208801618ff6565b01601c01949350505050565b60006020828403121561989a57600080fd5b81516001600160a01b0381168114614ebe57600080fd5b6040516060810167ffffffffffffffff811182821017156198d4576198d4619358565b60405290565b60008067ffffffffffffffff8411156198f5576198f5619358565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561992457619924619358565b60405283815290508082840185101561993c57600080fd5b616b8a846020830185618ff6565b600082601f83011261995b57600080fd5b614ebe838351602085016198da565b60006020828403121561997c57600080fd5b815167ffffffffffffffff81111561999357600080fd5b614dc18482850161994a565b600083516199b1818460208801618ff6565b8351908301906199c5818360208801618ff6565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351619a0681601a850160208801618ff6565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351619a43816033840160208801618ff6565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000614ebe608083018461901a565b600060208284031215619ad257600080fd5b815167ffffffffffffffff811115619ae957600080fd5b8201601f81018413619afa57600080fd5b614dc1848251602084016198da565b60008551619b1b818460208a01618ff6565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551619b55816001840160208a01618ff6565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451619b93816002840160208901618ff6565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351619bd5816002840160208801618ff6565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000619c20604083018461901a565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b600060208284031215619c7157600080fd5b81518015158114614ebe57600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251619cb981601f850160208701618ff6565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000619d26604083018461901a565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000619d78604083018461901a565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251619def816014850160208701618ff6565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b604081526000619e36604083018561901a565b8281036020840152614eba818561901a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251619eaf816001850160208701618ff6565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251619ef5818460208701618ff6565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251619fa881604b850160208701618ff6565b91909101604b0192915050565b600060ff821660ff8103619fcb57619fcb6194da565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c6940000000000000000000000000000000000000000000000060208201526000825161a032816029850160208701618ff6565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000614ebe608083018461901a565b60006020828403121561a09857600080fd5b815167ffffffffffffffff81111561a0af57600080fd5b82016060818503121561a0c157600080fd5b61a0c96198b1565b81518060030b811461a0da57600080fd5b8152602082015167ffffffffffffffff81111561a0f657600080fd5b61a1028682850161994a565b602083015250604082015167ffffffffffffffff81111561a12257600080fd5b61a12e8682850161994a565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161a19a816021850160208701618ff6565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161a386816021850160208801618ff6565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161a3c381602e840160208801618ff6565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a20000000000000000000000000000000000000000000000060208201526000825161a032816029850160208701618ff6565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161a48b816022850160208701618ff6565b9190910160220192915050565b81810381811115614dc557614dc56194da565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161a4e381600e850160208701618ff6565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161a5c1816018850160208801618ff6565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161a5fe81601c840160208801618ff6565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161a704818460208701618ff6565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161a76b81601c850160208701618ff6565b91909101601c0192915050565b6000600019820361a78b5761a78b6194da565b5060010190565b8082028115828204841417614dc557614dc56194da565b6001815b600184111561a7e45780850481111561a7c85761a7c86194da565b600184161561a7d657908102905b60019390931c92800261a7ad565b935093915050565b60008261a7fb57506001614dc5565b8161a80857506000614dc5565b816001811461a81e576002811461a8285761a844565b6001915050614dc5565b60ff84111561a8395761a8396194da565b50506001821b614dc5565b5060208310610133831016604e8410600b841016171561a867575081810a614dc5565b61a874600019848461a7a9565b806000190482111561a8885761a8886194da565b029392505050565b6000614ebe838361a7ec565b60008161a8ab5761a8ab6194da565b506000190190565b6000835161a8c5818460208801618ff6565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a8ff816001840160208801618ff6565b01600101949350505050565b8181036000831280158383131683831282161715618182576181826194da56fe608060405234801561001057600080fd5b506040516112a63803806112a683398101604081905261002f91610110565b604051806040016040528060048152602001635a65746160e01b815250604051806040016040528060048152602001635a45544160e01b815250816003908161007891906101e2565b50600461008582826101e2565b5050506001600160a01b03821615806100a557506001600160a01b038116155b156100c35760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b039384166001600160a01b031991821617909155600780549290931691161790556102a0565b80516001600160a01b038116811461010b57600080fd5b919050565b6000806040838503121561012357600080fd5b61012c836100f4565b915061013a602084016100f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061016d57607f821691505b60208210810361018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101dd57806000526020600020601f840160051c810160208510156101ba5750805b601f840160051c820191505b818110156101da57600081556001016101c6565b50505b505050565b81516001600160401b038111156101fb576101fb610143565b61020f816102098454610159565b84610193565b6020601f821160018114610243576000831561022b5750848201515b600019600385901b1c1916600184901b1784556101da565b600084815260208120601f198516915b828110156102735787850151825560209485019460019092019101610253565b50848210156102915786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610ff7806102af6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806342966c68116100b257806379cc679011610081578063a9059cbb11610066578063a9059cbb1461028e578063bff9662a146102a1578063dd62ed3e146102c157600080fd5b806379cc67901461027357806395d89b411461028657600080fd5b806342966c68146102025780635b1125911461021557806370a0823114610235578063779e3b631461026b57600080fd5b80631e458bee116100ee5780631e458bee1461018857806323b872dd1461019b578063313ce567146101ae578063328a01d0146101bd57600080fd5b806306fdde0314610120578063095ea7b31461013e57806315d57fd41461016157806318160ddd14610176575b600080fd5b610128610307565b6040516101359190610d97565b60405180910390f35b61015161014c366004610e2c565b610399565b6040519015158152602001610135565b61017461016f366004610e56565b6103b3565b005b6002545b604051908152602001610135565b610174610196366004610e89565b61057e565b6101516101a9366004610ebc565b610631565b60405160128152602001610135565b6007546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610174610210366004610ef9565b610655565b6006546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a610243366004610f12565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610174610662565b610174610281366004610e2c565b610786565b610128610837565b61015161029c366004610e2c565b610846565b6005546101dd9073ffffffffffffffffffffffffffffffffffffffff1681565b61017a6102cf366004610e56565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461031690610f34565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610f34565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b5050505050905090565b6000336103a7818585610854565b60019150505b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1633148015906103f3575060065473ffffffffffffffffffffffffffffffffffffffff163314155b15610431576040517fcdfcef970000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82161580610468575073ffffffffffffffffffffffffffffffffffffffff8116155b1561049f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560058054918516919092161790556040805133815260208101929092527fe79965b5c67dcfb2cf5fe152715e4a7256cee62a3d5dd8484fd8a8539eb8beff910160405180910390a16040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201527f1b9352454524a57a51f24f67dc66d898f616922cd1f7a12d73570ece12b1975c910160405180910390a15050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146105d1576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6105db8383610866565b808373ffffffffffffffffffffffffffffffffffffffff167fc263b302aec62d29105026245f19e16f8e0137066ccd4a8bd941f716bd4096bb8460405161062491815260200190565b60405180910390a3505050565b60003361063f8582856108c6565b61064a858585610995565b506001949350505050565b61065f3382610a40565b50565b60075473ffffffffffffffffffffffffffffffffffffffff1633146106b5576040517fe700765e000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b60065473ffffffffffffffffffffffffffffffffffffffff16610704576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040805133815260208101929092527f5104c9abdc7d111c2aeb4ce890ac70274a4be2ee83f46a62551be5e6ebc82dd0910160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f3fe32fba000000000000000000000000000000000000000000000000000000008152336004820152602401610428565b6107e38282610a9c565b8173ffffffffffffffffffffffffffffffffffffffff167f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b18260405161082b91815260200190565b60405180910390a25050565b60606004805461031690610f34565b6000336103a7818585610995565b6108618383836001610ab1565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166108b6576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c260008383610bf9565b5050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f5781811015610980576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610428565b61098f84848484036000610ab1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166109e5576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8216610a35576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b610861838383610bf9565b73ffffffffffffffffffffffffffffffffffffffff8216610a90576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b6108c282600083610bf9565b610aa78233836108c6565b6108c28282610a40565b73ffffffffffffffffffffffffffffffffffffffff8416610b01576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8316610b51576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610428565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561098f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610beb91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c31578060026000828254610c269190610f87565b90915550610ce39050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cb7576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610428565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610d0c57600280548290039055610d38565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161062491815260200190565b602081526000825180602084015260005b81811015610dc55760208186018101516040868401015201610da8565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e2757600080fd5b919050565b60008060408385031215610e3f57600080fd5b610e4883610e03565b946020939093013593505050565b60008060408385031215610e6957600080fd5b610e7283610e03565b9150610e8060208401610e03565b90509250929050565b600080600060608486031215610e9e57600080fd5b610ea784610e03565b95602085013595506040909401359392505050565b600080600060608486031215610ed157600080fd5b610eda84610e03565b9250610ee860208501610e03565b929592945050506040919091013590565b600060208284031215610f0b57600080fd5b5035919050565b600060208284031215610f2457600080fd5b610f2d82610e03565b9392505050565b600181811c90821680610f4857607f821691505b602082108103610f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156103ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220085f01204b33dc17013c78c74fbca32a3da2c0b384ce7c8878c889551af28c6164736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a00336080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033a2646970667358221220b03db17869b243e0c671139e6e8ca053d1299867d59c1732275ab3c22ad431bc64736f6c634300081a0033", } // ZetaConnectorNonNativeTestABI is the input ABI used to generate the binding from. diff --git a/v2/pkg/zrc20.t.sol/zrc20test.go b/v2/pkg/zrc20.t.sol/zrc20test.go index 3a3841ea..67c0d30d 100644 --- a/v2/pkg/zrc20.t.sol/zrc20test.go +++ b/v2/pkg/zrc20.t.sol/zrc20test.go @@ -50,7 +50,7 @@ type StdInvariantFuzzSelector struct { // ZRC20TestMetaData contains all meta data concerning the ZRC20Test contract. var ZRC20TestMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"IS_TEST\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"excludeSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"excludedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setUp\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"targetArtifactSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifactSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzArtifactSelector[]\",\"components\":[{\"name\":\"artifact\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetArtifacts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedArtifacts_\",\"type\":\"string[]\",\"internalType\":\"string[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetContracts\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedContracts_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetInterfaces\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedInterfaces_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzInterface[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"artifacts\",\"type\":\"string[]\",\"internalType\":\"string[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSelectors\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSelectors_\",\"type\":\"tuple[]\",\"internalType\":\"structStdInvariant.FuzzSelector[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selectors\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"targetSenders\",\"inputs\":[],\"outputs\":[{\"name\":\"targetedSenders_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"testApproveFailsIfRecipientIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testBurn\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testBurnFailsIfNoBalance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDeposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfRecipientIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testDepositFailsIfSenderIsNotGateway\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransfer\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFailsIfNoBalance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFailsIfRecipientIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFrom\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFromFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFromFailsIfNoBalance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFromFailsIfRecipientIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testTransferFromFailsIfSenderIsZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateGasLimit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateGasLimitFailsIfSenderIsNotFungible\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateGatewayAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateGatewayAddressFailsIfSenderIsNotFungible\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateGatewayAddressFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateProtocolFlatFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateProtocolFlatFeeFailsIfSenderIsNotFungible\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateSystemContractAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateSystemContractAddressFailsIfSenderIsNotFungible\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testUpdateSystemContractAddressFailsIfZeroAddress\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdraw\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawFailsIfNoAllowance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawFailsIfNoBalance\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawGasFee\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawGasFeeFailsIfGasCoinNotSetForChainId\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testWithdrawGasFeeFailsIfGasPriceNotSetForChainId\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"testZRC20BasicInfo\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"log\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_address\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_array\",\"inputs\":[{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_bytes32\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_int\",\"inputs\":[{\"name\":\"\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_address\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256[]\",\"indexed\":false,\"internalType\":\"int256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_array\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_bytes32\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_decimal_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"decimals\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_int\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_string\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_named_uint\",\"inputs\":[{\"name\":\"key\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"val\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_string\",\"inputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"log_uint\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"logs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CallerIsNotFungibleModule\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasFeeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSender\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LowAllowance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LowBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroGasCoin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroGasPrice\",\"inputs\":[]}]", - Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061e1b28061003c6000396000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80638ce7ef0511610191578063d27b0427116100e3578063dfbdf60011610097578063f1f87f4011610071578063f1f87f401461049d578063f2413096146104a5578063fa7626d4146104ad57600080fd5b8063dfbdf60014610485578063e13aba481461048d578063e20c9f711461049557600080fd5b8063d591221f116100c8578063d591221f1461046d578063d97136a214610475578063dcba486a1461047d57600080fd5b8063d27b04271461045d578063d509b16c1461046557600080fd5b8063b549984c11610145578063ba414fa61161011f578063ba414fa614610435578063d04cda981461044d578063d1fd32911461045557600080fd5b8063b549984c1461041d578063b5508aa914610425578063b79cad091461042d57600080fd5b8063a4aa6c7c11610176578063a4aa6c7c14610405578063ae9687dc1461040d578063b0464fdc1461041557600080fd5b80638ce7ef05146103e8578063916a17c6146103f057600080fd5b80634b6295091161024a57806366d9a9a0116101fe5780637f924c4e116101d85780637f924c4e146103c357806380326680146103cb57806385226c81146103d357600080fd5b806366d9a9a01461039e5780636ff45850146103b357806370557298146103bb57600080fd5b8063513999621161022f578063513999621461038657806358fdbbe01461038e5780635f01db7e1461039657600080fd5b80634b629509146103765780634cfc0aaa1461037e57600080fd5b806328438826116102ac5780633be9ec80116102865780633be9ec801461035e5780633e5e3c23146103665780633f7286f41461036e57600080fd5b806328438826146103395780632ade3880146103415780632f6254fc1461035657600080fd5b80630a9254e4116102dd5780630a9254e41461030b5780631142744e146103135780631ed7831c1461031b57600080fd5b80630393998b146102f95780630809dfef14610303575b600080fd5b6103016104ba565b005b6103016105bc565b61030161074a565b610301610e2c565b610323610f10565b6040516103309190619053565b60405180910390f35b610301610f72565b6103496111bd565b60405161033091906190ef565b6103016112ff565b610301611470565b61032361165d565b6103236116bd565b61030161171d565b6103016117f0565b6103016118c9565b610301611c46565b610301611d19565b6103a6611e86565b6040516103309190619255565b610301612008565b610301612218565b610301612468565b61030161268c565b6103db612760565b60405161033091906192f3565b610301612830565b6103f8612a30565b604051610330919061936a565b610301612b2b565b610301612ce0565b6103f8612f6d565b610301613068565b6103db61313a565b61030161320a565b61043d61359c565b6040519015158152602001610330565b610301613670565b6103016137b4565b6103016138f7565b610301613a3a565b6103016140ce565b6103016141b2565b610301614338565b6103016145bb565b6103016146fe565b6103236149a8565b610301614a08565b610301614b4e565b601f5461043d9060ff1681565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561052657600080fd5b505af115801561053a573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063eddeb12391506024015b600060405180830381600087803b1580156105a257600080fd5b505af11580156105b6573d6000803e3d6000fd5b50505050565b60225460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561061557600080fd5b505af1158015610629573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561069957600080fd5b505af11580156106ad573d6000803e3d6000fd5b5050601f546040517f47e7ef2400000000000000000000000000000000000000000000000000000000815260006004820152620186a060248201526101009091046001600160a01b031692506347e7ef2491506044015b6020604051808303816000875af1158015610723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107479190619401565b50565b602480547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556025805490911661123417905560405161079090618f73565b604051809103906000f0801580156107ac573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600f81527f476174657761795a45564d2e736f6c000000000000000000000000000000000060208201526024805492519081019390935292166044820152610890919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc95500000000000000000000000000000000000000000000000000000000179052614daa565b602280546001600160a01b03929092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155602180549092168117909155604080517f3ce4a5bc0000000000000000000000000000000000000000000000000000000081529051633ce4a5bc916004808201926020929091908290030181865afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d919061943f565b602680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691821790556040517f06447d560000000000000000000000000000000000000000000000000000000081526004810191909152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156109eb57600080fd5b505af11580156109ff573d6000803e3d6000fd5b505050506000806000604051610a1490618f80565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610a50573d6000803e3d6000fd5b50602080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602154604051601293600193849360009391921690610aa690618f8d565b610ab59695949392919061945a565b604051809103906000f080158015610ad1573d6000803e3d6000fd5b50601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03938416810291909117918290556020546040517fee2815ba00000000000000000000000000000000000000000000000000000000815260016004820152919092048316602482015291169063ee2815ba90604401600060405180830381600087803b158015610b7157600080fd5b505af1158015610b85573d6000803e3d6000fd5b50506020546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b50506026546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50506022546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610d1757600080fd5b505af1158015610d2b573d6000803e3d6000fd5b5050601f54602480546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09281019290925261010090920490911692506347e7ef2491506044016020604051808303816000875af1158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190619401565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105a257600080fd5b604051630618f58760e51b81527fddb5de5e000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b5050601f54602480546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09281019290925261010090920490911692506347e7ef249150604401610704565b60606016805480602002602001604051908101604052809291908181526020018280548015610f6857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f4a575b5050505050905090565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb919061954f565b9050610ff8600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190619401565b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b5050601f546025546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b039182166024820152604481018690526101009092041692506323b872dd91506064015b6020604051808303816000875af1158015611194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b89190619401565b505050565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156112f657600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156112df57838290600052602060002001805461125290619568565b80601f016020809104026020016040519081016040528092919081815260200182805461127e90619568565b80156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b505050505081526020019060010190611233565b5050505081525050815260200190600101906111e1565b50505050905090565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b5050601f546040517fc835d7cc00000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063c835d7cc9150602401600060405180830381600087803b1580156113d457600080fd5b505af11580156113e8573d6000803e3d6000fd5b5050505061146e601f60019054906101000a90046001600160a01b03166001600160a01b031663f2441b326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611466919061943f565b613211614e51565b565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b50506020546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820152600060248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b15801561154757600080fd5b505af115801561155b573d6000803e3d6000fd5b5050604051630618f58760e51b81527fe661aed0000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b1580156115cc57600080fd5b505af11580156115e0573d6000803e3d6000fd5b50505050600080601f60019054906101000a90046001600160a01b03166001600160a01b031663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b691906195b5565b60606018805480602002602001604051908101604052809291908181526020018280548015610f68576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610f4a575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610f68576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610f4a575050505050905090565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561178957600080fd5b505af115801561179d573d6000803e3d6000fd5b5050601f546040517fccc7759900000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063ccc775999150602401610588565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561185c57600080fd5b505af1158015611870573d6000803e3d6000fd5b5050601f546040517f095ea7b300000000000000000000000000000000000000000000000000000000815260006004820152600a60248201526101009091046001600160a01b0316925063095ea7b39150604401610704565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152600a908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561192757600080fd5b505af115801561193b573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600481018690526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611a1357600080fd5b505af1158015611a27573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600481018590526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b158015611a8e57600080fd5b505af1158015611aa2573d6000803e3d6000fd5b5050601f546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03166004820181905260006024830152925063095ea7b391506044016020604051808303816000875af1158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b399190619401565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b5050601f546025546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301528051601481840301815260348301918290527fc7012626000000000000000000000000000000000000000000000000000000009091526001600160a01b0361010090930492909216935063c7012626925061117591906001906038016195e1565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015611cb257600080fd5b505af1158015611cc6573d6000803e3d6000fd5b5050601f546040517fc835d7cc00000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063c835d7cc9150602401610588565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b158015611ded57600080fd5b505af1158015611e01573d6000803e3d6000fd5b5050505061146e600a601f60019054906101000a90046001600160a01b03166001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e81919061954f565b614dc9565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156112f65783829060005260206000209060020201604051806040016040529081600082018054611edd90619568565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0990619568565b8015611f565780601f10611f2b57610100808354040283529160200191611f56565b820191906000526020600020905b815481529060010190602001808311611f3957829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ff057602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611f9d5790505b50505050508152505081526020019060010190611eaa565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612081919061954f565b905061208e600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190619401565b50604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561219757600080fd5b505af11580156121ab573d6000803e3d6000fd5b5050601f54602480546025546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216928101929092526044820186905261010090920490911692506323b872dd9150606401611175565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa15801561226d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612291919061954f565b905061229e600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015261c35092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190619401565b50601f54602480546025546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169281019290925260448201849052610100909204909116906323b872dd906064015b6020604051808303816000875af11580156123be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e29190619401565b50601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015612438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245c919061954f565b90506111b88282614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e1919061954f565b90506124f0620186a082614dc9565b60225460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561254957600080fd5b505af115801561255d573d6000803e3d6000fd5b5050601f54602480546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09281019290925261010090920490911692506347e7ef2491506044016020604051808303816000875af11580156125db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ff9190619401565b506000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612655573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612679919061954f565b905061268862030d4082614dc9565b5050565b604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156126f857600080fd5b505af115801561270c573d6000803e3d6000fd5b5050601f546040517f42966c68000000000000000000000000000000000000000000000000000000008152620249f060048201526101009091046001600160a01b031692506342966c689150602401610704565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156112f65783829060005260206000200180546127a390619568565b80601f01602080910402602001604051908101604052809291908181526020018280546127cf90619568565b801561281c5780601f106127f15761010080835404028352916020019161281c565b820191906000526020600020905b8154815290600101906020018083116127ff57829003601f168201915b505050505081526020019060010190612784565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a9919061954f565b90506128b6600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af115801561292e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129529190619401565b50604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156129bf57600080fd5b505af11580156129d3573d6000803e3d6000fd5b5050601f546025546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810186905261010090920416925063a9059cbb9150604401611175565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156112f65760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015612b1357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411612ac05790505b50505050508152505081526020019060010190612a54565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015612ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc79190619401565b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015612c3457600080fd5b505af1158015612c48573d6000803e3d6000fd5b5050601f546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815260006004820152602481018590526101009091046001600160a01b0316925063a9059cbb91506044015b6020604051808303816000875af1158015612cbc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126889190619401565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015612d35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d5d91908101906196cb565b9050612d9e6040518060400160405280600581526020017f544f4b454e00000000000000000000000000000000000000000000000000000081525082614eb2565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015612df3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e1b91908101906196cb565b9050612e5c6040518060400160405280600381526020017f544b4e000000000000000000000000000000000000000000000000000000000081525082614eb2565b6000601f60019054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed59190619714565b9050612ee560128260ff16614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5e919061954f565b90506105b6620186a082614dc9565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156112f65760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561305057602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411612ffd5790505b50505050508152505081526020019060010190612f91565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063f687d12a9150602401610588565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156112f657838290600052602060002001805461317d90619568565b80601f01602080910402602001604051908101604052809291908181526020018280546131a990619568565b80156131f65780601f106131cb576101008083540402835291602001916131f6565b820191906000526020600020905b8154815290600101906020018083116131d957829003601f168201915b50505050508152602001906001019061315e565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152600a906305f5e10090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561326c57600080fd5b505af1158015613280573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600481018690526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b1580156132e757600080fd5b505af11580156132fb573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561335857600080fd5b505af115801561336c573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600481018590526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050601f546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b031660048201819052630bebc2006024830152925063095ea7b391506044016020604051808303816000875af115801561345d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134819190619401565b50604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156134ee57600080fd5b505af1158015613502573d6000803e3d6000fd5b5050601f546025546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301528051601481840301815260348301918290527fc7012626000000000000000000000000000000000000000000000000000000009091526001600160a01b0361010090930492909216935063c7012626925061117591906064906038016195e1565b60085460009060ff16156135b4575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015613645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613669919061954f565b1415905090565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156136c957600080fd5b505af11580156136dd573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b15801561374457600080fd5b505af1158015613758573d6000803e3d6000fd5b5050505061146e600a601f60019054906101000a90046001600160a01b03166001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5d573d6000803e3d6000fd5b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561380d57600080fd5b505af1158015613821573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561389157600080fd5b505af11580156138a5573d6000803e3d6000fd5b5050601f546040517fccc77599000000000000000000000000000000000000000000000000000000008152600060048201526101009091046001600160a01b0316925063ccc775999150602401610588565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561395057600080fd5b505af1158015613964573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156139d457600080fd5b505af11580156139e8573d6000803e3d6000fd5b5050601f546040517fc835d7cc000000000000000000000000000000000000000000000000000000008152600060048201526101009091046001600160a01b0316925063c835d7cc9150602401610588565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152600a908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613a9857600080fd5b505af1158015613aac573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600481018690526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b158015613b1357600080fd5b505af1158015613b27573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015613b8457600080fd5b505af1158015613b98573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600481018590526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b158015613bff57600080fd5b505af1158015613c13573d6000803e3d6000fd5b5050601f54602480546040516370a0823160e01b81526001600160a01b039182166004820152600095506101009093041692506370a082319101602060405180830381865afa158015613c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8e919061954f565b9050613c9d620186a082614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d16919061954f565b9050613d25620186a082614dc9565b601f546026546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015613d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9e919061954f565b601f546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03166004820181905261c350602483015291925063095ea7b3906044016020604051808303816000875af1158015613e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e349190619401565b50601f546025546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301528051601481840301815260348301918290527fc7012626000000000000000000000000000000000000000000000000000000009091526001600160a01b03610100909304929092169163c701262691613ecc919061c350906038016195e1565b6020604051808303816000875af1158015613eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0f9190619401565b50601f546026546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015613f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f89919061954f565b9050613fa985613f998885619766565b613fa39190619766565b82614dc9565b601f54602480546040516370a0823160e01b81526001600160a01b0391821660048201526000936101009004909116916370a082319101602060405180830381865afa158015613ffd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614021919061954f565b905061403d866140338961c350619779565b613fa39190619779565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b6919061954f565b90506140c461c35082614dc9565b5050505050505050565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015614123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614147919061954f565b9050614154600082614dc9565b601f546025546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015261c350602482018190529261010090049091169063a9059cbb9060440161239f565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af115801561422a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424e9190619401565b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156142bb57600080fd5b505af11580156142cf573d6000803e3d6000fd5b5050601f54602480546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000928101929092526044820186905261010090920490911692506323b872dd9150606401612c9d565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561439157600080fd5b505af11580156143a5573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a6004820181905293508392506101009091046001600160a01b03169063f687d12a90602401600060405180830381600087803b15801561441157600080fd5b505af1158015614425573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561448257600080fd5b505af1158015614496573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b1580156144fd57600080fd5b505af1158015614511573d6000803e3d6000fd5b50505050600080601f60019054906101000a90046001600160a01b03166001600160a01b031663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa15801561456a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061458e91906195b5565b601f5491935091506145ae9061010090046001600160a01b031683614e51565b6105b6613fa38486619766565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561461457600080fd5b505af1158015614628573d6000803e3d6000fd5b5050601f546040517fccc7759900000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063ccc775999150602401600060405180830381600087803b15801561469057600080fd5b505af11580156146a4573d6000803e3d6000fd5b5050505061146e601f60019054906101000a90046001600160a01b03166001600160a01b0316638b851b956040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b601f54602480546040516370a0823160e01b81526001600160a01b0391821660048201526000936101009004909116916370a082319101602060405180830381865afa158015614752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614776919061954f565b9050614785620186a082614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147fe919061954f565b905061480d620186a082614dc9565b601f546040517f42966c6800000000000000000000000000000000000000000000000000000000815261c35060048201526101009091046001600160a01b0316906342966c68906024016020604051808303816000875af1158015614876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061489a9190619401565b50601f54602480546040516370a0823160e01b81526001600160a01b0391821660048201526000936101009004909116916370a082319101602060405180830381865afa1580156148ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614913919061954f565b905061492161c35082614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061499a919061954f565b90506105b661c35082614dc9565b60606015805480602002602001604051908101604052809291908181526020018280548015610f68576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610f4a575050505050905090565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614a6157600080fd5b505af1158015614a75573d6000803e3d6000fd5b50506020546040517fee2815ba00000000000000000000000000000000000000000000000000000000815260016004820152600060248201526001600160a01b03909116925063ee2815ba9150604401600060405180830381600087803b158015614adf57600080fd5b505af1158015614af3573d6000803e3d6000fd5b5050604051630618f58760e51b81527f78fff396000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024016115b2565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015614ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc7919061954f565b9050614bd4600082614dc9565b601f54602480546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201819052928101929092526000926101009004169063dd62ed3e90604401602060405180830381865afa158015614c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6e919061954f565b9050614c7b600082614dc9565b604051630618f58760e51b81527f10bad14700000000000000000000000000000000000000000000000000000000600482015261c35090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015614ceb57600080fd5b505af1158015614cff573d6000803e3d6000fd5b5050601f54602480546025546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216928101929092526044820186905261010090920490911692506323b872dd91506064016020604051808303816000875af1158015614d86573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b69190619401565b6000614db4618f9a565b614dbf848483614f04565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c54906044015b60006040518083038186803b158015614e3557600080fd5b505afa158015614e49573d6000803e3d6000fd5b505050505050565b6040517f515361f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015282166024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063515361f690604401614e1d565b6040517ff320d963000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f320d96390614e1d908590859060040161978c565b600080614f118584614f7f565b9050614f746040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614f5f9291906197b1565b60405160208183030381529060405285614f8b565b9150505b9392505050565b6000614f788383614fb9565b60c08101515160009015614faf57614fa884848460c00151614fd4565b9050614f78565b614fa8848461517a565b6000614fc58383615265565b614f7883836020015184614f8b565b600080614fdf615271565b90506000614fed8683615344565b9050600061500482606001518360200151856157ea565b90506000615014838389896159fc565b9050600061502182616879565b602081015181519192509060030b156150945789826040015160405160200161504b9291906197d3565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261508b91600401619854565b60405180910390fd5b60006150d76040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001616a48565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d9061512a908490600401619854565b602060405180830381865afa158015615147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061516b919061943f565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906151cf908790600401619854565b600060405180830381865afa1580156151ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526152149190810190619887565b90506000615242828560405160200161522e9291906198bc565b604051602081830303815290604052616c48565b90506001600160a01b038116614dbf57848460405160200161504b9291906198eb565b61268882826000616c5b565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906152f8908490600401619996565b600060405180830381865afa158015615315573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261533d91908101906196cb565b9250505090565b6153766040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506153c16040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6153ca85616d5e565b602082015260006153da86617143565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa15801561541c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261544491908101906196cb565b8683856020015160405160200161545e94939291906199dd565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906154b6908590600401619854565b600060405180830381865afa1580156154d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154fb91908101906196cb565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690615543908490600401619ae1565b602060405180830381865afa158015615560573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155849190619401565b615599578160405160200161504b9190619b33565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906155de908490600401619bc5565b600060405180830381865afa1580156155fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261562391908101906196cb565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061566a908490600401619c17565b602060405180830381865afa158015615687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156ab9190619401565b15615740576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906156f5908490600401619c17565b600060405180830381865afa158015615712573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261573a91908101906196cb565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016157659190619c69565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161579192919061978c565b600060405180830381865afa1580156157ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157d691908101906196cb565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816158065790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061586657615866619cd5565b60200260200101819052506040518060400160405280600381526020017f2d726c0000000000000000000000000000000000000000000000000000000000815250816001815181106158ba576158ba619cd5565b6020026020010181905250846040516020016158d69190619d04565b604051602081830303815290604052816002815181106158f8576158f8619cd5565b6020026020010181905250826040516020016159149190619d70565b6040516020818303038152906040528160038151811061593657615936619cd5565b6020026020010181905250600061594c82616879565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506159dd90604080518082018252600080825260209182015281518083019092528451825280850190820152906173c6565b6159f2578560405160200161504b9190619db1565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615a4c565b511590565b615bc057826020015115615b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a40161508b565b8260c0015115615bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a40161508b565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081615bd957905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280615c3490619e42565b935060ff1681518110615c4957615c49619cd5565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001615c9a9190619e61565b604051602081830303815290604052828280615cb590619e42565b935060ff1681518110615cca57615cca619cd5565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280615d1790619e42565b935060ff1681518110615d2c57615d2c619cd5565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280615d7990619e42565b935060ff1681518110615d8e57615d8e619cd5565b60200260200101819052508760200151828280615daa90619e42565b935060ff1681518110615dbf57615dbf619cd5565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615e0c90619e42565b935060ff1681518110615e2157615e21619cd5565b602090810291909101015287518282615e3981619e42565b935060ff1681518110615e4e57615e4e619cd5565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615e9b90619e42565b935060ff1681518110615eb057615eb0619cd5565b6020026020010181905250615ec446617427565b8282615ecf81619e42565b935060ff1681518110615ee457615ee4619cd5565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615f3190619e42565b935060ff1681518110615f4657615f46619cd5565b602002602001018190525086828280615f5e90619e42565b935060ff1681518110615f7357615f73619cd5565b602090810291909101015285511561609a5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282615fc481619e42565b935060ff1681518110615fd957615fd9619cd5565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90616029908990600401619854565b600060405180830381865afa158015616046573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261606e91908101906196cb565b828261607981619e42565b935060ff168151811061608e5761608e619cd5565b60200260200101819052505b84602001511561616a5760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826160e381619e42565b935060ff16815181106160f8576160f8619cd5565b60200260200101819052506040518060400160405280600581526020017f66616c736500000000000000000000000000000000000000000000000000000081525082828061614590619e42565b935060ff168151811061615a5761615a619cd5565b6020026020010181905250616331565b6161a2615a478660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6162355760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826161e581619e42565b935060ff16815181106161fa576161fa619cd5565b60200260200101819052508460a0015160405160200161621a9190619d04565b60405160208183030381529060405282828061614590619e42565b8460c0015115801561627857506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261627690511590565b155b156163315760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826162bc81619e42565b935060ff16815181106162d1576162d1619cd5565b60200260200101819052506162e5886174c7565b6040516020016162f59190619d04565b60405160208183030381529060405282828061631090619e42565b935060ff168151811061632557616325619cd5565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261636590511590565b6163fa5760408051808201909152600b81527f2d2d72656c617965724964000000000000000000000000000000000000000000602082015282826163a881619e42565b935060ff16815181106163bd576163bd619cd5565b602002602001018190525084604001518282806163d990619e42565b935060ff16815181106163ee576163ee619cd5565b60200260200101819052505b60608501511561651b5760408051808201909152600681527f2d2d73616c7400000000000000000000000000000000000000000000000000006020820152828261644381619e42565b935060ff168151811061645857616458619cd5565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156164c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526164ef91908101906196cb565b82826164fa81619e42565b935060ff168151811061650f5761650f619cd5565b60200260200101819052505b60e085015151156165c25760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261656581619e42565b935060ff168151811061657a5761657a619cd5565b60200260200101819052506165968560e0015160000151617427565b82826165a181619e42565b935060ff16815181106165b6576165b6619cd5565b60200260200101819052505b60e0850151602001511561666c5760408051808201909152600a81527f2d2d6761735072696365000000000000000000000000000000000000000000006020820152828261660f81619e42565b935060ff168151811061662457616624619cd5565b60200260200101819052506166408560e0015160200151617427565b828261664b81619e42565b935060ff168151811061666057616660619cd5565b60200260200101819052505b60e085015160400151156167165760408051808201909152600e81527f2d2d6d6178466565506572476173000000000000000000000000000000000000602082015282826166b981619e42565b935060ff16815181106166ce576166ce619cd5565b60200260200101819052506166ea8560e0015160400151617427565b82826166f581619e42565b935060ff168151811061670a5761670a619cd5565b60200260200101819052505b60e085015160600151156167c05760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261676381619e42565b935060ff168151811061677857616778619cd5565b60200260200101819052506167948560e0015160600151617427565b828261679f81619e42565b935060ff16815181106167b4576167b4619cd5565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156167de576167de619603565b60405190808252806020026020018201604052801561681157816020015b60608152602001906001900390816167fc5790505b50905060005b8260ff168160ff16101561686a57838160ff168151811061683a5761683a619cd5565b6020026020010151828260ff168151811061685757616857619cd5565b6020908102919091010152600101616817565b5093505050505b949350505050565b6168a06040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161692691869101619ecc565b600060405180830381865afa158015616943573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261696b91908101906196cb565b905060006169798683617fb6565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016169a991906192f3565b6000604051808303816000875af11580156169c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526169f09190810190619f13565b805190915060030b15801590616a095750602081015151155b8015616a185750604081015151155b156159f25781600081518110616a3057616a30619cd5565b602002602001015160405160200161504b9190619fc9565b60606000616a7d8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150616ab49082905b9061810b565b15616c11576000616b3182616b2b84616b25616af78a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90618132565b90618194565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616b9590829061810b565b15616bff57604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616bfc905b8290618219565b90505b616c088161823f565b92505050614f78565b8215616c2a57848460405160200161504b92919061a1b5565b5050604080516020810190915260008152614f78565b509392505050565b6000808251602084016000f09392505050565b8160a0015115616c6a57505050565b6000616c778484846182a8565b90506000616c8482616879565b602081015181519192509060030b158015616d205750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d2090604080518082018252600080825260209182015281518083019092528451825280850190820152616aae565b15616d2d57505050505050565b60408201515115616d4d57816040015160405160200161504b919061a25c565b8060405160200161504b919061a2ba565b60606000616d938360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616df8905b82906173c6565b15616e6757604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7890616e62908390618843565b61823f565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ec9905b82906188cd565b600103616f9657604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f2f90616bf5565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7890616e62905b8390618219565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ff590616df1565b1561712c57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061705d908390618967565b9050600081600183516170709190619779565b8151811061708057617080619cd5565b60200260200101519050617123616e626170f66040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290618843565b95945050505050565b8260405160200161504b919061a325565b50919050565b606060006171788360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506171da90616df1565b156171e857614f788161823f565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261724790616ec2565b6001036172b157604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7890616e6290616f8f565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261731090616df1565b1561712c57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290617378908390618967565b90506001815111156173b45780600282516173939190619779565b815181106173a3576173a3619cd5565b602002602001015192505050919050565b508260405160200161504b919061a325565b8051825160009111156173db57506000614dc3565b815183516020850151600092916173f191619766565b6173fb9190619779565b905082602001518103617412576001915050614dc3565b82516020840151819020912014905092915050565b6060600061743483618a0c565b600101905060008167ffffffffffffffff81111561745457617454619603565b6040519080825280601f01601f19166020018201604052801561747e576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461748857509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091617553905b8290618aee565b1561759357505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175f29061754c565b1561763257505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526176919061754c565b156176d157505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177309061754c565b806177955750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177959061754c565b156177d557505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178349061754c565b806178995750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178999061754c565b156178d957505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179389061754c565b8061799d5750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261799d9061754c565b156179dd57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617a3c9061754c565b80617aa15750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617aa19061754c565b15617ae157505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617b409061754c565b15617b8057505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617bdf9061754c565b15617c1f57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617c7e9061754c565b15617cbe57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d1d9061754c565b15617d5d57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617dbc9061754c565b15617dfc57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617e5b9061754c565b80617ec05750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617ec09061754c565b15617f0057505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617f5f9061754c565b15617f9f57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b6040808401518451915161504b929060200161a403565b60608060005b84518110156180415781858281518110617fd857617fd8619cd5565b6020026020010151604051602001617ff19291906198bc565b6040516020818303038152906040529150600185516180109190619779565b81146180395781604051602001618027919061a56c565b60405160208183030381529060405291505b600101617fbc565b5060408051600380825260808201909252600091816020015b606081526020019060019003908161805a579050509050838160008151811061808557618085619cd5565b60200260200101819052506040518060400160405280600281526020017f2d63000000000000000000000000000000000000000000000000000000000000815250816001815181106180d9576180d9619cd5565b602002602001018190525081816002815181106180f8576180f8619cd5565b6020908102919091010152949350505050565b60208083015183518351928401516000936181299291849190618b02565b14159392505050565b604080518082019091526000808252602082015260006181648460000151856020015185600001518660200151618c13565b90508360200151816181769190619779565b84518590618185908390619779565b90525060208401525090919050565b60408051808201909152600080825260208201528151835110156181b9575081614dc3565b60208083015190840151600191146181e05750815160208481015190840151829020919020145b8015618211578251845185906181f7908390619779565b905250825160208501805161820d908390619766565b9052505b509192915050565b6040805180820190915260008082526020820152618238838383618d33565b5092915050565b60606000826000015167ffffffffffffffff81111561826057618260619603565b6040519080825280601f01601f19166020018201604052801561828a576020820181803683370190505b50905060006020820190506182388185602001518660000151618dde565b606060006182b4615271565b6040805160ff808252612000820190925291925060009190816020015b60608152602001906001900390816182d157905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061832c90619e42565b935060ff168151811061834157618341619cd5565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001618392919061a5ad565b6040516020818303038152906040528282806183ad90619e42565b935060ff16815181106183c2576183c2619cd5565b60200260200101819052506040518060400160405280600881526020017f76616c696461746500000000000000000000000000000000000000000000000081525082828061840f90619e42565b935060ff168151811061842457618424619cd5565b6020026020010181905250826040516020016184409190619d70565b60405160208183030381529060405282828061845b90619e42565b935060ff168151811061847057618470619cd5565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e7472616374000000000000000000000000000000000000000000008152508282806184bd90619e42565b935060ff16815181106184d2576184d2619cd5565b60200260200101819052506184e78784618e58565b82826184f281619e42565b935060ff168151811061850757618507619cd5565b6020908102919091010152855151156185b35760408051808201909152600b81527f2d2d7265666572656e63650000000000000000000000000000000000000000006020820152828261855981619e42565b935060ff168151811061856e5761856e619cd5565b6020026020010181905250618587866000015184618e58565b828261859281619e42565b935060ff16815181106185a7576185a7619cd5565b60200260200101819052505b8560800151156186215760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b0000000000000000602082015282826185fc81619e42565b935060ff168151811061861157618611619cd5565b6020026020010181905250618687565b84156186875760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261866681619e42565b935060ff168151811061867b5761867b619cd5565b60200260200101819052505b604086015151156187235760408051808201909152600d81527f2d2d756e73616665416c6c6f7700000000000000000000000000000000000000602082015282826186d181619e42565b935060ff16815181106186e6576186e6619cd5565b6020026020010181905250856040015182828061870290619e42565b935060ff168151811061871757618717619cd5565b60200260200101819052505b85606001511561878d5760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261876c81619e42565b935060ff168151811061878157618781619cd5565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156187ab576187ab619603565b6040519080825280602002602001820160405280156187de57816020015b60608152602001906001900390816187c95790505b50905060005b8260ff168160ff16101561883757838160ff168151811061880757618807619cd5565b6020026020010151828260ff168151811061882457618824619cd5565b60209081029190910101526001016187e4565b50979650505050505050565b6040805180820190915260008082526020820152815183511015618868575081614dc3565b8151835160208501516000929161887e91619766565b6188889190619779565b602084015190915060019082146188a9575082516020840151819020908220145b80156188c4578351855186906188c0908390619779565b9052505b50929392505050565b60008082600001516188f18560000151866020015186600001518760200151618c13565b6188fb9190619766565b90505b8351602085015161890f9190619766565b8111618238578161891f8161a5f2565b925050826000015161895685602001518361893a9190619779565b86516189469190619779565b8386600001518760200151618c13565b6189609190619766565b90506188fe565b6060600061897584846188cd565b618980906001619766565b67ffffffffffffffff81111561899857618998619603565b6040519080825280602002602001820160405280156189cb57816020015b60608152602001906001900390816189b65790505b50905060005b8151811015616c40576189e7616e628686618219565b8282815181106189f9576189f9619cd5565b60209081029190910101526001016189d1565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310618a55577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310618a81576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310618a9f57662386f26fc10000830492506010015b6305f5e1008310618ab7576305f5e100830492506008015b6127108310618acb57612710830492506004015b60648310618add576064830492506002015b600a8310614dc35760010192915050565b6000618afa8383618e98565b159392505050565b600080858411618c095760208411618bb55760008415618b4d576001618b29866020619779565b618b3490600861a60c565b618b3f90600261a70a565b618b499190619779565b1990505b8351811685618b5c8989619766565b618b669190619779565b805190935082165b818114618ba057878411618b885787945050505050616871565b83618b928161a716565b945050828451169050618b6e565b618baa8785619766565b945050505050616871565b838320618bc28588619779565b618bcc9087619766565b91505b858210618c0757848220808203618bf457618bea8684619766565b9350505050616871565b618bff600184619779565b925050618bcf565b505b5092949350505050565b60008381868511618d1e5760208511618ccd5760008515618c5f576001618c3b876020619779565b618c4690600861a60c565b618c5190600261a70a565b618c5b9190619779565b1990505b84518116600087618c708b8b619766565b618c7a9190619779565b855190915083165b828114618cbf57818610618ca757618c9a8b8b619766565b9650505050505050616871565b85618cb18161a5f2565b965050838651169050618c82565b859650505050505050616871565b508383206000905b618cdf8689619779565b8211618d1c57858320808203618cfb5783945050505050616871565b618d06600185619766565b9350508180618d149061a5f2565b925050618cd5565b505b618d288787619766565b979650505050505050565b60408051808201909152600080825260208201526000618d658560000151866020015186600001518760200151618c13565b602080870180519186019190915251909150618d819082619779565b835284516020860151618d949190619766565b8103618da35760008552618dd5565b83518351618db19190619766565b85518690618dc0908390619779565b9052508351618dcf9082619766565b60208601525b50909392505050565b60208110618e165781518352618df5602084619766565b9250618e02602083619766565b9150618e0f602082619779565b9050618dde565b6000198115618e45576001618e2c836020619779565b618e389061010061a70a565b618e429190619779565b90505b9151835183169219169190911790915250565b60606000618e668484615344565b8051602080830151604051939450618e809390910161a72d565b60405160208183030381529060405291505092915050565b8151815160009190811115618eab575081515b6020808501519084015160005b83811015618f645782518251808214618f34576000196020871015618f1357600184618ee5896020619779565b618eef9190619766565b618efa90600861a60c565b618f0590600261a70a565b618f0f9190619779565b1990505b8181168382168181039114618f31579750614dc39650505050505050565b50505b618f3f602086619766565b9450618f4c602085619766565b93505050602081618f5d9190619766565b9050618eb8565b50845186516159f2919061a785565b610b678061a7a683390190565b61106f8061b30d83390190565b611e018061c37c83390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001618fdd618fe2565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001618fdd6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b818110156190945783516001600160a01b031683526020938401939092019160010161906d565b509095945050505050565b60005b838110156190ba5781810151838201526020016190a2565b50506000910152565b600081518084526190db81602086016020860161909f565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b818110156191d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a85030183526191bb8486516190c3565b6020958601959094509290920191600101619181565b509197505050602094850194929092019150600101619117565b50929695505050505050565b600081518084526020840193506020830160005b8281101561924b5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161920b565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526192c160408801826190c3565b90506020820151915086810360208801526192dc81836191f7565b96505050602093840193919091019060010161927d565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184526193558583516190c3565b9450602093840193919091019060010161931b565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b03815116865260208101519050604060208701526193eb60408701826191f7565b9550506020938401939190910190600101619392565b60006020828403121561941357600080fd5b81518015158114614f7857600080fd5b80516001600160a01b038116811461943a57600080fd5b919050565b60006020828403121561945157600080fd5b614f7882619423565b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff8816604083015286606083015260038610619514577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a083015261953560c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b60006020828403121561956157600080fd5b5051919050565b600181811c9082168061957c57607f821691505b60208210810361713d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080604083850312156195c857600080fd5b6195d183619423565b6020939093015192949293505050565b6040815260006195f460408301856190c3565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561965557619655619603565b60405290565b60008067ffffffffffffffff84111561967657619676619603565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156196a5576196a5619603565b6040528381529050808284018510156196bd57600080fd5b616c4084602083018561909f565b6000602082840312156196dd57600080fd5b815167ffffffffffffffff8111156196f457600080fd5b8201601f8101841361970557600080fd5b614dbf8482516020840161965b565b60006020828403121561972657600080fd5b815160ff81168114614f7857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115614dc357614dc3619737565b81810381811115614dc357614dc3619737565b60408152600061979f60408301856190c3565b8281036020840152614f7481856190c3565b6001600160a01b038316815260406020820152600061687160408301846190c3565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161980b81601a85016020880161909f565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161984881601c84016020880161909f565b01601c01949350505050565b602081526000614f7860208301846190c3565b600082601f83011261987857600080fd5b614f788383516020850161965b565b60006020828403121561989957600080fd5b815167ffffffffffffffff8111156198b057600080fd5b614dbf84828501619867565b600083516198ce81846020880161909f565b8351908301906198e281836020880161909f565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161992381601a85016020880161909f565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161996081603384016020880161909f565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000614f7860808301846190c3565b600085516199ef818460208a0161909f565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551619a29816001840160208a0161909f565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451619a6781600284016020890161909f565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351619aa981600284016020880161909f565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000619af460408301846190c3565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251619b6b81601f85016020870161909f565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000619bd860408301846190c3565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000619c2a60408301846190c3565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251619ca181601485016020870161909f565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251619d3c81600185016020870161909f565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251619d8281846020870161909f565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251619e3581604b85016020870161909f565b91909101604b0192915050565b600060ff821660ff8103619e5857619e58619737565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251619ebf81602985016020870161909f565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000614f7860808301846190c3565b600060208284031215619f2557600080fd5b815167ffffffffffffffff811115619f3c57600080fd5b820160608185031215619f4e57600080fd5b619f56619632565b81518060030b8114619f6757600080fd5b8152602082015167ffffffffffffffff811115619f8357600080fd5b619f8f86828501619867565b602083015250604082015167ffffffffffffffff811115619faf57600080fd5b619fbb86828501619867565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161a02781602185016020870161909f565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161a21381602185016020880161909f565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161a25081602e84016020880161909f565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251619ebf81602985016020870161909f565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161a31881602285016020870161909f565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161a35d81600e85016020870161909f565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161a43b81601885016020880161909f565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161a47881601c84016020880161909f565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161a57e81846020870161909f565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161a5e581601c85016020870161909f565b91909101601c0192915050565b6000600019820361a6055761a605619737565b5060010190565b8082028115828204841417614dc357614dc3619737565b6001815b600184111561a65e5780850481111561a6425761a642619737565b600184161561a65057908102905b60019390931c92800261a627565b935093915050565b60008261a67557506001614dc3565b8161a68257506000614dc3565b816001811461a698576002811461a6a25761a6be565b6001915050614dc3565b60ff84111561a6b35761a6b3619737565b50506001821b614dc3565b5060208310610133831016604e8410600b841016171561a6e1575081810a614dc3565b61a6ee600019848461a623565b806000190482111561a7025761a702619737565b029392505050565b6000614f78838361a666565b60008161a7255761a725619737565b506000190190565b6000835161a73f81846020880161909f565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a77981600184016020880161909f565b01600101949350505050565b81810360008312801583831316838312821617156182385761823861973756fe60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610114565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610114565b506002805460ff1916601217905534801561006f57600080fd5b506101d2565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561010f57806000526020600020601f840160051c810160208510156100ec5750805b601f840160051c820191505b8181101561010c57600081556001016100f8565b50505b505050565b81516001600160401b0381111561012d5761012d610075565b6101418161013b845461008b565b846100c5565b6020601f821160018114610175576000831561015d5750848201515b600019600385901b1c1916600184901b17845561010c565b600084815260208120601f198516915b828110156101a55787850151825560209485019460019092019101610185565b50848210156101c35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610986806101e16000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610745565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046107da565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610804565b6103bd565b34801561017857600080fd5b506100cd610187366004610841565b610647565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d336600461085a565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e9610724565b34801561020657600080fd5b5061011f6102153660046107da565b610731565b6100cd61025a565b34801561022e57600080fd5b5061013e61023d366004610875565b600460209081526000928352604080842090915290825290205481565b33600090815260036020526040812080543492906102799084906108d7565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c2906108ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee906108ea565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561042b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600060248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104a1575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105605773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561051a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091528120805484929061055a90849061093d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061059590849061093d565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548492906105cf9084906108d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161063591815260200190565b60405180910390a35060019392505050565b3360009081526003602052604090205481111561069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b33600090815260036020526040812080548392906106b990849061093d565b9091555050604051339082156108fc029083906000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c2906108ea565b600061073e3384846103bd565b9392505050565b602081526000825180602084015260005b818110156107735760208186018101516040868401015201610756565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107d557600080fd5b919050565b600080604083850312156107ed57600080fd5b6107f6836107b1565b946020939093013593505050565b60008060006060848603121561081957600080fd5b610822846107b1565b9250610830602085016107b1565b929592945050506040919091013590565b60006020828403121561085357600080fd5b5035919050565b60006020828403121561086c57600080fd5b61073e826107b1565b6000806040838503121561088857600080fd5b610891836107b1565b915061089f602084016107b1565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76108a8565b600181811c908216806108fe57607f821691505b602082108103610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76108a856fea264697066735822122008d7fc4e09519c5dd9f356b03596f6829a151d0bc7682533f9ceab4e459f5ee264736f6c634300081a003360c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a26469706673582212208f7208d51f9dfba4bebd9956a78d3995d79e0a6d062d3115ca08627ff716084964736f6c634300081a0033", + Bin: "0x6080604052600c8054600160ff199182168117909255601f80549091169091179055348015602c57600080fd5b5061e1b28061003c6000396000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80638ce7ef0511610191578063d27b0427116100e3578063dfbdf60011610097578063f1f87f4011610071578063f1f87f401461049d578063f2413096146104a5578063fa7626d4146104ad57600080fd5b8063dfbdf60014610485578063e13aba481461048d578063e20c9f711461049557600080fd5b8063d591221f116100c8578063d591221f1461046d578063d97136a214610475578063dcba486a1461047d57600080fd5b8063d27b04271461045d578063d509b16c1461046557600080fd5b8063b549984c11610145578063ba414fa61161011f578063ba414fa614610435578063d04cda981461044d578063d1fd32911461045557600080fd5b8063b549984c1461041d578063b5508aa914610425578063b79cad091461042d57600080fd5b8063a4aa6c7c11610176578063a4aa6c7c14610405578063ae9687dc1461040d578063b0464fdc1461041557600080fd5b80638ce7ef05146103e8578063916a17c6146103f057600080fd5b80634b6295091161024a57806366d9a9a0116101fe5780637f924c4e116101d85780637f924c4e146103c357806380326680146103cb57806385226c81146103d357600080fd5b806366d9a9a01461039e5780636ff45850146103b357806370557298146103bb57600080fd5b8063513999621161022f578063513999621461038657806358fdbbe01461038e5780635f01db7e1461039657600080fd5b80634b629509146103765780634cfc0aaa1461037e57600080fd5b806328438826116102ac5780633be9ec80116102865780633be9ec801461035e5780633e5e3c23146103665780633f7286f41461036e57600080fd5b806328438826146103395780632ade3880146103415780632f6254fc1461035657600080fd5b80630a9254e4116102dd5780630a9254e41461030b5780631142744e146103135780631ed7831c1461031b57600080fd5b80630393998b146102f95780630809dfef14610303575b600080fd5b6103016104ba565b005b6103016105bc565b61030161074a565b610301610e2c565b610323610f10565b6040516103309190619053565b60405180910390f35b610301610f72565b6103496111bd565b60405161033091906190ef565b6103016112ff565b610301611470565b61032361165d565b6103236116bd565b61030161171d565b6103016117f0565b6103016118c9565b610301611c46565b610301611d19565b6103a6611e86565b6040516103309190619255565b610301612008565b610301612218565b610301612468565b61030161268c565b6103db612760565b60405161033091906192f3565b610301612830565b6103f8612a30565b604051610330919061936a565b610301612b2b565b610301612ce0565b6103f8612f6d565b610301613068565b6103db61313a565b61030161320a565b61043d61359c565b6040519015158152602001610330565b610301613670565b6103016137b4565b6103016138f7565b610301613a3a565b6103016140ce565b6103016141b2565b610301614338565b6103016145bb565b6103016146fe565b6103236149a8565b610301614a08565b610301614b4e565b601f5461043d9060ff1681565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561052657600080fd5b505af115801561053a573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063eddeb12391506024015b600060405180830381600087803b1580156105a257600080fd5b505af11580156105b6573d6000803e3d6000fd5b50505050565b60225460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561061557600080fd5b505af1158015610629573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561069957600080fd5b505af11580156106ad573d6000803e3d6000fd5b5050601f546040517f47e7ef2400000000000000000000000000000000000000000000000000000000815260006004820152620186a060248201526101009091046001600160a01b031692506347e7ef2491506044015b6020604051808303816000875af1158015610723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107479190619401565b50565b602480547fffffffffffffffffffffffff000000000000000000000000000000000000000090811630179091556025805490911661123417905560405161079090618f73565b604051809103906000f0801580156107ac573d6000803e3d6000fd5b50602380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155604080518082018252600f81527f476174657761795a45564d2e736f6c000000000000000000000000000000000060208201526024805492519081019390935292166044820152610890919060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f485cc95500000000000000000000000000000000000000000000000000000000179052614daa565b602280546001600160a01b03929092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155602180549092168117909155604080517f3ce4a5bc0000000000000000000000000000000000000000000000000000000081529051633ce4a5bc916004808201926020929091908290030181865afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d919061943f565b602680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691821790556040517f06447d560000000000000000000000000000000000000000000000000000000081526004810191909152737109709ecfa91a80626ff3989d68f67f5b1dd12d906306447d5690602401600060405180830381600087803b1580156109eb57600080fd5b505af11580156109ff573d6000803e3d6000fd5b505050506000806000604051610a1490618f80565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015610a50573d6000803e3d6000fd5b50602080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316908117909155602154604051601293600193849360009391921690610aa690618f8d565b610ab59695949392919061945a565b604051809103906000f080158015610ad1573d6000803e3d6000fd5b50601f80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03938416810291909117918290556020546040517fee2815ba00000000000000000000000000000000000000000000000000000000815260016004820152919092048316602482015291169063ee2815ba90604401600060405180830381600087803b158015610b7157600080fd5b505af1158015610b85573d6000803e3d6000fd5b50506020546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820181905260248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b50506026546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50506022546040517fc88a5e6d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152633b9aca006024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c88a5e6d9150604401600060405180830381600087803b158015610d1757600080fd5b505af1158015610d2b573d6000803e3d6000fd5b5050601f54602480546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09281019290925261010090920490911692506347e7ef2491506044016020604051808303816000875af1158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190619401565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105a257600080fd5b604051630618f58760e51b81527fddb5de5e000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b5050601f54602480546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09281019290925261010090920490911692506347e7ef249150604401610704565b60606016805480602002602001604051908101604052809291908181526020018280548015610f6857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f4a575b5050505050905090565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb919061954f565b9050610ff8600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190619401565b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b5050601f546025546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b039182166024820152604481018690526101009092041692506323b872dd91506064015b6020604051808303816000875af1158015611194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b89190619401565b505050565b6060601e805480602002602001604051908101604052809291908181526020016000905b828210156112f657600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b828210156112df57838290600052602060002001805461125290619568565b80601f016020809104026020016040519081016040528092919081815260200182805461127e90619568565b80156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b505050505081526020019060010190611233565b5050505081525050815260200190600101906111e1565b50505050905090565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561135857600080fd5b505af115801561136c573d6000803e3d6000fd5b5050601f546040517fc835d7cc00000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063c835d7cc9150602401600060405180830381600087803b1580156113d457600080fd5b505af11580156113e8573d6000803e3d6000fd5b5050505061146e601f60019054906101000a90046001600160a01b03166001600160a01b031663f2441b326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611466919061943f565b613211614e51565b565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b50506020546040517fa7cb050700000000000000000000000000000000000000000000000000000000815260016004820152600060248201526001600160a01b03909116925063a7cb05079150604401600060405180830381600087803b15801561154757600080fd5b505af115801561155b573d6000803e3d6000fd5b5050604051630618f58760e51b81527fe661aed0000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024015b600060405180830381600087803b1580156115cc57600080fd5b505af11580156115e0573d6000803e3d6000fd5b50505050600080601f60019054906101000a90046001600160a01b03166001600160a01b031663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b691906195b5565b60606018805480602002602001604051908101604052809291908181526020018280548015610f68576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610f4a575050505050905090565b60606017805480602002602001604051908101604052809291908181526020018280548015610f68576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610f4a575050505050905090565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561178957600080fd5b505af115801561179d573d6000803e3d6000fd5b5050601f546040517fccc7759900000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063ccc775999150602401610588565b604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561185c57600080fd5b505af1158015611870573d6000803e3d6000fd5b5050601f546040517f095ea7b300000000000000000000000000000000000000000000000000000000815260006004820152600a60248201526101009091046001600160a01b0316925063095ea7b39150604401610704565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152600a908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561192757600080fd5b505af115801561193b573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600481018690526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015611a1357600080fd5b505af1158015611a27573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600481018590526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b158015611a8e57600080fd5b505af1158015611aa2573d6000803e3d6000fd5b5050601f546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03166004820181905260006024830152925063095ea7b391506044016020604051808303816000875af1158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b399190619401565b507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b031663f48448146040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b5050601f546025546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301528051601481840301815260348301918290527fc7012626000000000000000000000000000000000000000000000000000000009091526001600160a01b0361010090930492909216935063c7012626925061117591906001906038016195e1565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015611cb257600080fd5b505af1158015611cc6573d6000803e3d6000fd5b5050601f546040517fc835d7cc00000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063c835d7cc9150602401610588565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b158015611ded57600080fd5b505af1158015611e01573d6000803e3d6000fd5b5050505061146e600a601f60019054906101000a90046001600160a01b03166001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e81919061954f565b614dc9565b6060601b805480602002602001604051908101604052809291908181526020016000905b828210156112f65783829060005260206000209060020201604051806040016040529081600082018054611edd90619568565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0990619568565b8015611f565780601f10611f2b57610100808354040283529160200191611f56565b820191906000526020600020905b815481529060010190602001808311611f3957829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ff057602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411611f9d5790505b50505050508152505081526020019060010190611eaa565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612081919061954f565b905061208e600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190619401565b50604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b15801561219757600080fd5b505af11580156121ab573d6000803e3d6000fd5b5050601f54602480546025546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216928101929092526044820186905261010090920490911692506323b872dd9150606401611175565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa15801561226d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612291919061954f565b905061229e600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015261c35092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190619401565b50601f54602480546025546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529082169281019290925260448201849052610100909204909116906323b872dd906064015b6020604051808303816000875af11580156123be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e29190619401565b50601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015612438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245c919061954f565b90506111b88282614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e1919061954f565b90506124f0620186a082614dc9565b60225460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561254957600080fd5b505af115801561255d573d6000803e3d6000fd5b5050601f54602480546040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152620186a09281019290925261010090920490911692506347e7ef2491506044016020604051808303816000875af11580156125db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ff9190619401565b506000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612655573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612679919061954f565b905061268862030d4082614dc9565b5050565b604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156126f857600080fd5b505af115801561270c573d6000803e3d6000fd5b5050601f546040517f42966c68000000000000000000000000000000000000000000000000000000008152620249f060048201526101009091046001600160a01b031692506342966c689150602401610704565b6060601a805480602002602001604051908101604052809291908181526020016000905b828210156112f65783829060005260206000200180546127a390619568565b80601f01602080910402602001604051908101604052809291908181526020018280546127cf90619568565b801561281c5780601f106127f15761010080835404028352916020019161281c565b820191906000526020600020905b8154815290600101906020018083116127ff57829003601f168201915b505050505081526020019060010190612784565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a9919061954f565b90506128b6600082614dc9565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af115801561292e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129529190619401565b50604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156129bf57600080fd5b505af11580156129d3573d6000803e3d6000fd5b5050601f546025546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810186905261010090920416925063a9059cbb9150604401611175565b6060601d805480602002602001604051908101604052809291908181526020016000905b828210156112f65760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015612b1357602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411612ac05790505b50505050508152505081526020019060010190612a54565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af1158015612ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc79190619401565b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015612c3457600080fd5b505af1158015612c48573d6000803e3d6000fd5b5050601f546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815260006004820152602481018590526101009091046001600160a01b0316925063a9059cbb91506044015b6020604051808303816000875af1158015612cbc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126889190619401565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015612d35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d5d91908101906196cb565b9050612d9e6040518060400160405280600581526020017f544f4b454e00000000000000000000000000000000000000000000000000000081525082614eb2565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015612df3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e1b91908101906196cb565b9050612e5c6040518060400160405280600381526020017f544b4e000000000000000000000000000000000000000000000000000000000081525082614eb2565b6000601f60019054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed59190619714565b9050612ee560128260ff16614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5e919061954f565b90506105b6620186a082614dc9565b6060601c805480602002602001604051908101604052809291908181526020016000905b828210156112f65760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561305057602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411612ffd5790505b50505050508152505081526020019060010190612f91565b604051630618f58760e51b81527f2b2add3d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063f687d12a9150602401610588565b60606019805480602002602001604051908101604052809291908181526020016000905b828210156112f657838290600052602060002001805461317d90619568565b80601f01602080910402602001604051908101604052809291908181526020018280546131a990619568565b80156131f65780601f106131cb576101008083540402835291602001916131f6565b820191906000526020600020905b8154815290600101906020018083116131d957829003601f168201915b50505050508152602001906001019061315e565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152600a906305f5e10090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561326c57600080fd5b505af1158015613280573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600481018690526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b1580156132e757600080fd5b505af11580156132fb573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561335857600080fd5b505af115801561336c573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600481018590526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050601f546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b031660048201819052630bebc2006024830152925063095ea7b391506044016020604051808303816000875af115801561345d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134819190619401565b50604051630618f58760e51b81527ffe382aa7000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156134ee57600080fd5b505af1158015613502573d6000803e3d6000fd5b5050601f546025546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301528051601481840301815260348301918290527fc7012626000000000000000000000000000000000000000000000000000000009091526001600160a01b0361010090930492909216935063c7012626925061117591906064906038016195e1565b60085460009060ff16156135b4575060085460ff1690565b6040517f667f9d70000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d600482018190527f6661696c65640000000000000000000000000000000000000000000000000000602483015260009163667f9d7090604401602060405180830381865afa158015613645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613669919061954f565b1415905090565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b1580156136c957600080fd5b505af11580156136dd573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b15801561374457600080fd5b505af1158015613758573d6000803e3d6000fd5b5050505061146e600a601f60019054906101000a90046001600160a01b03166001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e5d573d6000803e3d6000fd5b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561380d57600080fd5b505af1158015613821573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b15801561389157600080fd5b505af11580156138a5573d6000803e3d6000fd5b5050601f546040517fccc77599000000000000000000000000000000000000000000000000000000008152600060048201526101009091046001600160a01b0316925063ccc775999150602401610588565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561395057600080fd5b505af1158015613964573d6000803e3d6000fd5b5050604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e09150602401600060405180830381600087803b1580156139d457600080fd5b505af11580156139e8573d6000803e3d6000fd5b5050601f546040517fc835d7cc000000000000000000000000000000000000000000000000000000008152600060048201526101009091046001600160a01b0316925063c835d7cc9150602401610588565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152600a908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015613a9857600080fd5b505af1158015613aac573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600481018690526101009091046001600160a01b0316925063f687d12a9150602401600060405180830381600087803b158015613b1357600080fd5b505af1158015613b27573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b158015613b8457600080fd5b505af1158015613b98573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600481018590526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b158015613bff57600080fd5b505af1158015613c13573d6000803e3d6000fd5b5050601f54602480546040516370a0823160e01b81526001600160a01b039182166004820152600095506101009093041692506370a082319101602060405180830381865afa158015613c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8e919061954f565b9050613c9d620186a082614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d16919061954f565b9050613d25620186a082614dc9565b601f546026546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015613d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9e919061954f565b601f546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03166004820181905261c350602483015291925063095ea7b3906044016020604051808303816000875af1158015613e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e349190619401565b50601f546025546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301528051601481840301815260348301918290527fc7012626000000000000000000000000000000000000000000000000000000009091526001600160a01b03610100909304929092169163c701262691613ecc919061c350906038016195e1565b6020604051808303816000875af1158015613eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0f9190619401565b50601f546026546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015613f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f89919061954f565b9050613fa985613f998885619766565b613fa39190619766565b82614dc9565b601f54602480546040516370a0823160e01b81526001600160a01b0391821660048201526000936101009004909116916370a082319101602060405180830381865afa158015613ffd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614021919061954f565b905061403d866140338961c350619779565b613fa39190619779565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b6919061954f565b90506140c461c35082614dc9565b5050505050505050565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015614123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614147919061954f565b9050614154600082614dc9565b601f546025546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015261c350602482018190529261010090049091169063a9059cbb9060440161239f565b601f54602480546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526207a12092810183905291926101009004169063095ea7b3906044016020604051808303816000875af115801561422a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424e9190619401565b50604051630618f58760e51b81527fd92e233d000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b1580156142bb57600080fd5b505af11580156142cf573d6000803e3d6000fd5b5050601f54602480546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000928101929092526044820186905261010090920490911692506323b872dd9150606401612c9d565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561439157600080fd5b505af11580156143a5573d6000803e3d6000fd5b5050601f546040517ff687d12a000000000000000000000000000000000000000000000000000000008152600a6004820181905293508392506101009091046001600160a01b03169063f687d12a90602401600060405180830381600087803b15801561441157600080fd5b505af1158015614425573d6000803e3d6000fd5b505060265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063ca669fa79150602401600060405180830381600087803b15801561448257600080fd5b505af1158015614496573d6000803e3d6000fd5b5050601f546040517feddeb123000000000000000000000000000000000000000000000000000000008152600a60048201526101009091046001600160a01b0316925063eddeb1239150602401600060405180830381600087803b1580156144fd57600080fd5b505af1158015614511573d6000803e3d6000fd5b50505050600080601f60019054906101000a90046001600160a01b03166001600160a01b031663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa15801561456a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061458e91906195b5565b601f5491935091506145ae9061010090046001600160a01b031683614e51565b6105b6613fa38486619766565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b15801561461457600080fd5b505af1158015614628573d6000803e3d6000fd5b5050601f546040517fccc7759900000000000000000000000000000000000000000000000000000000815261321160048201526101009091046001600160a01b0316925063ccc775999150602401600060405180830381600087803b15801561469057600080fd5b505af11580156146a4573d6000803e3d6000fd5b5050505061146e601f60019054906101000a90046001600160a01b03166001600160a01b0316638b851b956040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b601f54602480546040516370a0823160e01b81526001600160a01b0391821660048201526000936101009004909116916370a082319101602060405180830381865afa158015614752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614776919061954f565b9050614785620186a082614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147fe919061954f565b905061480d620186a082614dc9565b601f546040517f42966c6800000000000000000000000000000000000000000000000000000000815261c35060048201526101009091046001600160a01b0316906342966c68906024016020604051808303816000875af1158015614876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061489a9190619401565b50601f54602480546040516370a0823160e01b81526001600160a01b0391821660048201526000936101009004909116916370a082319101602060405180830381865afa1580156148ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614913919061954f565b905061492161c35082614dc9565b6000601f60019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061499a919061954f565b90506105b661c35082614dc9565b60606015805480602002602001604051908101604052809291908181526020018280548015610f68576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610f4a575050505050905090565b60265460405163ca669fa760e01b81526001600160a01b039091166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063ca669fa790602401600060405180830381600087803b158015614a6157600080fd5b505af1158015614a75573d6000803e3d6000fd5b50506020546040517fee2815ba00000000000000000000000000000000000000000000000000000000815260016004820152600060248201526001600160a01b03909116925063ee2815ba9150604401600060405180830381600087803b158015614adf57600080fd5b505af1158015614af3573d6000803e3d6000fd5b5050604051630618f58760e51b81527f78fff396000000000000000000000000000000000000000000000000000000006004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d925063c31eb0e091506024016115b2565b601f546025546040516370a0823160e01b81526001600160a01b0391821660048201526000926101009004909116906370a0823190602401602060405180830381865afa158015614ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc7919061954f565b9050614bd4600082614dc9565b601f54602480546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201819052928101929092526000926101009004169063dd62ed3e90604401602060405180830381865afa158015614c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6e919061954f565b9050614c7b600082614dc9565b604051630618f58760e51b81527f10bad14700000000000000000000000000000000000000000000000000000000600482015261c35090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c31eb0e090602401600060405180830381600087803b158015614ceb57600080fd5b505af1158015614cff573d6000803e3d6000fd5b5050601f54602480546025546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152908216928101929092526044820186905261010090920490911692506323b872dd91506064016020604051808303816000875af1158015614d86573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b69190619401565b6000614db4618f9a565b614dbf848483614f04565b9150505b92915050565b6040517f98296c540000000000000000000000000000000000000000000000000000000081526004810183905260248101829052737109709ecfa91a80626ff3989d68f67f5b1dd12d906398296c54906044015b60006040518083038186803b158015614e3557600080fd5b505afa158015614e49573d6000803e3d6000fd5b505050505050565b6040517f515361f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015282166024820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063515361f690604401614e1d565b6040517ff320d963000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063f320d96390614e1d908590859060040161978c565b600080614f118584614f7f565b9050614f746040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001614f5f9291906197b1565b60405160208183030381529060405285614f8b565b9150505b9392505050565b6000614f788383614fb9565b60c08101515160009015614faf57614fa884848460c00151614fd4565b9050614f78565b614fa8848461517a565b6000614fc58383615265565b614f7883836020015184614f8b565b600080614fdf615271565b90506000614fed8683615344565b9050600061500482606001518360200151856157ea565b90506000615014838389896159fc565b9050600061502182616879565b602081015181519192509060030b156150945789826040015160405160200161504b9291906197d3565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261508b91600401619854565b60405180910390fd5b60006150d76040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001616a48565b6040517fc6ce059d000000000000000000000000000000000000000000000000000000008152909150737109709ecfa91a80626ff3989d68f67f5b1dd12d9063c6ce059d9061512a908490600401619854565b602060405180830381865afa158015615147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061516b919061943f565b9b9a5050505050505050505050565b6040517f8d1cc9250000000000000000000000000000000000000000000000000000000081526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d90638d1cc925906151cf908790600401619854565b600060405180830381865afa1580156151ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526152149190810190619887565b90506000615242828560405160200161522e9291906198bc565b604051602081830303815290604052616c48565b90506001600160a01b038116614dbf57848460405160200161504b9291906198eb565b61268882826000616c5b565b604080518082018252600381527f6f75740000000000000000000000000000000000000000000000000000000000602082015290517fd145736c000000000000000000000000000000000000000000000000000000008152606091737109709ecfa91a80626ff3989d68f67f5b1dd12d91829063d145736c906152f8908490600401619996565b600060405180830381865afa158015615315573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261533d91908101906196cb565b9250505090565b6153766040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d90506153c16040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6153ca85616d5e565b602082015260006153da86617143565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa15801561541c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261544491908101906196cb565b8683856020015160405160200161545e94939291906199dd565b60408051601f19818403018152908290527f60f9bb1100000000000000000000000000000000000000000000000000000000825291506000906001600160a01b038616906360f9bb11906154b6908590600401619854565b600060405180830381865afa1580156154d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526154fb91908101906196cb565b6040517fdb4235f60000000000000000000000000000000000000000000000000000000081529091506001600160a01b0386169063db4235f690615543908490600401619ae1565b602060405180830381865afa158015615560573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155849190619401565b615599578160405160200161504b9190619b33565b6040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906155de908490600401619bc5565b600060405180830381865afa1580156155fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261562391908101906196cb565b84526040517fdb4235f60000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063db4235f69061566a908490600401619c17565b602060405180830381865afa158015615687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156ab9190619401565b15615740576040517f49c4fac80000000000000000000000000000000000000000000000000000000081526001600160a01b038616906349c4fac8906156f5908490600401619c17565b600060405180830381865afa158015615712573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261573a91908101906196cb565b60408501525b846001600160a01b03166349c4fac88286600001516040516020016157659190619c69565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161579192919061978c565b600060405180830381865afa1580156157ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526157d691908101906196cb565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b60608152602001906001900390816158065790505090506040518060400160405280600481526020017f67726570000000000000000000000000000000000000000000000000000000008152508160008151811061586657615866619cd5565b60200260200101819052506040518060400160405280600381526020017f2d726c0000000000000000000000000000000000000000000000000000000000815250816001815181106158ba576158ba619cd5565b6020026020010181905250846040516020016158d69190619d04565b604051602081830303815290604052816002815181106158f8576158f8619cd5565b6020026020010181905250826040516020016159149190619d70565b6040516020818303038152906040528160038151811061593657615936619cd5565b6020026020010181905250600061594c82616879565b602080820151604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000081850190815282518084018452600080825290860152825180840190935290518252928101929092529192506159dd90604080518082018252600080825260209182015281518083019092528451825280850190820152906173c6565b6159f2578560405160200161504b9190619db1565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090737109709ecfa91a80626ff3989d68f67f5b1dd12d9015615a4c565b511590565b615bc057826020015115615b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a40161508b565b8260c0015115615bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f742060448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a40161508b565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081615bd957905050905060006040518060400160405280600381526020017f6e70780000000000000000000000000000000000000000000000000000000000815250828280615c3490619e42565b935060ff1681518110615c4957615c49619cd5565b60200260200101819052506040518060400160405280600d81526020017f302e302e312d616c7068612e3700000000000000000000000000000000000000815250604051602001615c9a9190619e61565b604051602081830303815290604052828280615cb590619e42565b935060ff1681518110615cca57615cca619cd5565b60200260200101819052506040518060400160405280600681526020017f6465706c6f790000000000000000000000000000000000000000000000000000815250828280615d1790619e42565b935060ff1681518110615d2c57615d2c619cd5565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e74726163744e616d65000000000000000000000000000000000000815250828280615d7990619e42565b935060ff1681518110615d8e57615d8e619cd5565b60200260200101819052508760200151828280615daa90619e42565b935060ff1681518110615dbf57615dbf619cd5565b60200260200101819052506040518060400160405280600e81526020017f2d2d636f6e747261637450617468000000000000000000000000000000000000815250828280615e0c90619e42565b935060ff1681518110615e2157615e21619cd5565b602090810291909101015287518282615e3981619e42565b935060ff1681518110615e4e57615e4e619cd5565b60200260200101819052506040518060400160405280600981526020017f2d2d636861696e49640000000000000000000000000000000000000000000000815250828280615e9b90619e42565b935060ff1681518110615eb057615eb0619cd5565b6020026020010181905250615ec446617427565b8282615ecf81619e42565b935060ff1681518110615ee457615ee4619cd5565b60200260200101819052506040518060400160405280600f81526020017f2d2d6275696c64496e666f46696c650000000000000000000000000000000000815250828280615f3190619e42565b935060ff1681518110615f4657615f46619cd5565b602002602001018190525086828280615f5e90619e42565b935060ff1681518110615f7357615f73619cd5565b602090810291909101015285511561609a5760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f6465000000000000000000000060208201528282615fc481619e42565b935060ff1681518110615fd957615fd9619cd5565b60209081029190910101526040517f71aad10d0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906371aad10d90616029908990600401619854565b600060405180830381865afa158015616046573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261606e91908101906196cb565b828261607981619e42565b935060ff168151811061608e5761608e619cd5565b60200260200101819052505b84602001511561616a5760408051808201909152601281527f2d2d766572696679536f75726365436f64650000000000000000000000000000602082015282826160e381619e42565b935060ff16815181106160f8576160f8619cd5565b60200260200101819052506040518060400160405280600581526020017f66616c736500000000000000000000000000000000000000000000000000000081525082828061614590619e42565b935060ff168151811061615a5761615a619cd5565b6020026020010181905250616331565b6161a2615a478660a0015160408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6162355760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826161e581619e42565b935060ff16815181106161fa576161fa619cd5565b60200260200101819052508460a0015160405160200161621a9190619d04565b60405160208183030381529060405282828061614590619e42565b8460c0015115801561627857506040808901518151808301835260008082526020918201528251808401909352815183529081019082015261627690511590565b155b156163315760408051808201909152600d81527f2d2d6c6963656e73655479706500000000000000000000000000000000000000602082015282826162bc81619e42565b935060ff16815181106162d1576162d1619cd5565b60200260200101819052506162e5886174c7565b6040516020016162f59190619d04565b60405160208183030381529060405282828061631090619e42565b935060ff168151811061632557616325619cd5565b60200260200101819052505b6040808601518151808301835260008082526020918201528251808401909352815183529081019082015261636590511590565b6163fa5760408051808201909152600b81527f2d2d72656c617965724964000000000000000000000000000000000000000000602082015282826163a881619e42565b935060ff16815181106163bd576163bd619cd5565b602002602001018190525084604001518282806163d990619e42565b935060ff16815181106163ee576163ee619cd5565b60200260200101819052505b60608501511561651b5760408051808201909152600681527f2d2d73616c7400000000000000000000000000000000000000000000000000006020820152828261644381619e42565b935060ff168151811061645857616458619cd5565b602090810291909101015260608501516040517fb11a19e800000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156164c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526164ef91908101906196cb565b82826164fa81619e42565b935060ff168151811061650f5761650f619cd5565b60200260200101819052505b60e085015151156165c25760408051808201909152600a81527f2d2d6761734c696d6974000000000000000000000000000000000000000000006020820152828261656581619e42565b935060ff168151811061657a5761657a619cd5565b60200260200101819052506165968560e0015160000151617427565b82826165a181619e42565b935060ff16815181106165b6576165b6619cd5565b60200260200101819052505b60e0850151602001511561666c5760408051808201909152600a81527f2d2d6761735072696365000000000000000000000000000000000000000000006020820152828261660f81619e42565b935060ff168151811061662457616624619cd5565b60200260200101819052506166408560e0015160200151617427565b828261664b81619e42565b935060ff168151811061666057616660619cd5565b60200260200101819052505b60e085015160400151156167165760408051808201909152600e81527f2d2d6d6178466565506572476173000000000000000000000000000000000000602082015282826166b981619e42565b935060ff16815181106166ce576166ce619cd5565b60200260200101819052506166ea8560e0015160400151617427565b82826166f581619e42565b935060ff168151811061670a5761670a619cd5565b60200260200101819052505b60e085015160600151156167c05760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261676381619e42565b935060ff168151811061677857616778619cd5565b60200260200101819052506167948560e0015160600151617427565b828261679f81619e42565b935060ff16815181106167b4576167b4619cd5565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156167de576167de619603565b60405190808252806020026020018201604052801561681157816020015b60608152602001906001900390816167fc5790505b50905060005b8260ff168160ff16101561686a57838160ff168151811061683a5761683a619cd5565b6020026020010151828260ff168151811061685757616857619cd5565b6020908102919091010152600101616817565b5093505050505b949350505050565b6168a06040518060600160405280600060030b815260200160608152602001606081525090565b60408051808201825260048082527f6261736800000000000000000000000000000000000000000000000000000000602083015291517fd145736c000000000000000000000000000000000000000000000000000000008152737109709ecfa91a80626ff3989d68f67f5b1dd12d92600091849163d145736c9161692691869101619ecc565b600060405180830381865afa158015616943573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261696b91908101906196cb565b905060006169798683617fb6565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b81526004016169a991906192f3565b6000604051808303816000875af11580156169c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526169f09190810190619f13565b805190915060030b15801590616a095750602081015151155b8015616a185750604081015151155b156159f25781600081518110616a3057616a30619cd5565b602002602001015160405160200161504b9190619fc9565b60606000616a7d8560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150616ab49082905b9061810b565b15616c11576000616b3182616b2b84616b25616af78a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90618132565b90618194565b604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616b9590829061810b565b15616bff57604080518082018252600181527f0a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616bfc905b8290618219565b90505b616c088161823f565b92505050614f78565b8215616c2a57848460405160200161504b92919061a1b5565b5050604080516020810190915260008152614f78565b509392505050565b6000808251602084016000f09392505050565b8160a0015115616c6a57505050565b6000616c778484846182a8565b90506000616c8482616879565b602081015181519192509060030b158015616d205750604080518082018252600781527f535543434553530000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616d2090604080518082018252600080825260209182015281518083019092528451825280850190820152616aae565b15616d2d57505050505050565b60408201515115616d4d57816040015160405160200161504b919061a25c565b8060405160200161504b919061a2ba565b60606000616d938360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152909150616df8905b82906173c6565b15616e6757604080518082018252600481527f2e736f6c0000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7890616e62908390618843565b61823f565b604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ec9905b82906188cd565b600103616f9657604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616f2f90616bf5565b50604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7890616e62905b8390618219565b604080518082018252600581527f2e6a736f6e00000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152616ff590616df1565b1561712c57604080518082018252600181527f2f0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082018190528451808601909552925184528301529061705d908390618967565b9050600081600183516170709190619779565b8151811061708057617080619cd5565b60200260200101519050617123616e626170f66040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b60408051808201825260008082526020918201528151808301909252855182528086019082015290618843565b95945050505050565b8260405160200161504b919061a325565b50919050565b606060006171788360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600481527f2e736f6c00000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201529091506171da90616df1565b156171e857614f788161823f565b604080518082018252600181527f3a000000000000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261724790616ec2565b6001036172b157604080518082018252600181527f3a0000000000000000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152614f7890616e6290616f8f565b604080518082018252600581527f2e6a736f6e0000000000000000000000000000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261731090616df1565b1561712c57604080518082018252600181527f2f00000000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820181905284518086019095529251845283015290617378908390618967565b90506001815111156173b45780600282516173939190619779565b815181106173a3576173a3619cd5565b602002602001015192505050919050565b508260405160200161504b919061a325565b8051825160009111156173db57506000614dc3565b815183516020850151600092916173f191619766565b6173fb9190619779565b905082602001518103617412576001915050614dc3565b82516020840151819020912014905092915050565b6060600061743483618a0c565b600101905060008167ffffffffffffffff81111561745457617454619603565b6040519080825280601f01601f19166020018201604052801561747e576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461748857509392505050565b604081810151815180830183526000808252602091820181905283518085018552835181529282018383015283518085018552600a81527f554e4c4943454e5345440000000000000000000000000000000000000000000081840190815285518087018752838152840192909252845180860190955251845290830152606091617553905b8290618aee565b1561759357505060408051808201909152600481527f4e6f6e65000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600981527f556e6c6963656e73650000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526175f29061754c565b1561763257505060408051808201909152600981527f556e6c6963656e736500000000000000000000000000000000000000000000006020820152919050565b604080518082018252600381527f4d49540000000000000000000000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526176919061754c565b156176d157505060408051808201909152600381527f4d495400000000000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d322e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177309061754c565b806177955750604080518082018252601081527f47504c2d322e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526177959061754c565b156177d557505060408051808201909152600981527f474e552047504c763200000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f47504c2d332e302d6f6e6c790000000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178349061754c565b806178995750604080518082018252601081527f47504c2d332e302d6f722d6c6174657200000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526178999061754c565b156178d957505060408051808201909152600981527f474e552047504c763300000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d322e312d6f6e6c7900000000000000000000000000000000000000602080830191825283518085018552600080825290820152835180850190945291518352908201526179389061754c565b8061799d5750604080518082018252601181527f4c47504c2d322e312d6f722d6c617465720000000000000000000000000000006020808301918252835180850185526000808252908201528351808501909452915183529082015261799d9061754c565b156179dd57505060408051808201909152600c81527f474e55204c47504c76322e3100000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4c47504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617a3c9061754c565b80617aa15750604080518082018252601181527f4c47504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617aa19061754c565b15617ae157505060408051808201909152600a81527f474e55204c47504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d322d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617b409061754c565b15617b8057505060408051808201909152600c81527f4253442d322d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600c81527f4253442d332d436c61757365000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617bdf9061754c565b15617c1f57505060408051808201909152600c81527f4253442d332d436c6175736500000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4d504c2d322e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617c7e9061754c565b15617cbe57505060408051808201909152600781527f4d504c2d322e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600781527f4f534c2d332e300000000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617d1d9061754c565b15617d5d57505060408051808201909152600781527f4f534c2d332e30000000000000000000000000000000000000000000000000006020820152919050565b604080518082018252600a81527f4170616368652d322e300000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617dbc9061754c565b15617dfc57505060408051808201909152600a81527f4170616368652d322e30000000000000000000000000000000000000000000006020820152919050565b604080518082018252600d81527f4147504c2d332e302d6f6e6c790000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617e5b9061754c565b80617ec05750604080518082018252601181527f4147504c2d332e302d6f722d6c6174657200000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617ec09061754c565b15617f0057505060408051808201909152600a81527f474e55204147504c7633000000000000000000000000000000000000000000006020820152919050565b604080518082018252600881527f4255534c2d312e3100000000000000000000000000000000000000000000000060208083019182528351808501855260008082529082015283518085019094529151835290820152617f5f9061754c565b15617f9f57505060408051808201909152600781527f42534c20312e31000000000000000000000000000000000000000000000000006020820152919050565b6040808401518451915161504b929060200161a403565b60608060005b84518110156180415781858281518110617fd857617fd8619cd5565b6020026020010151604051602001617ff19291906198bc565b6040516020818303038152906040529150600185516180109190619779565b81146180395781604051602001618027919061a56c565b60405160208183030381529060405291505b600101617fbc565b5060408051600380825260808201909252600091816020015b606081526020019060019003908161805a579050509050838160008151811061808557618085619cd5565b60200260200101819052506040518060400160405280600281526020017f2d63000000000000000000000000000000000000000000000000000000000000815250816001815181106180d9576180d9619cd5565b602002602001018190525081816002815181106180f8576180f8619cd5565b6020908102919091010152949350505050565b60208083015183518351928401516000936181299291849190618b02565b14159392505050565b604080518082019091526000808252602082015260006181648460000151856020015185600001518660200151618c13565b90508360200151816181769190619779565b84518590618185908390619779565b90525060208401525090919050565b60408051808201909152600080825260208201528151835110156181b9575081614dc3565b60208083015190840151600191146181e05750815160208481015190840151829020919020145b8015618211578251845185906181f7908390619779565b905250825160208501805161820d908390619766565b9052505b509192915050565b6040805180820190915260008082526020820152618238838383618d33565b5092915050565b60606000826000015167ffffffffffffffff81111561826057618260619603565b6040519080825280601f01601f19166020018201604052801561828a576020820181803683370190505b50905060006020820190506182388185602001518660000151618dde565b606060006182b4615271565b6040805160ff808252612000820190925291925060009190816020015b60608152602001906001900390816182d157905050905060006040518060400160405280600381526020017f6e7078000000000000000000000000000000000000000000000000000000000081525082828061832c90619e42565b935060ff168151811061834157618341619cd5565b60200260200101819052506040518060400160405280600781526020017f5e312e33322e3300000000000000000000000000000000000000000000000000815250604051602001618392919061a5ad565b6040516020818303038152906040528282806183ad90619e42565b935060ff16815181106183c2576183c2619cd5565b60200260200101819052506040518060400160405280600881526020017f76616c696461746500000000000000000000000000000000000000000000000081525082828061840f90619e42565b935060ff168151811061842457618424619cd5565b6020026020010181905250826040516020016184409190619d70565b60405160208183030381529060405282828061845b90619e42565b935060ff168151811061847057618470619cd5565b60200260200101819052506040518060400160405280600a81526020017f2d2d636f6e7472616374000000000000000000000000000000000000000000008152508282806184bd90619e42565b935060ff16815181106184d2576184d2619cd5565b60200260200101819052506184e78784618e58565b82826184f281619e42565b935060ff168151811061850757618507619cd5565b6020908102919091010152855151156185b35760408051808201909152600b81527f2d2d7265666572656e63650000000000000000000000000000000000000000006020820152828261855981619e42565b935060ff168151811061856e5761856e619cd5565b6020026020010181905250618587866000015184618e58565b828261859281619e42565b935060ff16815181106185a7576185a7619cd5565b60200260200101819052505b8560800151156186215760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b0000000000000000602082015282826185fc81619e42565b935060ff168151811061861157618611619cd5565b6020026020010181905250618687565b84156186875760408051808201909152601281527f2d2d726571756972655265666572656e636500000000000000000000000000006020820152828261866681619e42565b935060ff168151811061867b5761867b619cd5565b60200260200101819052505b604086015151156187235760408051808201909152600d81527f2d2d756e73616665416c6c6f7700000000000000000000000000000000000000602082015282826186d181619e42565b935060ff16815181106186e6576186e6619cd5565b6020026020010181905250856040015182828061870290619e42565b935060ff168151811061871757618717619cd5565b60200260200101819052505b85606001511561878d5760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261876c81619e42565b935060ff168151811061878157618781619cd5565b60200260200101819052505b60008160ff1667ffffffffffffffff8111156187ab576187ab619603565b6040519080825280602002602001820160405280156187de57816020015b60608152602001906001900390816187c95790505b50905060005b8260ff168160ff16101561883757838160ff168151811061880757618807619cd5565b6020026020010151828260ff168151811061882457618824619cd5565b60209081029190910101526001016187e4565b50979650505050505050565b6040805180820190915260008082526020820152815183511015618868575081614dc3565b8151835160208501516000929161887e91619766565b6188889190619779565b602084015190915060019082146188a9575082516020840151819020908220145b80156188c4578351855186906188c0908390619779565b9052505b50929392505050565b60008082600001516188f18560000151866020015186600001518760200151618c13565b6188fb9190619766565b90505b8351602085015161890f9190619766565b8111618238578161891f8161a5f2565b925050826000015161895685602001518361893a9190619779565b86516189469190619779565b8386600001518760200151618c13565b6189609190619766565b90506188fe565b6060600061897584846188cd565b618980906001619766565b67ffffffffffffffff81111561899857618998619603565b6040519080825280602002602001820160405280156189cb57816020015b60608152602001906001900390816189b65790505b50905060005b8151811015616c40576189e7616e628686618219565b8282815181106189f9576189f9619cd5565b60209081029190910101526001016189d1565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310618a55577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310618a81576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310618a9f57662386f26fc10000830492506010015b6305f5e1008310618ab7576305f5e100830492506008015b6127108310618acb57612710830492506004015b60648310618add576064830492506002015b600a8310614dc35760010192915050565b6000618afa8383618e98565b159392505050565b600080858411618c095760208411618bb55760008415618b4d576001618b29866020619779565b618b3490600861a60c565b618b3f90600261a70a565b618b499190619779565b1990505b8351811685618b5c8989619766565b618b669190619779565b805190935082165b818114618ba057878411618b885787945050505050616871565b83618b928161a716565b945050828451169050618b6e565b618baa8785619766565b945050505050616871565b838320618bc28588619779565b618bcc9087619766565b91505b858210618c0757848220808203618bf457618bea8684619766565b9350505050616871565b618bff600184619779565b925050618bcf565b505b5092949350505050565b60008381868511618d1e5760208511618ccd5760008515618c5f576001618c3b876020619779565b618c4690600861a60c565b618c5190600261a70a565b618c5b9190619779565b1990505b84518116600087618c708b8b619766565b618c7a9190619779565b855190915083165b828114618cbf57818610618ca757618c9a8b8b619766565b9650505050505050616871565b85618cb18161a5f2565b965050838651169050618c82565b859650505050505050616871565b508383206000905b618cdf8689619779565b8211618d1c57858320808203618cfb5783945050505050616871565b618d06600185619766565b9350508180618d149061a5f2565b925050618cd5565b505b618d288787619766565b979650505050505050565b60408051808201909152600080825260208201526000618d658560000151866020015186600001518760200151618c13565b602080870180519186019190915251909150618d819082619779565b835284516020860151618d949190619766565b8103618da35760008552618dd5565b83518351618db19190619766565b85518690618dc0908390619779565b9052508351618dcf9082619766565b60208601525b50909392505050565b60208110618e165781518352618df5602084619766565b9250618e02602083619766565b9150618e0f602082619779565b9050618dde565b6000198115618e45576001618e2c836020619779565b618e389061010061a70a565b618e429190619779565b90505b9151835183169219169190911790915250565b60606000618e668484615344565b8051602080830151604051939450618e809390910161a72d565b60405160208183030381529060405291505092915050565b8151815160009190811115618eab575081515b6020808501519084015160005b83811015618f645782518251808214618f34576000196020871015618f1357600184618ee5896020619779565b618eef9190619766565b618efa90600861a60c565b618f0590600261a70a565b618f0f9190619779565b1990505b8181168382168181039114618f31579750614dc39650505050505050565b50505b618f3f602086619766565b9450618f4c602085619766565b93505050602081618f5d9190619766565b9050618eb8565b50845186516159f2919061a785565b610b678061a7a683390190565b61106f8061b30d83390190565b611e018061c37c83390190565b6040518060e00160405280606081526020016060815260200160608152602001600015158152602001600015158152602001600015158152602001618fdd618fe2565b905290565b60405180610100016040528060001515815260200160001515815260200160608152602001600080191681526020016060815260200160608152602001600015158152602001618fdd6040518060800160405280600081526020016000815260200160008152602001600081525090565b602080825282518282018190526000918401906040840190835b818110156190945783516001600160a01b031683526020938401939092019160010161906d565b509095945050505050565b60005b838110156190ba5781810151838201526020016190a2565b50506000910152565b600081518084526190db81602086016020860161909f565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018452815180516001600160a01b03168652602090810151604082880181905281519088018190529101906060600582901b88018101919088019060005b818110156191d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a85030183526191bb8486516190c3565b6020958601959094509290920191600101619181565b509197505050602094850194929092019150600101619117565b50929695505050505050565b600081518084526020840193506020830160005b8281101561924b5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161920b565b5093949350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281518051604087526192c160408801826190c3565b90506020820151915086810360208801526192dc81836191f7565b96505050602093840193919091019060010161927d565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184526193558583516190c3565b9450602093840193919091019060010161931b565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156191eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845281516001600160a01b03815116865260208101519050604060208701526193eb60408701826191f7565b9550506020938401939190910190600101619392565b60006020828403121561941357600080fd5b81518015158114614f7857600080fd5b80516001600160a01b038116811461943a57600080fd5b919050565b60006020828403121561945157600080fd5b614f7882619423565b610100815260056101008201527f544f4b454e000000000000000000000000000000000000000000000000000000610120820152610140602082015260036101408201527f544b4e000000000000000000000000000000000000000000000000000000000061016082015260006101808201905060ff8816604083015286606083015260038610619514577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8560808301528460a083015261953560c08301856001600160a01b03169052565b6001600160a01b03831660e0830152979650505050505050565b60006020828403121561956157600080fd5b5051919050565b600181811c9082168061957c57607f821691505b60208210810361713d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080604083850312156195c857600080fd5b6195d183619423565b6020939093015192949293505050565b6040815260006195f460408301856190c3565b90508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561965557619655619603565b60405290565b60008067ffffffffffffffff84111561967657619676619603565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156196a5576196a5619603565b6040528381529050808284018510156196bd57600080fd5b616c4084602083018561909f565b6000602082840312156196dd57600080fd5b815167ffffffffffffffff8111156196f457600080fd5b8201601f8101841361970557600080fd5b614dbf8482516020840161965b565b60006020828403121561972657600080fd5b815160ff81168114614f7857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115614dc357614dc3619737565b81810381811115614dc357614dc3619737565b60408152600061979f60408301856190c3565b8281036020840152614f7481856190c3565b6001600160a01b038316815260406020820152600061687160408301846190c3565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161980b81601a85016020880161909f565b7f3a20000000000000000000000000000000000000000000000000000000000000601a91840191820152835161984881601c84016020880161909f565b01601c01949350505050565b602081526000614f7860208301846190c3565b600082601f83011261987857600080fd5b614f788383516020850161965b565b60006020828403121561989957600080fd5b815167ffffffffffffffff8111156198b057600080fd5b614dbf84828501619867565b600083516198ce81846020880161909f565b8351908301906198e281836020880161909f565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161992381601a85016020880161909f565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a91840191820152835161996081603384016020880161909f565b7f220000000000000000000000000000000000000000000000000000000000000060339290910191820152603401949350505050565b60408152600b60408201527f464f554e4452595f4f55540000000000000000000000000000000000000000006060820152608060208201526000614f7860808301846190c3565b600085516199ef818460208a0161909f565b7f2f000000000000000000000000000000000000000000000000000000000000009083019081528551619a29816001840160208a0161909f565b7f2f00000000000000000000000000000000000000000000000000000000000000600192909101918201528451619a6781600284016020890161909f565b6001818301019150507f2f0000000000000000000000000000000000000000000000000000000000000060018201528351619aa981600284016020880161909f565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600292909101918201526007019695505050505050565b604081526000619af460408301846190c3565b8281036020840152600481527f2e6173740000000000000000000000000000000000000000000000000000000060208201526040810191505092915050565b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251619b6b81601f85016020870161909f565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f9390910192830152507f6d6c000000000000000000000000000000000000000000000000000000000000603f820152604101919050565b604081526000619bd860408301846190c3565b8281036020840152601181527f2e6173742e6162736f6c7574655061746800000000000000000000000000000060208201526040810191505092915050565b604081526000619c2a60408301846190c3565b8281036020840152600c81527f2e6173742e6c6963656e7365000000000000000000000000000000000000000060208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251619ca181601485016020870161909f565b7f275d2e6b656363616b32353600000000000000000000000000000000000000006014939091019283015250602001919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f2200000000000000000000000000000000000000000000000000000000000000815260008251619d3c81600185016020870161909f565b7f22000000000000000000000000000000000000000000000000000000000000006001939091019283015250600201919050565b60008251619d8281846020870161909f565b7f2f6275696c642d696e666f000000000000000000000000000000000000000000920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201527f7220636f6e747261637420000000000000000000000000000000000000000000604082015260008251619e3581604b85016020870161909f565b91909101604b0192915050565b600060ff821660ff8103619e5857619e58619737565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81527f69656e742d636c69400000000000000000000000000000000000000000000000602082015260008251619ebf81602985016020870161909f565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f50415448000000000000000000006060820152608060208201526000614f7860808301846190c3565b600060208284031215619f2557600080fd5b815167ffffffffffffffff811115619f3c57600080fd5b820160608185031215619f4e57600080fd5b619f56619632565b81518060030b8114619f6757600080fd5b8152602082015167ffffffffffffffff811115619f8357600080fd5b619f8f86828501619867565b602083015250604082015167ffffffffffffffff811115619faf57600080fd5b619fbb86828501619867565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e6420776974682081527f220000000000000000000000000000000000000000000000000000000000000060208201526000825161a02781602185016020870161909f565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e652077697468207072656669782081527f270000000000000000000000000000000000000000000000000000000000000060208201526000835161a21381602185016020880161909f565b7f2720696e206f75747075743a2000000000000000000000000000000000000000602191840191820152835161a25081602e84016020880161909f565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c81527f69646174696f6e3a200000000000000000000000000000000000000000000000602082015260008251619ebf81602985016020870161909f565b7f55706772616465207361666574792076616c69646174696f6e206661696c656481527f3a0a00000000000000000000000000000000000000000000000000000000000060208201526000825161a31881602285016020870161909f565b9190910160220192915050565b7f436f6e7472616374206e616d652000000000000000000000000000000000000081526000825161a35d81600e85016020870161909f565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201527f6163742e6a736f6e000000000000000000000000000000000000000000000000606e820152607601919050565b7f53504458206c6963656e7365206964656e74696669657220000000000000000081526000835161a43b81601885016020880161909f565b7f20696e2000000000000000000000000000000000000000000000000000000000601891840191820152835161a47881601c84016020880161909f565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b6000825161a57e81846020870161909f565b7f2000000000000000000000000000000000000000000000000000000000000000920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161a5e581601c85016020870161909f565b91909101601c0192915050565b6000600019820361a6055761a605619737565b5060010190565b8082028115828204841417614dc357614dc3619737565b6001815b600184111561a65e5780850481111561a6425761a642619737565b600184161561a65057908102905b60019390931c92800261a627565b935093915050565b60008261a67557506001614dc3565b8161a68257506000614dc3565b816001811461a698576002811461a6a25761a6be565b6001915050614dc3565b60ff84111561a6b35761a6b3619737565b50506001821b614dc3565b5060208310610133831016604e8410600b841016171561a6e1575081810a614dc3565b61a6ee600019848461a623565b806000190482111561a7025761a702619737565b029392505050565b6000614f78838361a666565b60008161a7255761a725619737565b506000190190565b6000835161a73f81846020880161909f565b7f3a00000000000000000000000000000000000000000000000000000000000000908301908152835161a77981600184016020880161909f565b01600101949350505050565b81810360008312801583831316838312821617156182385761823861973756fe60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610114565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610114565b506002805460ff1916601217905534801561006f57600080fd5b506101d2565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561010f57806000526020600020601f840160051c810160208510156100ec5750805b601f840160051c820191505b8181101561010c57600081556001016100f8565b50505b505050565b81516001600160401b0381111561012d5761012d610075565b6101418161013b845461008b565b846100c5565b6020601f821160018114610175576000831561015d5750848201515b600019600385901b1c1916600184901b17845561010c565b600084815260208120601f198516915b828110156101a55787850151825560209485019460019092019101610185565b50848210156101c35786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b610986806101e16000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610745565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046107da565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610804565b6103bd565b34801561017857600080fd5b506100cd610187366004610841565b610647565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d336600461085a565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e9610724565b34801561020657600080fd5b5061011f6102153660046107da565b610731565b6100cd61025a565b34801561022e57600080fd5b5061013e61023d366004610875565b600460209081526000928352604080842090915290825290205481565b33600090815260036020526040812080543492906102799084906108d7565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c2906108ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee906108ea565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561042b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600060248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104a1575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105605773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561051a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091528120805484929061055a90849061093d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061059590849061093d565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548492906105cf9084906108d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161063591815260200190565b60405180910390a35060019392505050565b3360009081526003602052604090205481111561069a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610422565b33600090815260036020526040812080548392906106b990849061093d565b9091555050604051339082156108fc029083906000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c2906108ea565b600061073e3384846103bd565b9392505050565b602081526000825180602084015260005b818110156107735760208186018101516040868401015201610756565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107d557600080fd5b919050565b600080604083850312156107ed57600080fd5b6107f6836107b1565b946020939093013593505050565b60008060006060848603121561081957600080fd5b610822846107b1565b9250610830602085016107b1565b929592945050506040919091013590565b60006020828403121561085357600080fd5b5035919050565b60006020828403121561086c57600080fd5b61073e826107b1565b6000806040838503121561088857600080fd5b610891836107b1565b915061089f602084016107b1565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76108a8565b600181811c908216806108fe57607f821691505b602082108103610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76108a856fea264697066735822122008d7fc4e09519c5dd9f356b03596f6829a151d0bc7682533f9ceab4e459f5ee264736f6c634300081a003360c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a003360e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033a264697066735822122014b7a1afbe198ba545c22879ded558d8bb669c51e6fb34bf363672a1f52f282c64736f6c634300081a0033", } // ZRC20TestABI is the input ABI used to generate the binding from. diff --git a/v2/src/evm/interfaces/IERC20Custody.sol b/v2/src/evm/interfaces/IERC20Custody.sol index 77f08ad2..3aa09ce9 100644 --- a/v2/src/evm/interfaces/IERC20Custody.sol +++ b/v2/src/evm/interfaces/IERC20Custody.sol @@ -10,23 +10,23 @@ interface IERC20CustodyEvents { /// @param token The address of the ERC20 token. /// @param to The address receiving the tokens. /// @param amount The amount of tokens withdrawn. - event Withdrawn(address indexed token, address indexed to, uint256 amount); + event Withdrawn(address indexed to, address indexed token, uint256 amount); /// @notice Emitted when tokens are withdrawn and a contract call is made. - /// @param token The address of the ERC20 token. /// @param to The address receiving the tokens. + /// @param token The address of the ERC20 token. /// @param amount The amount of tokens withdrawn. /// @param data The calldata passed to the contract call. - event WithdrawnAndCalled(address indexed token, address indexed to, uint256 amount, bytes data); + event WithdrawnAndCalled(address indexed to, address indexed token, uint256 amount, bytes data); /// @notice Emitted when tokens are withdrawn and a revertable contract call is made. - /// @param token The address of the ERC20 token. /// @param to The address receiving the tokens. + /// @param token The address of the ERC20 token. /// @param amount The amount of tokens withdrawn. /// @param data The calldata passed to the contract call. /// @param revertContext Revert context to pass to onRevert. event WithdrawnAndReverted( - address indexed token, address indexed to, uint256 amount, bytes data, RevertContext revertContext + address indexed to, address indexed token, uint256 amount, bytes data, RevertContext revertContext ); /// @notice Emitted when ERC20 token is whitelisted diff --git a/v2/src/zevm/GatewayZEVM.sol b/v2/src/zevm/GatewayZEVM.sol index a9171d97..2e98f5b5 100644 --- a/v2/src/zevm/GatewayZEVM.sol +++ b/v2/src/zevm/GatewayZEVM.sol @@ -143,7 +143,16 @@ contract GatewayZEVM is uint256 gasFee = _withdrawZRC20(amount, zrc20); emit Withdrawn( - msg.sender, 0, receiver, zrc20, amount, gasFee, IZRC20(zrc20).PROTOCOL_FLAT_FEE(), "", revertOptions + msg.sender, + 0, + receiver, + zrc20, + amount, + gasFee, + IZRC20(zrc20).PROTOCOL_FLAT_FEE(), + "", + IZRC20(zrc20).GAS_LIMIT(), + revertOptions ); } @@ -171,7 +180,16 @@ contract GatewayZEVM is uint256 gasFee = _withdrawZRC20WithGasLimit(amount, zrc20, gasLimit); emit Withdrawn( - msg.sender, 0, receiver, zrc20, amount, gasFee, IZRC20(zrc20).PROTOCOL_FLAT_FEE(), message, revertOptions + msg.sender, + 0, + receiver, + zrc20, + amount, + gasFee, + IZRC20(zrc20).PROTOCOL_FLAT_FEE(), + message, + gasLimit, + revertOptions ); } @@ -193,7 +211,7 @@ contract GatewayZEVM is if (amount == 0) revert InsufficientZetaAmount(); _transferZETA(amount, FUNGIBLE_MODULE_ADDRESS); - emit Withdrawn(msg.sender, chainId, receiver, address(zetaToken), amount, 0, 0, "", revertOptions); + emit Withdrawn(msg.sender, chainId, receiver, address(zetaToken), amount, 0, 0, "", 0, revertOptions); } /// @notice Withdraw ZETA tokens and call a smart contract on an external chain. @@ -217,7 +235,7 @@ contract GatewayZEVM is if (amount == 0) revert InsufficientZetaAmount(); _transferZETA(amount, FUNGIBLE_MODULE_ADDRESS); - emit Withdrawn(msg.sender, chainId, receiver, address(zetaToken), amount, 0, 0, message, revertOptions); + emit Withdrawn(msg.sender, chainId, receiver, address(zetaToken), amount, 0, 0, message, 0, revertOptions); } /// @notice Call a smart contract on an external chain without asset transfer. @@ -245,7 +263,7 @@ contract GatewayZEVM is revert GasFeeTransferFailed(); } - emit Called(msg.sender, zrc20, receiver, message, revertOptions); + emit Called(msg.sender, zrc20, receiver, message, gasLimit, revertOptions); } /// @notice Deposit foreign coins into ZRC20. @@ -279,7 +297,6 @@ contract GatewayZEVM is whenNotPaused { if (zrc20 == address(0) || target == address(0)) revert ZeroAddress(); - if (amount == 0) revert InsufficientZRC20Amount(); UniversalContract(target).onCrossChainCall(context, zrc20, amount, message); } @@ -333,43 +350,23 @@ contract GatewayZEVM is } /// @notice Revert a user-specified contract on ZEVM. - /// @param context The context of the revert call. - /// @param zrc20 The address of the ZRC20 token. - /// @param amount The amount of tokens to revert. /// @param target The target contract to call. - /// @param message The calldata to pass to the contract call. /// @param revertContext Revert context to pass to onRevert. - function executeRevert( - zContext calldata context, - address zrc20, - uint256 amount, - address target, - bytes calldata message, - RevertContext calldata revertContext - ) - external - onlyFungible - whenNotPaused - { - if (zrc20 == address(0) || target == address(0)) revert ZeroAddress(); - if (amount == 0) revert InsufficientZRC20Amount(); + function executeRevert(address target, RevertContext calldata revertContext) external onlyFungible whenNotPaused { + if (target == address(0)) revert ZeroAddress(); UniversalContract(target).onRevert(revertContext); } /// @notice Deposit foreign coins into ZRC20 and revert a user-specified contract on ZEVM. - /// @param context The context of the revert call. /// @param zrc20 The address of the ZRC20 token. /// @param amount The amount of tokens to revert. /// @param target The target contract to call. - /// @param message The calldata to pass to the contract call. /// @param revertContext Revert context to pass to onRevert. function depositAndRevert( - zContext calldata context, address zrc20, uint256 amount, address target, - bytes calldata message, RevertContext calldata revertContext ) external diff --git a/v2/src/zevm/interfaces/IGatewayZEVM.sol b/v2/src/zevm/interfaces/IGatewayZEVM.sol index 7dd3675b..fb848fd1 100644 --- a/v2/src/zevm/interfaces/IGatewayZEVM.sol +++ b/v2/src/zevm/interfaces/IGatewayZEVM.sol @@ -12,9 +12,15 @@ interface IGatewayZEVMEvents { /// @param zrc20 Address of zrc20 to pay fees. /// @param receiver The receiver address on the external chain. /// @param message The calldata passed to the contract call. + /// @param gasLimit Gas limit. /// @param revertOptions Revert options. event Called( - address indexed sender, address indexed zrc20, bytes receiver, bytes message, RevertOptions revertOptions + address indexed sender, + address indexed zrc20, + bytes receiver, + bytes message, + uint256 gasLimit, + RevertOptions revertOptions ); /// @notice Emitted when a withdrawal is made. @@ -26,6 +32,7 @@ interface IGatewayZEVMEvents { /// @param gasfee The gas fee for the withdrawal. /// @param protocolFlatFee The protocol flat fee for the withdrawal. /// @param message The calldata passed to the contract call. + /// @param gasLimit Gas limit. /// @param revertOptions Revert options. event Withdrawn( address indexed sender, @@ -36,6 +43,7 @@ interface IGatewayZEVMEvents { uint256 gasfee, uint256 protocolFlatFee, bytes message, + uint256 gasLimit, RevertOptions revertOptions ); } @@ -206,35 +214,19 @@ interface IGatewayZEVM is IGatewayZEVMErrors, IGatewayZEVMEvents { external; /// @notice Revert a user-specified contract on ZEVM. - /// @param context The context of the revert call. - /// @param zrc20 The address of the ZRC20 token. - /// @param amount The amount of tokens to revert. /// @param target The target contract to call. - /// @param message The calldata to pass to the contract call. /// @param revertContext Revert context to pass to onRevert. - function executeRevert( - zContext calldata context, - address zrc20, - uint256 amount, - address target, - bytes calldata message, - RevertContext calldata revertContext - ) - external; + function executeRevert(address target, RevertContext calldata revertContext) external; /// @notice Deposit foreign coins into ZRC20 and revert a user-specified contract on ZEVM. - /// @param context The context of the revert call. /// @param zrc20 The address of the ZRC20 token. /// @param amount The amount of tokens to revert. /// @param target The target contract to call. - /// @param message The calldata to pass to the contract call. /// @param revertContext Revert context to pass to onRevert. function depositAndRevert( - zContext calldata context, address zrc20, uint256 amount, address target, - bytes calldata message, RevertContext calldata revertContext ) external; diff --git a/v2/test/GatewayEVMZEVM.t.sol b/v2/test/GatewayEVMZEVM.t.sol index 7e80b885..7cc4ca79 100644 --- a/v2/test/GatewayEVMZEVM.t.sol +++ b/v2/test/GatewayEVMZEVM.t.sol @@ -134,7 +134,7 @@ contract GatewayEVMZEVMTest is bytes memory message = abi.encodeWithSelector(receiverEVM.receivePayable.selector, str, num, flag); vm.prank(ownerZEVM); vm.expectEmit(true, true, true, true, address(gatewayZEVM)); - emit Called(address(ownerZEVM), address(zrc20), abi.encodePacked(receiverEVM), message, revertOptions); + emit Called(address(ownerZEVM), address(zrc20), abi.encodePacked(receiverEVM), message, 1, revertOptions); gatewayZEVM.call(abi.encodePacked(receiverEVM), address(zrc20), message, 1, revertOptions); // Call execute on evm @@ -194,6 +194,7 @@ contract GatewayEVMZEVMTest is expectedGasFee, zrc20.PROTOCOL_FLAT_FEE(), message, + 1, revertOptions ); vm.prank(ownerZEVM); diff --git a/v2/test/GatewayZEVM.t.sol b/v2/test/GatewayZEVM.t.sol index c3756fb2..dee200c3 100644 --- a/v2/test/GatewayZEVM.t.sol +++ b/v2/test/GatewayZEVM.t.sol @@ -78,7 +78,16 @@ contract GatewayZEVMInboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors vm.expectEmit(true, true, true, true, address(gateway)); emit Withdrawn( - owner, 0, abi.encodePacked(addr1), address(zrc20), amount, 0, zrc20.PROTOCOL_FLAT_FEE(), "", revertOptions + owner, + 0, + abi.encodePacked(addr1), + address(zrc20), + amount, + 0, + zrc20.PROTOCOL_FLAT_FEE(), + "", + 0, + revertOptions ); gateway.withdraw(abi.encodePacked(addr1), amount, address(zrc20), revertOptions); @@ -179,6 +188,7 @@ contract GatewayZEVMInboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors expectedGasFee, zrc20.PROTOCOL_FLAT_FEE(), message, + gasLimit, revertOptions ); gateway.withdrawAndCall(abi.encodePacked(addr1), amount, address(zrc20), message, gasLimit, revertOptions); @@ -217,7 +227,7 @@ contract GatewayZEVMInboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors uint256 chainId = 1; vm.expectEmit(true, true, true, true, address(gateway)); - emit Withdrawn(owner, chainId, abi.encodePacked(addr1), address(zetaToken), amount, 0, 0, "", revertOptions); + emit Withdrawn(owner, chainId, abi.encodePacked(addr1), address(zetaToken), amount, 0, 0, "", 0, revertOptions); gateway.withdraw(abi.encodePacked(addr1), amount, chainId, revertOptions); uint256 ownerBalanceAfter = zetaToken.balanceOf(owner); @@ -274,7 +284,7 @@ contract GatewayZEVMInboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors vm.expectEmit(true, true, true, true, address(gateway)); emit Withdrawn( - owner, chainId, abi.encodePacked(addr1), address(zetaToken), amount, 0, 0, message, revertOptions + owner, chainId, abi.encodePacked(addr1), address(zetaToken), amount, 0, 0, message, 0, revertOptions ); gateway.withdrawAndCall(abi.encodePacked(addr1), amount, chainId, message, revertOptions); @@ -323,7 +333,7 @@ contract GatewayZEVMInboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors bytes memory message = abi.encodeWithSignature("hello(address)", addr1); vm.expectEmit(true, true, true, true, address(gateway)); - emit Called(owner, address(zrc20), abi.encodePacked(addr1), message, revertOptions); + emit Called(owner, address(zrc20), abi.encodePacked(addr1), message, 1, revertOptions); gateway.call(abi.encodePacked(addr1), address(zrc20), message, 1, revertOptions); } } @@ -496,16 +506,6 @@ contract GatewayZEVMOutboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors gateway.execute(context, address(zrc20), 1, address(0), message); } - function testExecuteFailsIfAmountIsZero() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - - vm.prank(fungibleModule); - vm.expectRevert(InsufficientZRC20Amount.selector); - gateway.execute(context, address(zrc20), 0, address(testUniversalContract), message); - } - function testExecuteUniversalContractFailsIfZeroAddress() public { bytes memory message = abi.encode("hello"); zContext memory context = @@ -537,75 +537,23 @@ contract GatewayZEVMOutboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors gateway.execute(context, address(zrc20), 1, address(testUniversalContract), message); } - function testExecuteRevertUniversalContractFailsIfZrc20IsZeroAddress() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - - vm.prank(fungibleModule); - vm.expectRevert(ZeroAddress.selector); - gateway.executeRevert(context, address(0), 1, address(testUniversalContract), message, revertContext); - } - function testExecuteRevertUniversalContractFailsIfTargetIsZeroAddress() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - - vm.prank(fungibleModule); - vm.expectRevert(ZeroAddress.selector); - gateway.executeRevert(context, address(zrc20), 1, address(0), message, revertContext); - } - - function testExecuteRevertUniversalContractFailsIfAmountIsZero() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - - vm.prank(fungibleModule); - vm.expectRevert(InsufficientZRC20Amount.selector); - gateway.executeRevert(context, address(zrc20), 0, address(testUniversalContract), message, revertContext); - } - - function testExecuteRevertUniversalContractFailsIfZeroAddress() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.prank(fungibleModule); vm.expectRevert(ZeroAddress.selector); - gateway.executeRevert(context, address(0), 1, address(testUniversalContract), message, revertContext); - } - - function testExecuteRevertUniversalContractFailsIfZRC20IsZeroAddress() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - - vm.prank(fungibleModule); - vm.expectRevert(ZeroAddress.selector); - gateway.executeRevert(context, address(0), 1, address(testUniversalContract), message, revertContext); + gateway.executeRevert(address(0), revertContext); } function testExecuteRevertUniversalContract() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.expectEmit(true, true, true, true, address(testUniversalContract)); emit ContextDataRevert(revertContext); vm.prank(fungibleModule); - gateway.executeRevert(context, address(zrc20), 1, address(testUniversalContract), message, revertContext); + gateway.executeRevert(address(testUniversalContract), revertContext); } function testExecuteRevertUniversalContractIfSenderIsNotFungibleModule() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.expectRevert(CallerIsNotFungibleModule.selector); vm.prank(owner); - gateway.executeRevert(context, address(zrc20), 1, address(testUniversalContract), message, revertContext); + gateway.executeRevert(address(testUniversalContract), revertContext); } function testDepositZRC20AndCallUniversalContractFailsIfZRC20IsZeroAddress() public { @@ -686,80 +634,52 @@ contract GatewayZEVMOutboundTest is Test, IGatewayZEVMEvents, IGatewayZEVMErrors } function testDepositAndRevertZRC20AndCallUniversalContractFailsIfZRC20IsZeroAddress() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.prank(fungibleModule); vm.expectRevert(ZeroAddress.selector); - gateway.depositAndRevert(context, address(0), 1, address(testUniversalContract), message, revertContext); + gateway.depositAndRevert(address(0), 1, address(testUniversalContract), revertContext); } function testDepositAndRevertZRC20AndCallUniversalContractFailsIfTargetIsZeroAddress() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.prank(fungibleModule); vm.expectRevert(ZeroAddress.selector); - gateway.depositAndRevert(context, address(zrc20), 1, address(0), message, revertContext); + gateway.depositAndRevert(address(zrc20), 1, address(0), revertContext); } function testDepositAndRevertZRC20AndCallUniversalContractFailsIfAmountIsZero() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.prank(fungibleModule); vm.expectRevert(InsufficientZRC20Amount.selector); - gateway.depositAndRevert(context, address(zrc20), 0, address(testUniversalContract), message, revertContext); + gateway.depositAndRevert(address(zrc20), 0, address(testUniversalContract), revertContext); } function testDepositAndRevertZRC20AndCallUniversalContract() public { uint256 balanceBefore = zrc20.balanceOf(address(testUniversalContract)); assertEq(0, balanceBefore); - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.expectEmit(true, true, true, true, address(testUniversalContract)); emit ContextDataRevert(revertContext); vm.prank(fungibleModule); - gateway.depositAndRevert(context, address(zrc20), 1, address(testUniversalContract), message, revertContext); + gateway.depositAndRevert(address(zrc20), 1, address(testUniversalContract), revertContext); uint256 balanceAfter = zrc20.balanceOf(address(testUniversalContract)); assertEq(1, balanceAfter); } function testDepositAndRevertZRC20AndCallUniversalContractFailsIfSenderIsNotFungibleModule() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.expectRevert(CallerIsNotFungibleModule.selector); vm.prank(owner); - gateway.depositAndRevert(context, address(zrc20), 1, address(testUniversalContract), message, revertContext); + gateway.depositAndRevert(address(zrc20), 1, address(testUniversalContract), revertContext); } function testDepositAndRevertZRC20AndCallUniversalContractFailsITargetIsFungibleModule() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.expectRevert(InvalidTarget.selector); vm.prank(fungibleModule); - gateway.depositAndRevert(context, address(zrc20), 1, fungibleModule, message, revertContext); + gateway.depositAndRevert(address(zrc20), 1, fungibleModule, revertContext); } function testDepositAndRevertZRC20AndCallUniversalContractFailsITargetIsGateway() public { - bytes memory message = abi.encode("hello"); - zContext memory context = - zContext({ origin: abi.encodePacked(address(gateway)), sender: fungibleModule, chainID: 1 }); - vm.expectRevert(InvalidTarget.selector); vm.prank(fungibleModule); - gateway.depositAndRevert(context, address(zrc20), 1, address(gateway), message, revertContext); + gateway.depositAndRevert(address(zrc20), 1, address(gateway), revertContext); } function testDepositZETAAndCallUniversalContractFailsIfTargetIsZeroAddress() public { diff --git a/v2/types/ERC20Custody.ts b/v2/types/ERC20Custody.ts index 6f4845ed..2d04b016 100644 --- a/v2/types/ERC20Custody.ts +++ b/v2/types/ERC20Custody.ts @@ -23,11 +23,24 @@ import type { TypedContractMethod, } from "./common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface ERC20CustodyInterface extends Interface { getFunction( nameOrSignature: | "DEFAULT_ADMIN_ROLE" | "PAUSER_ROLE" + | "WHITELISTER_ROLE" | "WITHDRAWER_ROLE" | "gateway" | "getRoleAdmin" @@ -39,6 +52,9 @@ export interface ERC20CustodyInterface extends Interface { | "revokeRole" | "supportsInterface" | "unpause" + | "unwhitelist" + | "whitelist" + | "whitelisted" | "withdraw" | "withdrawAndCall" | "withdrawAndRevert" @@ -51,9 +67,11 @@ export interface ERC20CustodyInterface extends Interface { | "RoleGranted" | "RoleRevoked" | "Unpaused" - | "Withdraw" - | "WithdrawAndCall" - | "WithdrawAndRevert" + | "Unwhitelisted" + | "Whitelisted" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; encodeFunctionData( @@ -64,6 +82,10 @@ export interface ERC20CustodyInterface extends Interface { functionFragment: "PAUSER_ROLE", values?: undefined ): string; + encodeFunctionData( + functionFragment: "WHITELISTER_ROLE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "WITHDRAWER_ROLE", values?: undefined @@ -96,6 +118,18 @@ export interface ERC20CustodyInterface extends Interface { values: [BytesLike] ): string; encodeFunctionData(functionFragment: "unpause", values?: undefined): string; + encodeFunctionData( + functionFragment: "unwhitelist", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "whitelist", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "whitelisted", + values: [AddressLike] + ): string; encodeFunctionData( functionFragment: "withdraw", values: [AddressLike, AddressLike, BigNumberish] @@ -106,7 +140,13 @@ export interface ERC20CustodyInterface extends Interface { ): string; encodeFunctionData( functionFragment: "withdrawAndRevert", - values: [AddressLike, AddressLike, BigNumberish, BytesLike] + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] ): string; decodeFunctionResult( @@ -117,6 +157,10 @@ export interface ERC20CustodyInterface extends Interface { functionFragment: "PAUSER_ROLE", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "WHITELISTER_ROLE", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "WITHDRAWER_ROLE", data: BytesLike @@ -140,6 +184,15 @@ export interface ERC20CustodyInterface extends Interface { data: BytesLike ): Result; decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "unwhitelist", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "whitelist", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "whitelisted", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; decodeFunctionResult( functionFragment: "withdrawAndCall", @@ -233,16 +286,40 @@ export namespace UnpausedEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawEvent { +export namespace UnwhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish ]; - export type OutputTuple = [token: string, to: string, amount: bigint]; + export type OutputTuple = [to: string, token: string, amount: bigint]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; } export type Event = TypedContractEvent; @@ -251,22 +328,22 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, data: string ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; } @@ -276,24 +353,27 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -348,6 +428,8 @@ export interface ERC20Custody extends BaseContract { PAUSER_ROLE: TypedContractMethod<[], [string], "view">; + WHITELISTER_ROLE: TypedContractMethod<[], [string], "view">; + WITHDRAWER_ROLE: TypedContractMethod<[], [string], "view">; gateway: TypedContractMethod<[], [string], "view">; @@ -390,16 +472,22 @@ export interface ERC20Custody extends BaseContract { unpause: TypedContractMethod<[], [void], "nonpayable">; + unwhitelist: TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + + whitelist: TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + + whitelisted: TypedContractMethod<[arg0: AddressLike], [boolean], "view">; + withdraw: TypedContractMethod< - [token: AddressLike, to: AddressLike, amount: BigNumberish], + [to: AddressLike, token: AddressLike, amount: BigNumberish], [void], "nonpayable" >; withdrawAndCall: TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ], @@ -409,10 +497,11 @@ export interface ERC20Custody extends BaseContract { withdrawAndRevert: TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -428,6 +517,9 @@ export interface ERC20Custody extends BaseContract { getFunction( nameOrSignature: "PAUSER_ROLE" ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "WHITELISTER_ROLE" + ): TypedContractMethod<[], [string], "view">; getFunction( nameOrSignature: "WITHDRAWER_ROLE" ): TypedContractMethod<[], [string], "view">; @@ -477,10 +569,19 @@ export interface ERC20Custody extends BaseContract { getFunction( nameOrSignature: "unpause" ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "unwhitelist" + ): TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "whitelist" + ): TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "whitelisted" + ): TypedContractMethod<[arg0: AddressLike], [boolean], "view">; getFunction( nameOrSignature: "withdraw" ): TypedContractMethod< - [token: AddressLike, to: AddressLike, amount: BigNumberish], + [to: AddressLike, token: AddressLike, amount: BigNumberish], [void], "nonpayable" >; @@ -488,8 +589,8 @@ export interface ERC20Custody extends BaseContract { nameOrSignature: "withdrawAndCall" ): TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ], @@ -500,10 +601,11 @@ export interface ERC20Custody extends BaseContract { nameOrSignature: "withdrawAndRevert" ): TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -545,25 +647,39 @@ export interface ERC20Custody extends BaseContract { UnpausedEvent.OutputObject >; getEvent( - key: "Withdraw" + key: "Unwhitelisted" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "Whitelisted" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "Withdrawn" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndCalled" + ): TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndReverted" + ): TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { @@ -622,37 +738,59 @@ export interface ERC20Custody extends BaseContract { UnpausedEvent.OutputObject >; - "Withdraw(address,address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Unwhitelisted(address)": TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + Unwhitelisted: TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + + "Whitelisted(address)": TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + Whitelisted: TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + + "Withdrawn(address,address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/ERC20CustodyEchidnaTest.ts b/v2/types/ERC20CustodyEchidnaTest.ts index a0bd66ef..3c4238bf 100644 --- a/v2/types/ERC20CustodyEchidnaTest.ts +++ b/v2/types/ERC20CustodyEchidnaTest.ts @@ -23,11 +23,24 @@ import type { TypedContractMethod, } from "./common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface ERC20CustodyEchidnaTestInterface extends Interface { getFunction( nameOrSignature: | "DEFAULT_ADMIN_ROLE" | "PAUSER_ROLE" + | "WHITELISTER_ROLE" | "WITHDRAWER_ROLE" | "echidnaCaller" | "gateway" @@ -42,6 +55,9 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { | "testERC20" | "testWithdrawAndCall" | "unpause" + | "unwhitelist" + | "whitelist" + | "whitelisted" | "withdraw" | "withdrawAndCall" | "withdrawAndRevert" @@ -54,9 +70,11 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { | "RoleGranted" | "RoleRevoked" | "Unpaused" - | "Withdraw" - | "WithdrawAndCall" - | "WithdrawAndRevert" + | "Unwhitelisted" + | "Whitelisted" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; encodeFunctionData( @@ -67,6 +85,10 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { functionFragment: "PAUSER_ROLE", values?: undefined ): string; + encodeFunctionData( + functionFragment: "WHITELISTER_ROLE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "WITHDRAWER_ROLE", values?: undefined @@ -108,6 +130,18 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { values: [AddressLike, BigNumberish, BytesLike] ): string; encodeFunctionData(functionFragment: "unpause", values?: undefined): string; + encodeFunctionData( + functionFragment: "unwhitelist", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "whitelist", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "whitelisted", + values: [AddressLike] + ): string; encodeFunctionData( functionFragment: "withdraw", values: [AddressLike, AddressLike, BigNumberish] @@ -118,7 +152,13 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "withdrawAndRevert", - values: [AddressLike, AddressLike, BigNumberish, BytesLike] + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] ): string; decodeFunctionResult( @@ -129,6 +169,10 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { functionFragment: "PAUSER_ROLE", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "WHITELISTER_ROLE", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "WITHDRAWER_ROLE", data: BytesLike @@ -161,6 +205,15 @@ export interface ERC20CustodyEchidnaTestInterface extends Interface { data: BytesLike ): Result; decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "unwhitelist", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "whitelist", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "whitelisted", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; decodeFunctionResult( functionFragment: "withdrawAndCall", @@ -254,16 +307,40 @@ export namespace UnpausedEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawEvent { +export namespace UnwhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish ]; - export type OutputTuple = [token: string, to: string, amount: bigint]; + export type OutputTuple = [to: string, token: string, amount: bigint]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; } export type Event = TypedContractEvent; @@ -272,22 +349,22 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, data: string ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; } @@ -297,24 +374,27 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -369,6 +449,8 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { PAUSER_ROLE: TypedContractMethod<[], [string], "view">; + WHITELISTER_ROLE: TypedContractMethod<[], [string], "view">; + WITHDRAWER_ROLE: TypedContractMethod<[], [string], "view">; echidnaCaller: TypedContractMethod<[], [string], "view">; @@ -421,16 +503,22 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { unpause: TypedContractMethod<[], [void], "nonpayable">; + unwhitelist: TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + + whitelist: TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + + whitelisted: TypedContractMethod<[arg0: AddressLike], [boolean], "view">; + withdraw: TypedContractMethod< - [token: AddressLike, to: AddressLike, amount: BigNumberish], + [to: AddressLike, token: AddressLike, amount: BigNumberish], [void], "nonpayable" >; withdrawAndCall: TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ], @@ -440,10 +528,11 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { withdrawAndRevert: TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -459,6 +548,9 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { getFunction( nameOrSignature: "PAUSER_ROLE" ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "WHITELISTER_ROLE" + ): TypedContractMethod<[], [string], "view">; getFunction( nameOrSignature: "WITHDRAWER_ROLE" ): TypedContractMethod<[], [string], "view">; @@ -521,10 +613,19 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { getFunction( nameOrSignature: "unpause" ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "unwhitelist" + ): TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "whitelist" + ): TypedContractMethod<[token: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "whitelisted" + ): TypedContractMethod<[arg0: AddressLike], [boolean], "view">; getFunction( nameOrSignature: "withdraw" ): TypedContractMethod< - [token: AddressLike, to: AddressLike, amount: BigNumberish], + [to: AddressLike, token: AddressLike, amount: BigNumberish], [void], "nonpayable" >; @@ -532,8 +633,8 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { nameOrSignature: "withdrawAndCall" ): TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ], @@ -544,10 +645,11 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { nameOrSignature: "withdrawAndRevert" ): TypedContractMethod< [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -589,25 +691,39 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { UnpausedEvent.OutputObject >; getEvent( - key: "Withdraw" + key: "Unwhitelisted" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "Whitelisted" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "Withdrawn" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndCalled" + ): TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndReverted" + ): TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { @@ -666,37 +782,59 @@ export interface ERC20CustodyEchidnaTest extends BaseContract { UnpausedEvent.OutputObject >; - "Withdraw(address,address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Unwhitelisted(address)": TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + Unwhitelisted: TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + + "Whitelisted(address)": TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + Whitelisted: TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + + "Withdrawn(address,address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/GatewayEVM.ts b/v2/types/GatewayEVM.ts index a22537b1..c52e9853 100644 --- a/v2/types/GatewayEVM.ts +++ b/v2/types/GatewayEVM.ts @@ -23,6 +23,37 @@ import type { TypedContractMethod, } from "./common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface GatewayEVMInterface extends Interface { getFunction( nameOrSignature: @@ -33,10 +64,10 @@ export interface GatewayEVMInterface extends Interface { | "UPGRADE_INTERFACE_VERSION" | "call" | "custody" - | "deposit(address)" - | "deposit(address,uint256,address)" - | "depositAndCall(address,bytes)" - | "depositAndCall(address,uint256,address,bytes)" + | "deposit(address,uint256,address,(address,bool,address,bytes))" + | "deposit(address,(address,bool,address,bytes))" + | "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" + | "depositAndCall(address,bytes,(address,bool,address,bytes))" | "execute" | "executeRevert" | "executeWithERC20" @@ -62,14 +93,13 @@ export interface GatewayEVMInterface extends Interface { getEvent( nameOrSignatureOrTopic: - | "Call" - | "Deposit" + | "Called" + | "Deposited" | "Executed" | "ExecutedWithERC20" | "Initialized" | "Paused" | "Reverted" - | "RevertedWithERC20" | "RoleAdminChanged" | "RoleGranted" | "RoleRevoked" @@ -96,24 +126,30 @@ export interface GatewayEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "call", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData(functionFragment: "custody", values?: undefined): string; encodeFunctionData( - functionFragment: "deposit(address)", - values: [AddressLike] + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", + values: [AddressLike, BigNumberish, AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "deposit(address,uint256,address)", - values: [AddressLike, BigNumberish, AddressLike] + functionFragment: "deposit(address,(address,bool,address,bytes))", + values: [AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,bytes)", - values: [AddressLike, BytesLike] + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", + values: [ + AddressLike, + BigNumberish, + AddressLike, + BytesLike, + RevertOptionsStruct + ] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,uint256,address,bytes)", - values: [AddressLike, BigNumberish, AddressLike, BytesLike] + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData( functionFragment: "execute", @@ -121,7 +157,7 @@ export interface GatewayEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "executeRevert", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "executeWithERC20", @@ -155,7 +191,13 @@ export interface GatewayEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "revertWithERC20", - values: [AddressLike, AddressLike, BigNumberish, BytesLike] + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] ): string; encodeFunctionData( functionFragment: "revokeRole", @@ -208,19 +250,19 @@ export interface GatewayEVMInterface extends Interface { decodeFunctionResult(functionFragment: "call", data: BytesLike): Result; decodeFunctionResult(functionFragment: "custody", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "deposit(address)", + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "deposit(address,uint256,address)", + functionFragment: "deposit(address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,bytes)", + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,uint256,address,bytes)", + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult(functionFragment: "execute", data: BytesLike): Result; @@ -276,17 +318,24 @@ export interface GatewayEVMInterface extends Interface { decodeFunctionResult(functionFragment: "zetaToken", data: BytesLike): Result; } -export namespace CallEvent { +export namespace CalledEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + receiver: string, + payload: string, + revertOptions: RevertOptionsStructOutput ]; - export type OutputTuple = [sender: string, receiver: string, payload: string]; export interface OutputObject { sender: string; receiver: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -294,20 +343,22 @@ export namespace CallEvent { export type LogDescription = TypedLogDescription; } -export namespace DepositEvent { +export namespace DepositedEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, receiver: string, amount: bigint, asset: string, - payload: string + payload: string, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; @@ -315,6 +366,7 @@ export namespace DepositEvent { amount: bigint; asset: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -391,40 +443,25 @@ export namespace PausedEvent { export namespace RevertedEvent { export type InputTuple = [ - destination: AddressLike, - value: BigNumberish, - data: BytesLike - ]; - export type OutputTuple = [destination: string, value: bigint, data: string]; - export interface OutputObject { - destination: string; - value: bigint; - data: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RevertedWithERC20Event { - export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -568,42 +605,56 @@ export interface GatewayEVM extends BaseContract { UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; call: TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; custody: TypedContractMethod<[], [string], "view">; - "deposit(address)": TypedContractMethod< - [receiver: AddressLike], - [void], - "payable" - >; - - "deposit(address,uint256,address)": TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + "deposit(address,uint256,address,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "depositAndCall(address,bytes)": TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + "deposit(address,(address,bool,address,bytes))": TypedContractMethod< + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; - "depositAndCall(address,uint256,address,bytes)": TypedContractMethod< + "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))": TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + "depositAndCall(address,bytes,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; + execute: TypedContractMethod< [destination: AddressLike, data: BytesLike], [string], @@ -611,7 +662,11 @@ export interface GatewayEVM extends BaseContract { >; executeRevert: TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -664,7 +719,8 @@ export interface GatewayEVM extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -730,7 +786,11 @@ export interface GatewayEVM extends BaseContract { getFunction( nameOrSignature: "call" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -738,34 +798,48 @@ export interface GatewayEVM extends BaseContract { nameOrSignature: "custody" ): TypedContractMethod<[], [string], "view">; getFunction( - nameOrSignature: "deposit(address)" - ): TypedContractMethod<[receiver: AddressLike], [void], "payable">; - getFunction( - nameOrSignature: "deposit(address,uint256,address)" + nameOrSignature: "deposit(address,uint256,address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "depositAndCall(address,bytes)" + nameOrSignature: "deposit(address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; getFunction( - nameOrSignature: "depositAndCall(address,uint256,address,bytes)" + nameOrSignature: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" ): TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + getFunction( + nameOrSignature: "depositAndCall(address,bytes,(address,bool,address,bytes))" + ): TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; getFunction( nameOrSignature: "execute" ): TypedContractMethod< @@ -776,7 +850,11 @@ export interface GatewayEVM extends BaseContract { getFunction( nameOrSignature: "executeRevert" ): TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -839,7 +917,8 @@ export interface GatewayEVM extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -881,18 +960,18 @@ export interface GatewayEVM extends BaseContract { ): TypedContractMethod<[], [string], "view">; getEvent( - key: "Call" + key: "Called" ): TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; getEvent( - key: "Deposit" + key: "Deposited" ): TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; getEvent( key: "Executed" @@ -929,13 +1008,6 @@ export interface GatewayEVM extends BaseContract { RevertedEvent.OutputTuple, RevertedEvent.OutputObject >; - getEvent( - key: "RevertedWithERC20" - ): TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; getEvent( key: "RoleAdminChanged" ): TypedContractEvent< @@ -973,26 +1045,26 @@ export interface GatewayEVM extends BaseContract { >; filters: { - "Call(address,address,bytes)": TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + "Called(address,address,bytes,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - Call: TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - "Deposit(address,address,uint256,address,bytes)": TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + "Deposited(address,address,uint256,address,bytes,tuple)": TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; - Deposit: TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + Deposited: TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; "Executed(address,uint256,bytes)": TypedContractEvent< @@ -1039,7 +1111,7 @@ export interface GatewayEVM extends BaseContract { PausedEvent.OutputObject >; - "Reverted(address,uint256,bytes)": TypedContractEvent< + "Reverted(address,address,uint256,bytes,tuple)": TypedContractEvent< RevertedEvent.InputTuple, RevertedEvent.OutputTuple, RevertedEvent.OutputObject @@ -1050,17 +1122,6 @@ export interface GatewayEVM extends BaseContract { RevertedEvent.OutputObject >; - "RevertedWithERC20(address,address,uint256,bytes)": TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - RevertedWithERC20: TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent< RoleAdminChangedEvent.InputTuple, RoleAdminChangedEvent.OutputTuple, diff --git a/v2/types/GatewayEVMEchidnaTest.ts b/v2/types/GatewayEVMEchidnaTest.ts index 9ee32cd7..d16fd44c 100644 --- a/v2/types/GatewayEVMEchidnaTest.ts +++ b/v2/types/GatewayEVMEchidnaTest.ts @@ -23,6 +23,37 @@ import type { TypedContractMethod, } from "./common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface GatewayEVMEchidnaTestInterface extends Interface { getFunction( nameOrSignature: @@ -33,10 +64,10 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { | "UPGRADE_INTERFACE_VERSION" | "call" | "custody" - | "deposit(address)" - | "deposit(address,uint256,address)" - | "depositAndCall(address,bytes)" - | "depositAndCall(address,uint256,address,bytes)" + | "deposit(address,uint256,address,(address,bool,address,bytes))" + | "deposit(address,(address,bool,address,bytes))" + | "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" + | "depositAndCall(address,bytes,(address,bool,address,bytes))" | "echidnaCaller" | "execute" | "executeRevert" @@ -65,14 +96,13 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { getEvent( nameOrSignatureOrTopic: - | "Call" - | "Deposit" + | "Called" + | "Deposited" | "Executed" | "ExecutedWithERC20" | "Initialized" | "Paused" | "Reverted" - | "RevertedWithERC20" | "RoleAdminChanged" | "RoleGranted" | "RoleRevoked" @@ -99,24 +129,30 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "call", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData(functionFragment: "custody", values?: undefined): string; encodeFunctionData( - functionFragment: "deposit(address)", - values: [AddressLike] + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", + values: [AddressLike, BigNumberish, AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "deposit(address,uint256,address)", - values: [AddressLike, BigNumberish, AddressLike] + functionFragment: "deposit(address,(address,bool,address,bytes))", + values: [AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,bytes)", - values: [AddressLike, BytesLike] + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", + values: [ + AddressLike, + BigNumberish, + AddressLike, + BytesLike, + RevertOptionsStruct + ] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,uint256,address,bytes)", - values: [AddressLike, BigNumberish, AddressLike, BytesLike] + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData( functionFragment: "echidnaCaller", @@ -128,7 +164,7 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "executeRevert", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "executeWithERC20", @@ -162,7 +198,13 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "revertWithERC20", - values: [AddressLike, AddressLike, BigNumberish, BytesLike] + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] ): string; encodeFunctionData( functionFragment: "revokeRole", @@ -220,19 +262,19 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { decodeFunctionResult(functionFragment: "call", data: BytesLike): Result; decodeFunctionResult(functionFragment: "custody", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "deposit(address)", + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "deposit(address,uint256,address)", + functionFragment: "deposit(address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,bytes)", + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,uint256,address,bytes)", + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( @@ -297,17 +339,24 @@ export interface GatewayEVMEchidnaTestInterface extends Interface { decodeFunctionResult(functionFragment: "zetaToken", data: BytesLike): Result; } -export namespace CallEvent { +export namespace CalledEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + receiver: string, + payload: string, + revertOptions: RevertOptionsStructOutput ]; - export type OutputTuple = [sender: string, receiver: string, payload: string]; export interface OutputObject { sender: string; receiver: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -315,20 +364,22 @@ export namespace CallEvent { export type LogDescription = TypedLogDescription; } -export namespace DepositEvent { +export namespace DepositedEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, receiver: string, amount: bigint, asset: string, - payload: string + payload: string, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; @@ -336,6 +387,7 @@ export namespace DepositEvent { amount: bigint; asset: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -412,40 +464,25 @@ export namespace PausedEvent { export namespace RevertedEvent { export type InputTuple = [ - destination: AddressLike, - value: BigNumberish, - data: BytesLike - ]; - export type OutputTuple = [destination: string, value: bigint, data: string]; - export interface OutputObject { - destination: string; - value: bigint; - data: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RevertedWithERC20Event { - export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -589,42 +626,56 @@ export interface GatewayEVMEchidnaTest extends BaseContract { UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; call: TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; custody: TypedContractMethod<[], [string], "view">; - "deposit(address)": TypedContractMethod< - [receiver: AddressLike], - [void], - "payable" - >; - - "deposit(address,uint256,address)": TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + "deposit(address,uint256,address,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "depositAndCall(address,bytes)": TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + "deposit(address,(address,bool,address,bytes))": TypedContractMethod< + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; - "depositAndCall(address,uint256,address,bytes)": TypedContractMethod< + "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))": TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + "depositAndCall(address,bytes,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; + echidnaCaller: TypedContractMethod<[], [string], "view">; execute: TypedContractMethod< @@ -634,7 +685,11 @@ export interface GatewayEVMEchidnaTest extends BaseContract { >; executeRevert: TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -687,7 +742,8 @@ export interface GatewayEVMEchidnaTest extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -761,7 +817,11 @@ export interface GatewayEVMEchidnaTest extends BaseContract { getFunction( nameOrSignature: "call" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -769,34 +829,48 @@ export interface GatewayEVMEchidnaTest extends BaseContract { nameOrSignature: "custody" ): TypedContractMethod<[], [string], "view">; getFunction( - nameOrSignature: "deposit(address)" - ): TypedContractMethod<[receiver: AddressLike], [void], "payable">; - getFunction( - nameOrSignature: "deposit(address,uint256,address)" + nameOrSignature: "deposit(address,uint256,address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "depositAndCall(address,bytes)" + nameOrSignature: "deposit(address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; getFunction( - nameOrSignature: "depositAndCall(address,uint256,address,bytes)" + nameOrSignature: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" ): TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + getFunction( + nameOrSignature: "depositAndCall(address,bytes,(address,bool,address,bytes))" + ): TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; getFunction( nameOrSignature: "echidnaCaller" ): TypedContractMethod<[], [string], "view">; @@ -810,7 +884,11 @@ export interface GatewayEVMEchidnaTest extends BaseContract { getFunction( nameOrSignature: "executeRevert" ): TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -873,7 +951,8 @@ export interface GatewayEVMEchidnaTest extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -925,18 +1004,18 @@ export interface GatewayEVMEchidnaTest extends BaseContract { ): TypedContractMethod<[], [string], "view">; getEvent( - key: "Call" + key: "Called" ): TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; getEvent( - key: "Deposit" + key: "Deposited" ): TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; getEvent( key: "Executed" @@ -973,13 +1052,6 @@ export interface GatewayEVMEchidnaTest extends BaseContract { RevertedEvent.OutputTuple, RevertedEvent.OutputObject >; - getEvent( - key: "RevertedWithERC20" - ): TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; getEvent( key: "RoleAdminChanged" ): TypedContractEvent< @@ -1017,26 +1089,26 @@ export interface GatewayEVMEchidnaTest extends BaseContract { >; filters: { - "Call(address,address,bytes)": TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + "Called(address,address,bytes,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - Call: TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - "Deposit(address,address,uint256,address,bytes)": TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + "Deposited(address,address,uint256,address,bytes,tuple)": TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; - Deposit: TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + Deposited: TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; "Executed(address,uint256,bytes)": TypedContractEvent< @@ -1083,7 +1155,7 @@ export interface GatewayEVMEchidnaTest extends BaseContract { PausedEvent.OutputObject >; - "Reverted(address,uint256,bytes)": TypedContractEvent< + "Reverted(address,address,uint256,bytes,tuple)": TypedContractEvent< RevertedEvent.InputTuple, RevertedEvent.OutputTuple, RevertedEvent.OutputObject @@ -1094,17 +1166,6 @@ export interface GatewayEVMEchidnaTest extends BaseContract { RevertedEvent.OutputObject >; - "RevertedWithERC20(address,address,uint256,bytes)": TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - RevertedWithERC20: TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent< RoleAdminChangedEvent.InputTuple, RoleAdminChangedEvent.OutputTuple, diff --git a/v2/types/GatewayEVMUpgradeTest.ts b/v2/types/GatewayEVMUpgradeTest.ts index c1bb34cb..3675ce3a 100644 --- a/v2/types/GatewayEVMUpgradeTest.ts +++ b/v2/types/GatewayEVMUpgradeTest.ts @@ -23,6 +23,37 @@ import type { TypedContractMethod, } from "./common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface GatewayEVMUpgradeTestInterface extends Interface { getFunction( nameOrSignature: @@ -33,10 +64,10 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { | "UPGRADE_INTERFACE_VERSION" | "call" | "custody" - | "deposit(address)" - | "deposit(address,uint256,address)" - | "depositAndCall(address,bytes)" - | "depositAndCall(address,uint256,address,bytes)" + | "deposit(address,uint256,address,(address,bool,address,bytes))" + | "deposit(address,(address,bool,address,bytes))" + | "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" + | "depositAndCall(address,bytes,(address,bool,address,bytes))" | "execute" | "executeRevert" | "executeWithERC20" @@ -62,15 +93,14 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { getEvent( nameOrSignatureOrTopic: - | "Call" - | "Deposit" + | "Called" + | "Deposited" | "Executed" | "ExecutedV2" | "ExecutedWithERC20" | "Initialized" | "Paused" | "Reverted" - | "RevertedWithERC20" | "RoleAdminChanged" | "RoleGranted" | "RoleRevoked" @@ -97,24 +127,30 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "call", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData(functionFragment: "custody", values?: undefined): string; encodeFunctionData( - functionFragment: "deposit(address)", - values: [AddressLike] + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", + values: [AddressLike, BigNumberish, AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "deposit(address,uint256,address)", - values: [AddressLike, BigNumberish, AddressLike] + functionFragment: "deposit(address,(address,bool,address,bytes))", + values: [AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,bytes)", - values: [AddressLike, BytesLike] + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", + values: [ + AddressLike, + BigNumberish, + AddressLike, + BytesLike, + RevertOptionsStruct + ] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,uint256,address,bytes)", - values: [AddressLike, BigNumberish, AddressLike, BytesLike] + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData( functionFragment: "execute", @@ -122,7 +158,7 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "executeRevert", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "executeWithERC20", @@ -156,7 +192,13 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { ): string; encodeFunctionData( functionFragment: "revertWithERC20", - values: [AddressLike, AddressLike, BigNumberish, BytesLike] + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] ): string; encodeFunctionData( functionFragment: "revokeRole", @@ -209,19 +251,19 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { decodeFunctionResult(functionFragment: "call", data: BytesLike): Result; decodeFunctionResult(functionFragment: "custody", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "deposit(address)", + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "deposit(address,uint256,address)", + functionFragment: "deposit(address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,bytes)", + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,uint256,address,bytes)", + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult(functionFragment: "execute", data: BytesLike): Result; @@ -277,17 +319,24 @@ export interface GatewayEVMUpgradeTestInterface extends Interface { decodeFunctionResult(functionFragment: "zetaToken", data: BytesLike): Result; } -export namespace CallEvent { +export namespace CalledEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + receiver: string, + payload: string, + revertOptions: RevertOptionsStructOutput ]; - export type OutputTuple = [sender: string, receiver: string, payload: string]; export interface OutputObject { sender: string; receiver: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -295,20 +344,22 @@ export namespace CallEvent { export type LogDescription = TypedLogDescription; } -export namespace DepositEvent { +export namespace DepositedEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, receiver: string, amount: bigint, asset: string, - payload: string + payload: string, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; @@ -316,6 +367,7 @@ export namespace DepositEvent { amount: bigint; asset: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -410,40 +462,25 @@ export namespace PausedEvent { export namespace RevertedEvent { export type InputTuple = [ - destination: AddressLike, - value: BigNumberish, - data: BytesLike - ]; - export type OutputTuple = [destination: string, value: bigint, data: string]; - export interface OutputObject { - destination: string; - value: bigint; - data: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RevertedWithERC20Event { - export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -587,42 +624,56 @@ export interface GatewayEVMUpgradeTest extends BaseContract { UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; call: TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; custody: TypedContractMethod<[], [string], "view">; - "deposit(address)": TypedContractMethod< - [receiver: AddressLike], - [void], - "payable" - >; - - "deposit(address,uint256,address)": TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + "deposit(address,uint256,address,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "depositAndCall(address,bytes)": TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + "deposit(address,(address,bool,address,bytes))": TypedContractMethod< + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; - "depositAndCall(address,uint256,address,bytes)": TypedContractMethod< + "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))": TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + "depositAndCall(address,bytes,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; + execute: TypedContractMethod< [destination: AddressLike, data: BytesLike], [string], @@ -630,7 +681,11 @@ export interface GatewayEVMUpgradeTest extends BaseContract { >; executeRevert: TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -661,7 +716,7 @@ export interface GatewayEVMUpgradeTest extends BaseContract { >; initialize: TypedContractMethod< - [_tssAddress: AddressLike, _zetaToken: AddressLike, _admin: AddressLike], + [tssAddress_: AddressLike, zetaToken_: AddressLike, admin_: AddressLike], [void], "nonpayable" >; @@ -683,7 +738,8 @@ export interface GatewayEVMUpgradeTest extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -696,13 +752,13 @@ export interface GatewayEVMUpgradeTest extends BaseContract { >; setConnector: TypedContractMethod< - [_zetaConnector: AddressLike], + [zetaConnector_: AddressLike], [void], "nonpayable" >; setCustody: TypedContractMethod< - [_custody: AddressLike], + [custody_: AddressLike], [void], "nonpayable" >; @@ -749,7 +805,11 @@ export interface GatewayEVMUpgradeTest extends BaseContract { getFunction( nameOrSignature: "call" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -757,34 +817,48 @@ export interface GatewayEVMUpgradeTest extends BaseContract { nameOrSignature: "custody" ): TypedContractMethod<[], [string], "view">; getFunction( - nameOrSignature: "deposit(address)" - ): TypedContractMethod<[receiver: AddressLike], [void], "payable">; - getFunction( - nameOrSignature: "deposit(address,uint256,address)" + nameOrSignature: "deposit(address,uint256,address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "depositAndCall(address,bytes)" + nameOrSignature: "deposit(address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; getFunction( - nameOrSignature: "depositAndCall(address,uint256,address,bytes)" + nameOrSignature: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" ): TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + getFunction( + nameOrSignature: "depositAndCall(address,bytes,(address,bool,address,bytes))" + ): TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; getFunction( nameOrSignature: "execute" ): TypedContractMethod< @@ -795,7 +869,11 @@ export interface GatewayEVMUpgradeTest extends BaseContract { getFunction( nameOrSignature: "executeRevert" ): TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -831,7 +909,7 @@ export interface GatewayEVMUpgradeTest extends BaseContract { getFunction( nameOrSignature: "initialize" ): TypedContractMethod< - [_tssAddress: AddressLike, _zetaToken: AddressLike, _admin: AddressLike], + [tssAddress_: AddressLike, zetaToken_: AddressLike, admin_: AddressLike], [void], "nonpayable" >; @@ -858,7 +936,8 @@ export interface GatewayEVMUpgradeTest extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -872,10 +951,10 @@ export interface GatewayEVMUpgradeTest extends BaseContract { >; getFunction( nameOrSignature: "setConnector" - ): TypedContractMethod<[_zetaConnector: AddressLike], [void], "nonpayable">; + ): TypedContractMethod<[zetaConnector_: AddressLike], [void], "nonpayable">; getFunction( nameOrSignature: "setCustody" - ): TypedContractMethod<[_custody: AddressLike], [void], "nonpayable">; + ): TypedContractMethod<[custody_: AddressLike], [void], "nonpayable">; getFunction( nameOrSignature: "supportsInterface" ): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">; @@ -900,18 +979,18 @@ export interface GatewayEVMUpgradeTest extends BaseContract { ): TypedContractMethod<[], [string], "view">; getEvent( - key: "Call" + key: "Called" ): TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; getEvent( - key: "Deposit" + key: "Deposited" ): TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; getEvent( key: "Executed" @@ -955,13 +1034,6 @@ export interface GatewayEVMUpgradeTest extends BaseContract { RevertedEvent.OutputTuple, RevertedEvent.OutputObject >; - getEvent( - key: "RevertedWithERC20" - ): TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; getEvent( key: "RoleAdminChanged" ): TypedContractEvent< @@ -999,26 +1071,26 @@ export interface GatewayEVMUpgradeTest extends BaseContract { >; filters: { - "Call(address,address,bytes)": TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + "Called(address,address,bytes,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - Call: TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - "Deposit(address,address,uint256,address,bytes)": TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + "Deposited(address,address,uint256,address,bytes,tuple)": TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; - Deposit: TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + Deposited: TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; "Executed(address,uint256,bytes)": TypedContractEvent< @@ -1076,7 +1148,7 @@ export interface GatewayEVMUpgradeTest extends BaseContract { PausedEvent.OutputObject >; - "Reverted(address,uint256,bytes)": TypedContractEvent< + "Reverted(address,address,uint256,bytes,tuple)": TypedContractEvent< RevertedEvent.InputTuple, RevertedEvent.OutputTuple, RevertedEvent.OutputObject @@ -1087,17 +1159,6 @@ export interface GatewayEVMUpgradeTest extends BaseContract { RevertedEvent.OutputObject >; - "RevertedWithERC20(address,address,uint256,bytes)": TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - RevertedWithERC20: TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - "RoleAdminChanged(bytes32,bytes32,bytes32)": TypedContractEvent< RoleAdminChangedEvent.InputTuple, RoleAdminChangedEvent.OutputTuple, diff --git a/v2/types/GatewayZEVM.ts b/v2/types/GatewayZEVM.ts index 68d5989d..afa55ccc 100644 --- a/v2/types/GatewayZEVM.ts +++ b/v2/types/GatewayZEVM.ts @@ -23,6 +23,25 @@ import type { TypedContractMethod, } from "./common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + export type ZContextStruct = { origin: BytesLike; sender: AddressLike; @@ -36,16 +55,16 @@ export type ZContextStructOutput = [ ] & { origin: string; sender: string; chainID: bigint }; export type RevertContextStruct = { - origin: BytesLike; - sender: AddressLike; - chainID: BigNumberish; + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; }; export type RevertContextStructOutput = [ - origin: string, - sender: string, - chainID: bigint -] & { origin: string; sender: string; chainID: bigint }; + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; export interface GatewayZEVMInterface extends Interface { getFunction( @@ -73,16 +92,16 @@ export interface GatewayZEVMInterface extends Interface { | "supportsInterface" | "unpause" | "upgradeToAndCall" - | "withdraw(bytes,uint256,address)" - | "withdraw(uint256,uint256)" - | "withdrawAndCall(bytes,uint256,address,bytes)" - | "withdrawAndCall(uint256,uint256,bytes)" + | "withdraw(bytes,uint256,address,(address,bool,address,bytes))" + | "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))" + | "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))" + | "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))" | "zetaToken" ): FunctionFragment; getEvent( nameOrSignatureOrTopic: - | "Call" + | "Called" | "Initialized" | "Paused" | "RoleAdminChanged" @@ -90,7 +109,7 @@ export interface GatewayZEVMInterface extends Interface { | "RoleRevoked" | "Unpaused" | "Upgraded" - | "Withdrawal" + | "Withdrawn" ): EventFragment; encodeFunctionData( @@ -111,7 +130,13 @@ export interface GatewayZEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "call", - values: [BytesLike, BigNumberish, BytesLike] + values: [ + BytesLike, + AddressLike, + BytesLike, + BigNumberish, + RevertOptionsStruct + ] ): string; encodeFunctionData( functionFragment: "deposit", @@ -127,13 +152,7 @@ export interface GatewayZEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "depositAndRevert", - values: [ - RevertContextStruct, - AddressLike, - BigNumberish, - AddressLike, - BytesLike - ] + values: [AddressLike, BigNumberish, AddressLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "execute", @@ -141,13 +160,7 @@ export interface GatewayZEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "executeRevert", - values: [ - RevertContextStruct, - AddressLike, - BigNumberish, - AddressLike, - BytesLike - ] + values: [AddressLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "getRoleAdmin", @@ -189,20 +202,33 @@ export interface GatewayZEVMInterface extends Interface { values: [AddressLike, BytesLike] ): string; encodeFunctionData( - functionFragment: "withdraw(bytes,uint256,address)", - values: [BytesLike, BigNumberish, AddressLike] + functionFragment: "withdraw(bytes,uint256,address,(address,bool,address,bytes))", + values: [BytesLike, BigNumberish, AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "withdraw(uint256,uint256)", - values: [BigNumberish, BigNumberish] + functionFragment: "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))", + values: [BytesLike, BigNumberish, BigNumberish, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "withdrawAndCall(bytes,uint256,address,bytes)", - values: [BytesLike, BigNumberish, AddressLike, BytesLike] + functionFragment: "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))", + values: [ + BytesLike, + BigNumberish, + BigNumberish, + BytesLike, + RevertOptionsStruct + ] ): string; encodeFunctionData( - functionFragment: "withdrawAndCall(uint256,uint256,bytes)", - values: [BigNumberish, BigNumberish, BytesLike] + functionFragment: "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))", + values: [ + BytesLike, + BigNumberish, + AddressLike, + BytesLike, + BigNumberish, + RevertOptionsStruct + ] ): string; encodeFunctionData(functionFragment: "zetaToken", values?: undefined): string; @@ -269,42 +295,48 @@ export interface GatewayZEVMInterface extends Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdraw(bytes,uint256,address)", + functionFragment: "withdraw(bytes,uint256,address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdraw(uint256,uint256)", + functionFragment: "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdrawAndCall(bytes,uint256,address,bytes)", + functionFragment: "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdrawAndCall(uint256,uint256,bytes)", + functionFragment: "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult(functionFragment: "zetaToken", data: BytesLike): Result; } -export namespace CallEvent { +export namespace CalledEvent { export type InputTuple = [ sender: AddressLike, - chainId: BigNumberish, + zrc20: AddressLike, receiver: BytesLike, - message: BytesLike + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, - chainId: bigint, + zrc20: string, receiver: string, - message: string + message: string, + gasLimit: bigint, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; - chainId: bigint; + zrc20: string; receiver: string; message: string; + gasLimit: bigint; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -418,7 +450,7 @@ export namespace UpgradedEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawalEvent { +export namespace WithdrawnEvent { export type InputTuple = [ sender: AddressLike, chainId: BigNumberish, @@ -427,7 +459,9 @@ export namespace WithdrawalEvent { value: BigNumberish, gasfee: BigNumberish, protocolFlatFee: BigNumberish, - message: BytesLike + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, @@ -437,7 +471,9 @@ export namespace WithdrawalEvent { value: bigint, gasfee: bigint, protocolFlatFee: bigint, - message: string + message: string, + gasLimit: bigint, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; @@ -448,6 +484,8 @@ export namespace WithdrawalEvent { gasfee: bigint; protocolFlatFee: bigint; message: string; + gasLimit: bigint; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -507,7 +545,13 @@ export interface GatewayZEVM extends BaseContract { UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; call: TypedContractMethod< - [receiver: BytesLike, chainId: BigNumberish, message: BytesLike], + [ + receiver: BytesLike, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -543,11 +587,10 @@ export interface GatewayZEVM extends BaseContract { depositAndRevert: TypedContractMethod< [ - context: RevertContextStruct, zrc20: AddressLike, amount: BigNumberish, target: AddressLike, - message: BytesLike + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -566,13 +609,7 @@ export interface GatewayZEVM extends BaseContract { >; executeRevert: TypedContractMethod< - [ - context: RevertContextStruct, - zrc20: AddressLike, - amount: BigNumberish, - target: AddressLike, - message: BytesLike - ], + [target: AddressLike, revertContext: RevertContextStruct], [void], "nonpayable" >; @@ -629,31 +666,49 @@ export interface GatewayZEVM extends BaseContract { "payable" >; - "withdraw(bytes,uint256,address)": TypedContractMethod< - [receiver: BytesLike, amount: BigNumberish, zrc20: AddressLike], + "withdraw(bytes,uint256,address,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "withdraw(uint256,uint256)": TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish], + "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: BytesLike, + amount: BigNumberish, + chainId: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "withdrawAndCall(bytes,uint256,address,bytes)": TypedContractMethod< + "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))": TypedContractMethod< [ receiver: BytesLike, amount: BigNumberish, - zrc20: AddressLike, - message: BytesLike + chainId: BigNumberish, + message: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; - "withdrawAndCall(uint256,uint256,bytes)": TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish, message: BytesLike], + "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -679,7 +734,13 @@ export interface GatewayZEVM extends BaseContract { getFunction( nameOrSignature: "call" ): TypedContractMethod< - [receiver: BytesLike, chainId: BigNumberish, message: BytesLike], + [ + receiver: BytesLike, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -719,11 +780,10 @@ export interface GatewayZEVM extends BaseContract { nameOrSignature: "depositAndRevert" ): TypedContractMethod< [ - context: RevertContextStruct, zrc20: AddressLike, amount: BigNumberish, target: AddressLike, - message: BytesLike + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -744,13 +804,7 @@ export interface GatewayZEVM extends BaseContract { getFunction( nameOrSignature: "executeRevert" ): TypedContractMethod< - [ - context: RevertContextStruct, - zrc20: AddressLike, - amount: BigNumberish, - target: AddressLike, - message: BytesLike - ], + [target: AddressLike, revertContext: RevertContextStruct], [void], "nonpayable" >; @@ -815,35 +869,53 @@ export interface GatewayZEVM extends BaseContract { "payable" >; getFunction( - nameOrSignature: "withdraw(bytes,uint256,address)" + nameOrSignature: "withdraw(bytes,uint256,address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: BytesLike, amount: BigNumberish, zrc20: AddressLike], + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdraw(uint256,uint256)" + nameOrSignature: "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))" ): TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish], + [ + receiver: BytesLike, + amount: BigNumberish, + chainId: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdrawAndCall(bytes,uint256,address,bytes)" + nameOrSignature: "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))" ): TypedContractMethod< [ receiver: BytesLike, amount: BigNumberish, - zrc20: AddressLike, - message: BytesLike + chainId: BigNumberish, + message: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdrawAndCall(uint256,uint256,bytes)" + nameOrSignature: "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))" ): TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish, message: BytesLike], + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -852,11 +924,11 @@ export interface GatewayZEVM extends BaseContract { ): TypedContractMethod<[], [string], "view">; getEvent( - key: "Call" + key: "Called" ): TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; getEvent( key: "Initialized" @@ -908,23 +980,23 @@ export interface GatewayZEVM extends BaseContract { UpgradedEvent.OutputObject >; getEvent( - key: "Withdrawal" + key: "Withdrawn" ): TypedContractEvent< - WithdrawalEvent.InputTuple, - WithdrawalEvent.OutputTuple, - WithdrawalEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; filters: { - "Call(address,uint256,bytes,bytes)": TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + "Called(address,address,bytes,bytes,uint256,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - Call: TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; "Initialized(uint64)": TypedContractEvent< @@ -1004,15 +1076,15 @@ export interface GatewayZEVM extends BaseContract { UpgradedEvent.OutputObject >; - "Withdrawal(address,uint256,bytes,address,uint256,uint256,uint256,bytes)": TypedContractEvent< - WithdrawalEvent.InputTuple, - WithdrawalEvent.OutputTuple, - WithdrawalEvent.OutputObject + "Withdrawn(address,uint256,bytes,address,uint256,uint256,uint256,bytes,uint256,tuple)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdrawal: TypedContractEvent< - WithdrawalEvent.InputTuple, - WithdrawalEvent.OutputTuple, - WithdrawalEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; }; } diff --git a/v2/types/IERC20Custody.sol/IERC20Custody.ts b/v2/types/IERC20Custody.sol/IERC20Custody.ts new file mode 100644 index 00000000..fa6f58a6 --- /dev/null +++ b/v2/types/IERC20Custody.sol/IERC20Custody.ts @@ -0,0 +1,395 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + +export interface IERC20CustodyInterface extends Interface { + getFunction( + nameOrSignature: + | "whitelisted" + | "withdraw" + | "withdrawAndCall" + | "withdrawAndRevert" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "Unwhitelisted" + | "Whitelisted" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" + ): EventFragment; + + encodeFunctionData( + functionFragment: "whitelisted", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "withdraw", + values: [AddressLike, AddressLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "withdrawAndCall", + values: [AddressLike, AddressLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "withdrawAndRevert", + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] + ): string; + + decodeFunctionResult( + functionFragment: "whitelisted", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "withdrawAndCall", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "withdrawAndRevert", + data: BytesLike + ): Result; +} + +export namespace UnwhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnEvent { + export type InputTuple = [ + to: AddressLike, + token: AddressLike, + amount: BigNumberish + ]; + export type OutputTuple = [to: string, token: string, amount: bigint]; + export interface OutputObject { + to: string; + token: string; + amount: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnAndCalledEvent { + export type InputTuple = [ + to: AddressLike, + token: AddressLike, + amount: BigNumberish, + data: BytesLike + ]; + export type OutputTuple = [ + to: string, + token: string, + amount: bigint, + data: string + ]; + export interface OutputObject { + to: string; + token: string; + amount: bigint; + data: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnAndRevertedEvent { + export type InputTuple = [ + to: AddressLike, + token: AddressLike, + amount: BigNumberish, + data: BytesLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + to: string, + token: string, + amount: bigint, + data: string, + revertContext: RevertContextStructOutput + ]; + export interface OutputObject { + to: string; + token: string; + amount: bigint; + data: string; + revertContext: RevertContextStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface IERC20Custody extends BaseContract { + connect(runner?: ContractRunner | null): IERC20Custody; + waitForDeployment(): Promise; + + interface: IERC20CustodyInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + whitelisted: TypedContractMethod<[token: AddressLike], [boolean], "view">; + + withdraw: TypedContractMethod< + [token: AddressLike, to: AddressLike, amount: BigNumberish], + [void], + "nonpayable" + >; + + withdrawAndCall: TypedContractMethod< + [ + token: AddressLike, + to: AddressLike, + amount: BigNumberish, + data: BytesLike + ], + [void], + "nonpayable" + >; + + withdrawAndRevert: TypedContractMethod< + [ + token: AddressLike, + to: AddressLike, + amount: BigNumberish, + data: BytesLike, + revertContext: RevertContextStruct + ], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "whitelisted" + ): TypedContractMethod<[token: AddressLike], [boolean], "view">; + getFunction( + nameOrSignature: "withdraw" + ): TypedContractMethod< + [token: AddressLike, to: AddressLike, amount: BigNumberish], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "withdrawAndCall" + ): TypedContractMethod< + [ + token: AddressLike, + to: AddressLike, + amount: BigNumberish, + data: BytesLike + ], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "withdrawAndRevert" + ): TypedContractMethod< + [ + token: AddressLike, + to: AddressLike, + amount: BigNumberish, + data: BytesLike, + revertContext: RevertContextStruct + ], + [void], + "nonpayable" + >; + + getEvent( + key: "Unwhitelisted" + ): TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + getEvent( + key: "Whitelisted" + ): TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + getEvent( + key: "Withdrawn" + ): TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndCalled" + ): TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndReverted" + ): TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject + >; + + filters: { + "Unwhitelisted(address)": TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + Unwhitelisted: TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + + "Whitelisted(address)": TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + Whitelisted: TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + + "Withdrawn(address,address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + + "WithdrawnAndCalled(address,address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject + >; + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject + >; + + "WithdrawnAndReverted(address,address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject + >; + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject + >; + }; +} diff --git a/v2/types/IERC20Custody.sol/IERC20CustodyEvents.ts b/v2/types/IERC20Custody.sol/IERC20CustodyEvents.ts index af645748..3353e389 100644 --- a/v2/types/IERC20Custody.sol/IERC20CustodyEvents.ts +++ b/v2/types/IERC20Custody.sol/IERC20CustodyEvents.ts @@ -21,22 +21,63 @@ import type { TypedListener, } from "../common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface IERC20CustodyEventsInterface extends Interface { getEvent( - nameOrSignatureOrTopic: "Withdraw" | "WithdrawAndCall" | "WithdrawAndRevert" + nameOrSignatureOrTopic: + | "Unwhitelisted" + | "Whitelisted" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; } -export namespace WithdrawEvent { +export namespace UnwhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WhitelistedEvent { + export type InputTuple = [token: AddressLike]; + export type OutputTuple = [token: string]; + export interface OutputObject { + token: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish ]; - export type OutputTuple = [token: string, to: string, amount: bigint]; + export type OutputTuple = [to: string, token: string, amount: bigint]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; } export type Event = TypedContractEvent; @@ -45,22 +86,22 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, data: BytesLike ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, data: string ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; } @@ -70,24 +111,27 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -143,59 +187,95 @@ export interface IERC20CustodyEvents extends BaseContract { ): T; getEvent( - key: "Withdraw" + key: "Unwhitelisted" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "Whitelisted" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "Withdrawn" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndCalled" + ): TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject + >; + getEvent( + key: "WithdrawnAndReverted" + ): TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { - "Withdraw(address,address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Unwhitelisted(address)": TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + Unwhitelisted: TypedContractEvent< + UnwhitelistedEvent.InputTuple, + UnwhitelistedEvent.OutputTuple, + UnwhitelistedEvent.OutputObject + >; + + "Whitelisted(address)": TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + Whitelisted: TypedContractEvent< + WhitelistedEvent.InputTuple, + WhitelistedEvent.OutputTuple, + WhitelistedEvent.OutputObject + >; + + "Withdrawn(address,address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/IERC20Custody.sol/index.ts b/v2/types/IERC20Custody.sol/index.ts index fa390d55..26e32f74 100644 --- a/v2/types/IERC20Custody.sol/index.ts +++ b/v2/types/IERC20Custody.sol/index.ts @@ -1,5 +1,6 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export type { IERC20Custody } from "./IERC20Custody"; export type { IERC20CustodyErrors } from "./IERC20CustodyErrors"; export type { IERC20CustodyEvents } from "./IERC20CustodyEvents"; diff --git a/v2/types/IGatewayEVM.sol/IGatewayEVM.ts b/v2/types/IGatewayEVM.sol/IGatewayEVM.ts index 7aff294c..68c508b3 100644 --- a/v2/types/IGatewayEVM.sol/IGatewayEVM.ts +++ b/v2/types/IGatewayEVM.sol/IGatewayEVM.ts @@ -8,6 +8,7 @@ import type { FunctionFragment, Result, Interface, + EventFragment, AddressLike, ContractRunner, ContractMethod, @@ -17,43 +18,90 @@ import type { TypedContractEvent, TypedDeferredTopicFilter, TypedEventLog, + TypedLogDescription, TypedListener, TypedContractMethod, } from "../common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface IGatewayEVMInterface extends Interface { getFunction( nameOrSignature: | "call" - | "deposit(address)" - | "deposit(address,uint256,address)" - | "depositAndCall(address,bytes)" - | "depositAndCall(address,uint256,address,bytes)" + | "deposit(address,uint256,address,(address,bool,address,bytes))" + | "deposit(address,(address,bool,address,bytes))" + | "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" + | "depositAndCall(address,bytes,(address,bool,address,bytes))" | "execute" | "executeRevert" | "executeWithERC20" | "revertWithERC20" ): FunctionFragment; + getEvent( + nameOrSignatureOrTopic: + | "Called" + | "Deposited" + | "Executed" + | "ExecutedWithERC20" + | "Reverted" + ): EventFragment; + encodeFunctionData( functionFragment: "call", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "deposit(address)", - values: [AddressLike] + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", + values: [AddressLike, BigNumberish, AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "deposit(address,uint256,address)", - values: [AddressLike, BigNumberish, AddressLike] + functionFragment: "deposit(address,(address,bool,address,bytes))", + values: [AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,bytes)", - values: [AddressLike, BytesLike] + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", + values: [ + AddressLike, + BigNumberish, + AddressLike, + BytesLike, + RevertOptionsStruct + ] ): string; encodeFunctionData( - functionFragment: "depositAndCall(address,uint256,address,bytes)", - values: [AddressLike, BigNumberish, AddressLike, BytesLike] + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", + values: [AddressLike, BytesLike, RevertOptionsStruct] ): string; encodeFunctionData( functionFragment: "execute", @@ -61,7 +109,7 @@ export interface IGatewayEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "executeRevert", - values: [AddressLike, BytesLike] + values: [AddressLike, BytesLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "executeWithERC20", @@ -69,24 +117,30 @@ export interface IGatewayEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "revertWithERC20", - values: [AddressLike, AddressLike, BigNumberish, BytesLike] + values: [ + AddressLike, + AddressLike, + BigNumberish, + BytesLike, + RevertContextStruct + ] ): string; decodeFunctionResult(functionFragment: "call", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "deposit(address)", + functionFragment: "deposit(address,uint256,address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "deposit(address,uint256,address)", + functionFragment: "deposit(address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,bytes)", + functionFragment: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "depositAndCall(address,uint256,address,bytes)", + functionFragment: "depositAndCall(address,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult(functionFragment: "execute", data: BytesLike): Result; @@ -104,6 +158,133 @@ export interface IGatewayEVMInterface extends Interface { ): Result; } +export namespace CalledEvent { + export type InputTuple = [ + sender: AddressLike, + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + receiver: string, + payload: string, + revertOptions: RevertOptionsStructOutput + ]; + export interface OutputObject { + sender: string; + receiver: string; + payload: string; + revertOptions: RevertOptionsStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace DepositedEvent { + export type InputTuple = [ + sender: AddressLike, + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + receiver: string, + amount: bigint, + asset: string, + payload: string, + revertOptions: RevertOptionsStructOutput + ]; + export interface OutputObject { + sender: string; + receiver: string; + amount: bigint; + asset: string; + payload: string; + revertOptions: RevertOptionsStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ExecutedEvent { + export type InputTuple = [ + destination: AddressLike, + value: BigNumberish, + data: BytesLike + ]; + export type OutputTuple = [destination: string, value: bigint, data: string]; + export interface OutputObject { + destination: string; + value: bigint; + data: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ExecutedWithERC20Event { + export type InputTuple = [ + token: AddressLike, + to: AddressLike, + amount: BigNumberish, + data: BytesLike + ]; + export type OutputTuple = [ + token: string, + to: string, + amount: bigint, + data: string + ]; + export interface OutputObject { + token: string; + to: string; + amount: bigint; + data: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace RevertedEvent { + export type InputTuple = [ + to: AddressLike, + token: AddressLike, + amount: BigNumberish, + data: BytesLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + to: string, + token: string, + amount: bigint, + data: string, + revertContext: RevertContextStructOutput + ]; + export interface OutputObject { + to: string; + token: string; + amount: bigint; + data: string; + revertContext: RevertContextStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + export interface IGatewayEVM extends BaseContract { connect(runner?: ContractRunner | null): IGatewayEVM; waitForDeployment(): Promise; @@ -148,40 +329,54 @@ export interface IGatewayEVM extends BaseContract { ): Promise; call: TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "deposit(address)": TypedContractMethod< - [receiver: AddressLike], - [void], - "payable" - >; - - "deposit(address,uint256,address)": TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + "deposit(address,uint256,address,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "depositAndCall(address,bytes)": TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + "deposit(address,(address,bool,address,bytes))": TypedContractMethod< + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; - "depositAndCall(address,uint256,address,bytes)": TypedContractMethod< + "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))": TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + "depositAndCall(address,bytes,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; + execute: TypedContractMethod< [destination: AddressLike, data: BytesLike], [string], @@ -189,7 +384,11 @@ export interface IGatewayEVM extends BaseContract { >; executeRevert: TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -210,7 +409,8 @@ export interface IGatewayEVM extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -223,39 +423,57 @@ export interface IGatewayEVM extends BaseContract { getFunction( nameOrSignature: "call" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "deposit(address)" - ): TypedContractMethod<[receiver: AddressLike], [void], "payable">; - getFunction( - nameOrSignature: "deposit(address,uint256,address)" + nameOrSignature: "deposit(address,uint256,address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, amount: BigNumberish, asset: AddressLike], + [ + receiver: AddressLike, + amount: BigNumberish, + asset: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "depositAndCall(address,bytes)" + nameOrSignature: "deposit(address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: AddressLike, payload: BytesLike], + [receiver: AddressLike, revertOptions: RevertOptionsStruct], [void], "payable" >; getFunction( - nameOrSignature: "depositAndCall(address,uint256,address,bytes)" + nameOrSignature: "depositAndCall(address,uint256,address,bytes,(address,bool,address,bytes))" ): TypedContractMethod< [ receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; + getFunction( + nameOrSignature: "depositAndCall(address,bytes,(address,bool,address,bytes))" + ): TypedContractMethod< + [ + receiver: AddressLike, + payload: BytesLike, + revertOptions: RevertOptionsStruct + ], + [void], + "payable" + >; getFunction( nameOrSignature: "execute" ): TypedContractMethod< @@ -266,7 +484,11 @@ export interface IGatewayEVM extends BaseContract { getFunction( nameOrSignature: "executeRevert" ): TypedContractMethod< - [destination: AddressLike, data: BytesLike], + [ + destination: AddressLike, + data: BytesLike, + revertContext: RevertContextStruct + ], [void], "payable" >; @@ -289,11 +511,103 @@ export interface IGatewayEVM extends BaseContract { token: AddressLike, to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" >; - filters: {}; + getEvent( + key: "Called" + ): TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject + >; + getEvent( + key: "Deposited" + ): TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject + >; + getEvent( + key: "Executed" + ): TypedContractEvent< + ExecutedEvent.InputTuple, + ExecutedEvent.OutputTuple, + ExecutedEvent.OutputObject + >; + getEvent( + key: "ExecutedWithERC20" + ): TypedContractEvent< + ExecutedWithERC20Event.InputTuple, + ExecutedWithERC20Event.OutputTuple, + ExecutedWithERC20Event.OutputObject + >; + getEvent( + key: "Reverted" + ): TypedContractEvent< + RevertedEvent.InputTuple, + RevertedEvent.OutputTuple, + RevertedEvent.OutputObject + >; + + filters: { + "Called(address,address,bytes,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject + >; + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject + >; + + "Deposited(address,address,uint256,address,bytes,tuple)": TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject + >; + Deposited: TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject + >; + + "Executed(address,uint256,bytes)": TypedContractEvent< + ExecutedEvent.InputTuple, + ExecutedEvent.OutputTuple, + ExecutedEvent.OutputObject + >; + Executed: TypedContractEvent< + ExecutedEvent.InputTuple, + ExecutedEvent.OutputTuple, + ExecutedEvent.OutputObject + >; + + "ExecutedWithERC20(address,address,uint256,bytes)": TypedContractEvent< + ExecutedWithERC20Event.InputTuple, + ExecutedWithERC20Event.OutputTuple, + ExecutedWithERC20Event.OutputObject + >; + ExecutedWithERC20: TypedContractEvent< + ExecutedWithERC20Event.InputTuple, + ExecutedWithERC20Event.OutputTuple, + ExecutedWithERC20Event.OutputObject + >; + + "Reverted(address,address,uint256,bytes,tuple)": TypedContractEvent< + RevertedEvent.InputTuple, + RevertedEvent.OutputTuple, + RevertedEvent.OutputObject + >; + Reverted: TypedContractEvent< + RevertedEvent.InputTuple, + RevertedEvent.OutputTuple, + RevertedEvent.OutputObject + >; + }; } diff --git a/v2/types/IGatewayEVM.sol/IGatewayEVMEvents.ts b/v2/types/IGatewayEVM.sol/IGatewayEVMEvents.ts index 0dbee710..05f6c7ce 100644 --- a/v2/types/IGatewayEVM.sol/IGatewayEVMEvents.ts +++ b/v2/types/IGatewayEVM.sol/IGatewayEVMEvents.ts @@ -21,29 +21,66 @@ import type { TypedListener, } from "../common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface IGatewayEVMEventsInterface extends Interface { getEvent( nameOrSignatureOrTopic: - | "Call" - | "Deposit" + | "Called" + | "Deposited" | "Executed" | "ExecutedWithERC20" | "Reverted" - | "RevertedWithERC20" ): EventFragment; } -export namespace CallEvent { +export namespace CalledEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + receiver: string, + payload: string, + revertOptions: RevertOptionsStructOutput ]; - export type OutputTuple = [sender: string, receiver: string, payload: string]; export interface OutputObject { sender: string; receiver: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -51,20 +88,22 @@ export namespace CallEvent { export type LogDescription = TypedLogDescription; } -export namespace DepositEvent { +export namespace DepositedEvent { export type InputTuple = [ sender: AddressLike, receiver: AddressLike, amount: BigNumberish, asset: AddressLike, - payload: BytesLike + payload: BytesLike, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, receiver: string, amount: bigint, asset: string, - payload: string + payload: string, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; @@ -72,6 +111,7 @@ export namespace DepositEvent { amount: bigint; asset: string; payload: string; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -124,40 +164,25 @@ export namespace ExecutedWithERC20Event { export namespace RevertedEvent { export type InputTuple = [ - destination: AddressLike, - value: BigNumberish, - data: BytesLike - ]; - export type OutputTuple = [destination: string, value: bigint, data: string]; - export interface OutputObject { - destination: string; - value: bigint; - data: string; - } - export type Event = TypedContractEvent; - export type Filter = TypedDeferredTopicFilter; - export type Log = TypedEventLog; - export type LogDescription = TypedLogDescription; -} - -export namespace RevertedWithERC20Event { - export type InputTuple = [ - token: AddressLike, to: AddressLike, + token: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct ]; export type OutputTuple = [ - token: string, to: string, + token: string, amount: bigint, - data: string + data: string, + revertContext: RevertContextStructOutput ]; export interface OutputObject { - token: string; to: string; + token: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -213,18 +238,18 @@ export interface IGatewayEVMEvents extends BaseContract { ): T; getEvent( - key: "Call" + key: "Called" ): TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; getEvent( - key: "Deposit" + key: "Deposited" ): TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; getEvent( key: "Executed" @@ -247,35 +272,28 @@ export interface IGatewayEVMEvents extends BaseContract { RevertedEvent.OutputTuple, RevertedEvent.OutputObject >; - getEvent( - key: "RevertedWithERC20" - ): TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; filters: { - "Call(address,address,bytes)": TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + "Called(address,address,bytes,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - Call: TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - "Deposit(address,address,uint256,address,bytes)": TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + "Deposited(address,address,uint256,address,bytes,tuple)": TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; - Deposit: TypedContractEvent< - DepositEvent.InputTuple, - DepositEvent.OutputTuple, - DepositEvent.OutputObject + Deposited: TypedContractEvent< + DepositedEvent.InputTuple, + DepositedEvent.OutputTuple, + DepositedEvent.OutputObject >; "Executed(address,uint256,bytes)": TypedContractEvent< @@ -300,7 +318,7 @@ export interface IGatewayEVMEvents extends BaseContract { ExecutedWithERC20Event.OutputObject >; - "Reverted(address,uint256,bytes)": TypedContractEvent< + "Reverted(address,address,uint256,bytes,tuple)": TypedContractEvent< RevertedEvent.InputTuple, RevertedEvent.OutputTuple, RevertedEvent.OutputObject @@ -310,16 +328,5 @@ export interface IGatewayEVMEvents extends BaseContract { RevertedEvent.OutputTuple, RevertedEvent.OutputObject >; - - "RevertedWithERC20(address,address,uint256,bytes)": TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; - RevertedWithERC20: TypedContractEvent< - RevertedWithERC20Event.InputTuple, - RevertedWithERC20Event.OutputTuple, - RevertedWithERC20Event.OutputObject - >; }; } diff --git a/v2/types/IGatewayEVM.sol/index.ts b/v2/types/IGatewayEVM.sol/index.ts index 52962cd9..caefde48 100644 --- a/v2/types/IGatewayEVM.sol/index.ts +++ b/v2/types/IGatewayEVM.sol/index.ts @@ -4,4 +4,3 @@ export type { IGatewayEVM } from "./IGatewayEVM"; export type { IGatewayEVMErrors } from "./IGatewayEVMErrors"; export type { IGatewayEVMEvents } from "./IGatewayEVMEvents"; -export type { Revertable } from "./Revertable"; diff --git a/v2/types/IGatewayZEVM.sol/IGatewayZEVM.ts b/v2/types/IGatewayZEVM.sol/IGatewayZEVM.ts index 09a96a0e..2fb23349 100644 --- a/v2/types/IGatewayZEVM.sol/IGatewayZEVM.ts +++ b/v2/types/IGatewayZEVM.sol/IGatewayZEVM.ts @@ -8,6 +8,7 @@ import type { FunctionFragment, Result, Interface, + EventFragment, AddressLike, ContractRunner, ContractMethod, @@ -17,10 +18,30 @@ import type { TypedContractEvent, TypedDeferredTopicFilter, TypedEventLog, + TypedLogDescription, TypedListener, TypedContractMethod, } from "../common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + export type ZContextStruct = { origin: BytesLike; sender: AddressLike; @@ -34,16 +55,16 @@ export type ZContextStructOutput = [ ] & { origin: string; sender: string; chainID: bigint }; export type RevertContextStruct = { - origin: BytesLike; - sender: AddressLike; - chainID: BigNumberish; + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; }; export type RevertContextStructOutput = [ - origin: string, - sender: string, - chainID: bigint -] & { origin: string; sender: string; chainID: bigint }; + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; export interface IGatewayZEVMInterface extends Interface { getFunction( @@ -55,15 +76,23 @@ export interface IGatewayZEVMInterface extends Interface { | "depositAndRevert" | "execute" | "executeRevert" - | "withdraw(bytes,uint256,address)" - | "withdraw(uint256,uint256)" - | "withdrawAndCall(bytes,uint256,address,bytes)" - | "withdrawAndCall(uint256,uint256,bytes)" + | "withdraw(bytes,uint256,address,(address,bool,address,bytes))" + | "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))" + | "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))" + | "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))" ): FunctionFragment; + getEvent(nameOrSignatureOrTopic: "Called" | "Withdrawn"): EventFragment; + encodeFunctionData( functionFragment: "call", - values: [BytesLike, BigNumberish, BytesLike] + values: [ + BytesLike, + AddressLike, + BytesLike, + BigNumberish, + RevertOptionsStruct + ] ): string; encodeFunctionData( functionFragment: "deposit", @@ -79,13 +108,7 @@ export interface IGatewayZEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "depositAndRevert", - values: [ - RevertContextStruct, - AddressLike, - BigNumberish, - AddressLike, - BytesLike - ] + values: [AddressLike, BigNumberish, AddressLike, RevertContextStruct] ): string; encodeFunctionData( functionFragment: "execute", @@ -93,29 +116,36 @@ export interface IGatewayZEVMInterface extends Interface { ): string; encodeFunctionData( functionFragment: "executeRevert", - values: [ - RevertContextStruct, - AddressLike, - BigNumberish, - AddressLike, - BytesLike - ] + values: [AddressLike, RevertContextStruct] ): string; encodeFunctionData( - functionFragment: "withdraw(bytes,uint256,address)", - values: [BytesLike, BigNumberish, AddressLike] + functionFragment: "withdraw(bytes,uint256,address,(address,bool,address,bytes))", + values: [BytesLike, BigNumberish, AddressLike, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "withdraw(uint256,uint256)", - values: [BigNumberish, BigNumberish] + functionFragment: "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))", + values: [BytesLike, BigNumberish, BigNumberish, RevertOptionsStruct] ): string; encodeFunctionData( - functionFragment: "withdrawAndCall(bytes,uint256,address,bytes)", - values: [BytesLike, BigNumberish, AddressLike, BytesLike] + functionFragment: "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))", + values: [ + BytesLike, + BigNumberish, + BigNumberish, + BytesLike, + RevertOptionsStruct + ] ): string; encodeFunctionData( - functionFragment: "withdrawAndCall(uint256,uint256,bytes)", - values: [BigNumberish, BigNumberish, BytesLike] + functionFragment: "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))", + values: [ + BytesLike, + BigNumberish, + AddressLike, + BytesLike, + BigNumberish, + RevertOptionsStruct + ] ): string; decodeFunctionResult(functionFragment: "call", data: BytesLike): Result; @@ -138,23 +168,97 @@ export interface IGatewayZEVMInterface extends Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdraw(bytes,uint256,address)", + functionFragment: "withdraw(bytes,uint256,address,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdraw(uint256,uint256)", + functionFragment: "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdrawAndCall(bytes,uint256,address,bytes)", + functionFragment: "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "withdrawAndCall(uint256,uint256,bytes)", + functionFragment: "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))", data: BytesLike ): Result; } +export namespace CalledEvent { + export type InputTuple = [ + sender: AddressLike, + zrc20: AddressLike, + receiver: BytesLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + zrc20: string, + receiver: string, + message: string, + gasLimit: bigint, + revertOptions: RevertOptionsStructOutput + ]; + export interface OutputObject { + sender: string; + zrc20: string; + receiver: string; + message: string; + gasLimit: bigint; + revertOptions: RevertOptionsStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace WithdrawnEvent { + export type InputTuple = [ + sender: AddressLike, + chainId: BigNumberish, + receiver: BytesLike, + zrc20: AddressLike, + value: BigNumberish, + gasfee: BigNumberish, + protocolFlatFee: BigNumberish, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ]; + export type OutputTuple = [ + sender: string, + chainId: bigint, + receiver: string, + zrc20: string, + value: bigint, + gasfee: bigint, + protocolFlatFee: bigint, + message: string, + gasLimit: bigint, + revertOptions: RevertOptionsStructOutput + ]; + export interface OutputObject { + sender: string; + chainId: bigint; + receiver: string; + zrc20: string; + value: bigint; + gasfee: bigint; + protocolFlatFee: bigint; + message: string; + gasLimit: bigint; + revertOptions: RevertOptionsStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + export interface IGatewayZEVM extends BaseContract { connect(runner?: ContractRunner | null): IGatewayZEVM; waitForDeployment(): Promise; @@ -199,7 +303,13 @@ export interface IGatewayZEVM extends BaseContract { ): Promise; call: TypedContractMethod< - [receiver: BytesLike, chainId: BigNumberish, message: BytesLike], + [ + receiver: BytesLike, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -235,11 +345,10 @@ export interface IGatewayZEVM extends BaseContract { depositAndRevert: TypedContractMethod< [ - context: RevertContextStruct, zrc20: AddressLike, amount: BigNumberish, target: AddressLike, - message: BytesLike + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -258,42 +367,54 @@ export interface IGatewayZEVM extends BaseContract { >; executeRevert: TypedContractMethod< - [ - context: RevertContextStruct, - zrc20: AddressLike, - amount: BigNumberish, - target: AddressLike, - message: BytesLike - ], + [target: AddressLike, revertContext: RevertContextStruct], [void], "nonpayable" >; - "withdraw(bytes,uint256,address)": TypedContractMethod< - [receiver: BytesLike, amount: BigNumberish, zrc20: AddressLike], + "withdraw(bytes,uint256,address,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "withdraw(uint256,uint256)": TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish], + "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: BytesLike, + amount: BigNumberish, + chainId: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - "withdrawAndCall(bytes,uint256,address,bytes)": TypedContractMethod< + "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))": TypedContractMethod< [ receiver: BytesLike, amount: BigNumberish, - zrc20: AddressLike, - message: BytesLike + chainId: BigNumberish, + message: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; - "withdrawAndCall(uint256,uint256,bytes)": TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish, message: BytesLike], + "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))": TypedContractMethod< + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -305,7 +426,13 @@ export interface IGatewayZEVM extends BaseContract { getFunction( nameOrSignature: "call" ): TypedContractMethod< - [receiver: BytesLike, chainId: BigNumberish, message: BytesLike], + [ + receiver: BytesLike, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; @@ -345,11 +472,10 @@ export interface IGatewayZEVM extends BaseContract { nameOrSignature: "depositAndRevert" ): TypedContractMethod< [ - context: RevertContextStruct, zrc20: AddressLike, amount: BigNumberish, target: AddressLike, - message: BytesLike + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -370,49 +496,98 @@ export interface IGatewayZEVM extends BaseContract { getFunction( nameOrSignature: "executeRevert" ): TypedContractMethod< - [ - context: RevertContextStruct, - zrc20: AddressLike, - amount: BigNumberish, - target: AddressLike, - message: BytesLike - ], + [target: AddressLike, revertContext: RevertContextStruct], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdraw(bytes,uint256,address)" + nameOrSignature: "withdraw(bytes,uint256,address,(address,bool,address,bytes))" ): TypedContractMethod< - [receiver: BytesLike, amount: BigNumberish, zrc20: AddressLike], + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdraw(uint256,uint256)" + nameOrSignature: "withdraw(bytes,uint256,uint256,(address,bool,address,bytes))" ): TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish], + [ + receiver: BytesLike, + amount: BigNumberish, + chainId: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdrawAndCall(bytes,uint256,address,bytes)" + nameOrSignature: "withdrawAndCall(bytes,uint256,uint256,bytes,(address,bool,address,bytes))" ): TypedContractMethod< [ receiver: BytesLike, amount: BigNumberish, - zrc20: AddressLike, - message: BytesLike + chainId: BigNumberish, + message: BytesLike, + revertOptions: RevertOptionsStruct ], [void], "nonpayable" >; getFunction( - nameOrSignature: "withdrawAndCall(uint256,uint256,bytes)" + nameOrSignature: "withdrawAndCall(bytes,uint256,address,bytes,uint256,(address,bool,address,bytes))" ): TypedContractMethod< - [amount: BigNumberish, chainId: BigNumberish, message: BytesLike], + [ + receiver: BytesLike, + amount: BigNumberish, + zrc20: AddressLike, + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct + ], [void], "nonpayable" >; - filters: {}; + getEvent( + key: "Called" + ): TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject + >; + getEvent( + key: "Withdrawn" + ): TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + + filters: { + "Called(address,address,bytes,bytes,uint256,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject + >; + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject + >; + + "Withdrawn(address,uint256,bytes,address,uint256,uint256,uint256,bytes,uint256,tuple)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject + >; + }; } diff --git a/v2/types/IGatewayZEVM.sol/IGatewayZEVMEvents.ts b/v2/types/IGatewayZEVM.sol/IGatewayZEVMEvents.ts index 00517fd5..627aa7cc 100644 --- a/v2/types/IGatewayZEVM.sol/IGatewayZEVMEvents.ts +++ b/v2/types/IGatewayZEVM.sol/IGatewayZEVMEvents.ts @@ -21,28 +21,53 @@ import type { TypedListener, } from "../common"; +export type RevertOptionsStruct = { + revertAddress: AddressLike; + callOnRevert: boolean; + abortAddress: AddressLike; + revertMessage: BytesLike; +}; + +export type RevertOptionsStructOutput = [ + revertAddress: string, + callOnRevert: boolean, + abortAddress: string, + revertMessage: string +] & { + revertAddress: string; + callOnRevert: boolean; + abortAddress: string; + revertMessage: string; +}; + export interface IGatewayZEVMEventsInterface extends Interface { - getEvent(nameOrSignatureOrTopic: "Call" | "Withdrawal"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Called" | "Withdrawn"): EventFragment; } -export namespace CallEvent { +export namespace CalledEvent { export type InputTuple = [ sender: AddressLike, - chainId: BigNumberish, + zrc20: AddressLike, receiver: BytesLike, - message: BytesLike + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, - chainId: bigint, + zrc20: string, receiver: string, - message: string + message: string, + gasLimit: bigint, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; - chainId: bigint; + zrc20: string; receiver: string; message: string; + gasLimit: bigint; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -50,7 +75,7 @@ export namespace CallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawalEvent { +export namespace WithdrawnEvent { export type InputTuple = [ sender: AddressLike, chainId: BigNumberish, @@ -59,7 +84,9 @@ export namespace WithdrawalEvent { value: BigNumberish, gasfee: BigNumberish, protocolFlatFee: BigNumberish, - message: BytesLike + message: BytesLike, + gasLimit: BigNumberish, + revertOptions: RevertOptionsStruct ]; export type OutputTuple = [ sender: string, @@ -69,7 +96,9 @@ export namespace WithdrawalEvent { value: bigint, gasfee: bigint, protocolFlatFee: bigint, - message: string + message: string, + gasLimit: bigint, + revertOptions: RevertOptionsStructOutput ]; export interface OutputObject { sender: string; @@ -80,6 +109,8 @@ export namespace WithdrawalEvent { gasfee: bigint; protocolFlatFee: bigint; message: string; + gasLimit: bigint; + revertOptions: RevertOptionsStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -135,41 +166,41 @@ export interface IGatewayZEVMEvents extends BaseContract { ): T; getEvent( - key: "Call" + key: "Called" ): TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; getEvent( - key: "Withdrawal" + key: "Withdrawn" ): TypedContractEvent< - WithdrawalEvent.InputTuple, - WithdrawalEvent.OutputTuple, - WithdrawalEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; filters: { - "Call(address,uint256,bytes,bytes)": TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + "Called(address,address,bytes,bytes,uint256,tuple)": TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - Call: TypedContractEvent< - CallEvent.InputTuple, - CallEvent.OutputTuple, - CallEvent.OutputObject + Called: TypedContractEvent< + CalledEvent.InputTuple, + CalledEvent.OutputTuple, + CalledEvent.OutputObject >; - "Withdrawal(address,uint256,bytes,address,uint256,uint256,uint256,bytes)": TypedContractEvent< - WithdrawalEvent.InputTuple, - WithdrawalEvent.OutputTuple, - WithdrawalEvent.OutputObject + "Withdrawn(address,uint256,bytes,address,uint256,uint256,uint256,bytes,uint256,tuple)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdrawal: TypedContractEvent< - WithdrawalEvent.InputTuple, - WithdrawalEvent.OutputTuple, - WithdrawalEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; }; } diff --git a/v2/types/IReceiverEVM.sol/IReceiverEVMEvents.ts b/v2/types/IReceiverEVM.sol/IReceiverEVMEvents.ts index 16c5430e..06e3522f 100644 --- a/v2/types/IReceiverEVM.sol/IReceiverEVMEvents.ts +++ b/v2/types/IReceiverEVM.sol/IReceiverEVMEvents.ts @@ -21,6 +21,18 @@ import type { TypedListener, } from "../common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface IReceiverEVMEventsInterface extends Interface { getEvent( nameOrSignatureOrTopic: @@ -123,11 +135,17 @@ export namespace ReceivedPayableEvent { } export namespace ReceivedRevertEvent { - export type InputTuple = [sender: AddressLike, data: BytesLike]; - export type OutputTuple = [sender: string, data: string]; + export type InputTuple = [ + sender: AddressLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + sender: string, + revertContext: RevertContextStructOutput + ]; export interface OutputObject { sender: string; - data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -263,7 +281,7 @@ export interface IReceiverEVMEvents extends BaseContract { ReceivedPayableEvent.OutputObject >; - "ReceivedRevert(address,bytes)": TypedContractEvent< + "ReceivedRevert(address,tuple)": TypedContractEvent< ReceivedRevertEvent.InputTuple, ReceivedRevertEvent.OutputTuple, ReceivedRevertEvent.OutputObject diff --git a/v2/types/IZRC20.sol/IZRC20.ts b/v2/types/IZRC20.sol/IZRC20.ts index fdd91a64..71c53846 100644 --- a/v2/types/IZRC20.sol/IZRC20.ts +++ b/v2/types/IZRC20.sol/IZRC20.ts @@ -24,6 +24,7 @@ import type { export interface IZRC20Interface extends Interface { getFunction( nameOrSignature: + | "GAS_LIMIT" | "PROTOCOL_FLAT_FEE" | "allowance" | "approve" @@ -35,8 +36,10 @@ export interface IZRC20Interface extends Interface { | "transferFrom" | "withdraw" | "withdrawGasFee" + | "withdrawGasFeeWithGasLimit" ): FunctionFragment; + encodeFunctionData(functionFragment: "GAS_LIMIT", values?: undefined): string; encodeFunctionData( functionFragment: "PROTOCOL_FLAT_FEE", values?: undefined @@ -78,7 +81,12 @@ export interface IZRC20Interface extends Interface { functionFragment: "withdrawGasFee", values?: undefined ): string; + encodeFunctionData( + functionFragment: "withdrawGasFeeWithGasLimit", + values: [BigNumberish] + ): string; + decodeFunctionResult(functionFragment: "GAS_LIMIT", data: BytesLike): Result; decodeFunctionResult( functionFragment: "PROTOCOL_FLAT_FEE", data: BytesLike @@ -102,6 +110,10 @@ export interface IZRC20Interface extends Interface { functionFragment: "withdrawGasFee", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "withdrawGasFeeWithGasLimit", + data: BytesLike + ): Result; } export interface IZRC20 extends BaseContract { @@ -147,6 +159,8 @@ export interface IZRC20 extends BaseContract { event?: TCEvent ): Promise; + GAS_LIMIT: TypedContractMethod<[], [bigint], "view">; + PROTOCOL_FLAT_FEE: TypedContractMethod<[], [bigint], "view">; allowance: TypedContractMethod< @@ -193,10 +207,19 @@ export interface IZRC20 extends BaseContract { withdrawGasFee: TypedContractMethod<[], [[string, bigint]], "view">; + withdrawGasFeeWithGasLimit: TypedContractMethod< + [gasLimit: BigNumberish], + [[string, bigint]], + "view" + >; + getFunction( key: string | FunctionFragment ): T; + getFunction( + nameOrSignature: "GAS_LIMIT" + ): TypedContractMethod<[], [bigint], "view">; getFunction( nameOrSignature: "PROTOCOL_FLAT_FEE" ): TypedContractMethod<[], [bigint], "view">; @@ -254,6 +277,9 @@ export interface IZRC20 extends BaseContract { getFunction( nameOrSignature: "withdrawGasFee" ): TypedContractMethod<[], [[string, bigint]], "view">; + getFunction( + nameOrSignature: "withdrawGasFeeWithGasLimit" + ): TypedContractMethod<[gasLimit: BigNumberish], [[string, bigint]], "view">; filters: {}; } diff --git a/v2/types/IZRC20.sol/IZRC20Metadata.ts b/v2/types/IZRC20.sol/IZRC20Metadata.ts index 38ec49b5..ec8ce218 100644 --- a/v2/types/IZRC20.sol/IZRC20Metadata.ts +++ b/v2/types/IZRC20.sol/IZRC20Metadata.ts @@ -24,6 +24,7 @@ import type { export interface IZRC20MetadataInterface extends Interface { getFunction( nameOrSignature: + | "GAS_LIMIT" | "PROTOCOL_FLAT_FEE" | "allowance" | "approve" @@ -38,8 +39,10 @@ export interface IZRC20MetadataInterface extends Interface { | "transferFrom" | "withdraw" | "withdrawGasFee" + | "withdrawGasFeeWithGasLimit" ): FunctionFragment; + encodeFunctionData(functionFragment: "GAS_LIMIT", values?: undefined): string; encodeFunctionData( functionFragment: "PROTOCOL_FLAT_FEE", values?: undefined @@ -84,7 +87,12 @@ export interface IZRC20MetadataInterface extends Interface { functionFragment: "withdrawGasFee", values?: undefined ): string; + encodeFunctionData( + functionFragment: "withdrawGasFeeWithGasLimit", + values: [BigNumberish] + ): string; + decodeFunctionResult(functionFragment: "GAS_LIMIT", data: BytesLike): Result; decodeFunctionResult( functionFragment: "PROTOCOL_FLAT_FEE", data: BytesLike @@ -111,6 +119,10 @@ export interface IZRC20MetadataInterface extends Interface { functionFragment: "withdrawGasFee", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "withdrawGasFeeWithGasLimit", + data: BytesLike + ): Result; } export interface IZRC20Metadata extends BaseContract { @@ -156,6 +168,8 @@ export interface IZRC20Metadata extends BaseContract { event?: TCEvent ): Promise; + GAS_LIMIT: TypedContractMethod<[], [bigint], "view">; + PROTOCOL_FLAT_FEE: TypedContractMethod<[], [bigint], "view">; allowance: TypedContractMethod< @@ -208,10 +222,19 @@ export interface IZRC20Metadata extends BaseContract { withdrawGasFee: TypedContractMethod<[], [[string, bigint]], "view">; + withdrawGasFeeWithGasLimit: TypedContractMethod< + [gasLimit: BigNumberish], + [[string, bigint]], + "view" + >; + getFunction( key: string | FunctionFragment ): T; + getFunction( + nameOrSignature: "GAS_LIMIT" + ): TypedContractMethod<[], [bigint], "view">; getFunction( nameOrSignature: "PROTOCOL_FLAT_FEE" ): TypedContractMethod<[], [bigint], "view">; @@ -278,6 +301,9 @@ export interface IZRC20Metadata extends BaseContract { getFunction( nameOrSignature: "withdrawGasFee" ): TypedContractMethod<[], [[string, bigint]], "view">; + getFunction( + nameOrSignature: "withdrawGasFeeWithGasLimit" + ): TypedContractMethod<[gasLimit: BigNumberish], [[string, bigint]], "view">; filters: {}; } diff --git a/v2/types/IZetaConnector.sol/IZetaConnectorEvents.ts b/v2/types/IZetaConnector.sol/IZetaConnectorEvents.ts index 58de4a51..1a97a0cc 100644 --- a/v2/types/IZetaConnector.sol/IZetaConnectorEvents.ts +++ b/v2/types/IZetaConnector.sol/IZetaConnectorEvents.ts @@ -21,13 +21,28 @@ import type { TypedListener, } from "../common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface IZetaConnectorEventsInterface extends Interface { getEvent( - nameOrSignatureOrTopic: "Withdraw" | "WithdrawAndCall" | "WithdrawAndRevert" + nameOrSignatureOrTopic: + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; } -export namespace WithdrawEvent { +export namespace WithdrawnEvent { export type InputTuple = [to: AddressLike, amount: BigNumberish]; export type OutputTuple = [to: string, amount: bigint]; export interface OutputObject { @@ -40,7 +55,7 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, @@ -58,17 +73,24 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + to: string, + amount: bigint, + data: string, + revertContext: RevertContextStructOutput ]; - export type OutputTuple = [to: string, amount: bigint, data: string]; export interface OutputObject { to: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -124,59 +146,59 @@ export interface IZetaConnectorEvents extends BaseContract { ): T; getEvent( - key: "Withdraw" + key: "Withdrawn" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "WithdrawnAndCalled" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "WithdrawnAndReverted" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { - "Withdraw(address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Withdrawn(address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/ReceiverEVM.ts b/v2/types/ReceiverEVM.ts index 1d3316e5..9005bb6e 100644 --- a/v2/types/ReceiverEVM.ts +++ b/v2/types/ReceiverEVM.ts @@ -23,6 +23,18 @@ import type { TypedContractMethod, } from "./common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface ReceiverEVMInterface extends Interface { getFunction( nameOrSignature: @@ -43,7 +55,10 @@ export interface ReceiverEVMInterface extends Interface { | "ReceivedRevert" ): EventFragment; - encodeFunctionData(functionFragment: "onRevert", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "onRevert", + values: [RevertContextStruct] + ): string; encodeFunctionData( functionFragment: "receiveERC20", values: [BigNumberish, AddressLike, AddressLike] @@ -179,11 +194,17 @@ export namespace ReceivedPayableEvent { } export namespace ReceivedRevertEvent { - export type InputTuple = [sender: AddressLike, data: BytesLike]; - export type OutputTuple = [sender: string, data: string]; + export type InputTuple = [ + sender: AddressLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + sender: string, + revertContext: RevertContextStructOutput + ]; export interface OutputObject { sender: string; - data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -234,7 +255,11 @@ export interface ReceiverEVM extends BaseContract { event?: TCEvent ): Promise; - onRevert: TypedContractMethod<[data: BytesLike], [void], "nonpayable">; + onRevert: TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; receiveERC20: TypedContractMethod< [amount: BigNumberish, token: AddressLike, destination: AddressLike], @@ -268,7 +293,11 @@ export interface ReceiverEVM extends BaseContract { getFunction( nameOrSignature: "onRevert" - ): TypedContractMethod<[data: BytesLike], [void], "nonpayable">; + ): TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; getFunction( nameOrSignature: "receiveERC20" ): TypedContractMethod< @@ -382,7 +411,7 @@ export interface ReceiverEVM extends BaseContract { ReceivedPayableEvent.OutputObject >; - "ReceivedRevert(address,bytes)": TypedContractEvent< + "ReceivedRevert(address,tuple)": TypedContractEvent< ReceivedRevertEvent.InputTuple, ReceivedRevertEvent.OutputTuple, ReceivedRevertEvent.OutputObject diff --git a/v2/types/Revert.sol/Revertable.ts b/v2/types/Revert.sol/Revertable.ts new file mode 100644 index 00000000..6b4286b4 --- /dev/null +++ b/v2/types/Revert.sol/Revertable.ts @@ -0,0 +1,109 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../common"; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + +export interface RevertableInterface extends Interface { + getFunction(nameOrSignature: "onRevert"): FunctionFragment; + + encodeFunctionData( + functionFragment: "onRevert", + values: [RevertContextStruct] + ): string; + + decodeFunctionResult(functionFragment: "onRevert", data: BytesLike): Result; +} + +export interface Revertable extends BaseContract { + connect(runner?: ContractRunner | null): Revertable; + waitForDeployment(): Promise; + + interface: RevertableInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + onRevert: TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "onRevert" + ): TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; + + filters: {}; +} diff --git a/v2/types/Revert.sol/index.ts b/v2/types/Revert.sol/index.ts new file mode 100644 index 00000000..12a1db84 --- /dev/null +++ b/v2/types/Revert.sol/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { Revertable } from "./Revertable"; diff --git a/v2/types/SenderZEVM.ts b/v2/types/SenderZEVM.ts index 90ae1c4d..a8528cd1 100644 --- a/v2/types/SenderZEVM.ts +++ b/v2/types/SenderZEVM.ts @@ -28,7 +28,7 @@ export interface SenderZEVMInterface extends Interface { encodeFunctionData( functionFragment: "callReceiver", - values: [BytesLike, BigNumberish, string, BigNumberish, boolean] + values: [BytesLike, AddressLike, string, BigNumberish, boolean] ): string; encodeFunctionData(functionFragment: "gateway", values?: undefined): string; encodeFunctionData( @@ -100,7 +100,7 @@ export interface SenderZEVM extends BaseContract { callReceiver: TypedContractMethod< [ receiver: BytesLike, - chainId: BigNumberish, + zrc20: AddressLike, str: string, num: BigNumberish, flag: boolean @@ -133,7 +133,7 @@ export interface SenderZEVM extends BaseContract { ): TypedContractMethod< [ receiver: BytesLike, - chainId: BigNumberish, + zrc20: AddressLike, str: string, num: BigNumberish, flag: boolean diff --git a/v2/types/TestUniversalContract.ts b/v2/types/TestUniversalContract.ts new file mode 100644 index 00000000..3b48601e --- /dev/null +++ b/v2/types/TestUniversalContract.ts @@ -0,0 +1,237 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "./common"; + +export type ZContextStruct = { + origin: BytesLike; + sender: AddressLike; + chainID: BigNumberish; +}; + +export type ZContextStructOutput = [ + origin: string, + sender: string, + chainID: bigint +] & { origin: string; sender: string; chainID: bigint }; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + +export interface TestUniversalContractInterface extends Interface { + getFunction( + nameOrSignature: "onCrossChainCall" | "onRevert" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: "ContextData" | "ContextDataRevert" + ): EventFragment; + + encodeFunctionData( + functionFragment: "onCrossChainCall", + values: [ZContextStruct, AddressLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "onRevert", + values: [RevertContextStruct] + ): string; + + decodeFunctionResult( + functionFragment: "onCrossChainCall", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "onRevert", data: BytesLike): Result; +} + +export namespace ContextDataEvent { + export type InputTuple = [ + origin: BytesLike, + sender: AddressLike, + chainID: BigNumberish, + msgSender: AddressLike, + message: string + ]; + export type OutputTuple = [ + origin: string, + sender: string, + chainID: bigint, + msgSender: string, + message: string + ]; + export interface OutputObject { + origin: string; + sender: string; + chainID: bigint; + msgSender: string; + message: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace ContextDataRevertEvent { + export type InputTuple = [revertContext: RevertContextStruct]; + export type OutputTuple = [revertContext: RevertContextStructOutput]; + export interface OutputObject { + revertContext: RevertContextStructOutput; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface TestUniversalContract extends BaseContract { + connect(runner?: ContractRunner | null): TestUniversalContract; + waitForDeployment(): Promise; + + interface: TestUniversalContractInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + onCrossChainCall: TypedContractMethod< + [ + context: ZContextStruct, + zrc20: AddressLike, + amount: BigNumberish, + message: BytesLike + ], + [void], + "nonpayable" + >; + + onRevert: TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "onCrossChainCall" + ): TypedContractMethod< + [ + context: ZContextStruct, + zrc20: AddressLike, + amount: BigNumberish, + message: BytesLike + ], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "onRevert" + ): TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; + + getEvent( + key: "ContextData" + ): TypedContractEvent< + ContextDataEvent.InputTuple, + ContextDataEvent.OutputTuple, + ContextDataEvent.OutputObject + >; + getEvent( + key: "ContextDataRevert" + ): TypedContractEvent< + ContextDataRevertEvent.InputTuple, + ContextDataRevertEvent.OutputTuple, + ContextDataRevertEvent.OutputObject + >; + + filters: { + "ContextData(bytes,address,uint256,address,string)": TypedContractEvent< + ContextDataEvent.InputTuple, + ContextDataEvent.OutputTuple, + ContextDataEvent.OutputObject + >; + ContextData: TypedContractEvent< + ContextDataEvent.InputTuple, + ContextDataEvent.OutputTuple, + ContextDataEvent.OutputObject + >; + + "ContextDataRevert(tuple)": TypedContractEvent< + ContextDataRevertEvent.InputTuple, + ContextDataRevertEvent.OutputTuple, + ContextDataRevertEvent.OutputObject + >; + ContextDataRevert: TypedContractEvent< + ContextDataRevertEvent.InputTuple, + ContextDataRevertEvent.OutputTuple, + ContextDataRevertEvent.OutputObject + >; + }; +} diff --git a/v2/types/UniversalContract.sol/UniversalContract.ts b/v2/types/UniversalContract.sol/UniversalContract.ts new file mode 100644 index 00000000..ea8c993e --- /dev/null +++ b/v2/types/UniversalContract.sol/UniversalContract.ts @@ -0,0 +1,154 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../common"; + +export type ZContextStruct = { + origin: BytesLike; + sender: AddressLike; + chainID: BigNumberish; +}; + +export type ZContextStructOutput = [ + origin: string, + sender: string, + chainID: bigint +] & { origin: string; sender: string; chainID: bigint }; + +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + +export interface UniversalContractInterface extends Interface { + getFunction( + nameOrSignature: "onCrossChainCall" | "onRevert" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "onCrossChainCall", + values: [ZContextStruct, AddressLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "onRevert", + values: [RevertContextStruct] + ): string; + + decodeFunctionResult( + functionFragment: "onCrossChainCall", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "onRevert", data: BytesLike): Result; +} + +export interface UniversalContract extends BaseContract { + connect(runner?: ContractRunner | null): UniversalContract; + waitForDeployment(): Promise; + + interface: UniversalContractInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + onCrossChainCall: TypedContractMethod< + [ + context: ZContextStruct, + zrc20: AddressLike, + amount: BigNumberish, + message: BytesLike + ], + [void], + "nonpayable" + >; + + onRevert: TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "onCrossChainCall" + ): TypedContractMethod< + [ + context: ZContextStruct, + zrc20: AddressLike, + amount: BigNumberish, + message: BytesLike + ], + [void], + "nonpayable" + >; + getFunction( + nameOrSignature: "onRevert" + ): TypedContractMethod< + [revertContext: RevertContextStruct], + [void], + "nonpayable" + >; + + filters: {}; +} diff --git a/v2/types/UniversalContract.sol/ZContract.ts b/v2/types/UniversalContract.sol/ZContract.ts new file mode 100644 index 00000000..f83ec06a --- /dev/null +++ b/v2/types/UniversalContract.sol/ZContract.ts @@ -0,0 +1,122 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../common"; + +export type ZContextStruct = { + origin: BytesLike; + sender: AddressLike; + chainID: BigNumberish; +}; + +export type ZContextStructOutput = [ + origin: string, + sender: string, + chainID: bigint +] & { origin: string; sender: string; chainID: bigint }; + +export interface ZContractInterface extends Interface { + getFunction(nameOrSignature: "onCrossChainCall"): FunctionFragment; + + encodeFunctionData( + functionFragment: "onCrossChainCall", + values: [ZContextStruct, AddressLike, BigNumberish, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "onCrossChainCall", + data: BytesLike + ): Result; +} + +export interface ZContract extends BaseContract { + connect(runner?: ContractRunner | null): ZContract; + waitForDeployment(): Promise; + + interface: ZContractInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + onCrossChainCall: TypedContractMethod< + [ + context: ZContextStruct, + zrc20: AddressLike, + amount: BigNumberish, + message: BytesLike + ], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "onCrossChainCall" + ): TypedContractMethod< + [ + context: ZContextStruct, + zrc20: AddressLike, + amount: BigNumberish, + message: BytesLike + ], + [void], + "nonpayable" + >; + + filters: {}; +} diff --git a/v2/types/UniversalContract.sol/index.ts b/v2/types/UniversalContract.sol/index.ts new file mode 100644 index 00000000..bf8e5a02 --- /dev/null +++ b/v2/types/UniversalContract.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { UniversalContract } from "./UniversalContract"; +export type { ZContract } from "./ZContract"; diff --git a/v2/types/ZRC20.sol/ZRC20.ts b/v2/types/ZRC20.sol/ZRC20.ts index 50fcbe19..053de27e 100644 --- a/v2/types/ZRC20.sol/ZRC20.ts +++ b/v2/types/ZRC20.sol/ZRC20.ts @@ -50,6 +50,7 @@ export interface ZRC20Interface extends Interface { | "updateSystemContractAddress" | "withdraw" | "withdrawGasFee" + | "withdrawGasFeeWithGasLimit" ): FunctionFragment; getEvent( @@ -139,6 +140,10 @@ export interface ZRC20Interface extends Interface { functionFragment: "withdrawGasFee", values?: undefined ): string; + encodeFunctionData( + functionFragment: "withdrawGasFeeWithGasLimit", + values: [BigNumberish] + ): string; decodeFunctionResult(functionFragment: "CHAIN_ID", data: BytesLike): Result; decodeFunctionResult(functionFragment: "COIN_TYPE", data: BytesLike): Result; @@ -197,6 +202,10 @@ export interface ZRC20Interface extends Interface { functionFragment: "withdrawGasFee", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "withdrawGasFeeWithGasLimit", + data: BytesLike + ): Result; } export namespace ApprovalEvent { @@ -460,6 +469,12 @@ export interface ZRC20 extends BaseContract { withdrawGasFee: TypedContractMethod<[], [[string, bigint]], "view">; + withdrawGasFeeWithGasLimit: TypedContractMethod< + [gasLimit: BigNumberish], + [[string, bigint]], + "view" + >; + getFunction( key: string | FunctionFragment ): T; @@ -564,6 +579,9 @@ export interface ZRC20 extends BaseContract { getFunction( nameOrSignature: "withdrawGasFee" ): TypedContractMethod<[], [[string, bigint]], "view">; + getFunction( + nameOrSignature: "withdrawGasFeeWithGasLimit" + ): TypedContractMethod<[gasLimit: BigNumberish], [[string, bigint]], "view">; getEvent( key: "Approval" diff --git a/v2/types/ZetaConnectorBase.ts b/v2/types/ZetaConnectorBase.ts index bd16e57e..d7606d02 100644 --- a/v2/types/ZetaConnectorBase.ts +++ b/v2/types/ZetaConnectorBase.ts @@ -23,11 +23,24 @@ import type { TypedContractMethod, } from "./common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface ZetaConnectorBaseInterface extends Interface { getFunction( nameOrSignature: | "DEFAULT_ADMIN_ROLE" | "PAUSER_ROLE" + | "TSS_ROLE" | "WITHDRAWER_ROLE" | "gateway" | "getRoleAdmin" @@ -53,9 +66,9 @@ export interface ZetaConnectorBaseInterface extends Interface { | "RoleGranted" | "RoleRevoked" | "Unpaused" - | "Withdraw" - | "WithdrawAndCall" - | "WithdrawAndRevert" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; encodeFunctionData( @@ -66,6 +79,7 @@ export interface ZetaConnectorBaseInterface extends Interface { functionFragment: "PAUSER_ROLE", values?: undefined ): string; + encodeFunctionData(functionFragment: "TSS_ROLE", values?: undefined): string; encodeFunctionData( functionFragment: "WITHDRAWER_ROLE", values?: undefined @@ -112,7 +126,13 @@ export interface ZetaConnectorBaseInterface extends Interface { ): string; encodeFunctionData( functionFragment: "withdrawAndRevert", - values: [AddressLike, BigNumberish, BytesLike, BytesLike] + values: [ + AddressLike, + BigNumberish, + BytesLike, + BytesLike, + RevertContextStruct + ] ): string; encodeFunctionData(functionFragment: "zetaToken", values?: undefined): string; @@ -124,6 +144,7 @@ export interface ZetaConnectorBaseInterface extends Interface { functionFragment: "PAUSER_ROLE", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "TSS_ROLE", data: BytesLike): Result; decodeFunctionResult( functionFragment: "WITHDRAWER_ROLE", data: BytesLike @@ -245,7 +266,7 @@ export namespace UnpausedEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawEvent { +export namespace WithdrawnEvent { export type InputTuple = [to: AddressLike, amount: BigNumberish]; export type OutputTuple = [to: string, amount: bigint]; export interface OutputObject { @@ -258,7 +279,7 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, @@ -276,17 +297,24 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + to: string, + amount: bigint, + data: string, + revertContext: RevertContextStructOutput ]; - export type OutputTuple = [to: string, amount: bigint, data: string]; export interface OutputObject { to: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -341,6 +369,8 @@ export interface ZetaConnectorBase extends BaseContract { PAUSER_ROLE: TypedContractMethod<[], [string], "view">; + TSS_ROLE: TypedContractMethod<[], [string], "view">; + WITHDRAWER_ROLE: TypedContractMethod<[], [string], "view">; gateway: TypedContractMethod<[], [string], "view">; @@ -411,7 +441,8 @@ export interface ZetaConnectorBase extends BaseContract { to: AddressLike, amount: BigNumberish, data: BytesLike, - internalSendHash: BytesLike + internalSendHash: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -429,6 +460,9 @@ export interface ZetaConnectorBase extends BaseContract { getFunction( nameOrSignature: "PAUSER_ROLE" ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "TSS_ROLE" + ): TypedContractMethod<[], [string], "view">; getFunction( nameOrSignature: "WITHDRAWER_ROLE" ): TypedContractMethod<[], [string], "view">; @@ -507,7 +541,8 @@ export interface ZetaConnectorBase extends BaseContract { to: AddressLike, amount: BigNumberish, data: BytesLike, - internalSendHash: BytesLike + internalSendHash: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -552,25 +587,25 @@ export interface ZetaConnectorBase extends BaseContract { UnpausedEvent.OutputObject >; getEvent( - key: "Withdraw" + key: "Withdrawn" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "WithdrawnAndCalled" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "WithdrawnAndReverted" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { @@ -629,37 +664,37 @@ export interface ZetaConnectorBase extends BaseContract { UnpausedEvent.OutputObject >; - "Withdraw(address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Withdrawn(address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/ZetaConnectorNative.ts b/v2/types/ZetaConnectorNative.ts index 870778e9..d341c8cb 100644 --- a/v2/types/ZetaConnectorNative.ts +++ b/v2/types/ZetaConnectorNative.ts @@ -23,11 +23,24 @@ import type { TypedContractMethod, } from "./common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface ZetaConnectorNativeInterface extends Interface { getFunction( nameOrSignature: | "DEFAULT_ADMIN_ROLE" | "PAUSER_ROLE" + | "TSS_ROLE" | "WITHDRAWER_ROLE" | "gateway" | "getRoleAdmin" @@ -53,9 +66,9 @@ export interface ZetaConnectorNativeInterface extends Interface { | "RoleGranted" | "RoleRevoked" | "Unpaused" - | "Withdraw" - | "WithdrawAndCall" - | "WithdrawAndRevert" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; encodeFunctionData( @@ -66,6 +79,7 @@ export interface ZetaConnectorNativeInterface extends Interface { functionFragment: "PAUSER_ROLE", values?: undefined ): string; + encodeFunctionData(functionFragment: "TSS_ROLE", values?: undefined): string; encodeFunctionData( functionFragment: "WITHDRAWER_ROLE", values?: undefined @@ -112,7 +126,13 @@ export interface ZetaConnectorNativeInterface extends Interface { ): string; encodeFunctionData( functionFragment: "withdrawAndRevert", - values: [AddressLike, BigNumberish, BytesLike, BytesLike] + values: [ + AddressLike, + BigNumberish, + BytesLike, + BytesLike, + RevertContextStruct + ] ): string; encodeFunctionData(functionFragment: "zetaToken", values?: undefined): string; @@ -124,6 +144,7 @@ export interface ZetaConnectorNativeInterface extends Interface { functionFragment: "PAUSER_ROLE", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "TSS_ROLE", data: BytesLike): Result; decodeFunctionResult( functionFragment: "WITHDRAWER_ROLE", data: BytesLike @@ -245,7 +266,7 @@ export namespace UnpausedEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawEvent { +export namespace WithdrawnEvent { export type InputTuple = [to: AddressLike, amount: BigNumberish]; export type OutputTuple = [to: string, amount: bigint]; export interface OutputObject { @@ -258,7 +279,7 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, @@ -276,17 +297,24 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + to: string, + amount: bigint, + data: string, + revertContext: RevertContextStructOutput ]; - export type OutputTuple = [to: string, amount: bigint, data: string]; export interface OutputObject { to: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -341,6 +369,8 @@ export interface ZetaConnectorNative extends BaseContract { PAUSER_ROLE: TypedContractMethod<[], [string], "view">; + TSS_ROLE: TypedContractMethod<[], [string], "view">; + WITHDRAWER_ROLE: TypedContractMethod<[], [string], "view">; gateway: TypedContractMethod<[], [string], "view">; @@ -411,7 +441,8 @@ export interface ZetaConnectorNative extends BaseContract { to: AddressLike, amount: BigNumberish, data: BytesLike, - internalSendHash: BytesLike + internalSendHash: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -429,6 +460,9 @@ export interface ZetaConnectorNative extends BaseContract { getFunction( nameOrSignature: "PAUSER_ROLE" ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "TSS_ROLE" + ): TypedContractMethod<[], [string], "view">; getFunction( nameOrSignature: "WITHDRAWER_ROLE" ): TypedContractMethod<[], [string], "view">; @@ -507,7 +541,8 @@ export interface ZetaConnectorNative extends BaseContract { to: AddressLike, amount: BigNumberish, data: BytesLike, - internalSendHash: BytesLike + internalSendHash: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -552,25 +587,25 @@ export interface ZetaConnectorNative extends BaseContract { UnpausedEvent.OutputObject >; getEvent( - key: "Withdraw" + key: "Withdrawn" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "WithdrawnAndCalled" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "WithdrawnAndReverted" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { @@ -629,37 +664,37 @@ export interface ZetaConnectorNative extends BaseContract { UnpausedEvent.OutputObject >; - "Withdraw(address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Withdrawn(address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/ZetaConnectorNonNative.ts b/v2/types/ZetaConnectorNonNative.ts index c24d39ac..15897cc5 100644 --- a/v2/types/ZetaConnectorNonNative.ts +++ b/v2/types/ZetaConnectorNonNative.ts @@ -23,11 +23,24 @@ import type { TypedContractMethod, } from "./common"; +export type RevertContextStruct = { + asset: AddressLike; + amount: BigNumberish; + revertMessage: BytesLike; +}; + +export type RevertContextStructOutput = [ + asset: string, + amount: bigint, + revertMessage: string +] & { asset: string; amount: bigint; revertMessage: string }; + export interface ZetaConnectorNonNativeInterface extends Interface { getFunction( nameOrSignature: | "DEFAULT_ADMIN_ROLE" | "PAUSER_ROLE" + | "TSS_ROLE" | "WITHDRAWER_ROLE" | "gateway" | "getRoleAdmin" @@ -56,9 +69,9 @@ export interface ZetaConnectorNonNativeInterface extends Interface { | "RoleGranted" | "RoleRevoked" | "Unpaused" - | "Withdraw" - | "WithdrawAndCall" - | "WithdrawAndRevert" + | "Withdrawn" + | "WithdrawnAndCalled" + | "WithdrawnAndReverted" ): EventFragment; encodeFunctionData( @@ -69,6 +82,7 @@ export interface ZetaConnectorNonNativeInterface extends Interface { functionFragment: "PAUSER_ROLE", values?: undefined ): string; + encodeFunctionData(functionFragment: "TSS_ROLE", values?: undefined): string; encodeFunctionData( functionFragment: "WITHDRAWER_ROLE", values?: undefined @@ -120,7 +134,13 @@ export interface ZetaConnectorNonNativeInterface extends Interface { ): string; encodeFunctionData( functionFragment: "withdrawAndRevert", - values: [AddressLike, BigNumberish, BytesLike, BytesLike] + values: [ + AddressLike, + BigNumberish, + BytesLike, + BytesLike, + RevertContextStruct + ] ): string; encodeFunctionData(functionFragment: "zetaToken", values?: undefined): string; @@ -132,6 +152,7 @@ export interface ZetaConnectorNonNativeInterface extends Interface { functionFragment: "PAUSER_ROLE", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "TSS_ROLE", data: BytesLike): Result; decodeFunctionResult( functionFragment: "WITHDRAWER_ROLE", data: BytesLike @@ -270,7 +291,7 @@ export namespace UnpausedEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawEvent { +export namespace WithdrawnEvent { export type InputTuple = [to: AddressLike, amount: BigNumberish]; export type OutputTuple = [to: string, amount: bigint]; export interface OutputObject { @@ -283,7 +304,7 @@ export namespace WithdrawEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndCallEvent { +export namespace WithdrawnAndCalledEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, @@ -301,17 +322,24 @@ export namespace WithdrawAndCallEvent { export type LogDescription = TypedLogDescription; } -export namespace WithdrawAndRevertEvent { +export namespace WithdrawnAndRevertedEvent { export type InputTuple = [ to: AddressLike, amount: BigNumberish, - data: BytesLike + data: BytesLike, + revertContext: RevertContextStruct + ]; + export type OutputTuple = [ + to: string, + amount: bigint, + data: string, + revertContext: RevertContextStructOutput ]; - export type OutputTuple = [to: string, amount: bigint, data: string]; export interface OutputObject { to: string; amount: bigint; data: string; + revertContext: RevertContextStructOutput; } export type Event = TypedContractEvent; export type Filter = TypedDeferredTopicFilter; @@ -366,6 +394,8 @@ export interface ZetaConnectorNonNative extends BaseContract { PAUSER_ROLE: TypedContractMethod<[], [string], "view">; + TSS_ROLE: TypedContractMethod<[], [string], "view">; + WITHDRAWER_ROLE: TypedContractMethod<[], [string], "view">; gateway: TypedContractMethod<[], [string], "view">; @@ -444,7 +474,8 @@ export interface ZetaConnectorNonNative extends BaseContract { to: AddressLike, amount: BigNumberish, data: BytesLike, - internalSendHash: BytesLike + internalSendHash: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -462,6 +493,9 @@ export interface ZetaConnectorNonNative extends BaseContract { getFunction( nameOrSignature: "PAUSER_ROLE" ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "TSS_ROLE" + ): TypedContractMethod<[], [string], "view">; getFunction( nameOrSignature: "WITHDRAWER_ROLE" ): TypedContractMethod<[], [string], "view">; @@ -546,7 +580,8 @@ export interface ZetaConnectorNonNative extends BaseContract { to: AddressLike, amount: BigNumberish, data: BytesLike, - internalSendHash: BytesLike + internalSendHash: BytesLike, + revertContext: RevertContextStruct ], [void], "nonpayable" @@ -598,25 +633,25 @@ export interface ZetaConnectorNonNative extends BaseContract { UnpausedEvent.OutputObject >; getEvent( - key: "Withdraw" + key: "Withdrawn" ): TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; getEvent( - key: "WithdrawAndCall" + key: "WithdrawnAndCalled" ): TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; getEvent( - key: "WithdrawAndRevert" + key: "WithdrawnAndReverted" ): TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; filters: { @@ -686,37 +721,37 @@ export interface ZetaConnectorNonNative extends BaseContract { UnpausedEvent.OutputObject >; - "Withdraw(address,uint256)": TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + "Withdrawn(address,uint256)": TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - Withdraw: TypedContractEvent< - WithdrawEvent.InputTuple, - WithdrawEvent.OutputTuple, - WithdrawEvent.OutputObject + Withdrawn: TypedContractEvent< + WithdrawnEvent.InputTuple, + WithdrawnEvent.OutputTuple, + WithdrawnEvent.OutputObject >; - "WithdrawAndCall(address,uint256,bytes)": TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + "WithdrawnAndCalled(address,uint256,bytes)": TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - WithdrawAndCall: TypedContractEvent< - WithdrawAndCallEvent.InputTuple, - WithdrawAndCallEvent.OutputTuple, - WithdrawAndCallEvent.OutputObject + WithdrawnAndCalled: TypedContractEvent< + WithdrawnAndCalledEvent.InputTuple, + WithdrawnAndCalledEvent.OutputTuple, + WithdrawnAndCalledEvent.OutputObject >; - "WithdrawAndRevert(address,uint256,bytes)": TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + "WithdrawnAndReverted(address,uint256,bytes,tuple)": TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; - WithdrawAndRevert: TypedContractEvent< - WithdrawAndRevertEvent.InputTuple, - WithdrawAndRevertEvent.OutputTuple, - WithdrawAndRevertEvent.OutputObject + WithdrawnAndReverted: TypedContractEvent< + WithdrawnAndRevertedEvent.InputTuple, + WithdrawnAndRevertedEvent.OutputTuple, + WithdrawnAndRevertedEvent.OutputObject >; }; } diff --git a/v2/types/factories/ERC20CustodyEchidnaTest__factory.ts b/v2/types/factories/ERC20CustodyEchidnaTest__factory.ts index 55594799..347b1a75 100644 --- a/v2/types/factories/ERC20CustodyEchidnaTest__factory.ts +++ b/v2/types/factories/ERC20CustodyEchidnaTest__factory.ts @@ -46,6 +46,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "WHITELISTER_ROLE", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, { type: "function", name: "WITHDRAWER_ROLE", @@ -266,18 +279,63 @@ const _abi = [ }, { type: "function", - name: "withdraw", + name: "unwhitelist", inputs: [ { name: "token", type: "address", internalType: "address", }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "whitelist", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "whitelisted", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "withdraw", + inputs: [ { name: "to", type: "address", internalType: "address", }, + { + name: "token", + type: "address", + internalType: "address", + }, { name: "amount", type: "uint256", @@ -292,12 +350,12 @@ const _abi = [ name: "withdrawAndCall", inputs: [ { - name: "token", + name: "to", type: "address", internalType: "address", }, { - name: "to", + name: "token", type: "address", internalType: "address", }, @@ -320,12 +378,12 @@ const _abi = [ name: "withdrawAndRevert", inputs: [ { - name: "token", + name: "to", type: "address", internalType: "address", }, { - name: "to", + name: "token", type: "address", internalType: "address", }, @@ -339,6 +397,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -446,7 +526,7 @@ const _abi = [ }, { type: "event", - name: "Withdraw", + name: "Unwhitelisted", inputs: [ { name: "token", @@ -454,12 +534,38 @@ const _abi = [ indexed: true, internalType: "address", }, + ], + anonymous: false, + }, + { + type: "event", + name: "Whitelisted", + inputs: [ + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Withdrawn", + inputs: [ { name: "to", type: "address", indexed: true, internalType: "address", }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, { name: "amount", type: "uint256", @@ -471,16 +577,16 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { - name: "token", + name: "to", type: "address", indexed: true, internalType: "address", }, { - name: "to", + name: "token", type: "address", indexed: true, internalType: "address", @@ -502,16 +608,16 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { - name: "token", + name: "to", type: "address", indexed: true, internalType: "address", }, { - name: "to", + name: "token", type: "address", indexed: true, internalType: "address", @@ -528,6 +634,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -589,6 +718,11 @@ const _abi = [ name: "FailedInnerCall", inputs: [], }, + { + type: "error", + name: "NotWhitelisted", + inputs: [], + }, { type: "error", name: "ReentrancyGuardReentrantCall", @@ -613,7 +747,7 @@ const _abi = [ ] as const; const _bytecode = - "0x600380546001600160a01b03191633908117909155600e60a09081526d11d85d195dd85e5155934b9cdbdb60921b60c0526101049190915261012361012481905261014452606460e090815261016460405261010080516001600160e01b0390811663c0c53b8b60e01b1790915261007992919061026316565b600480546001600160a01b03929092166001600160a01b03199283168117909155600580549092161790553480156100b057600080fd5b5060055460035460016000556002805460ff191690556001600160a01b039182169116808215806100e857506001600160a01b038216155b806100fa57506001600160a01b038116155b156101185760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038316608052610130600082610282565b5061015b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610282565b506101867f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610282565b505050506040516101969061380e565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f0801580156101e8573d6000803e3d6000fd5b5060028054610100600160a81b0319166101006001600160a01b039384160217905560055460405163ae7a3a6f60e01b815230600482015291169063ae7a3a6f90602401600060405180830381600087803b15801561024657600080fd5b505af115801561025a573d6000803e3d6000fd5b5050505061488f565b600061026d61381b565b610278848483610315565b9150505b92915050565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1661030d5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a450600161027c565b50600061027c565b6000806103228584610391565b90506103866040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f78790000008152508286604051602001610370929190613924565b60408051601f198184030181529190528561039d565b9150505b9392505050565b600061038a83836103d1565b60c081015151600090156103c7576103c084848460c001516103f260201b60201c565b905061038a565b6103c0848461056b565b60006103dd8383610638565b61038a8383602001518461039d60201b60201c565b6000806103fd610648565b9050600061040b86836106e2565b905060006104288260600151836020015185610b0560201b60201c565b9050600061043883838989610cba565b9050600061044582611936565b602081015181519192509060030b1561049e5789826040015160405160200161046f929190613948565b60408051601f198184030181529082905262461bcd60e51b8252610495916004016139ae565b60405180910390fd5b60006104e76040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001611acd60201b60201c565b60405163c6ce059d60e01b8152909150600080516020616b378339815191529063c6ce059d9061051b9084906004016139ae565b602060405180830381865afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c91906139c1565b9b9a5050505050505050505050565b604051638d1cc92560e01b81526000908190600080516020616b3783398151915290638d1cc925906105a19087906004016139ae565b600060405180830381865afa1580156105be573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105e69190810190613ab6565b905060006106158285604051602001610600929190613aea565b60408051601f19818403018152919052611c6d565b90506001600160a01b03811661027857848460405160200161046f929190613b19565b61064482826000611c80565b5050565b60408051808201825260038152621bdd5d60ea1b602082015290516334515cdb60e21b8152606091600080516020616b3783398151915291829063d145736c90610696908490600401613ba8565b600060405180830381865afa1580156106b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106db9190810190613bdd565b9250505090565b6107146040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000600080516020616b3783398151915290506107596040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61076285611d5a565b6020820152600061077286611faf565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107b4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107dc9190810190613bdd565b868385602001516040516020016107f69493929190613c25565b60408051601f19818403018152908290526360f9bb1160e01b825291506000906001600160a01b038616906360f9bb11906108359085906004016139ae565b600060405180830381865afa158015610852573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087a9190810190613bdd565b604051636da11afb60e11b81529091506001600160a01b0386169063db4235f6906108a9908490600401613cbd565b602060405180830381865afa1580156108c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea9190613cf6565b6108ff578160405160200161046f9190613d18565b6040516309389f5960e31b81526001600160a01b038616906349c4fac89061092b908490600401613d8f565b600060405180830381865afa158015610948573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109709190810190613bdd565b8452604051636da11afb60e11b81526001600160a01b0386169063db4235f69061099e908490600401613dd5565b602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190613cf6565b15610a5b576040516309389f5960e31b81526001600160a01b038616906349c4fac890610a10908490600401613dd5565b600060405180830381865afa158015610a2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a559190810190613bdd565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001610a809190613e16565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610aac929190613e71565b600060405180830381865afa158015610ac9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af19190810190613bdd565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081610b21579050509050604051806040016040528060048152602001630677265760e41b81525081600081518110610b6857610b68613e96565b6020026020010181905250604051806040016040528060038152602001620b5c9b60ea1b81525081600181518110610ba257610ba2613e96565b602002602001018190525084604051602001610bbe9190613eac565b60405160208183030381529060405281600281518110610be057610be0613e96565b602002602001018190525082604051602001610bfc9190613ee1565b60405160208183030381529060405281600381518110610c1e57610c1e613e96565b60209081029190910101526000610c3482611936565b9050600081602001519050610c9b610c6e60405180604001604052806005815260200164173539b7b760d91b81525061213260201b60201c565b6040805180820182526000808252602091820152815180830190925284518252808501908201529061215f565b610cb0578560405160200161046f9190613f10565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090600080516020616b378339815191529015610d04565b511590565b610e2057826020015115610d945760405162461bcd60e51b81526020600482015260586024820152600080516020616b5783398151915260448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a401610495565b8260c0015115610e205760405162461bcd60e51b81526020600482015260536024820152600080516020616b5783398151915260448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a401610495565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081610e395790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280610e7a90613fa5565b935060ff1681518110610e8f57610e8f613e96565b60200260200101819052506040518060400160405280600d81526020016c302e302e312d616c7068612e3760981b815250604051602001610ed09190613fc4565b604051602081830303815290604052828280610eeb90613fa5565b935060ff1681518110610f0057610f00613e96565b6020026020010181905250604051806040016040528060068152602001656465706c6f7960d01b815250828280610f3690613fa5565b935060ff1681518110610f4b57610f4b613e96565b60200260200101819052506040518060400160405280600e81526020016d2d2d636f6e74726163744e616d6560901b815250828280610f8990613fa5565b935060ff1681518110610f9e57610f9e613e96565b60200260200101819052508760200151828280610fba90613fa5565b935060ff1681518110610fcf57610fcf613e96565b60200260200101819052506040518060400160405280600e81526020016d05a5ac6dedce8e4c2c6e8a0c2e8d60931b81525082828061100d90613fa5565b935060ff168151811061102257611022613e96565b60209081029190910101528751828261103a81613fa5565b935060ff168151811061104f5761104f613e96565b6020026020010181905250604051806040016040528060098152602001680b4b58da185a5b925960ba1b81525082828061108890613fa5565b935060ff168151811061109d5761109d613e96565b60209081029190910101526110b1466121c0565b82826110bc81613fa5565b935060ff16815181106110d1576110d1613e96565b60200260200101819052506040518060400160405280600f81526020016e2d2d6275696c64496e666f46696c6560881b81525082828061111090613fa5565b935060ff168151811061112557611125613e96565b60200260200101819052508682828061113d90613fa5565b935060ff168151811061115257611152613e96565b60209081029190910101528551156112605760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826111a381613fa5565b935060ff16815181106111b8576111b8613e96565b60209081029190910101526040516371aad10d60e01b81526001600160a01b038416906371aad10d906111ef9089906004016139ae565b600060405180830381865afa15801561120c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112349190810190613bdd565b828261123f81613fa5565b935060ff168151811061125457611254613e96565b60200260200101819052505b84602001511561130d576040805180820190915260128152712d2d766572696679536f75726365436f646560701b6020820152828261129e81613fa5565b935060ff16815181106112b3576112b3613e96565b60200260200101819052506040518060400160405280600581526020016466616c736560d81b8152508282806112e890613fa5565b935060ff16815181106112fd576112fd613e96565b6020026020010181905250611474565b611323610cff8660a0015161213260201b60201c565b6113a65760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261135681613fa5565b935060ff168151811061136b5761136b613e96565b60200260200101819052508460a0015160405160200161138b9190613eac565b6040516020818303038152906040528282806112e890613fa5565b8460c001511580156113cb57506113c9610cff896040015161213260201b60201c565b155b156114745760408051808201909152600d81526c2d2d6c6963656e73655479706560981b602082015282826113ff81613fa5565b935060ff168151811061141457611414613e96565b602090810291909101015261142888612252565b6040516020016114389190613eac565b60405160208183030381529060405282828061145390613fa5565b935060ff168151811061146857611468613e96565b60200260200101819052505b61148a610cff866040015161213260201b60201c565b61150d5760408051808201909152600b81526a0b4b5c995b185e595c925960aa1b602082015282826114bb81613fa5565b935060ff16815181106114d0576114d0613e96565b602002602001018190525084604001518282806114ec90613fa5565b935060ff168151811061150157611501613e96565b60200260200101819052505b6060850151156115fe576040805180820190915260068152650b4b5cd85b1d60d21b6020820152828261153f81613fa5565b935060ff168151811061155457611554613e96565b60209081029190910101526060850151604051631623433d60e31b815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156115aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115d29190810190613bdd565b82826115dd81613fa5565b935060ff16815181106115f2576115f2613e96565b60200260200101819052505b60e085015151156116905760408051808201909152600a8152690b4b59d85cd31a5b5a5d60b21b6020820152828261163581613fa5565b935060ff168151811061164a5761164a613e96565b602090810291909101015260e085015151611664906121c0565b828261166f81613fa5565b935060ff168151811061168457611684613e96565b60200260200101819052505b60e0850151602001511561172d5760408051808201909152600a8152692d2d676173507269636560b01b602082015282826116ca81613fa5565b935060ff16815181106116df576116df613e96565b60200260200101819052506117018560e00151602001516121c060201b60201c565b828261170c81613fa5565b935060ff168151811061172157611721613e96565b60200260200101819052505b60e085015160400151156117ce5760408051808201909152600e81526d2d2d6d617846656550657247617360901b6020820152828261176b81613fa5565b935060ff168151811061178057611780613e96565b60200260200101819052506117a28560e00151604001516121c060201b60201c565b82826117ad81613fa5565b935060ff16815181106117c2576117c2613e96565b60200260200101819052505b60e0850151606001511561187e5760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261181b81613fa5565b935060ff168151811061183057611830613e96565b60200260200101819052506118528560e00151606001516121c060201b60201c565b828261185d81613fa5565b935060ff168151811061187257611872613e96565b60200260200101819052505b60008160ff166001600160401b0381111561189b5761189b6139ea565b6040519080825280602002602001820160405280156118ce57816020015b60608152602001906001900390816118b95790505b50905060005b8260ff168160ff16101561192757838160ff16815181106118f7576118f7613e96565b6020026020010151828260ff168151811061191457611914613e96565b60209081029190910101526001016118d4565b5093505050505b949350505050565b61195d6040518060600160405280600060030b815260200160608152602001606081525090565b6040805180820182526004808252630c4c2e6d60e31b602083015291516334515cdb60e21b8152600080516020616b3783398151915292600091849163d145736c916119ab9186910161401b565b600060405180830381865afa1580156119c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119f09190810190613bdd565b905060006119fe8683612908565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401611a2e9190614062565b6000604051808303816000875af1158015611a4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a7591908101906140c7565b805190915060030b15801590611a8e5750602081015151155b8015611a9d5750604081015151155b15610cb05781600081518110611ab557611ab5613e96565b602002602001015160405160200161046f919061417a565b60606000611b028560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150611b399082905b90612a42565b15611c36576000611bb682611bb081611baa611b7c8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90612a69565b90612ac6565b9050611bea611be3604051806040016040528060018152602001600560f91b81525061213260201b60201c565b8290612a42565b15611c2457611c21611c1a604051806040016040528060018152602001600560f91b81525061213260201b60201c565b8290612b4b565b90505b611c2d81612b71565b9250505061038a565b8215611c4f57848460405160200161046f92919061434a565b505060408051602081019091526000815261038a565b509392505050565b6000808251602084016000f09392505050565b8160a0015115611c8f57505050565b6000611c9c848484612bd6565b90506000611ca982611936565b602081015181519192509060030b158015611d1c5750611d1c611cf0604051806040016040528060078152602001665355434345535360c81b81525061213260201b60201c565b604080518082018252600080825260209182015281518083019092528451825280850190820152611b33565b15611d2957505050505050565b60408201515115611d4957816040015160405160200161046f91906143c5565b8060405160200161046f919061440f565b60606000611d8f8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050611dc6611dbf604051806040016040528060048152602001630b9cdbdb60e21b81525061213260201b60201c565b829061215f565b15611e085761038a611e03611dfc604051806040016040528060048152602001630b9cdbdb60e21b81525061213260201b60201c565b83906130e9565b612b71565b611e3a611e33604051806040016040528060018152602001601d60f91b81525061213260201b60201c565b8290613173565b600103611ea257611e6c611c1a604051806040016040528060018152602001601d60f91b81525061213260201b60201c565b5061038a611e03611e9b604051806040016040528060018152602001601d60f91b81525061213260201b60201c565b8390612b4b565b611ed1611dbf60405180604001604052806005815260200164173539b7b760d91b81525061213260201b60201c565b15611f9e576000611f0982611f04604051806040016040528060018152602001602f60f81b81525061213260201b60201c565b613208565b905060008160018351611f1c919061445f565b81518110611f2c57611f2c613e96565b60200260200101519050611f95611e03611f6860405180604001604052806005815260200164173539b7b760d91b81525061213260201b60201c565b604080518082018252600080825260209182015281518083019092528551825280860190820152906130e9565b95945050505050565b8260405160200161046f9190614472565b60606000611fe48360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050612014611dbf604051806040016040528060048152602001630b9cdbdb60e21b81525061213260201b60201c565b156120225761038a81612b71565b61204d611e33604051806040016040528060018152602001601d60f91b81525061213260201b60201c565b6001036120825761038a611e03611e9b604051806040016040528060018152602001601d60f91b81525061213260201b60201c565b6120b1611dbf60405180604001604052806005815260200164173539b7b760d91b81525061213260201b60201c565b15611f9e5760006120e482611f04604051806040016040528060018152602001602f60f81b81525061213260201b60201c565b90506001815111156121205780600282516120ff919061445f565b8151811061210f5761210f613e96565b602002602001015192505050919050565b508260405160200161046f9190614472565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b8051825160009111156121745750600061027c565b8151835160208501516000929161218a9161452c565b612194919061445f565b9050826020015181036121ab57600191505061027c565b82516020840151819020912014905092915050565b606060006121cd836132ac565b60010190506000816001600160401b038111156121ec576121ec6139ea565b6040519080825280601f01601f191660200182016040528015612216576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461222057509392505050565b60606000612269836040015161213260201b60201c565b90506122a661229f6040518060400160405280600a8152602001691553931250d15394d15160b21b81525061213260201b60201c565b829061338e565b156122cd5750506040805180820190915260048152634e6f6e6560e01b6020820152919050565b61230061229f60405180604001604052806009815260200168556e6c6963656e736560b81b81525061213260201b60201c565b1561232c575050604080518082019091526009815268556e6c6963656e736560b81b6020820152919050565b61235961229f6040518060400160405280600381526020016213525560ea1b81525061213260201b60201c565b1561237f57505060408051808201909152600381526213525560ea1b6020820152919050565b6123b561229f6040518060400160405280600c81526020016b47504c2d322e302d6f6e6c7960a01b81525061213260201b60201c565b806123f557506123f561229f6040518060400160405280601081526020016f23a8261699171816b7b916b630ba32b960811b81525061213260201b60201c565b1561242157505060408051808201909152600981526823a72a9023a8263b1960b91b6020820152919050565b61245761229f6040518060400160405280600c81526020016b47504c2d332e302d6f6e6c7960a01b81525061213260201b60201c565b80612497575061249761229f6040518060400160405280601081526020016f23a8261699971816b7b916b630ba32b960811b81525061213260201b60201c565b156124c3575050604080518082019091526009815268474e552047504c763360b81b6020820152919050565b6124fa61229f6040518060400160405280600d81526020016c4c47504c2d322e312d6f6e6c7960981b81525061213260201b60201c565b8061253b575061253b61229f604051806040016040528060118152602001702623a8261699171896b7b916b630ba32b960791b81525061213260201b60201c565b1561256a57505060408051808201909152600c81526b474e55204c47504c76322e3160a01b6020820152919050565b6125a161229f6040518060400160405280600d81526020016c4c47504c2d332e302d6f6e6c7960981b81525061213260201b60201c565b806125e257506125e261229f604051806040016040528060118152602001702623a8261699971816b7b916b630ba32b960791b81525061213260201b60201c565b1561260f57505060408051808201909152600a815269474e55204c47504c763360b01b6020820152919050565b61264561229f6040518060400160405280600c81526020016b4253442d322d436c6175736560a01b81525061213260201b60201c565b1561267457505060408051808201909152600c81526b4253442d322d436c6175736560a01b6020820152919050565b6126aa61229f6040518060400160405280600c81526020016b4253442d332d436c6175736560a01b81525061213260201b60201c565b156126d957505060408051808201909152600c81526b4253442d332d436c6175736560a01b6020820152919050565b61270a61229f6040518060400160405280600781526020016604d504c2d322e360cc1b81525061213260201b60201c565b1561273457505060408051808201909152600781526604d504c2d322e360cc1b6020820152919050565b61276561229f6040518060400160405280600781526020016604f534c2d332e360cc1b81525061213260201b60201c565b1561278f57505060408051808201909152600781526604f534c2d332e360cc1b6020820152919050565b6127c361229f6040518060400160405280600a81526020016904170616368652d322e360b41b81525061213260201b60201c565b156127f057505060408051808201909152600a81526904170616368652d322e360b41b6020820152919050565b61282761229f6040518060400160405280600d81526020016c4147504c2d332e302d6f6e6c7960981b81525061213260201b60201c565b80612868575061286861229f6040518060400160405280601181526020017020a3a8261699971816b7b916b630ba32b960791b81525061213260201b60201c565b1561289557505060408051808201909152600a815269474e55204147504c763360b01b6020820152919050565b6128c761229f604051806040016040528060088152602001674255534c2d312e3160c01b81525061213260201b60201c565b156128f157505060408051808201909152600781526642534c20312e3160c81b6020820152919050565b6040808401518451915161046f929060200161453f565b60608060005b8451811015612993578185828151811061292a5761292a613e96565b6020026020010151604051602001612943929190613aea565b604051602081830303815290604052915060018551612962919061445f565b811461298b5781604051602001612979919061468f565b60405160208183030381529060405291505b60010161290e565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816129ac57905050905083816000815181106129d7576129d7613e96565b6020026020010181905250604051806040016040528060028152602001612d6360f01b81525081600181518110612a1057612a10613e96565b60200260200101819052508181600281518110612a2f57612a2f613e96565b6020908102919091010152949350505050565b6020808301518351835192840151600093612a6092918491906133a2565b14159392505050565b6040805180820190915260008082526020808301829052845185820151855192860151612a9693906134b3565b9050836020015181612aa8919061445f565b84518590612ab790839061445f565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015612aeb57508161027c565b6020808301519084015160019114612b125750815160208481015190840151829020919020145b8015612b4357825184518590612b2990839061445f565b9052508251602085018051612b3f90839061452c565b9052505b509192915050565b6040805180820190915260008082526020820152612b6a8383836135d3565b5092915050565b6060600082600001516001600160401b03811115612b9157612b916139ea565b6040519080825280601f01601f191660200182016040528015612bbb576020820181803683370190505b50602084810151855192935090830191612b6a918391613679565b60606000612be2610648565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081612bff5790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280612c4090613fa5565b935060ff1681518110612c5557612c55613e96565b6020026020010181905250604051806040016040528060078152602001665e312e33322e3360c81b815250604051602001612c9091906146b4565b604051602081830303815290604052828280612cab90613fa5565b935060ff1681518110612cc057612cc0613e96565b60200260200101819052506040518060400160405280600881526020016776616c696461746560c01b815250828280612cf890613fa5565b935060ff1681518110612d0d57612d0d613e96565b602002602001018190525082604051602001612d299190613ee1565b604051602081830303815290604052828280612d4490613fa5565b935060ff1681518110612d5957612d59613e96565b60200260200101819052506040518060400160405280600a8152602001690b4b58dbdb9d1c9858dd60b21b815250828280612d9390613fa5565b935060ff1681518110612da857612da8613e96565b6020908102919091010152612dbd87846136f3565b8282612dc881613fa5565b935060ff1681518110612ddd57612ddd613e96565b602090810291909101015285515115612e755760408051808201909152600b81526a2d2d7265666572656e636560a81b60208201528282612e1d81613fa5565b935060ff1681518110612e3257612e32613e96565b60209081029190910101528551612e4990846136f3565b8282612e5481613fa5565b935060ff1681518110612e6957612e69613e96565b60200260200101819052505b856080015115612ee35760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282612ebe81613fa5565b935060ff1681518110612ed357612ed3613e96565b6020026020010181905250612f3e565b8415612f3e576040805180820190915260128152712d2d726571756972655265666572656e636560701b60208201528282612f1d81613fa5565b935060ff1681518110612f3257612f32613e96565b60200260200101819052505b60408601515115612fca5760408051808201909152600d81526c2d2d756e73616665416c6c6f7760981b60208201528282612f7881613fa5565b935060ff1681518110612f8d57612f8d613e96565b60200260200101819052508560400151828280612fa990613fa5565b935060ff1681518110612fbe57612fbe613e96565b60200260200101819052505b8560600151156130345760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261301381613fa5565b935060ff168151811061302857613028613e96565b60200260200101819052505b60008160ff166001600160401b03811115613051576130516139ea565b60405190808252806020026020018201604052801561308457816020015b606081526020019060019003908161306f5790505b50905060005b8260ff168160ff1610156130dd57838160ff16815181106130ad576130ad613e96565b6020026020010151828260ff16815181106130ca576130ca613e96565b602090810291909101015260010161308a565b50979650505050505050565b604080518082019091526000808252602082015281518351101561310e57508161027c565b815183516020850151600092916131249161452c565b61312e919061445f565b6020840151909150600190821461314f575082516020840151819020908220145b801561316a5783518551869061316690839061445f565b9052505b50929392505050565b8051825160208085015190840151600093849390926131939284906134b3565b61319d919061452c565b90505b835160208501516131b1919061452c565b8111612b6a57816131c1816146f9565b92505082600001516131f78560200151836131dc919061445f565b86516131e8919061445f565b855160208701518591906134b3565b613201919061452c565b90506131a0565b606060006132168484613173565b61322190600161452c565b6001600160401b03811115613238576132386139ea565b60405190808252806020026020018201604052801561326b57816020015b60608152602001906001900390816132565790505b50905060005b8151811015611c6557613287611e038686612b4b565b82828151811061329957613299613e96565b6020908102919091010152600101613271565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106132f5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613321576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061333f57662386f26fc10000830492506010015b6305f5e1008310613357576305f5e100830492506008015b612710831061336b57612710830492506004015b6064831061337d576064830492506002015b600a831061027c5760010192915050565b600061339a8383613733565b159392505050565b6000808584116134a9576020841161345557600084156133ed5760016133c986602061445f565b6133d4906008614712565b6133df906002614810565b6133e9919061445f565b1990505b83518116856133fc898961452c565b613406919061445f565b805190935082165b81811461344057878411613428578794505050505061192e565b836134328161481c565b94505082845116905061340e565b61344a878561452c565b94505050505061192e565b838320613462858861445f565b61346c908761452c565b91505b8582106134a7578482208082036134945761348a868461452c565b935050505061192e565b61349f60018461445f565b92505061346f565b505b5092949350505050565b600083818685116135be576020851161356d57600085156134ff5760016134db87602061445f565b6134e6906008614712565b6134f1906002614810565b6134fb919061445f565b1990505b845181166000876135108b8b61452c565b61351a919061445f565b855190915083165b82811461355f578186106135475761353a8b8b61452c565b965050505050505061192e565b85613551816146f9565b965050838651169050613522565b85965050505050505061192e565b508383206000905b61357f868961445f565b82116135bc5785832080820361359b578394505050505061192e565b6135a660018561452c565b93505081806135b4906146f9565b925050613575565b505b6135c8878761452c565b979650505050505050565b604080518082019091526000808252602080830182905285518682015186519287015161360093906134b3565b60208087018051918601919091525190915061361c908261445f565b83528451602086015161362f919061452c565b810361363e5760008552613670565b8351835161364c919061452c565b8551869061365b90839061445f565b905250835161366a908261452c565b60208601525b50909392505050565b602081106136b1578151835261369060208461452c565b925061369d60208361452c565b91506136aa60208261445f565b9050613679565b60001981156136e05760016136c783602061445f565b6136d390610100614810565b6136dd919061445f565b90505b9151835183169219169190911790915250565b6060600061370184846106e2565b805160208083015160405193945061371b93909101614833565b60405160208183030381529060405291505092915050565b8151815160009190811115613746575081515b6020808501519084015160005b838110156137ff57825182518082146137cf5760001960208710156137ae5760018461378089602061445f565b61378a919061452c565b613795906008614712565b6137a0906002614810565b6137aa919061445f565b1990505b81811683821681810391146137cc57975061027c9650505050505050565b50505b6137da60208661452c565b94506137e760208561452c565b935050506020816137f8919061452c565b9050613753565b5084518651610cb0919061486f565b610c9f80615e9883390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161385e613863565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161385e6040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b838110156138ef5781810151838201526020016138d7565b50506000910152565b600081518084526139108160208601602086016138d4565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061192e908301846138f8565b7f4661696c656420746f206465706c6f7920636f6e74726163742000000000000081526000835161398081601a8501602088016138d4565b6101d160f51b601a9184019182015283516139a281601c8401602088016138d4565b01601c01949350505050565b60208152600061038a60208301846138f8565b6000602082840312156139d357600080fd5b81516001600160a01b038116811461038a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613a2257613a226139ea565b60405290565b6000806001600160401b03841115613a4257613a426139ea565b50604051601f19601f85018116603f011681018181106001600160401b0382111715613a7057613a706139ea565b604052838152905080828401851015613a8857600080fd5b611c658460208301856138d4565b600082601f830112613aa757600080fd5b61038a83835160208501613a28565b600060208284031215613ac857600080fd5b81516001600160401b03811115613ade57600080fd5b61027884828501613a96565b60008351613afc8184602088016138d4565b835190830190613b108183602088016138d4565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351613b5181601a8501602088016138d4565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351613b8e8160338401602088016138d4565b601160f91b60339290910191820152603401949350505050565b60408152600b60408201526a1193d55391149657d3d55560aa1b606082015260806020820152600061038a60808301846138f8565b600060208284031215613bef57600080fd5b81516001600160401b03811115613c0557600080fd5b8201601f81018413613c1657600080fd5b61027884825160208401613a28565b60008551613c37818460208a016138d4565b602f60f81b9083019081528551613c55816001840160208a016138d4565b602f60f81b600192909101918201528451613c778160028401602089016138d4565b600181830101915050602f60f81b60018201528351613c9d8160028401602088016138d4565b64173539b7b760d91b600292909101918201526007019695505050505050565b604081526000613cd060408301846138f8565b828103602084015260048152630b985cdd60e21b60208201526040810191505092915050565b600060208284031215613d0857600080fd5b8151801515811461038a57600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251613d5081601f8501602087016138d4565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f939091019283015250611b5b60f21b603f820152604101919050565b604081526000613da260408301846138f8565b8281036020840152601181527005cc2e6e85cc2c4e6ded8eae8caa0c2e8d607b1b60208201526040810191505092915050565b604081526000613de860408301846138f8565b8281036020840152600c81526b2e6173742e6c6963656e736560a01b60208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251613e4e8160148501602087016138d4565b6b13ae9735b2b1b1b0b5991a9b60a11b6014939091019283015250602001919050565b604081526000613e8460408301856138f8565b828103602084015261038681856138f8565b634e487b7160e01b600052603260045260246000fd5b601160f91b81528151600090613ec98160018501602087016138d4565b601160f91b6001939091019283015250600201919050565b60008251613ef38184602087016138d4565b6a2f6275696c642d696e666f60a81b920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201526a0391031b7b73a3930b1ba160ad1b604082015260008251613f8281604b8501602087016138d4565b91909101604b0192915050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8103613fbb57613fbb613f8f565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81526801a595b9d0b58db1a560be1b60208201526000825161400e8160298501602087016138d4565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f5041544800000000000000000000606082015260806020820152600061038a60808301846138f8565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156140bb57603f198786030184526140a68583516138f8565b9450602093840193919091019060010161408a565b50929695505050505050565b6000602082840312156140d957600080fd5b81516001600160401b038111156140ef57600080fd5b82016060818503121561410157600080fd5b614109613a00565b81518060030b811461411a57600080fd5b815260208201516001600160401b0381111561413557600080fd5b61414186828501613a96565b60208301525060408201516001600160401b0381111561416057600080fd5b61416c86828501613a96565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e642077697468208152601160f91b6020820152600082516141bc8160218501602087016138d4565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e65207769746820707265666978208152602760f81b60208201526000835161438c8160218501602088016138d4565b6c0139034b71037baba383aba1d1609d1b60219184019182015283516143b981602e8401602088016138d4565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c815268034b230ba34b7b71d160bd1b60208201526000825161400e8160298501602087016138d4565b7f55706772616465207361666574792076616c69646174696f6e206661696c65648152611d0560f11b6020820152600082516144528160228501602087016138d4565b9190910160220192915050565b8181038181111561027c5761027c613f8f565b6d021b7b73a3930b1ba103730b6b2960951b81526000825161449b81600e8501602087016138d4565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201526730b1ba173539b7b760c11b606e820152607601919050565b8082018082111561027c5761027c613f8f565b7f53504458206c6963656e7365206964656e7469666965722000000000000000008152600083516145778160188501602088016138d4565b6301034b7160e51b601891840191820152835161459b81601c8401602088016138d4565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516146a18184602087016138d4565b600160fd1b920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f726540000000008152600082516146ec81601c8501602087016138d4565b91909101601c0192915050565b60006001820161470b5761470b613f8f565b5060010190565b808202811582820484141761027c5761027c613f8f565b6001815b60018411156147645780850481111561474857614748613f8f565b600184161561475657908102905b60019390931c92800261472d565b935093915050565b60008261477b5750600161027c565b816147885750600061027c565b816001811461479e57600281146147a8576147c4565b600191505061027c565b60ff8411156147b9576147b9613f8f565b50506001821b61027c565b5060208310610133831016604e8410600b84101617156147e7575081810a61027c565b6147f46000198484614729565b806000190482111561480857614808613f8f565b029392505050565b600061038a838361476c565b60008161482b5761482b613f8f565b506000190190565b600083516148458184602088016138d4565b601d60f91b90830190815283516148638160018401602088016138d4565b01600101949350505050565b8181036000831280158383131683831282161715612b6a57612b6a613f8f565b6080516115cb6148cd600039600081816101830152818161046e015281816104d00152818161083f0152818161094e01526109b001526115cb6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80636133b4bb116100cd578063a217fddf11610081578063d547741f11610066578063d547741f14610332578063d9caed1214610345578063e63ab1e91461035857600080fd5b8063a217fddf14610317578063c8a023621461031f57600080fd5b80638456cb59116100b25780638456cb59146102a257806385f438c1146102aa57806391d14854146102d157600080fd5b80636133b4bb1461026f57806381100bf01461028257600080fd5b80632f2ff15d116101245780633c2f05a8116101095780633c2f05a8146102375780633f4ba83a1461025c5780635c975abb1461026457600080fd5b80632f2ff15d1461021157806336568abe1461022457600080fd5b806301ffc9a714610156578063116191b61461017e57806321fc65f2146101ca578063248a9ca3146101df575b600080fd5b6101696101643660046111fa565b61037f565b60405190151581526020015b60405180910390f35b6101a57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6101dd6101d83660046112ae565b610418565b005b6102036101ed36600461131d565b6000908152600160208190526040909120015490565b604051908152602001610175565b6101dd61021f366004611336565b6105ba565b6101dd610232366004611336565b6105e6565b6002546101a590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6101dd610644565b60025460ff16610169565b6101dd61027d366004611362565b610679565b6003546101a59073ffffffffffffffffffffffffffffffffffffffff1681565b6101dd6108c6565b6102037f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101696102df366004611336565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610203600081565b6101dd61032d3660046112ae565b6108f8565b6101dd610340366004611336565b610a80565b6101dd6103533660046113bc565b610aa6565b6102037f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061041257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610420610b73565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461044a81610bb6565b610452610bc0565b61049373ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000086610bff565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061050d9089908990899089908990600401611442565b600060405180830381600087803b15801561052757600080fd5b505af115801561053b573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f85b5be9cf454e05e0bddf49315178102227c312078eefa3c00294fb4d912ae4e8686866040516105a09392919061149f565b60405180910390a3506105b36001600055565b5050505050565b600082815260016020819052604090912001546105d681610bb6565b6105e08383610c8c565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610635576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61063f8282610d57565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61066e81610bb6565b610676610e16565b50565b600254610100900473ffffffffffffffffffffffffffffffffffffffff166340c10f19306106a88660056114c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b15801561071357600080fd5b505af1158015610727573d6000803e3d6000fd5b5050600254600580546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810192909252610100909204909116925063a9059cbb91506044016020604051808303816000875af11580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d391906114fc565b506002546107ff90610100900473ffffffffffffffffffffffffffffffffffffffff1685858585610418565b6002546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152610100909204909116906370a0823190602401602060405180830381865afa158015610895573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b9919061151e565b156105e0576105e0611537565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6108f081610bb6565b610676610e93565b610900610b73565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461092a81610bb6565b610932610bc0565b61097373ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000086610bff565b6040517fb8969bd400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b8969bd4906109ed9089908990899089908990600401611442565b600060405180830381600087803b158015610a0757600080fd5b505af1158015610a1b573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb9d4efa96044e5f5e03e696fa9ae2ff66911cc27e8a637c3627c75bc5b2241c88686866040516105a09392919061149f565b60008281526001602081905260409091200154610a9c81610bb6565b6105e08383610d57565b610aae610b73565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610ad881610bb6565b610ae0610bc0565b610b0173ffffffffffffffffffffffffffffffffffffffff85168484610bff565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb84604051610b6091815260200190565b60405180910390a35061063f6001600055565b600260005403610baf576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6106768133610eee565b60025460ff1615610bfd576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261063f908490610f7f565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d4f57600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8716808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610412565b506000610412565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d4f57600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610412565b610e1e611015565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610e9b610bc0565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e693390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f7b576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fa173ffffffffffffffffffffffffffffffffffffffff841683611051565b90508051600014158015610fc6575080806020019051810190610fc491906114fc565b155b1561063f576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610f72565b60025460ff16610bfd576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606061105f83836000611066565b9392505050565b6060814710156110a4576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610f72565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516110cd9190611566565b60006040518083038185875af1925050503d806000811461110a576040519150601f19603f3d011682016040523d82523d6000602084013e61110f565b606091505b509150915061111f868383611129565b9695505050505050565b60608261113e57611139826111b8565b61105f565b8151158015611162575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111b1576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610f72565b508061105f565b8051156111c85780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561120c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461105f57600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461126057600080fd5b919050565b60008083601f84011261127757600080fd5b50813567ffffffffffffffff81111561128f57600080fd5b6020830191508360208285010111156112a757600080fd5b9250929050565b6000806000806000608086880312156112c657600080fd5b6112cf8661123c565b94506112dd6020870161123c565b935060408601359250606086013567ffffffffffffffff81111561130057600080fd5b61130c88828901611265565b969995985093965092949392505050565b60006020828403121561132f57600080fd5b5035919050565b6000806040838503121561134957600080fd5b823591506113596020840161123c565b90509250929050565b6000806000806060858703121561137857600080fd5b6113818561123c565b935060208501359250604085013567ffffffffffffffff8111156113a457600080fd5b6113b087828801611265565b95989497509550505050565b6000806000606084860312156113d157600080fd5b6113da8461123c565b92506113e86020850161123c565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006114946080830184866113f9565b979650505050505050565b8381526040602082015260006114b96040830184866113f9565b95945050505050565b80820180821115610412577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006020828403121561150e57600080fd5b8151801515811461105f57600080fd5b60006020828403121561153057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000825160005b81811015611587576020818601810151858301520161156d565b50600092019182525091905056fea2646970667358221220c22f4256b34c7ceff39a5acf8d5ae318549565a6265a9a23b2d9459a9845ff3f64736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a00330000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f7420"; + "0x600580546001600160a01b03191633908117909155600e60a09081526d11d85d195dd85e5155934b9cdbdb60921b60c0526101049190915261012361012481905261014452606460e090815261016460405261010080516001600160e01b0390811663c0c53b8b60e01b1790915261007992919061029316565b600680546001600160a01b03929092166001600160a01b03199283168117909155600780549092161790553480156100b057600080fd5b5060075460055460016000556002805460ff191690556001600160a01b039182169116808215806100e857506001600160a01b038216155b806100fa57506001600160a01b038116155b156101185760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526101306000826102b2565b5061015b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a826102b2565b506101867f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4836102b2565b5061019f600080516020616e2c833981519152826102b2565b506101b8600080516020616e2c833981519152836102b2565b505050506040516101c89061383e565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f08015801561021a573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b0392831617815560075460405163ae7a3a6f60e01b815230928101929092529091169063ae7a3a6f90602401600060405180830381600087803b15801561027657600080fd5b505af115801561028a573d6000803e3d6000fd5b505050506148bf565b600061029d61384b565b6102a8848483610345565b9150505b92915050565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1661033d5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016102ac565b5060006102ac565b60008061035285846103c1565b90506103b66040518060400160405280601d81526020017f4552433139363750726f78792e736f6c3a4552433139363750726f787900000081525082866040516020016103a0929190613954565b60408051601f19818403018152919052856103cd565b9150505b9392505050565b60006103ba8383610401565b60c081015151600090156103f7576103f084848460c0015161042260201b60201c565b90506103ba565b6103f0848461059b565b600061040d8383610668565b6103ba838360200151846103cd60201b60201c565b60008061042d610678565b9050600061043b8683610712565b905060006104588260600151836020015185610b3560201b60201c565b9050600061046883838989610cea565b9050600061047582611966565b602081015181519192509060030b156104ce5789826040015160405160200161049f929190613978565b60408051601f198184030181529082905262461bcd60e51b82526104c5916004016139de565b60405180910390fd5b60006105176040518060400160405280601581526020017f4465706c6f79656420746f20616464726573733a200000000000000000000000815250836001611afd60201b60201c565b60405163c6ce059d60e01b8152909150600080516020616e0c8339815191529063c6ce059d9061054b9084906004016139de565b602060405180830381865afa158015610568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058c91906139f1565b9b9a5050505050505050505050565b604051638d1cc92560e01b81526000908190600080516020616e0c83398151915290638d1cc925906105d19087906004016139de565b600060405180830381865afa1580156105ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106169190810190613ae6565b905060006106458285604051602001610630929190613b1a565b60408051601f19818403018152919052611c9d565b90506001600160a01b0381166102a857848460405160200161049f929190613b49565b61067482826000611cb0565b5050565b60408051808201825260038152621bdd5d60ea1b602082015290516334515cdb60e21b8152606091600080516020616e0c83398151915291829063d145736c906106c6908490600401613bd8565b600060405180830381865afa1580156106e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261070b9190810190613c0d565b9250505090565b6107446040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b6000600080516020616e0c83398151915290506107896040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b61079285611d8a565b602082015260006107a286611fdf565b90506000836001600160a01b031663d930a0e66040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080c9190810190613c0d565b868385602001516040516020016108269493929190613c55565b60408051601f19818403018152908290526360f9bb1160e01b825291506000906001600160a01b038616906360f9bb11906108659085906004016139de565b600060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108aa9190810190613c0d565b604051636da11afb60e11b81529091506001600160a01b0386169063db4235f6906108d9908490600401613ced565b602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190613d26565b61092f578160405160200161049f9190613d48565b6040516309389f5960e31b81526001600160a01b038616906349c4fac89061095b908490600401613dbf565b600060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a09190810190613c0d565b8452604051636da11afb60e11b81526001600160a01b0386169063db4235f6906109ce908490600401613e05565b602060405180830381865afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f9190613d26565b15610a8b576040516309389f5960e31b81526001600160a01b038616906349c4fac890610a40908490600401613e05565b600060405180830381865afa158015610a5d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a859190810190613c0d565b60408501525b846001600160a01b03166349c4fac8828660000151604051602001610ab09190613e46565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610adc929190613ea1565b600060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b219190810190613c0d565b606085015250608083015250949350505050565b60408051600480825260a0820190925260609160009190816020015b6060815260200190600190039081610b51579050509050604051806040016040528060048152602001630677265760e41b81525081600081518110610b9857610b98613ec6565b6020026020010181905250604051806040016040528060038152602001620b5c9b60ea1b81525081600181518110610bd257610bd2613ec6565b602002602001018190525084604051602001610bee9190613edc565b60405160208183030381529060405281600281518110610c1057610c10613ec6565b602002602001018190525082604051602001610c2c9190613f11565b60405160208183030381529060405281600381518110610c4e57610c4e613ec6565b60209081029190910101526000610c6482611966565b9050600081602001519050610ccb610c9e60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b6040805180820182526000808252602091820152815180830190925284518252808501908201529061218f565b610ce0578560405160200161049f9190613f40565b9695505050505050565b60a0810151604080518082018252600080825260209182015281518083019092528251808352928101910152606090600080516020616e0c8339815191529015610d34565b511590565b610e5057826020015115610dc45760405162461bcd60e51b81526020600482015260586024820152600080516020616e4c83398151915260448201527f62652075736564207768656e207468652060736b6970566572696679536f757260648201527f6365436f646560206f7074696f6e206973206074727565600000000000000000608482015260a4016104c5565b8260c0015115610e505760405162461bcd60e51b81526020600482015260536024820152600080516020616e4c83398151915260448201527f62652075736564207768656e207468652060736b69704c6963656e736554797060648201527f6560206f7074696f6e2069732060747275656000000000000000000000000000608482015260a4016104c5565b6040805160ff8082526120008201909252600091816020015b6060815260200190600190039081610e695790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280610eaa90613fd5565b935060ff1681518110610ebf57610ebf613ec6565b60200260200101819052506040518060400160405280600d81526020016c302e302e312d616c7068612e3760981b815250604051602001610f009190613ff4565b604051602081830303815290604052828280610f1b90613fd5565b935060ff1681518110610f3057610f30613ec6565b6020026020010181905250604051806040016040528060068152602001656465706c6f7960d01b815250828280610f6690613fd5565b935060ff1681518110610f7b57610f7b613ec6565b60200260200101819052506040518060400160405280600e81526020016d2d2d636f6e74726163744e616d6560901b815250828280610fb990613fd5565b935060ff1681518110610fce57610fce613ec6565b60200260200101819052508760200151828280610fea90613fd5565b935060ff1681518110610fff57610fff613ec6565b60200260200101819052506040518060400160405280600e81526020016d05a5ac6dedce8e4c2c6e8a0c2e8d60931b81525082828061103d90613fd5565b935060ff168151811061105257611052613ec6565b60209081029190910101528751828261106a81613fd5565b935060ff168151811061107f5761107f613ec6565b6020026020010181905250604051806040016040528060098152602001680b4b58da185a5b925960ba1b8152508282806110b890613fd5565b935060ff16815181106110cd576110cd613ec6565b60209081029190910101526110e1466121f0565b82826110ec81613fd5565b935060ff168151811061110157611101613ec6565b60200260200101819052506040518060400160405280600f81526020016e2d2d6275696c64496e666f46696c6560881b81525082828061114090613fd5565b935060ff168151811061115557611155613ec6565b60200260200101819052508682828061116d90613fd5565b935060ff168151811061118257611182613ec6565b60209081029190910101528551156112905760408051808201909152601581527f2d2d636f6e7374727563746f7242797465636f64650000000000000000000000602082015282826111d381613fd5565b935060ff16815181106111e8576111e8613ec6565b60209081029190910101526040516371aad10d60e01b81526001600160a01b038416906371aad10d9061121f9089906004016139de565b600060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112649190810190613c0d565b828261126f81613fd5565b935060ff168151811061128457611284613ec6565b60200260200101819052505b84602001511561133d576040805180820190915260128152712d2d766572696679536f75726365436f646560701b602082015282826112ce81613fd5565b935060ff16815181106112e3576112e3613ec6565b60200260200101819052506040518060400160405280600581526020016466616c736560d81b81525082828061131890613fd5565b935060ff168151811061132d5761132d613ec6565b60200260200101819052506114a4565b611353610d2f8660a0015161216260201b60201c565b6113d65760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261138681613fd5565b935060ff168151811061139b5761139b613ec6565b60200260200101819052508460a001516040516020016113bb9190613edc565b60405160208183030381529060405282828061131890613fd5565b8460c001511580156113fb57506113f9610d2f896040015161216260201b60201c565b155b156114a45760408051808201909152600d81526c2d2d6c6963656e73655479706560981b6020820152828261142f81613fd5565b935060ff168151811061144457611444613ec6565b602090810291909101015261145888612282565b6040516020016114689190613edc565b60405160208183030381529060405282828061148390613fd5565b935060ff168151811061149857611498613ec6565b60200260200101819052505b6114ba610d2f866040015161216260201b60201c565b61153d5760408051808201909152600b81526a0b4b5c995b185e595c925960aa1b602082015282826114eb81613fd5565b935060ff168151811061150057611500613ec6565b6020026020010181905250846040015182828061151c90613fd5565b935060ff168151811061153157611531613ec6565b60200260200101819052505b60608501511561162e576040805180820190915260068152650b4b5cd85b1d60d21b6020820152828261156f81613fd5565b935060ff168151811061158457611584613ec6565b60209081029190910101526060850151604051631623433d60e31b815260048101919091526001600160a01b0384169063b11a19e890602401600060405180830381865afa1580156115da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116029190810190613c0d565b828261160d81613fd5565b935060ff168151811061162257611622613ec6565b60200260200101819052505b60e085015151156116c05760408051808201909152600a8152690b4b59d85cd31a5b5a5d60b21b6020820152828261166581613fd5565b935060ff168151811061167a5761167a613ec6565b602090810291909101015260e085015151611694906121f0565b828261169f81613fd5565b935060ff16815181106116b4576116b4613ec6565b60200260200101819052505b60e0850151602001511561175d5760408051808201909152600a8152692d2d676173507269636560b01b602082015282826116fa81613fd5565b935060ff168151811061170f5761170f613ec6565b60200260200101819052506117318560e00151602001516121f060201b60201c565b828261173c81613fd5565b935060ff168151811061175157611751613ec6565b60200260200101819052505b60e085015160400151156117fe5760408051808201909152600e81526d2d2d6d617846656550657247617360901b6020820152828261179b81613fd5565b935060ff16815181106117b0576117b0613ec6565b60200260200101819052506117d28560e00151604001516121f060201b60201c565b82826117dd81613fd5565b935060ff16815181106117f2576117f2613ec6565b60200260200101819052505b60e085015160600151156118ae5760408051808201909152601681527f2d2d6d61785072696f72697479466565506572476173000000000000000000006020820152828261184b81613fd5565b935060ff168151811061186057611860613ec6565b60200260200101819052506118828560e00151606001516121f060201b60201c565b828261188d81613fd5565b935060ff16815181106118a2576118a2613ec6565b60200260200101819052505b60008160ff166001600160401b038111156118cb576118cb613a1a565b6040519080825280602002602001820160405280156118fe57816020015b60608152602001906001900390816118e95790505b50905060005b8260ff168160ff16101561195757838160ff168151811061192757611927613ec6565b6020026020010151828260ff168151811061194457611944613ec6565b6020908102919091010152600101611904565b5093505050505b949350505050565b61198d6040518060600160405280600060030b815260200160608152602001606081525090565b6040805180820182526004808252630c4c2e6d60e31b602083015291516334515cdb60e21b8152600080516020616e0c83398151915292600091849163d145736c916119db9186910161404b565b600060405180830381865afa1580156119f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a209190810190613c0d565b90506000611a2e8683612938565b90506000846001600160a01b031663f45c1ce7836040518263ffffffff1660e01b8152600401611a5e9190614092565b6000604051808303816000875af1158015611a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aa591908101906140f7565b805190915060030b15801590611abe5750602081015151155b8015611acd5750604081015151155b15610ce05781600081518110611ae557611ae5613ec6565b602002602001015160405160200161049f91906141aa565b60606000611b328560408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b604080518082018252600080825260209182015281518083019092528651825280870190820152909150611b699082905b90612a72565b15611c66576000611be682611be081611bda611bac8a60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6040805180820182526000808252602091820152815180830190925282518252918201519181019190915290565b90612a99565b90612af6565b9050611c1a611c13604051806040016040528060018152602001600560f91b81525061216260201b60201c565b8290612a72565b15611c5457611c51611c4a604051806040016040528060018152602001600560f91b81525061216260201b60201c565b8290612b7b565b90505b611c5d81612ba1565b925050506103ba565b8215611c7f57848460405160200161049f92919061437a565b50506040805160208101909152600081526103ba565b509392505050565b6000808251602084016000f09392505050565b8160a0015115611cbf57505050565b6000611ccc848484612c06565b90506000611cd982611966565b602081015181519192509060030b158015611d4c5750611d4c611d20604051806040016040528060078152602001665355434345535360c81b81525061216260201b60201c565b604080518082018252600080825260209182015281518083019092528451825280850190820152611b63565b15611d5957505050505050565b60408201515115611d7957816040015160405160200161049f91906143f5565b8060405160200161049f919061443f565b60606000611dbf8360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050611df6611def604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b829061218f565b15611e38576103ba611e33611e2c604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b8390613119565b612ba1565b611e6a611e63604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b82906131a3565b600103611ed257611e9c611c4a604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b506103ba611e33611ecb604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b8390612b7b565b611f01611def60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b15611fce576000611f3982611f34604051806040016040528060018152602001602f60f81b81525061216260201b60201c565b613238565b905060008160018351611f4c919061448f565b81518110611f5c57611f5c613ec6565b60200260200101519050611fc5611e33611f9860405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b60408051808201825260008082526020918201528151808301909252855182528086019082015290613119565b95945050505050565b8260405160200161049f91906144a2565b606060006120148360408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050612044611def604051806040016040528060048152602001630b9cdbdb60e21b81525061216260201b60201c565b15612052576103ba81612ba1565b61207d611e63604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b6001036120b2576103ba611e33611ecb604051806040016040528060018152602001601d60f91b81525061216260201b60201c565b6120e1611def60405180604001604052806005815260200164173539b7b760d91b81525061216260201b60201c565b15611fce57600061211482611f34604051806040016040528060018152602001602f60f81b81525061216260201b60201c565b905060018151111561215057806002825161212f919061448f565b8151811061213f5761213f613ec6565b602002602001015192505050919050565b508260405160200161049f91906144a2565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b8051825160009111156121a4575060006102ac565b815183516020850151600092916121ba9161455c565b6121c4919061448f565b9050826020015181036121db5760019150506102ac565b82516020840151819020912014905092915050565b606060006121fd836132dc565b60010190506000816001600160401b0381111561221c5761221c613a1a565b6040519080825280601f01601f191660200182016040528015612246576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461225057509392505050565b60606000612299836040015161216260201b60201c565b90506122d66122cf6040518060400160405280600a8152602001691553931250d15394d15160b21b81525061216260201b60201c565b82906133be565b156122fd5750506040805180820190915260048152634e6f6e6560e01b6020820152919050565b6123306122cf60405180604001604052806009815260200168556e6c6963656e736560b81b81525061216260201b60201c565b1561235c575050604080518082019091526009815268556e6c6963656e736560b81b6020820152919050565b6123896122cf6040518060400160405280600381526020016213525560ea1b81525061216260201b60201c565b156123af57505060408051808201909152600381526213525560ea1b6020820152919050565b6123e56122cf6040518060400160405280600c81526020016b47504c2d322e302d6f6e6c7960a01b81525061216260201b60201c565b8061242557506124256122cf6040518060400160405280601081526020016f23a8261699171816b7b916b630ba32b960811b81525061216260201b60201c565b1561245157505060408051808201909152600981526823a72a9023a8263b1960b91b6020820152919050565b6124876122cf6040518060400160405280600c81526020016b47504c2d332e302d6f6e6c7960a01b81525061216260201b60201c565b806124c757506124c76122cf6040518060400160405280601081526020016f23a8261699971816b7b916b630ba32b960811b81525061216260201b60201c565b156124f3575050604080518082019091526009815268474e552047504c763360b81b6020820152919050565b61252a6122cf6040518060400160405280600d81526020016c4c47504c2d322e312d6f6e6c7960981b81525061216260201b60201c565b8061256b575061256b6122cf604051806040016040528060118152602001702623a8261699171896b7b916b630ba32b960791b81525061216260201b60201c565b1561259a57505060408051808201909152600c81526b474e55204c47504c76322e3160a01b6020820152919050565b6125d16122cf6040518060400160405280600d81526020016c4c47504c2d332e302d6f6e6c7960981b81525061216260201b60201c565b8061261257506126126122cf604051806040016040528060118152602001702623a8261699971816b7b916b630ba32b960791b81525061216260201b60201c565b1561263f57505060408051808201909152600a815269474e55204c47504c763360b01b6020820152919050565b6126756122cf6040518060400160405280600c81526020016b4253442d322d436c6175736560a01b81525061216260201b60201c565b156126a457505060408051808201909152600c81526b4253442d322d436c6175736560a01b6020820152919050565b6126da6122cf6040518060400160405280600c81526020016b4253442d332d436c6175736560a01b81525061216260201b60201c565b1561270957505060408051808201909152600c81526b4253442d332d436c6175736560a01b6020820152919050565b61273a6122cf6040518060400160405280600781526020016604d504c2d322e360cc1b81525061216260201b60201c565b1561276457505060408051808201909152600781526604d504c2d322e360cc1b6020820152919050565b6127956122cf6040518060400160405280600781526020016604f534c2d332e360cc1b81525061216260201b60201c565b156127bf57505060408051808201909152600781526604f534c2d332e360cc1b6020820152919050565b6127f36122cf6040518060400160405280600a81526020016904170616368652d322e360b41b81525061216260201b60201c565b1561282057505060408051808201909152600a81526904170616368652d322e360b41b6020820152919050565b6128576122cf6040518060400160405280600d81526020016c4147504c2d332e302d6f6e6c7960981b81525061216260201b60201c565b8061289857506128986122cf6040518060400160405280601181526020017020a3a8261699971816b7b916b630ba32b960791b81525061216260201b60201c565b156128c557505060408051808201909152600a815269474e55204147504c763360b01b6020820152919050565b6128f76122cf604051806040016040528060088152602001674255534c2d312e3160c01b81525061216260201b60201c565b1561292157505060408051808201909152600781526642534c20312e3160c81b6020820152919050565b6040808401518451915161049f929060200161456f565b60608060005b84518110156129c3578185828151811061295a5761295a613ec6565b6020026020010151604051602001612973929190613b1a565b604051602081830303815290604052915060018551612992919061448f565b81146129bb57816040516020016129a991906146bf565b60405160208183030381529060405291505b60010161293e565b5060408051600380825260808201909252600091816020015b60608152602001906001900390816129dc5790505090508381600081518110612a0757612a07613ec6565b6020026020010181905250604051806040016040528060028152602001612d6360f01b81525081600181518110612a4057612a40613ec6565b60200260200101819052508181600281518110612a5f57612a5f613ec6565b6020908102919091010152949350505050565b6020808301518351835192840151600093612a9092918491906133d2565b14159392505050565b6040805180820190915260008082526020808301829052845185820151855192860151612ac693906134e3565b9050836020015181612ad8919061448f565b84518590612ae790839061448f565b90525060208401525090919050565b6040805180820190915260008082526020820152815183511015612b1b5750816102ac565b6020808301519084015160019114612b425750815160208481015190840151829020919020145b8015612b7357825184518590612b5990839061448f565b9052508251602085018051612b6f90839061455c565b9052505b509192915050565b6040805180820190915260008082526020820152612b9a838383613603565b5092915050565b6060600082600001516001600160401b03811115612bc157612bc1613a1a565b6040519080825280601f01601f191660200182016040528015612beb576020820181803683370190505b50602084810151855192935090830191612b9a9183916136a9565b60606000612c12610678565b6040805160ff808252612000820190925291925060009190816020015b6060815260200190600190039081612c2f5790505090506000604051806040016040528060038152602001620dce0f60eb1b815250828280612c7090613fd5565b935060ff1681518110612c8557612c85613ec6565b6020026020010181905250604051806040016040528060078152602001665e312e33322e3360c81b815250604051602001612cc091906146e4565b604051602081830303815290604052828280612cdb90613fd5565b935060ff1681518110612cf057612cf0613ec6565b60200260200101819052506040518060400160405280600881526020016776616c696461746560c01b815250828280612d2890613fd5565b935060ff1681518110612d3d57612d3d613ec6565b602002602001018190525082604051602001612d599190613f11565b604051602081830303815290604052828280612d7490613fd5565b935060ff1681518110612d8957612d89613ec6565b60200260200101819052506040518060400160405280600a8152602001690b4b58dbdb9d1c9858dd60b21b815250828280612dc390613fd5565b935060ff1681518110612dd857612dd8613ec6565b6020908102919091010152612ded8784613723565b8282612df881613fd5565b935060ff1681518110612e0d57612e0d613ec6565b602090810291909101015285515115612ea55760408051808201909152600b81526a2d2d7265666572656e636560a81b60208201528282612e4d81613fd5565b935060ff1681518110612e6257612e62613ec6565b60209081029190910101528551612e799084613723565b8282612e8481613fd5565b935060ff1681518110612e9957612e99613ec6565b60200260200101819052505b856080015115612f135760408051808201909152601881527f2d2d756e73616665536b697053746f72616765436865636b000000000000000060208201528282612eee81613fd5565b935060ff1681518110612f0357612f03613ec6565b6020026020010181905250612f6e565b8415612f6e576040805180820190915260128152712d2d726571756972655265666572656e636560701b60208201528282612f4d81613fd5565b935060ff1681518110612f6257612f62613ec6565b60200260200101819052505b60408601515115612ffa5760408051808201909152600d81526c2d2d756e73616665416c6c6f7760981b60208201528282612fa881613fd5565b935060ff1681518110612fbd57612fbd613ec6565b60200260200101819052508560400151828280612fd990613fd5565b935060ff1681518110612fee57612fee613ec6565b60200260200101819052505b8560600151156130645760408051808201909152601481527f2d2d756e73616665416c6c6f7752656e616d65730000000000000000000000006020820152828261304381613fd5565b935060ff168151811061305857613058613ec6565b60200260200101819052505b60008160ff166001600160401b0381111561308157613081613a1a565b6040519080825280602002602001820160405280156130b457816020015b606081526020019060019003908161309f5790505b50905060005b8260ff168160ff16101561310d57838160ff16815181106130dd576130dd613ec6565b6020026020010151828260ff16815181106130fa576130fa613ec6565b60209081029190910101526001016130ba565b50979650505050505050565b604080518082019091526000808252602082015281518351101561313e5750816102ac565b815183516020850151600092916131549161455c565b61315e919061448f565b6020840151909150600190821461317f575082516020840151819020908220145b801561319a5783518551869061319690839061448f565b9052505b50929392505050565b8051825160208085015190840151600093849390926131c39284906134e3565b6131cd919061455c565b90505b835160208501516131e1919061455c565b8111612b9a57816131f181614729565b925050826000015161322785602001518361320c919061448f565b8651613218919061448f565b855160208701518591906134e3565b613231919061455c565b90506131d0565b6060600061324684846131a3565b61325190600161455c565b6001600160401b0381111561326857613268613a1a565b60405190808252806020026020018201604052801561329b57816020015b60608152602001906001900390816132865790505b50905060005b8151811015611c95576132b7611e338686612b7b565b8282815181106132c9576132c9613ec6565b60209081029190910101526001016132a1565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613325577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613351576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061336f57662386f26fc10000830492506010015b6305f5e1008310613387576305f5e100830492506008015b612710831061339b57612710830492506004015b606483106133ad576064830492506002015b600a83106102ac5760010192915050565b60006133ca8383613763565b159392505050565b6000808584116134d95760208411613485576000841561341d5760016133f986602061448f565b613404906008614742565b61340f906002614840565b613419919061448f565b1990505b835181168561342c898961455c565b613436919061448f565b805190935082165b81811461347057878411613458578794505050505061195e565b836134628161484c565b94505082845116905061343e565b61347a878561455c565b94505050505061195e565b838320613492858861448f565b61349c908761455c565b91505b8582106134d7578482208082036134c4576134ba868461455c565b935050505061195e565b6134cf60018461448f565b92505061349f565b505b5092949350505050565b600083818685116135ee576020851161359d576000851561352f57600161350b87602061448f565b613516906008614742565b613521906002614840565b61352b919061448f565b1990505b845181166000876135408b8b61455c565b61354a919061448f565b855190915083165b82811461358f578186106135775761356a8b8b61455c565b965050505050505061195e565b8561358181614729565b965050838651169050613552565b85965050505050505061195e565b508383206000905b6135af868961448f565b82116135ec578583208082036135cb578394505050505061195e565b6135d660018561455c565b93505081806135e490614729565b9250506135a5565b505b6135f8878761455c565b979650505050505050565b604080518082019091526000808252602080830182905285518682015186519287015161363093906134e3565b60208087018051918601919091525190915061364c908261448f565b83528451602086015161365f919061455c565b810361366e57600085526136a0565b8351835161367c919061455c565b8551869061368b90839061448f565b905250835161369a908261455c565b60208601525b50909392505050565b602081106136e157815183526136c060208461455c565b92506136cd60208361455c565b91506136da60208261448f565b90506136a9565b60001981156137105760016136f783602061448f565b61370390610100614840565b61370d919061448f565b90505b9151835183169219169190911790915250565b606060006137318484610712565b805160208083015160405193945061374b93909101614863565b60405160208183030381529060405291505092915050565b8151815160009190811115613776575081515b6020808501519084015160005b8381101561382f57825182518082146137ff5760001960208710156137de576001846137b089602061448f565b6137ba919061455c565b6137c5906008614742565b6137d0906002614840565b6137da919061448f565b1990505b81811683821681810391146137fc5797506102ac9650505050505050565b50505b61380a60208661455c565b945061381760208561455c565b93505050602081613828919061455c565b9050613783565b5084518651610ce0919061489f565b610c9f8061616d83390190565b6040518060e0016040528060608152602001606081526020016060815260200160001515815260200160001515815260200160001515815260200161388e613893565b905290565b6040518061010001604052806000151581526020016000151581526020016060815260200160008019168152602001606081526020016060815260200160001515815260200161388e6040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b8381101561391f578181015183820152602001613907565b50506000910152565b60008151808452613940816020860160208601613904565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061195e90830184613928565b7f4661696c656420746f206465706c6f7920636f6e7472616374200000000000008152600083516139b081601a850160208801613904565b6101d160f51b601a9184019182015283516139d281601c840160208801613904565b01601c01949350505050565b6020815260006103ba6020830184613928565b600060208284031215613a0357600080fd5b81516001600160a01b03811681146103ba57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613a5257613a52613a1a565b60405290565b6000806001600160401b03841115613a7257613a72613a1a565b50604051601f19601f85018116603f011681018181106001600160401b0382111715613aa057613aa0613a1a565b604052838152905080828401851015613ab857600080fd5b611c95846020830185613904565b600082601f830112613ad757600080fd5b6103ba83835160208501613a58565b600060208284031215613af857600080fd5b81516001600160401b03811115613b0e57600080fd5b6102a884828501613ac6565b60008351613b2c818460208801613904565b835190830190613b40818360208801613904565b01949350505050565b7f4661696c656420746f206465706c6f7920636f6e747261637420000000000000815260008351613b8181601a850160208801613904565b7f207573696e6720636f6e7374727563746f722064617461202200000000000000601a918401918201528351613bbe816033840160208801613904565b601160f91b60339290910191820152603401949350505050565b60408152600b60408201526a1193d55391149657d3d55560aa1b60608201526080602082015260006103ba6080830184613928565b600060208284031215613c1f57600080fd5b81516001600160401b03811115613c3557600080fd5b8201601f81018413613c4657600080fd5b6102a884825160208401613a58565b60008551613c67818460208a01613904565b602f60f81b9083019081528551613c85816001840160208a01613904565b602f60f81b600192909101918201528451613ca7816002840160208901613904565b600181830101915050602f60f81b60018201528351613ccd816002840160208801613904565b64173539b7b760d91b600292909101918201526007019695505050505050565b604081526000613d006040830184613928565b828103602084015260048152630b985cdd60e21b60208201526040810191505092915050565b600060208284031215613d3857600080fd5b815180151581146103ba57600080fd5b7f436f756c64206e6f742066696e642041535420696e2061727469666163742000815260008251613d8081601f850160208701613904565b7f2e205365742060617374203d20747275656020696e20666f756e6472792e746f601f939091019283015250611b5b60f21b603f820152604101919050565b604081526000613dd26040830184613928565b8281036020840152601181527005cc2e6e85cc2c4e6ded8eae8caa0c2e8d607b1b60208201526040810191505092915050565b604081526000613e186040830184613928565b8281036020840152600c81526b2e6173742e6c6963656e736560a01b60208201526040810191505092915050565b7f2e6d657461646174612e736f75726365732e5b27000000000000000000000000815260008251613e7e816014850160208701613904565b6b13ae9735b2b1b1b0b5991a9b60a11b6014939091019283015250602001919050565b604081526000613eb46040830185613928565b82810360208401526103b68185613928565b634e487b7160e01b600052603260045260246000fd5b601160f91b81528151600090613ef9816001850160208701613904565b601160f91b6001939091019283015250600201919050565b60008251613f23818460208701613904565b6a2f6275696c642d696e666f60a81b920191825250600b01919050565b7f436f756c64206e6f742066696e64206275696c642d696e666f2066696c65207781527f697468206d61746368696e6720736f7572636520636f6465206861736820666f60208201526a0391031b7b73a3930b1ba160ad1b604082015260008251613fb281604b850160208701613904565b91909101604b0192915050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8103613feb57613feb613fbf565b60010192915050565b7f406f70656e7a657070656c696e2f646566656e6465722d6465706c6f792d636c81526801a595b9d0b58db1a560be1b60208201526000825161403e816029850160208701613904565b9190910160290192915050565b60408152601660408201527f4f50454e5a455050454c494e5f424153485f504154480000000000000000000060608201526080602082015260006103ba6080830184613928565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156140eb57603f198786030184526140d6858351613928565b945060209384019391909101906001016140ba565b50929695505050505050565b60006020828403121561410957600080fd5b81516001600160401b0381111561411f57600080fd5b82016060818503121561413157600080fd5b614139613a30565b81518060030b811461414a57600080fd5b815260208201516001600160401b0381111561416557600080fd5b61417186828501613ac6565b60208301525060408201516001600160401b0381111561419057600080fd5b61419c86828501613ac6565b604083015250949350505050565b7f4661696c656420746f2072756e206261736820636f6d6d616e642077697468208152601160f91b6020820152600082516141ec816021850160208701613904565b7f222e20496620796f7520617265207573696e672057696e646f77732c2073657460219390910192830152507f20746865204f50454e5a455050454c494e5f424153485f5041544820656e766960418201527f726f6e6d656e74207661726961626c6520746f207468652066756c6c7920717560618201527f616c69666965642070617468206f66207468652062617368206578656375746160818201527f626c652e20466f72206578616d706c652c20696620796f75206172652075736960a18201527f6e672047697420666f722057696e646f77732c206164642074686520666f6c6c60c18201527f6f77696e67206c696e6520696e20746865202e656e762066696c65206f66207960e18201527f6f75722070726f6a65637420287573696e6720666f727761726420736c6173686101018201527f6573293a0a4f50454e5a455050454c494e5f424153485f504154483d22433a2f6101218201527f50726f6772616d2046696c65732f4769742f62696e2f6261736822000000000061014182015261015c01919050565b7f4661696c656420746f2066696e64206c696e65207769746820707265666978208152602760f81b6020820152600083516143bc816021850160208801613904565b6c0139034b71037baba383aba1d1609d1b60219184019182015283516143e981602e840160208801613904565b01602e01949350505050565b7f4661696c656420746f2072756e2075706772616465207361666574792076616c815268034b230ba34b7b71d160bd1b60208201526000825161403e816029850160208701613904565b7f55706772616465207361666574792076616c69646174696f6e206661696c65648152611d0560f11b602082015260008251614482816022850160208701613904565b9190910160220192915050565b818103818111156102ac576102ac613fbf565b6d021b7b73a3930b1ba103730b6b2960951b8152600082516144cb81600e850160208701613904565b7f206d75737420626520696e2074686520666f726d6174204d79436f6e74726163600e9390910192830152507f742e736f6c3a4d79436f6e7472616374206f72204d79436f6e74726163742e73602e8201527f6f6c206f72206f75742f4d79436f6e74726163742e736f6c2f4d79436f6e7472604e8201526730b1ba173539b7b760c11b606e820152607601919050565b808201808211156102ac576102ac613fbf565b7f53504458206c6963656e7365206964656e7469666965722000000000000000008152600083516145a7816018850160208801613904565b6301034b7160e51b60189184019182015283516145cb81601c840160208801613904565b7f20646f6573206e6f74206c6f6f6b206c696b65206120737570706f7274656420601c92909101918201527f6c6963656e736520666f7220626c6f636b206578706c6f726572207665726966603c8201527f69636174696f6e2e205573652074686520606c6963656e73655479706560206f605c8201527f7074696f6e20746f20737065636966792061206c6963656e736520747970652c607c8201527f206f7220736574207468652060736b69704c6963656e73655479706560206f70609c8201527f74696f6e20746f2060747275656020746f20736b69702e00000000000000000060bc82015260d301949350505050565b600082516146d1818460208701613904565b600160fd1b920191825250600101919050565b7f406f70656e7a657070656c696e2f75706772616465732d636f7265400000000081526000825161471c81601c850160208701613904565b91909101601c0192915050565b60006001820161473b5761473b613fbf565b5060010190565b80820281158282048414176102ac576102ac613fbf565b6001815b60018411156147945780850481111561477857614778613fbf565b600184161561478657908102905b60019390931c92800261475d565b935093915050565b6000826147ab575060016102ac565b816147b8575060006102ac565b81600181146147ce57600281146147d8576147f4565b60019150506102ac565b60ff8411156147e9576147e9613fbf565b50506001821b6102ac565b5060208310610133831016604e8410600b8410161715614817575081810a6102ac565b6148246000198484614759565b806000190482111561483857614838613fbf565b029392505050565b60006103ba838361479c565b60008161485b5761485b613fbf565b506000190190565b60008351614875818460208801613904565b601d60f91b9083019081528351614893816001840160208801613904565b01600101949350505050565b8181036000831280158383131683831282161715612b9a57612b9a613fbf565b6080516118706148fd600039600081816101bf015281816105260152818161057b0152818161087201528181610b2c0152610b8101526118706000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806381100bf0116100e3578063a217fddf1161008c578063d936547e11610066578063d936547e14610395578063d9caed12146103b8578063e63ab1e9146103cb57600080fd5b8063a217fddf14610367578063c709ab6e1461036f578063d547741f1461038257600080fd5b806391d14854116100bd57806391d14854146103085780639a590427146103415780639b19251a1461035457600080fd5b806381100bf0146102c65780638456cb59146102d957806385f438c1146102e157600080fd5b806336568abe11610145578063570618e11161011f578063570618e1146102815780635c975abb146102a85780636133b4bb146102b357600080fd5b806336568abe146102535780633c2f05a8146102665780633f4ba83a1461027957600080fd5b806321fc65f21161017657806321fc65f2146101f9578063248a9ca31461020e5780632f2ff15d1461024057600080fd5b806301ffc9a714610192578063116191b6146101ba575b600080fd5b6101a56101a03660046112da565b6103f2565b60405190151581526020015b60405180910390f35b6101e17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b1565b61020c610207366004611381565b61048b565b005b61023261021c3660046113f0565b6000908152600160208190526040909120015490565b6040519081526020016101b1565b61020c61024e366004611409565b61064b565b61020c610261366004611409565b610677565b6004546101e1906001600160a01b031681565b61020c6106c8565b6102327f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff166101a5565b61020c6102c1366004611435565b6106fd565b6005546101e1906001600160a01b031681565b61020c6108f4565b6102327f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101a5610316366004611409565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61020c61034f36600461148f565b610926565b61020c61036236600461148f565b6109da565b610232600081565b61020c61037d3660046114aa565b610a91565b61020c610390366004611409565b610c56565b6101a56103a336600461148f565b60036020526000908152604090205460ff1681565b61020c6103c6366004611549565b610c7c565b6102327f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061048557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610493610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46104bd81610db7565b6104c5610dc1565b6001600160a01b03851660009081526003602052604090205460ff16610517576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61054b6001600160a01b0386167f000000000000000000000000000000000000000000000000000000000000000086610e00565b6040517f5131ab590000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635131ab59906105b89088908a908990899089906004016115cf565b600060405180830381600087803b1580156105d257600080fd5b505af11580156105e6573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b03167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063193929190611612565b60405180910390a3506106446001600055565b5050505050565b6000828152600160208190526040909120015461066781610db7565b6106718383610e80565b50505050565b6001600160a01b03811633146106b9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282610f13565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6106f281610db7565b6106fa610f9a565b50565b6004546001600160a01b03166340c10f193061071a866005611635565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561077857600080fd5b505af115801561078c573d6000803e3d6000fd5b5050600480546007546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216938101939093526005602484015216925063a9059cbb91506044016020604051808303816000875af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610824919061166f565b5060045461083e906001600160a01b03168585858561048b565b600480546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093529116906370a0823190602401602060405180830381865afa1580156108c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e79190611691565b15610671576106716116aa565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61091e81610db7565b6106fa610fec565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61095081610db7565b6001600160a01b038216610990576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a610a0481610db7565b6001600160a01b038216610a44576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b610a99610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610ac381610db7565b610acb610dc1565b6001600160a01b03861660009081526003602052604090205460ff16610b1d576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b516001600160a01b0387167f000000000000000000000000000000000000000000000000000000000000000087610e00565b6040517fd0b492c30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610bc09089908b908a908a908a908a90600401611788565b600060405180830381600087803b158015610bda57600080fd5b505af1158015610bee573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610c3b94939291906117df565b60405180910390a350610c4e6001600055565b505050505050565b60008281526001602081905260409091200154610c7281610db7565b6106718383610f13565b610c84610d74565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610cae81610db7565b610cb6610dc1565b6001600160a01b03831660009081526003602052604090205460ff16610d08576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1c6001600160a01b0384168584610e00565b826001600160a01b0316846001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610d6191815260200190565b60405180910390a3506106c36001600055565b600260005403610db0576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6106fa8133611029565b60025460ff1615610dfe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106c39084906110a0565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff16610f0b5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610485565b506000610485565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1615610f0b5760008381526001602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610485565b610fa261111c565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ff4610dc1565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fcf3390565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff1661109c576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b60006110b56001600160a01b03841683611158565b905080516000141580156110da5750808060200190518101906110d8919061166f565b155b156106c3576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611093565b60025460ff16610dfe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606111668383600061116d565b9392505050565b6060814710156111ab576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611093565b600080856001600160a01b031684866040516111c7919061180b565b60006040518083038185875af1925050503d8060008114611204576040519150601f19603f3d011682016040523d82523d6000602084013e611209565b606091505b5091509150611219868383611223565b9695505050505050565b6060826112385761123382611298565b611166565b815115801561124f57506001600160a01b0384163b155b15611291576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611093565b5080611166565b8051156112a85780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156112ec57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461116657600080fd5b80356001600160a01b038116811461133357600080fd5b919050565b60008083601f84011261134a57600080fd5b50813567ffffffffffffffff81111561136257600080fd5b60208301915083602082850101111561137a57600080fd5b9250929050565b60008060008060006080868803121561139957600080fd5b6113a28661131c565b94506113b06020870161131c565b935060408601359250606086013567ffffffffffffffff8111156113d357600080fd5b6113df88828901611338565b969995985093965092949392505050565b60006020828403121561140257600080fd5b5035919050565b6000806040838503121561141c57600080fd5b8235915061142c6020840161131c565b90509250929050565b6000806000806060858703121561144b57600080fd5b6114548561131c565b935060208501359250604085013567ffffffffffffffff81111561147757600080fd5b61148387828801611338565b95989497509550505050565b6000602082840312156114a157600080fd5b6111668261131c565b60008060008060008060a087890312156114c357600080fd5b6114cc8761131c565b95506114da6020880161131c565b945060408701359350606087013567ffffffffffffffff8111156114fd57600080fd5b61150989828a01611338565b909450925050608087013567ffffffffffffffff81111561152957600080fd5b87016060818a03121561153b57600080fd5b809150509295509295509295565b60008060006060848603121561155e57600080fd5b6115678461131c565b92506115756020850161131c565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6001600160a01b03861681526001600160a01b0385166020820152836040820152608060608201526000611607608083018486611586565b979650505050505050565b83815260406020820152600061162c604083018486611586565b95945050505050565b80820180821115610485577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006020828403121561168157600080fd5b8151801515811461116657600080fd5b6000602082840312156116a357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6001600160a01b036116ea8261131c565b1682526000602082013567ffffffffffffffff811680821461170b57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261174757600080fd5b820160208101903567ffffffffffffffff81111561176457600080fd5b80360382131561177357600080fd5b6060604086015261162c606086018284611586565b6001600160a01b03871681526001600160a01b038616602082015284604082015260a0606082015260006117c060a083018587611586565b82810360808401526117d281856116d9565b9998505050505050505050565b8481526060602082015260006117f9606083018587611586565b828103604084015261160781856116d9565b6000825160005b8181101561182c5760208186018101518583015201611812565b50600092019182525091905056fea264697066735822122061cd549824825890a13a467c67a5cc641b8194ac645882f08a0554f2b93702ee64736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a00330000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a54686520606c6963656e73655479706560206f7074696f6e2063616e6e6f7420"; type ERC20CustodyEchidnaTestConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/ERC20Custody__factory.ts b/v2/types/factories/ERC20Custody__factory.ts index 2d25c497..bb8c7426 100644 --- a/v2/types/factories/ERC20Custody__factory.ts +++ b/v2/types/factories/ERC20Custody__factory.ts @@ -64,6 +64,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "WHITELISTER_ROLE", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, { type: "function", name: "WITHDRAWER_ROLE", @@ -235,18 +248,63 @@ const _abi = [ }, { type: "function", - name: "withdraw", + name: "unwhitelist", inputs: [ { name: "token", type: "address", internalType: "address", }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "whitelist", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "whitelisted", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "withdraw", + inputs: [ { name: "to", type: "address", internalType: "address", }, + { + name: "token", + type: "address", + internalType: "address", + }, { name: "amount", type: "uint256", @@ -261,12 +319,12 @@ const _abi = [ name: "withdrawAndCall", inputs: [ { - name: "token", + name: "to", type: "address", internalType: "address", }, { - name: "to", + name: "token", type: "address", internalType: "address", }, @@ -289,12 +347,12 @@ const _abi = [ name: "withdrawAndRevert", inputs: [ { - name: "token", + name: "to", type: "address", internalType: "address", }, { - name: "to", + name: "token", type: "address", internalType: "address", }, @@ -308,6 +366,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -415,7 +495,7 @@ const _abi = [ }, { type: "event", - name: "Withdraw", + name: "Unwhitelisted", inputs: [ { name: "token", @@ -423,12 +503,38 @@ const _abi = [ indexed: true, internalType: "address", }, + ], + anonymous: false, + }, + { + type: "event", + name: "Whitelisted", + inputs: [ + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Withdrawn", + inputs: [ { name: "to", type: "address", indexed: true, internalType: "address", }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, { name: "amount", type: "uint256", @@ -440,16 +546,16 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { - name: "token", + name: "to", type: "address", indexed: true, internalType: "address", }, { - name: "to", + name: "token", type: "address", indexed: true, internalType: "address", @@ -471,16 +577,16 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { - name: "token", + name: "to", type: "address", indexed: true, internalType: "address", }, { - name: "to", + name: "token", type: "address", indexed: true, internalType: "address", @@ -497,6 +603,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -558,6 +687,11 @@ const _abi = [ name: "FailedInnerCall", inputs: [], }, + { + type: "error", + name: "NotWhitelisted", + inputs: [], + }, { type: "error", name: "ReentrancyGuardReentrantCall", @@ -582,7 +716,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a060405234801561001057600080fd5b5060405161140b38038061140b83398101604081905261002f916101b3565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610102565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610102565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610102565b505050506101f6565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1661018d5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610191565b5060005b92915050565b80516001600160a01b03811681146101ae57600080fd5b919050565b6000806000606084860312156101c857600080fd5b6101d184610197565b92506101df60208501610197565b91506101ed60408501610197565b90509250925092565b6080516111de61022d60003960008181610132015281816103c5015281816104270152818161065801526106ba01526111de6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638456cb5911610097578063c8a0236211610066578063c8a0236214610276578063d547741f14610289578063d9caed121461029c578063e63ab1e9146102af57600080fd5b80638456cb59146101f957806385f438c11461020157806391d1485414610228578063a217fddf1461026e57600080fd5b80632f2ff15d116100d35780632f2ff15d146101c057806336568abe146101d35780633f4ba83a146101e65780635c975abb146101ee57600080fd5b806301ffc9a714610105578063116191b61461012d57806321fc65f214610179578063248a9ca31461018e575b600080fd5b610118610113366004610f04565b6102d6565b60405190151581526020015b60405180910390f35b6101547f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b61018c610187366004610f6f565b61036f565b005b6101b261019c36600461100c565b6000908152600160208190526040909120015490565b604051908152602001610124565b61018c6101ce366004611025565b610511565b61018c6101e1366004611025565b61053d565b61018c61059b565b60025460ff16610118565b61018c6105d0565b6101b27f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b610118610236366004611025565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101b2600081565b61018c610284366004610f6f565b610602565b61018c610297366004611025565b61078a565b61018c6102aa366004611051565b6107b0565b6101b27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061036957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61037761087d565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46103a1816108c0565b6103a96108ca565b6103ea73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000086610909565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061046490899089908990899089906004016110d7565b600060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f85b5be9cf454e05e0bddf49315178102227c312078eefa3c00294fb4d912ae4e8686866040516104f793929190611134565b60405180910390a35061050a6001600055565b5050505050565b6000828152600160208190526040909120015461052d816108c0565b6105378383610996565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461058c576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105968282610a61565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6105c5816108c0565b6105cd610b20565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6105fa816108c0565b6105cd610b9d565b61060a61087d565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610634816108c0565b61063c6108ca565b61067d73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000086610909565b6040517fb8969bd400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b8969bd4906106f790899089908990899089906004016110d7565b600060405180830381600087803b15801561071157600080fd5b505af1158015610725573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb9d4efa96044e5f5e03e696fa9ae2ff66911cc27e8a637c3627c75bc5b2241c88686866040516104f793929190611134565b600082815260016020819052604090912001546107a6816108c0565b6105378383610a61565b6107b861087d565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46107e2816108c0565b6107ea6108ca565b61080b73ffffffffffffffffffffffffffffffffffffffff85168484610909565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8460405161086a91815260200190565b60405180910390a3506105966001600055565b6002600054036108b9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6105cd8133610bf8565b60025460ff1615610907576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610596908490610c89565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610a5957600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8716808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610369565b506000610369565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610a5957600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610369565b610b28610d1f565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610ba56108ca565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b733390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610c85576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610cab73ffffffffffffffffffffffffffffffffffffffff841683610d5b565b90508051600014158015610cd0575080806020019051810190610cce9190611157565b155b15610596576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610c7c565b60025460ff16610907576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610d6983836000610d70565b9392505050565b606081471015610dae576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610c7c565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051610dd79190611179565b60006040518083038185875af1925050503d8060008114610e14576040519150601f19603f3d011682016040523d82523d6000602084013e610e19565b606091505b5091509150610e29868383610e33565b9695505050505050565b606082610e4857610e4382610ec2565b610d69565b8151158015610e6c575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610ebb576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610c7c565b5080610d69565b805115610ed25780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610f1657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610d6957600080fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610f6a57600080fd5b919050565b600080600080600060808688031215610f8757600080fd5b610f9086610f46565b9450610f9e60208701610f46565b935060408601359250606086013567ffffffffffffffff811115610fc157600080fd5b8601601f81018813610fd257600080fd5b803567ffffffffffffffff811115610fe957600080fd5b886020828401011115610ffb57600080fd5b959894975092955050506020019190565b60006020828403121561101e57600080fd5b5035919050565b6000806040838503121561103857600080fd5b8235915061104860208401610f46565b90509250929050565b60008060006060848603121561106657600080fd5b61106f84610f46565b925061107d60208501610f46565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061112960808301848661108e565b979650505050505050565b83815260406020820152600061114e60408301848661108e565b95945050505050565b60006020828403121561116957600080fd5b81518015158114610d6957600080fd5b6000825160005b8181101561119a5760208186018101518583015201611180565b50600092019182525091905056fea264697066735822122035ca457bdc8b45adde9844ff8416a0abd723c23055fd6933ddc05523b5f5b6de64736f6c634300081a0033"; + "0x60a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a"; type ERC20CustodyConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/GatewayEVMEchidnaTest__factory.ts b/v2/types/factories/GatewayEVMEchidnaTest__factory.ts index b0cc5263..2c13e3b3 100644 --- a/v2/types/factories/GatewayEVMEchidnaTest__factory.ts +++ b/v2/types/factories/GatewayEVMEchidnaTest__factory.ts @@ -99,6 +99,33 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -116,19 +143,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "deposit", - inputs: [ - { - name: "receiver", - type: "address", - internalType: "address", - }, - ], - outputs: [], - stateMutability: "payable", - }, { type: "function", name: "deposit", @@ -148,13 +162,40 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "depositAndCall", + name: "deposit", inputs: [ { name: "receiver", @@ -162,9 +203,31 @@ const _abi = [ internalType: "address", }, { - name: "payload", - type: "bytes", - internalType: "bytes", + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -194,10 +257,82 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "depositAndCall", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + { + name: "payload", + type: "bytes", + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "payable", + }, { type: "function", name: "echidnaCaller", @@ -249,6 +384,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "payable", @@ -440,6 +597,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -609,7 +788,7 @@ const _abi = [ }, { type: "event", - name: "Call", + name: "Called", inputs: [ { name: "sender", @@ -629,12 +808,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, { type: "event", - name: "Deposit", + name: "Deposited", inputs: [ { name: "sender", @@ -666,6 +873,34 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -756,42 +991,17 @@ const _abi = [ name: "Reverted", inputs: [ { - name: "destination", + name: "to", type: "address", indexed: true, internalType: "address", }, - { - name: "value", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - { - name: "data", - type: "bytes", - indexed: false, - internalType: "bytes", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RevertedWithERC20", - inputs: [ { name: "token", type: "address", indexed: true, internalType: "address", }, - { - name: "to", - type: "address", - indexed: true, - internalType: "address", - }, { name: "amount", type: "uint256", @@ -804,6 +1014,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -956,6 +1189,11 @@ const _abi = [ name: "ApprovalFailed", inputs: [], }, + { + type: "error", + name: "ConnectorInitialized", + inputs: [], + }, { type: "error", name: "CustodyInitialized", @@ -1022,6 +1260,11 @@ const _abi = [ name: "NotInitializing", inputs: [], }, + { + type: "error", + name: "NotWhitelistedInCustody", + inputs: [], + }, { type: "error", name: "ReentrancyGuardReentrantCall", @@ -1062,7 +1305,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a060405230608052600580546001600160a01b0319163317905534801561002657600080fd5b5061002f610154565b600554600180546001600160a01b039092166001600160a01b031992831617905560028054610123921691909117905560405161006b90610206565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f0801580156100bd573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b039283161790556001546040513092919091169082906100f290610213565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801561012e573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055610220565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156101a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610c9f806133f683390190565b61140b8061409583390190565b6080516131ad61024960003960008181611f2601528181611f4f015261231e01526131ad6000f3fe6080604052600436106102345760003560e01c80635c975abb11610138578063ad3cb1cc116100b0578063d547741f1161007f578063e63ab1e911610064578063e63ab1e9146106ff578063f340fa0114610733578063f45346dc1461074657600080fd5b8063d547741f146106bf578063dda79b75146106df57600080fd5b8063ad3cb1cc14610616578063ae7a3a6f1461065f578063b8969bd41461067f578063c0c53b8b1461069f57600080fd5b80638456cb591161010757806391d14854116100ec57806391d1485414610568578063a217fddf146105cd578063a783c789146105e257600080fd5b80638456cb59146105335780638c6f037f1461054857600080fd5b80635c975abb146104885780635d62c860146104bf5780636ab90f9b146104f357806381100bf01461051357600080fd5b806335c018db116101cb5780634f1ef2861161019a57806352d1902d1161017f57806352d1902d1461043357806357bec62f146104485780635b1125911461046857600080fd5b80634f1ef286146104005780635131ab591461041357600080fd5b806335c018db1461039857806336568abe146103ab5780633c2f05a8146103cb5780633f4ba83a146103eb57600080fd5b806321e093b11161020757806321e093b1146102d0578063248a9ca31461030857806329c59b5d146103655780632f2ff15d1461037857600080fd5b806301ffc9a71461023957806310188aef1461026e5780631b8b921d146102905780631cff79cd146102b0575b600080fd5b34801561024557600080fd5b50610259610254366004612b97565b610766565b60405190151581526020015b60405180910390f35b34801561027a57600080fd5b5061028e610289366004612bf5565b6107ff565b005b34801561029c57600080fd5b5061028e6102ab366004612c59565b6108f3565b6102c36102be366004612c59565b61097e565b6040516102659190612d1a565b3480156102dc57600080fd5b506003546102f0906001600160a01b031681565b6040516001600160a01b039091168152602001610265565b34801561031457600080fd5b50610357610323366004612d2d565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610265565b61028e610373366004612c59565b610a41565b34801561038457600080fd5b5061028e610393366004612d46565b610b94565b61028e6103a6366004612c59565b610bde565b3480156103b757600080fd5b5061028e6103c6366004612d46565b610dcd565b3480156103d757600080fd5b506004546102f0906001600160a01b031681565b3480156103f757600080fd5b5061028e610e19565b61028e61040e366004612da1565b610e4e565b34801561041f57600080fd5b5061028e61042e366004612ea8565b610e6d565b34801561043f57600080fd5b5061035761114a565b34801561045457600080fd5b506002546102f0906001600160a01b031681565b34801561047457600080fd5b506001546102f0906001600160a01b031681565b34801561049457600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610259565b3480156104cb57600080fd5b506103577f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b3480156104ff57600080fd5b5061028e61050e366004612f17565b611179565b34801561051f57600080fd5b506005546102f0906001600160a01b031681565b34801561053f57600080fd5b5061028e6112a4565b34801561055457600080fd5b5061028e610563366004612f71565b6112d6565b34801561057457600080fd5b50610259610583366004612d46565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156105d957600080fd5b50610357600081565b3480156105ee57600080fd5b506103577f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561062257600080fd5b506102c36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b34801561066b57600080fd5b5061028e61067a366004612bf5565b6113ac565b34801561068b57600080fd5b5061028e61069a366004612ea8565b6114a0565b3480156106ab57600080fd5b5061028e6106ba366004612fc3565b611619565b3480156106cb57600080fd5b5061028e6106da366004612d46565b6118ce565b3480156106eb57600080fd5b506000546102f0906001600160a01b031681565b34801561070b57600080fd5b506103577f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61028e610741366004612bf5565b611912565b34801561075257600080fd5b5061028e610761366004613006565b611a67565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107f957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061080a81611b22565b6002546001600160a01b03161561084d576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821661088d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b77f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b2c565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6108fb611c19565b610903611c77565b826001600160a01b0316336001600160a01b03167f2a21062ee9199c2e205622999eeb7c3da73153674f36a0acd3f74fa6af67bde38484604051610948929190613082565b60405180910390a361097960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6109aa81611b22565b6109b2611c19565b6109ba611c77565b60006109c7868686611d1e565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f348787604051610a069392919061309e565b60405180910390a29150610a3960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b610a49611c19565b610a51611c77565b34600003610a8b576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ad8576040519150601f19603f3d011682016040523d82523d6000602084013e610add565b606091505b5050905080610b18576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a43460008787604051610b6294939291906130b8565b60405180910390a35061097960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610bce81611b22565b610bd88383611b2c565b50505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb610c0881611b22565b610c10611c19565b610c18611c77565b6001600160a01b038416610c58576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000846001600160a01b03163460405160006040518083038185875af1925050503d8060008114610ca5576040519150601f19603f3d011682016040523d82523d6000602084013e610caa565b606091505b5050905080610ce5576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8fcaa0b50000000000000000000000000000000000000000000000000000000081526001600160a01b03861690638fcaa0b590610d2c9087908790600401613082565b600060405180830381600087803b158015610d4657600080fd5b505af1158015610d5a573d6000803e3d6000fd5b50505050846001600160a01b03167fd5d7616b1678354a0dea9d7e57e6a090bff5babe9f8d6381fdbad16e89ba311c348686604051610d9b9392919061309e565b60405180910390a250610bd860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6001600160a01b0381163314610e0f576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109798282611dc7565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e4381611b22565b610e4b611e8b565b50565b610e56611f1b565b610e5f82611feb565b610e698282611ff6565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610e9781611b22565b610e9f611c19565b610ea7611c77565b83600003610ee1576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eeb868661211a565b610f21576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad91906130e1565b610fe3576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ff0868585611d1e565b9050610ffc878761211a565b611032576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b69190613103565b905080156110c8576110c888826121aa565b866001600160a01b0316886001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b738288888860405161110f9392919061309e565b60405180910390a3505061114260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000611154612313565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b600480546040517f40c10f190000000000000000000000000000000000000000000000000000000081523092810192909252602482018590526001600160a01b0316906340c10f1990604401600060405180830381600087803b1580156111df57600080fd5b505af11580156111f3573d6000803e3d6000fd5b505060045461121192506001600160a01b0316905085858585610e6d565b600480546040517f70a0823100000000000000000000000000000000000000000000000000000000815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112979190613103565b15610bd857610bd861311c565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6112ce81611b22565b610e4b612375565b6112de611c19565b6112e6611c77565b83600003611320576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61132b3384866123ee565b846001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a48686868660405161137494939291906130b8565b60405180910390a36113a560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b60006113b781611b22565b6000546001600160a01b0316156113fa576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821661143a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114647f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b2c565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96114ca81611b22565b6114d2611c19565b6114da611c77565b83600003611514576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115286001600160a01b0387168686612577565b6040517f8fcaa0b50000000000000000000000000000000000000000000000000000000081526001600160a01b03861690638fcaa0b59061156f9086908690600401613082565b600060405180830381600087803b15801561158957600080fd5b505af115801561159d573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b03167f723fc7be2448075379e4fdf1e6bf5fead954d2668d2da05dcb44ccfec4beeda78686866040516115e89392919061309e565b60405180910390a361114260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156116645750825b905060008267ffffffffffffffff1660011480156116815750303b155b90508115801561168f575080155b156116c6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156117275784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061174457506001600160a01b038716155b1561177b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117836125eb565b61178b6125f3565b6117936125eb565b61179b612603565b6117a6600087611b2c565b506117d17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b2c565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a1617905561182f7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b2c565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156118c45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461190881611b22565b610bd88383611dc7565b61191a611c19565b611922611c77565b3460000361195c576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d80600081146119a9576040519150601f19603f3d011682016040523d82523d6000602084013e6119ae565b606091505b50509050806119e9576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051348152600060208201819052606082840181905282015290516001600160a01b0384169133917f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a49181900360800190a350610e4b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611a6f611c19565b611a77611c77565b81600003611ab1576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611abc3382846123ee565b826001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a484846040516109489291909182526001600160a01b0316602082015260606040820181905260009082015260800190565b610e4b8133612613565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c0f576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bc53390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506107f9565b60009150506107f9565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c75576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611cf2576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6060600080856001600160a01b0316348686604051611d3e92919061314b565b60006040518083038185875af1925050503d8060008114611d7b576040519150601f19603f3d011682016040523d82523d6000602084013e611d80565b606091505b509150915081611dbc576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c0f576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506107f9565b611e936126a0565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fb457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fa87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e6981611b22565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561206e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261206b91810190613103565b60015b6120b4576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612110576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120ab565b61097983836126fb565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af1158015612186573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc091906130e1565b6003546001600160a01b03908116908316036122f9576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af115801561222c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225091906130e1565b612286576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122e557600080fd5b505af1158015611142573d6000803e3d6000fd5b600054610e69906001600160a01b03848116911683612577565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61237d611c19565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611efd565b6003546001600160a01b039081169083160361255b576124196001600160a01b038316843084612751565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a991906130e1565b6124df576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561253e57600080fd5b505af1158015612552573d6000803e3d6000fd5b50505050505050565b600054610979906001600160a01b038481169186911684612751565b6040516001600160a01b0383811660248301526044820183905261097991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061278a565b611c75612806565b6125fb612806565b611c7561286d565b61260b612806565b611c75612875565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610e69576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120ab565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c75576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612704826128c6565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561274957610979828261296e565b610e696129e4565b6040516001600160a01b038481166024830152838116604483015260648201839052610bd89186918216906323b872dd906084016125a4565b600061279f6001600160a01b03841683612a1c565b905080516000141580156127c45750808060200190518101906127c291906130e1565b155b15610979576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120ab565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c75576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf8612806565b61287d612806565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b806001600160a01b03163b600003612915576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161298b919061315b565b600060405180830381855af49150503d80600081146129c6576040519150601f19603f3d011682016040523d82523d6000602084013e6129cb565b606091505b50915091506129db858383612a2a565b95945050505050565b3415611c75576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611dc083836000612a9f565b606082612a3f57612a3a82612b55565b611dc0565b8151158015612a5657506001600160a01b0384163b155b15612a98576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120ab565b5080611dc0565b606081471015612add576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120ab565b600080856001600160a01b03168486604051612af9919061315b565b60006040518083038185875af1925050503d8060008114612b36576040519150601f19603f3d011682016040523d82523d6000602084013e612b3b565b606091505b5091509150612b4b868383612a2a565b9695505050505050565b805115612b655780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612ba957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611dc057600080fd5b80356001600160a01b0381168114612bf057600080fd5b919050565b600060208284031215612c0757600080fd5b611dc082612bd9565b60008083601f840112612c2257600080fd5b50813567ffffffffffffffff811115612c3a57600080fd5b602083019150836020828501011115612c5257600080fd5b9250929050565b600080600060408486031215612c6e57600080fd5b612c7784612bd9565b9250602084013567ffffffffffffffff811115612c9357600080fd5b612c9f86828701612c10565b9497909650939450505050565b60005b83811015612cc7578181015183820152602001612caf565b50506000910152565b60008151808452612ce8816020860160208601612cac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611dc06020830184612cd0565b600060208284031215612d3f57600080fd5b5035919050565b60008060408385031215612d5957600080fd5b82359150612d6960208401612bd9565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612db457600080fd5b612dbd83612bd9565b9150602083013567ffffffffffffffff811115612dd957600080fd5b8301601f81018513612dea57600080fd5b803567ffffffffffffffff811115612e0457612e04612d72565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612e7057612e70612d72565b604052818152828201602001871015612e8857600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600060808688031215612ec057600080fd5b612ec986612bd9565b9450612ed760208701612bd9565b935060408601359250606086013567ffffffffffffffff811115612efa57600080fd5b612f0688828901612c10565b969995985093965092949392505050565b60008060008060608587031215612f2d57600080fd5b612f3685612bd9565b935060208501359250604085013567ffffffffffffffff811115612f5957600080fd5b612f6587828801612c10565b95989497509550505050565b600080600080600060808688031215612f8957600080fd5b612f9286612bd9565b945060208601359350612fa760408701612bd9565b9250606086013567ffffffffffffffff811115612efa57600080fd5b600080600060608486031215612fd857600080fd5b612fe184612bd9565b9250612fef60208501612bd9565b9150612ffd60408501612bd9565b90509250925092565b60008060006060848603121561301b57600080fd5b61302484612bd9565b925060208401359150612ffd60408501612bd9565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000613096602083018486613039565b949350505050565b8381526040602082015260006129db604083018486613039565b8481526001600160a01b0384166020820152606060408201526000612b4b606083018486613039565b6000602082840312156130f357600080fd5b81518015158114611dc057600080fd5b60006020828403121561311557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b8183823760009101908152919050565b6000825161316d818460208701612cac565b919091019291505056fea2646970667358221220af74e0039ccd316ad209c39ddb2d59569d0e7332f3cba90d28e03811e710d7ca64736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b5060405161140b38038061140b83398101604081905261002f916101b3565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610102565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610102565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610102565b505050506101f6565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff1661018d5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610191565b5060005b92915050565b80516001600160a01b03811681146101ae57600080fd5b919050565b6000806000606084860312156101c857600080fd5b6101d184610197565b92506101df60208501610197565b91506101ed60408501610197565b90509250925092565b6080516111de61022d60003960008181610132015281816103c5015281816104270152818161065801526106ba01526111de6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638456cb5911610097578063c8a0236211610066578063c8a0236214610276578063d547741f14610289578063d9caed121461029c578063e63ab1e9146102af57600080fd5b80638456cb59146101f957806385f438c11461020157806391d1485414610228578063a217fddf1461026e57600080fd5b80632f2ff15d116100d35780632f2ff15d146101c057806336568abe146101d35780633f4ba83a146101e65780635c975abb146101ee57600080fd5b806301ffc9a714610105578063116191b61461012d57806321fc65f214610179578063248a9ca31461018e575b600080fd5b610118610113366004610f04565b6102d6565b60405190151581526020015b60405180910390f35b6101547f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b61018c610187366004610f6f565b61036f565b005b6101b261019c36600461100c565b6000908152600160208190526040909120015490565b604051908152602001610124565b61018c6101ce366004611025565b610511565b61018c6101e1366004611025565b61053d565b61018c61059b565b60025460ff16610118565b61018c6105d0565b6101b27f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b610118610236366004611025565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101b2600081565b61018c610284366004610f6f565b610602565b61018c610297366004611025565b61078a565b61018c6102aa366004611051565b6107b0565b6101b27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061036957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61037761087d565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46103a1816108c0565b6103a96108ca565b6103ea73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000086610909565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061046490899089908990899089906004016110d7565b600060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f85b5be9cf454e05e0bddf49315178102227c312078eefa3c00294fb4d912ae4e8686866040516104f793929190611134565b60405180910390a35061050a6001600055565b5050505050565b6000828152600160208190526040909120015461052d816108c0565b6105378383610996565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461058c576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105968282610a61565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6105c5816108c0565b6105cd610b20565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6105fa816108c0565b6105cd610b9d565b61060a61087d565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610634816108c0565b61063c6108ca565b61067d73ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000086610909565b6040517fb8969bd400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b8969bd4906106f790899089908990899089906004016110d7565b600060405180830381600087803b15801561071157600080fd5b505af1158015610725573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb9d4efa96044e5f5e03e696fa9ae2ff66911cc27e8a637c3627c75bc5b2241c88686866040516104f793929190611134565b600082815260016020819052604090912001546107a6816108c0565b6105378383610a61565b6107b861087d565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46107e2816108c0565b6107ea6108ca565b61080b73ffffffffffffffffffffffffffffffffffffffff85168484610909565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8460405161086a91815260200190565b60405180910390a3506105966001600055565b6002600054036108b9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6105cd8133610bf8565b60025460ff1615610907576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610596908490610c89565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610a5957600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8716808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610369565b506000610369565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610a5957600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610369565b610b28610d1f565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610ba56108ca565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b733390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610c85576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610cab73ffffffffffffffffffffffffffffffffffffffff841683610d5b565b90508051600014158015610cd0575080806020019051810190610cce9190611157565b155b15610596576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610c7c565b60025460ff16610907576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610d6983836000610d70565b9392505050565b606081471015610dae576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610c7c565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051610dd79190611179565b60006040518083038185875af1925050503d8060008114610e14576040519150601f19603f3d011682016040523d82523d6000602084013e610e19565b606091505b5091509150610e29868383610e33565b9695505050505050565b606082610e4857610e4382610ec2565b610d69565b8151158015610e6c575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610ebb576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610c7c565b5080610d69565b805115610ed25780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610f1657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610d6957600080fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610f6a57600080fd5b919050565b600080600080600060808688031215610f8757600080fd5b610f9086610f46565b9450610f9e60208701610f46565b935060408601359250606086013567ffffffffffffffff811115610fc157600080fd5b8601601f81018813610fd257600080fd5b803567ffffffffffffffff811115610fe957600080fd5b886020828401011115610ffb57600080fd5b959894975092955050506020019190565b60006020828403121561101e57600080fd5b5035919050565b6000806040838503121561103857600080fd5b8235915061104860208401610f46565b90509250929050565b60008060006060848603121561106657600080fd5b61106f84610f46565b925061107d60208501610f46565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061112960808301848661108e565b979650505050505050565b83815260406020820152600061114e60408301848661108e565b95945050505050565b60006020828403121561116957600080fd5b81518015158114610d6957600080fd5b6000825160005b8181101561119a5760208186018101518583015201611180565b50600092019182525091905056fea264697066735822122035ca457bdc8b45adde9844ff8416a0abd723c23055fd6933ddc05523b5f5b6de64736f6c634300081a0033"; + "0x60a060405230608052600580546001600160a01b0319163317905534801561002657600080fd5b5061002f610154565b600554600180546001600160a01b039092166001600160a01b031992831617905560028054610123921691909117905560405161006b90610206565b60408082526004908201819052631d195cdd60e21b606083015260806020830181905282015263151154d560e21b60a082015260c001604051809103906000f0801580156100bd573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b039283161790556001546040513092919091169082906100f290610213565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801561012e573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055610220565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156101a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146102035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610c9f80613b8883390190565b6119ca8061482783390190565b60805161393f610249600039600081816121190152818161214201526125ce015261393f6000f3fe6080604052600436106102345760003560e01c8063616e877a11610138578063ad3cb1cc116100b0578063d547741f1161007f578063e63ab1e911610064578063e63ab1e91461070c578063f7ad60db14610740578063fc93baef1461075357600080fd5b8063d547741f146106cc578063dda79b75146106ec57600080fd5b8063ad3cb1cc14610623578063ae7a3a6f1461066c578063c0c53b8b1461068c578063d0b492c3146106ac57600080fd5b80638456cb591161010757806391d14854116100ec57806391d1485414610575578063a217fddf146105da578063a783c789146105ef57600080fd5b80638456cb5914610540578063870de27a1461055557600080fd5b8063616e877a146104cd5780636ab90f9b146104ed57806370f23f881461050d57806381100bf01461052057600080fd5b80633f4ba83a116101cb57806352d1902d1161019a5780635b1125911161017f5780635b112591146104425780635c975abb146104625780635d62c8601461049957600080fd5b806352d1902d1461040d57806357bec62f1461042257600080fd5b80633f4ba83a146103a557806345ac7a8d146103ba5780634f1ef286146103da5780635131ab59146103ed57600080fd5b8063248a9ca311610207578063248a9ca3146102e85780632f2ff15d1461034557806336568abe146103655780633c2f05a81461038557600080fd5b806301ffc9a71461023957806310188aef1461026e5780631cff79cd1461029057806321e093b1146102b0575b600080fd5b34801561024557600080fd5b50610259610254366004612efb565b610766565b60405190151581526020015b60405180910390f35b34801561027a57600080fd5b5061028e610289366004612f59565b6107ff565b005b6102a361029e366004612fbd565b6108f3565b604051610265919061307e565b3480156102bc57600080fd5b506003546102d0906001600160a01b031681565b6040516001600160a01b039091168152602001610265565b3480156102f457600080fd5b50610337610303366004613091565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610265565b34801561035157600080fd5b5061028e6103603660046130aa565b6109f6565b34801561037157600080fd5b5061028e6103803660046130aa565b610a40565b34801561039157600080fd5b506004546102d0906001600160a01b031681565b3480156103b157600080fd5b5061028e610a91565b3480156103c657600080fd5b5061028e6103d53660046130ee565b610ac6565b61028e6103e836600461319c565b610b8e565b3480156103f957600080fd5b5061028e6104083660046132a3565b610bad565b34801561041957600080fd5b50610337610ec6565b34801561042e57600080fd5b506002546102d0906001600160a01b031681565b34801561044e57600080fd5b506001546102d0906001600160a01b031681565b34801561046e57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610259565b3480156104a557600080fd5b506103377f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b3480156104d957600080fd5b5061028e6104e8366004613312565b610ef5565b3480156104f957600080fd5b5061028e610508366004613362565b610fd1565b61028e61051b3660046133bc565b6110fc565b34801561052c57600080fd5b506005546102d0906001600160a01b031681565b34801561054c57600080fd5b5061028e61128d565b34801561056157600080fd5b5061028e61057036600461340a565b6112bf565b34801561058157600080fd5b506102596105903660046130aa565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156105e657600080fd5b50610337600081565b3480156105fb57600080fd5b506103377f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561062f57600080fd5b506102a36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b34801561067857600080fd5b5061028e610687366004612f59565b6113d0565b34801561069857600080fd5b5061028e6106a73660046134a2565b6114c4565b3480156106b857600080fd5b5061028e6106c73660046134f7565b611779565b3480156106d857600080fd5b5061028e6106e73660046130aa565b61193b565b3480156106f857600080fd5b506000546102d0906001600160a01b031681565b34801561071857600080fd5b506103377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61028e61074e366004613582565b61197f565b61028e6107613660046130ee565b611b80565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107f957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061080a81611d15565b6001600160a01b03821661084a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561088d576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b77f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611d1f565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091f81611d15565b610927611e0c565b61092f611e6a565b6001600160a01b03851661096f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097c868686611eeb565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f3487876040516109bb9392919061363e565b60405180910390a291506109ee60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a3081611d15565b610a3a8383611d1f565b50505050565b6001600160a01b0381163314610a82576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a8c8282611fba565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610abb81611d15565b610ac361207e565b50565b610ace611e0c565b610ad6611e6a565b6001600160a01b038416610b16576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610b5d93929190613731565b60405180910390a3610a3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610b9661210e565b610b9f826121de565b610ba982826121e9565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610bd781611d15565b610bdf611e0c565b610be7611e6a565b83600003610c21576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610c61576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6b868661230d565b610ca1576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190613757565b610d63576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d6e858484611eeb565b50610d79868661230d565b610daf576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e339190613774565b90508015610e4557610e45878261239d565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610e8c9392919061363e565b60405180910390a350610ebe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610ed06125c3565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610efd611e0c565b610f05611e6a565b82600003610f3f576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610f7f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8a338385612625565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610b5d9392919061378d565b600480546040517f40c10f190000000000000000000000000000000000000000000000000000000081523092810192909252602482018590526001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505060045461106992506001600160a01b0316905085858585610bad565b600480546040517f70a0823100000000000000000000000000000000000000000000000000000000815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190613774565b15610a3a57610a3a6137c3565b611104611e0c565b61110c611e6a565b34600003611146576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611186576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d80600081146111d3576040519150601f19603f3d011682016040523d82523d6000602084013e6111d8565b606091505b5050905080611213576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161125b9392919061378d565b60405180910390a350610ba960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6112b781611d15565b610ac3612862565b6112c7611e0c565b6112cf611e6a565b84600003611309576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611349576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611354338587612625565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd878787878760405161139f9594939291906137f2565b60405180910390a3610ebe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006113db81611d15565b6001600160a01b03821661141b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b03161561145e576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114887f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611d1f565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff1660008115801561150f5750825b905060008267ffffffffffffffff16600114801561152c5750303b155b90508115801561153a575080155b15611571576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156115d25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b03881615806115ef57506001600160a01b038716155b15611626576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61162e6128db565b6116366128e3565b61163e6128db565b6116466128f3565b611651600087611d1f565b5061167c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611d1f565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556116da7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611d1f565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038916179055831561176f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96117a381611d15565b6117ab611e0c565b6117b3611e6a565b846000036117ed576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661182d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118416001600160a01b0388168787612903565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de090611886908590600401613893565b600060405180830381600087803b1580156118a057600080fd5b505af11580156118b4573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14368787878760405161190194939291906138a6565b60405180910390a361193260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461197581611d15565b610a3a8383611fba565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6119a981611d15565b6119b1611e0c565b6119b9611e6a565b6001600160a01b0385166119f9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d8060008114611a46576040519150601f19603f3d011682016040523d82523d6000602084013e611a4b565b606091505b5050905080611a86576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de090611acb908690600401613893565b600060405180830381600087803b158015611ae557600080fd5b505af1158015611af9573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b143634888888604051611b4794939291906138a6565b60405180910390a350611b7960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b611b88611e0c565b611b90611e6a565b34600003611bca576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611c0a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b5050905080611c97576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611ce39594939291906137f2565b60405180910390a350610a3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ac38133612977565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611e02576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611db83390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506107f9565b60009150506107f9565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611e68576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611ee5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611f0b9291906138dd565b60006040518083038185875af1925050503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b509150915081611f89576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611e02576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506107f9565b612086612a04565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121a757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661219b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611e68576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ba981611d15565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612261575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261225e91810190613774565b60015b6122a7576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612303576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161229e565b610a8c8383612a5f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af1158015612379573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8d9190613757565b6003546001600160a01b03908116908316036124ec576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af115801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613757565b612479576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156124d857600080fd5b505af1158015610ebe573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa15801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190613757565b6125a9576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610ba9906001600160a01b03848116911683612903565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e68576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b0390811690831603612789576126506001600160a01b038316843084612ab5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156126bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e09190613757565b612716576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561277557600080fd5b505af1158015611932573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa1580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613757565b612846576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610a8c906001600160a01b038481169186911684612ab5565b61286a611e0c565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336120f0565b611e68612aee565b6128eb612aee565b611e68612b55565b6128fb612aee565b611e68612b5d565b6040516001600160a01b03838116602483015260448201839052610a8c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bae565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610ba9576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440161229e565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611e68576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6882612c2a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612aad57610a8c8282612cd2565b610ba9612d48565b6040516001600160a01b038481166024830152838116604483015260648201839052610a3a9186918216906323b872dd90608401612930565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611e68576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f94612aee565b612b65612aee565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000612bc36001600160a01b03841683612d80565b90508051600014158015612be8575080806020019051810190612be69190613757565b155b15610a8c576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161229e565b806001600160a01b03163b600003612c79576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161229e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612cef91906138ed565b600060405180830381855af49150503d8060008114612d2a576040519150601f19603f3d011682016040523d82523d6000602084013e612d2f565b606091505b5091509150612d3f858383612d8e565b95945050505050565b3415611e68576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611f8d83836000612e03565b606082612da357612d9e82612eb9565b611f8d565b8151158015612dba57506001600160a01b0384163b155b15612dfc576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161229e565b5080611f8d565b606081471015612e41576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161229e565b600080856001600160a01b03168486604051612e5d91906138ed565b60006040518083038185875af1925050503d8060008114612e9a576040519150601f19603f3d011682016040523d82523d6000602084013e612e9f565b606091505b5091509150612eaf868383612d8e565b9695505050505050565b805115612ec95780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612f0d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611f8d57600080fd5b80356001600160a01b0381168114612f5457600080fd5b919050565b600060208284031215612f6b57600080fd5b611f8d82612f3d565b60008083601f840112612f8657600080fd5b50813567ffffffffffffffff811115612f9e57600080fd5b602083019150836020828501011115612fb657600080fd5b9250929050565b600080600060408486031215612fd257600080fd5b612fdb84612f3d565b9250602084013567ffffffffffffffff811115612ff757600080fd5b61300386828701612f74565b9497909650939450505050565b60005b8381101561302b578181015183820152602001613013565b50506000910152565b6000815180845261304c816020860160208601613010565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f8d6020830184613034565b6000602082840312156130a357600080fd5b5035919050565b600080604083850312156130bd57600080fd5b823591506130cd60208401612f3d565b90509250929050565b6000608082840312156130e857600080fd5b50919050565b6000806000806060858703121561310457600080fd5b61310d85612f3d565b9350602085013567ffffffffffffffff81111561312957600080fd5b61313587828801612f74565b909450925050604085013567ffffffffffffffff81111561315557600080fd5b613161878288016130d6565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156131af57600080fd5b6131b883612f3d565b9150602083013567ffffffffffffffff8111156131d457600080fd5b8301601f810185136131e557600080fd5b803567ffffffffffffffff8111156131ff576131ff61316d565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561326b5761326b61316d565b60405281815282820160200187101561328357600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156132bb57600080fd5b6132c486612f3d565b94506132d260208701612f3d565b935060408601359250606086013567ffffffffffffffff8111156132f557600080fd5b61330188828901612f74565b969995985093965092949392505050565b6000806000806080858703121561332857600080fd5b61333185612f3d565b93506020850135925061334660408601612f3d565b9150606085013567ffffffffffffffff81111561315557600080fd5b6000806000806060858703121561337857600080fd5b61338185612f3d565b935060208501359250604085013567ffffffffffffffff8111156133a457600080fd5b6133b087828801612f74565b95989497509550505050565b600080604083850312156133cf57600080fd5b6133d883612f3d565b9150602083013567ffffffffffffffff8111156133f457600080fd5b613400858286016130d6565b9150509250929050565b60008060008060008060a0878903121561342357600080fd5b61342c87612f3d565b95506020870135945061344160408801612f3d565b9350606087013567ffffffffffffffff81111561345d57600080fd5b61346989828a01612f74565b909450925050608087013567ffffffffffffffff81111561348957600080fd5b61349589828a016130d6565b9150509295509295509295565b6000806000606084860312156134b757600080fd5b6134c084612f3d565b92506134ce60208501612f3d565b91506134dc60408501612f3d565b90509250925092565b6000606082840312156130e857600080fd5b60008060008060008060a0878903121561351057600080fd5b61351987612f3d565b955061352760208801612f3d565b945060408701359350606087013567ffffffffffffffff81111561354a57600080fd5b61355689828a01612f74565b909450925050608087013567ffffffffffffffff81111561357657600080fd5b61349589828a016134e5565b6000806000806060858703121561359857600080fd5b6135a185612f3d565b9350602085013567ffffffffffffffff8111156135bd57600080fd5b6135c987828801612f74565b909450925050604085013567ffffffffffffffff8111156135e957600080fd5b613161878288016134e5565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612d3f6040830184866135f5565b8015158114610ac357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261369b57600080fd5b830160208101925035905067ffffffffffffffff8111156136bb57600080fd5b803603821315612fb657600080fd5b6001600160a01b036136db82612f3d565b168252600060208201356136ee81613658565b151560208401526001600160a01b0361370960408401612f3d565b16604084015261371c6060830183613666565b60806060860152612d3f6080860182846135f5565b6040815260006137456040830185876135f5565b8281036020840152612eaf81856136ca565b60006020828403121561376957600080fd5b8151611f8d81613658565b60006020828403121561378657600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612d3f60a08301846136ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b8581526001600160a01b038516602082015260806040820152600061381b6080830185876135f5565b828103606084015261382d81856136ca565b98975050505050505050565b6001600160a01b0361384a82612f3d565b1682526000602082013567ffffffffffffffff811680821461386b57600080fd5b60208501525061387e6040830183613666565b60606040860152612d3f6060860182846135f5565b602081526000611f8d6020830184613839565b8481526060602082015260006138c06060830185876135f5565b82810360408401526138d28185613839565b979650505050505050565b8183823760009101908152919050565b600082516138ff818460208701613010565b919091019291505056fea264697066735822122031f891589c82d8503b2afa2146a5fe5ea5d8f03bc2113e27a01f4243dc46540364736f6c634300081a0033608060405234801561001057600080fd5b50604051610c9f380380610c9f83398101604081905261002f9161010d565b8181600361003d83826101ff565b50600461004a82826101ff565b50505050506102bd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261007b57600080fd5b81516001600160401b0381111561009457610094610054565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100c2576100c2610054565b6040528181528382016020018510156100da57600080fd5b60005b828110156100f9576020818601810151838301820152016100dd565b506000918101602001919091529392505050565b6000806040838503121561012057600080fd5b82516001600160401b0381111561013657600080fd5b6101428582860161006a565b602085015190935090506001600160401b0381111561016057600080fd5b61016c8582860161006a565b9150509250929050565b600181811c9082168061018a57607f821691505b6020821081036101aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fa57806000526020600020601f840160051c810160208510156101d75750805b601f840160051c820191505b818110156101f757600081556001016101e3565b50505b505050565b81516001600160401b0381111561021857610218610054565b61022c816102268454610176565b846101b0565b6020601f82116001811461026057600083156102485750848201515b600019600385901b1c1916600184901b1784556101f7565b600084815260208120601f198516915b828110156102905787850151825560209485019460019092019101610270565b50848210156102ae5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6109d3806102cc6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806340c10f191161007657806395d89b411161005b57806395d89b4114610183578063a9059cbb1461018b578063dd62ed3e1461019e57600080fd5b806340c10f191461013857806370a082311461014d57600080fd5b806318160ddd116100a757806318160ddd1461010457806323b872dd14610116578063313ce5671461012957600080fd5b806306fdde03146100c3578063095ea7b3146100e1575b600080fd5b6100cb6101e4565b6040516100d891906107bf565b60405180910390f35b6100f46100ef366004610854565b610276565b60405190151581526020016100d8565b6002545b6040519081526020016100d8565b6100f461012436600461087e565b610290565b604051601281526020016100d8565b61014b610146366004610854565b6102b4565b005b61010861015b3660046108bb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100cb6102c2565b6100f4610199366004610854565b6102d1565b6101086101ac3660046108dd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101f390610910565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90610910565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905090565b6000336102848185856102df565b60019150505b92915050565b60003361029e8582856102f1565b6102a98585856103c5565b506001949350505050565b6102be8282610470565b5050565b6060600480546101f390610910565b6000336102848185856103c5565b6102ec83838360016104cc565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103bf57818110156103b0576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103bf848484840360006104cc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610415576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff8216610465576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102ec838383610614565b73ffffffffffffffffffffffffffffffffffffffff82166104c0576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b6102be60008383610614565b73ffffffffffffffffffffffffffffffffffffffff841661051c576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff831661056c576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103a7565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103bf578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161060691815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661064c5780600260008282546106419190610963565b909155506106fe9050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156106d2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103a7565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661072757600280548290039055610753565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b818110156107ed57602081860181015160408684010152016107d0565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f57600080fd5b919050565b6000806040838503121561086757600080fd5b6108708361082b565b946020939093013593505050565b60008060006060848603121561089357600080fd5b61089c8461082b565b92506108aa6020850161082b565b929592945050506040919091013590565b6000602082840312156108cd57600080fd5b6108d68261082b565b9392505050565b600080604083850312156108f057600080fd5b6108f98361082b565b91506109076020840161082b565b90509250929050565b600181811c9082168061092457607f821691505b60208210810361095d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8082018082111561028a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212207e804ca539d49155d2b6bc19268ce22f9f857027c75247d69fb0d56a089c93d464736f6c634300081a003360a060405234801561001057600080fd5b506040516119ca3803806119ca83398101604081905261002f916101e5565b60016000556002805460ff191690556001600160a01b038316158061005b57506001600160a01b038216155b8061006d57506001600160a01b038116155b1561008b5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0383166080526100a3600082610134565b506100ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610134565b506100f97f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610134565b506101126000805160206119aa83398151915282610134565b5061012b6000805160206119aa83398151915283610134565b50505050610228565b60008281526001602090815260408083206001600160a01b038516845290915281205460ff166101bf5760008381526001602081815260408084206001600160a01b0387168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45060016101c3565b5060005b92915050565b80516001600160a01b03811681146101e057600080fd5b919050565b6000806000606084860312156101fa57600080fd5b610203846101c9565b9250610211602085016101c9565b915061021f604085016101c9565b90509250925092565b60805161174b61025f6000396000818161019e01528181610500015281816105620152818161099101526109f3015261174b6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806385f438c1116100cd578063c709ab6e11610081578063d936547e11610066578063d936547e14610355578063d9caed1214610378578063e63ab1e91461038b57600080fd5b8063c709ab6e1461032f578063d547741f1461034257600080fd5b80639a590427116100b25780639a590427146103015780639b19251a14610314578063a217fddf1461032757600080fd5b806385f438c11461029457806391d14854146102bb57600080fd5b806336568abe11610124578063570618e111610109578063570618e11461025a5780635c975abb146102815780638456cb591461028c57600080fd5b806336568abe1461023f5780633f4ba83a1461025257600080fd5b806321fc65f21161015557806321fc65f2146101e5578063248a9ca3146101fa5780632f2ff15d1461022c57600080fd5b806301ffc9a714610171578063116191b614610199575b600080fd5b61018461017f366004611243565b6103b2565b60405190151581526020015b60405180910390f35b6101c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101f86101f33660046112f7565b61044b565b005b61021e610208366004611366565b6000908152600160208190526040909120015490565b604051908152602001610190565b6101f861023a36600461137f565b61064c565b6101f861024d36600461137f565b610678565b6101f86106d6565b61021e7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a81565b60025460ff16610184565b6101f861070b565b61021e7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846102c936600461137f565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f861030f3660046113ab565b61073d565b6101f86103223660046113ab565b61080b565b61021e600081565b6101f861033d3660046113c6565b6108dc565b6101f861035036600461137f565b610ae2565b6101846103633660046113ab565b60036020526000908152604090205460ff1681565b6101f8610386366004611465565b610b08565b61021e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610453610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461047d81610c77565b610485610c81565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205460ff166104e4576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052573ffffffffffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000086610cc0565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab599061059f9088908a908990899089906004016114eb565b600060405180830381600087803b1580156105b957600080fd5b505af11580156105cd573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f6478cbb6e28c0823c691dfd74c01c985634faddd4c401b990fe4ec26277ea8d586868660405161063293929190611548565b60405180910390a3506106456001600055565b5050505050565b6000828152600160208190526040909120015461066881610c77565b6106728383610d4d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106c7576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d18282610dfa565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61070081610c77565b610708610e9b565b50565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61073581610c77565b610708610efa565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61076781610c77565b73ffffffffffffffffffffffffffffffffffffffff82166107b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19169055517f51085ddf9ebdded84b76e829eb58c4078e4b5bdf97d9a94723f336039da467919190a25050565b7f8619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a61083581610c77565b73ffffffffffffffffffffffffffffffffffffffff8216610882576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260036020526040808220805460ff19166001179055517faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549190a25050565b6108e4610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461090e81610c77565b610916610c81565b73ffffffffffffffffffffffffffffffffffffffff861660009081526003602052604090205460ff16610975576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b673ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000000000000000000000000000000000087610cc0565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610a329089908b908a908a908a908a90600401611627565b600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f2032883a139c935aa5ecfcba7233f50f723279d7418d69424daa39a5af76d13b87878787604051610ac79493929190611698565b60405180910390a350610ada6001600055565b505050505050565b60008281526001602081905260409091200154610afe81610c77565b6106728383610dfa565b610b10610c34565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610b3a81610c77565b610b42610c81565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205460ff16610ba1576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bc273ffffffffffffffffffffffffffffffffffffffff84168584610cc0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb84604051610c2191815260200190565b60405180910390a3506106d16001600055565b600260005403610c70576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107088133610f37565b60025460ff1615610cbe576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526106d1908490610fc8565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610df257600083815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff87168086529252808420805460ff19169093179092559051339286917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a4506001610445565b506000610445565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610df257600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610445565b610ea361105e565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610f02610c81565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ed03390565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610fc4576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610fea73ffffffffffffffffffffffffffffffffffffffff84168361109a565b9050805160001415801561100f57508080602001905181019061100d91906116c4565b155b156106d1576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610fbb565b60025460ff16610cbe576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60606110a8838360006110af565b9392505050565b6060814710156110ed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610fbb565b6000808573ffffffffffffffffffffffffffffffffffffffff16848660405161111691906116e6565b60006040518083038185875af1925050503d8060008114611153576040519150601f19603f3d011682016040523d82523d6000602084013e611158565b606091505b5091509150611168868383611172565b9695505050505050565b6060826111875761118282611201565b6110a8565b81511580156111ab575073ffffffffffffffffffffffffffffffffffffffff84163b155b156111fa576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610fbb565b50806110a8565b8051156112115780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561125557600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146112a957600080fd5b919050565b60008083601f8401126112c057600080fd5b50813567ffffffffffffffff8111156112d857600080fd5b6020830191508360208285010111156112f057600080fd5b9250929050565b60008060008060006080868803121561130f57600080fd5b61131886611285565b945061132660208701611285565b935060408601359250606086013567ffffffffffffffff81111561134957600080fd5b611355888289016112ae565b969995985093965092949392505050565b60006020828403121561137857600080fd5b5035919050565b6000806040838503121561139257600080fd5b823591506113a260208401611285565b90509250929050565b6000602082840312156113bd57600080fd5b6110a882611285565b60008060008060008060a087890312156113df57600080fd5b6113e887611285565b95506113f660208801611285565b945060408701359350606087013567ffffffffffffffff81111561141957600080fd5b61142589828a016112ae565b909450925050608087013567ffffffffffffffff81111561144557600080fd5b87016060818a03121561145757600080fd5b809150509295509295509295565b60008060006060848603121561147a57600080fd5b61148384611285565b925061149160208501611285565b929592945050506040919091013590565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015260806060820152600061153d6080830184866114a2565b979650505050505050565b8381526040602082015260006115626040830184866114a2565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff61158982611285565b1682526000602082013567ffffffffffffffff81168082146115aa57600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126115e657600080fd5b820160208101903567ffffffffffffffff81111561160357600080fd5b80360382131561161257600080fd5b606060408601526115626060860182846114a2565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061167960a0830185876114a2565b828103608084015261168b818561156b565b9998505050505050505050565b8481526060602082015260006116b26060830185876114a2565b828103604084015261153d818561156b565b6000602082840312156116d657600080fd5b815180151581146110a857600080fd5b6000825160005b8181101561170757602081860181015185830152016116ed565b50600092019182525091905056fea26469706673582212202b767651f29c660acfbcdce7b597662dcc282dc534ca4c2be7f63a98ab3271b464736f6c634300081a00338619cecd8b9e095ab43867f5b69d492180450fe862e6b50bfbfb24b75dd84c8a"; type GatewayEVMEchidnaTestConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/GatewayEVMUpgradeTest__factory.ts b/v2/types/factories/GatewayEVMUpgradeTest__factory.ts index 9dde90ab..1fd0215e 100644 --- a/v2/types/factories/GatewayEVMUpgradeTest__factory.ts +++ b/v2/types/factories/GatewayEVMUpgradeTest__factory.ts @@ -99,6 +99,33 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -116,19 +143,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "deposit", - inputs: [ - { - name: "receiver", - type: "address", - internalType: "address", - }, - ], - outputs: [], - stateMutability: "payable", - }, { type: "function", name: "deposit", @@ -148,13 +162,40 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "depositAndCall", + name: "deposit", inputs: [ { name: "receiver", @@ -162,9 +203,31 @@ const _abi = [ internalType: "address", }, { - name: "payload", - type: "bytes", - internalType: "bytes", + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -194,10 +257,82 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "depositAndCall", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + { + name: "payload", + type: "bytes", + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "payable", + }, { type: "function", name: "execute", @@ -236,6 +371,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "payable", @@ -334,17 +491,17 @@ const _abi = [ name: "initialize", inputs: [ { - name: "_tssAddress", + name: "tssAddress_", type: "address", internalType: "address", }, { - name: "_zetaToken", + name: "zetaToken_", type: "address", internalType: "address", }, { - name: "_admin", + name: "admin_", type: "address", internalType: "address", }, @@ -427,6 +584,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -454,7 +633,7 @@ const _abi = [ name: "setConnector", inputs: [ { - name: "_zetaConnector", + name: "zetaConnector_", type: "address", internalType: "address", }, @@ -467,7 +646,7 @@ const _abi = [ name: "setCustody", inputs: [ { - name: "_custody", + name: "custody_", type: "address", internalType: "address", }, @@ -560,7 +739,7 @@ const _abi = [ }, { type: "event", - name: "Call", + name: "Called", inputs: [ { name: "sender", @@ -580,12 +759,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, { type: "event", - name: "Deposit", + name: "Deposited", inputs: [ { name: "sender", @@ -617,6 +824,34 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -732,42 +967,17 @@ const _abi = [ name: "Reverted", inputs: [ { - name: "destination", + name: "to", type: "address", indexed: true, internalType: "address", }, - { - name: "value", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - { - name: "data", - type: "bytes", - indexed: false, - internalType: "bytes", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RevertedWithERC20", - inputs: [ { name: "token", type: "address", indexed: true, internalType: "address", }, - { - name: "to", - type: "address", - indexed: true, - internalType: "address", - }, { name: "amount", type: "uint256", @@ -780,6 +990,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -932,6 +1165,11 @@ const _abi = [ name: "ApprovalFailed", inputs: [], }, + { + type: "error", + name: "ConnectorInitialized", + inputs: [], + }, { type: "error", name: "CustodyInitialized", @@ -998,6 +1236,11 @@ const _abi = [ name: "NotInitializing", inputs: [], }, + { + type: "error", + name: "NotWhitelistedInCustody", + inputs: [], + }, { type: "error", name: "ReentrancyGuardReentrantCall", @@ -1038,7 +1281,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612d526100fd60003960008181611ab101528181611ada0152611f250152612d526000f3fe6080604052600436106101e35760003560e01c80635c975abb11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461062e578063e63ab1e91461064e578063f340fa0114610682578063f45346dc1461069557600080fd5b8063ae7a3a6f146105ae578063b8969bd4146105ce578063c0c53b8b146105ee578063d547741f1461060e57600080fd5b806391d14854116100d157806391d14854146104b7578063a217fddf1461051c578063a783c78914610531578063ad3cb1cc1461056557600080fd5b80635c975abb146104175780635d62c8601461044e5780638456cb59146104825780638c6f037f1461049757600080fd5b806335c018db1161017a5780635131ab59116101495780635131ab59146103a257806352d1902d146103c257806357bec62f146103d75780635b112591146103f757600080fd5b806335c018db1461034757806336568abe1461035a5780633f4ba83a1461037a5780634f1ef2861461038f57600080fd5b806321e093b1116101b657806321e093b11461027f578063248a9ca3146102b757806329c59b5d146103145780632f2ff15d1461032757600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631b8b921d1461023f5780631cff79cd1461025f575b600080fd5b3480156101f457600080fd5b506102086102033660046127c5565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612823565b61074e565b005b34801561024b57600080fd5b5061023d61025a366004612887565b610842565b61027261026d366004612887565b610894565b6040516102149190612948565b34801561028b57600080fd5b5060035461029f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102c357600080fd5b506103066102d236600461295b565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b61023d610322366004612887565b61091d565b34801561033357600080fd5b5061023d610342366004612974565b610a42565b61023d610355366004612887565b610a8c565b34801561036657600080fd5b5061023d610375366004612974565b610c0b565b34801561038657600080fd5b5061023d610c5c565b61023d61039d3660046129cf565b610c91565b3480156103ae57600080fd5b5061023d6103bd366004612ad6565b610cb0565b3480156103ce57600080fd5b50610306610f85565b3480156103e357600080fd5b5060025461029f906001600160a01b031681565b34801561040357600080fd5b5060015461029f906001600160a01b031681565b34801561042357600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561045a57600080fd5b506103067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561048e57600080fd5b5061023d610fb4565b3480156104a357600080fd5b5061023d6104b2366004612b45565b610fe6565b3480156104c357600080fd5b506102086104d2366004612974565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561052857600080fd5b50610306600081565b34801561053d57600080fd5b506103067f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057157600080fd5b506102726040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105ba57600080fd5b5061023d6105c9366004612823565b611083565b3480156105da57600080fd5b5061023d6105e9366004612ad6565b611177565b3480156105fa57600080fd5b5061023d610609366004612b97565b6112e9565b34801561061a57600080fd5b5061023d610629366004612974565b61159e565b34801561063a57600080fd5b5060005461029f906001600160a01b031681565b34801561065a57600080fd5b506103067f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d610690366004612823565b6115e2565b3480156106a157600080fd5b5061023d6106b0366004612bda565b611707565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000610759816117b2565b6002546001600160a01b03161561079c576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166107dc576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9836117bc565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b826001600160a01b0316336001600160a01b03167f2a21062ee9199c2e205622999eeb7c3da73153674f36a0acd3f74fa6af67bde38484604051610887929190612c56565b60405180910390a3505050565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6108c0816117b2565b60006108cd8686866118a9565b9050856001600160a01b03167f373df382b9c587826f3de13f16d67f8d99f28ee947fc0924c6ef2d6d2c7e854634878760405161090c93929190612c72565b60405180910390a295945050505050565b34600003610957576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d80600081146109a4576040519150601f19603f3d011682016040523d82523d6000602084013e6109a9565b606091505b50909150508015156000036109ea576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a43460008787604051610a349493929190612c8c565b60405180910390a350505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a7c816117b2565b610a8683836117bc565b50505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb610ab6816117b2565b600080856001600160a01b03163460405160006040518083038185875af1925050503d8060008114610b04576040519150601f19603f3d011682016040523d82523d6000602084013e610b09565b606091505b509150915081610b45576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8fcaa0b50000000000000000000000000000000000000000000000000000000081526001600160a01b03871690638fcaa0b590610b8c9088908890600401612c56565b600060405180830381600087803b158015610ba657600080fd5b505af1158015610bba573d6000803e3d6000fd5b50505050856001600160a01b03167fd5d7616b1678354a0dea9d7e57e6a090bff5babe9f8d6381fdbad16e89ba311c348787604051610bfb93929190612c72565b60405180910390a2505050505050565b6001600160a01b0381163314610c4d576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c578282611952565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c86816117b2565b610c8e611a16565b50565b610c99611aa6565b610ca282611b78565b610cac8282611b83565b5050565b610cb8611ca7565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610ce2816117b2565b83600003610d1c576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d268686611d28565b610d5c576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de89190612cb5565b610e1e576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e2b8685856118a9565b9050610e378787611d28565b610e6d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190612cd7565b90508015610f0357610f038882611db8565b866001600160a01b0316886001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382888888604051610f4a93929190612c72565b60405180910390a3505050610f7e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6000610f8f611f1a565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610fde816117b2565b610c8e611f7c565b83600003611020576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61102b338486611ff5565b846001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a4868686866040516110749493929190612c8c565b60405180910390a35050505050565b600061108e816117b2565b6000546001600160a01b0316156110d1576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611111576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61113b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9836117bc565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b61117f611ca7565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96111a9816117b2565b836000036111e3576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111f76001600160a01b0387168686612149565b6040517f8fcaa0b50000000000000000000000000000000000000000000000000000000081526001600160a01b03861690638fcaa0b59061123e9086908690600401612c56565b600060405180830381600087803b15801561125857600080fd5b505af115801561126c573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b03167f723fc7be2448075379e4fdf1e6bf5fead954d2668d2da05dcb44ccfec4beeda78686866040516112b793929190612c72565b60405180910390a350610f7e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113345750825b905060008267ffffffffffffffff1660011480156113515750303b155b90508115801561135f575080155b15611396576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141457506001600160a01b038716155b1561144b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114536121bd565b61145b6121c5565b6114636121bd565b61146b6121d5565b6114766000876117bc565b506114a17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a876117bc565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114ff7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb896117bc565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115945784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546115d8816117b2565b610a868383611952565b3460000361161c576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611669576040519150601f19603f3d011682016040523d82523d6000602084013e61166e565b606091505b50909150508015156000036116af576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051348152600060208201819052606082840181905282015290516001600160a01b0384169133917f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a49181900360800190a35050565b81600003611741576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61174c338284611ff5565b826001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a484846040516108879291909182526001600160a01b0316602082015260606040820181905260009082015260800190565b610c8e81336121e5565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1661189f576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118553390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b6060600080856001600160a01b03163486866040516118c9929190612cf0565b60006040518083038185875af1925050503d8060008114611906576040519150601f19603f3d011682016040523d82523d6000602084013e61190b565b606091505b509150915081611947576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff161561189f576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611a1e612272565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b3f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b337f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611b76576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610cac816117b2565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611bfb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611bf891810190612cd7565b60015b611c41576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611c9d576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611c38565b610c5783836122cd565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d22576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af1158015611d94573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190612cb5565b6003546001600160a01b0390811690831603611eda576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015611e3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5e9190612cb5565b506002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b158015611ebe57600080fd5b505af1158015611ed2573d6000803e3d6000fd5b505050505050565b600054610cac906001600160a01b03848116911683612149565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611b76576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f84612323565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611a88565b6003546001600160a01b039081169083160361212d576120206001600160a01b03831684308461237f565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af115801561208c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b09190612cb5565b506002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561211057600080fd5b505af1158015612124573d6000803e3d6000fd5b50505050505050565b600054610c57906001600160a01b03848116918691168461237f565b6040516001600160a01b03838116602483015260448201839052610c5791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123b8565b611b76612434565b6121cd612434565b611b7661249b565b6121dd612434565b611b766124a3565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610cac576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401611c38565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611b76576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122d6826124f4565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561231b57610c57828261259c565b610cac612612565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611b76576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610a869186918216906323b872dd90608401612176565b60006123cd6001600160a01b0384168361264a565b905080516000141580156123f25750808060200190518101906123f09190612cb5565b155b15610c57576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611c38565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611b76576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ef4612434565b6124ab612434565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b806001600160a01b03163b600003612543576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401611c38565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516125b99190612d00565b600060405180830381855af49150503d80600081146125f4576040519150601f19603f3d011682016040523d82523d6000602084013e6125f9565b606091505b5091509150612609858383612658565b95945050505050565b3415611b76576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606061194b838360006126cd565b60608261266d5761266882612783565b61194b565b815115801561268457506001600160a01b0384163b155b156126c6576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611c38565b508061194b565b60608147101561270b576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611c38565b600080856001600160a01b031684866040516127279190612d00565b60006040518083038185875af1925050503d8060008114612764576040519150601f19603f3d011682016040523d82523d6000602084013e612769565b606091505b5091509150612779868383612658565b9695505050505050565b8051156127935780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156127d757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461194b57600080fd5b80356001600160a01b038116811461281e57600080fd5b919050565b60006020828403121561283557600080fd5b61194b82612807565b60008083601f84011261285057600080fd5b50813567ffffffffffffffff81111561286857600080fd5b60208301915083602082850101111561288057600080fd5b9250929050565b60008060006040848603121561289c57600080fd5b6128a584612807565b9250602084013567ffffffffffffffff8111156128c157600080fd5b6128cd8682870161283e565b9497909650939450505050565b60005b838110156128f55781810151838201526020016128dd565b50506000910152565b600081518084526129168160208601602086016128da565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061194b60208301846128fe565b60006020828403121561296d57600080fd5b5035919050565b6000806040838503121561298757600080fd5b8235915061299760208401612807565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156129e257600080fd5b6129eb83612807565b9150602083013567ffffffffffffffff811115612a0757600080fd5b8301601f81018513612a1857600080fd5b803567ffffffffffffffff811115612a3257612a326129a0565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612a9e57612a9e6129a0565b604052818152828201602001871015612ab657600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600060808688031215612aee57600080fd5b612af786612807565b9450612b0560208701612807565b935060408601359250606086013567ffffffffffffffff811115612b2857600080fd5b612b348882890161283e565b969995985093965092949392505050565b600080600080600060808688031215612b5d57600080fd5b612b6686612807565b945060208601359350612b7b60408701612807565b9250606086013567ffffffffffffffff811115612b2857600080fd5b600080600060608486031215612bac57600080fd5b612bb584612807565b9250612bc360208501612807565b9150612bd160408501612807565b90509250925092565b600080600060608486031215612bef57600080fd5b612bf884612807565b925060208401359150612bd160408501612807565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612c6a602083018486612c0d565b949350505050565b838152604060208201526000612609604083018486612c0d565b8481526001600160a01b0384166020820152606060408201526000612779606083018486612c0d565b600060208284031215612cc757600080fd5b8151801515811461194b57600080fd5b600060208284031215612ce957600080fd5b5051919050565b8183823760009101908152919050565b60008251612d128184602087016128da565b919091019291505056fea2646970667358221220f5f94badcd1bd52ad12da244f7c4f330f2fb5d16305f04303cf08087abeff75664736f6c634300081a0033"; + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516136da6100fd60003960008181611f3d01528181611f6601526123f201526136da6000f3fe6080604052600436106101e35760003560e01c8063616e877a11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461063b578063e63ab1e91461065b578063f7ad60db1461068f578063fc93baef146106a257600080fd5b8063ae7a3a6f146105bb578063c0c53b8b146105db578063d0b492c3146105fb578063d547741f1461061b57600080fd5b806391d14854116100d157806391d14854146104c4578063a217fddf14610529578063a783c7891461053e578063ad3cb1cc1461057257600080fd5b8063616e877a1461045c57806370f23f881461047c5780638456cb591461048f578063870de27a146104a457600080fd5b806345ac7a8d1161017a57806357bec62f1161014957806357bec62f146103b15780635b112591146103d15780635c975abb146103f15780635d62c8601461042857600080fd5b806345ac7a8d146103495780634f1ef286146103695780635131ab591461037c57806352d1902d1461039c57600080fd5b8063248a9ca3116101b6578063248a9ca3146102975780632f2ff15d146102f457806336568abe146103145780633f4ba83a1461033457600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631cff79cd1461023f57806321e093b11461025f575b600080fd5b3480156101f457600080fd5b50610208610203366004612d1f565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612d7d565b61074e565b005b61025261024d366004612de1565b610842565b6040516102149190612ea2565b34801561026b57600080fd5b5060035461027f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102a357600080fd5b506102e66102b2366004612eb5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b34801561030057600080fd5b5061023d61030f366004612ece565b610945565b34801561032057600080fd5b5061023d61032f366004612ece565b61098f565b34801561034057600080fd5b5061023d6109e0565b34801561035557600080fd5b5061023d610364366004612f12565b610a15565b61023d610377366004612fc0565b610add565b34801561038857600080fd5b5061023d6103973660046130c7565b610afc565b3480156103a857600080fd5b506102e6610e15565b3480156103bd57600080fd5b5060025461027f906001600160a01b031681565b3480156103dd57600080fd5b5060015461027f906001600160a01b031681565b3480156103fd57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561043457600080fd5b506102e67f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561046857600080fd5b5061023d610477366004613136565b610e44565b61023d61048a366004613186565b610f20565b34801561049b57600080fd5b5061023d6110b1565b3480156104b057600080fd5b5061023d6104bf3660046131d4565b6110e3565b3480156104d057600080fd5b506102086104df366004612ece565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561053557600080fd5b506102e6600081565b34801561054a57600080fd5b506102e67f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057e57600080fd5b506102526040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105c757600080fd5b5061023d6105d6366004612d7d565b6111f4565b3480156105e757600080fd5b5061023d6105f636600461326c565b6112e8565b34801561060757600080fd5b5061023d6106163660046132c1565b61159d565b34801561062757600080fd5b5061023d610636366004612ece565b61175f565b34801561064757600080fd5b5060005461027f906001600160a01b031681565b34801561066757600080fd5b506102e67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d61069d36600461334c565b6117a3565b61023d6106b0366004612f12565b6119a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611b39565b6001600160a01b038216610799576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b0316156107dc576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61086e81611b39565b610876611c30565b61087e611c8e565b6001600160a01b0385166108be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108cb868686611d0f565b9050856001600160a01b03167f373df382b9c587826f3de13f16d67f8d99f28ee947fc0924c6ef2d6d2c7e854634878760405161090a93929190613408565b60405180910390a2915061093d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461097f81611b39565b6109898383611b43565b50505050565b6001600160a01b03811633146109d1576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db8282611dde565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0a81611b39565b610a12611ea2565b50565b610a1d611c30565b610a25611c8e565b6001600160a01b038416610a65576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610aac939291906134fb565b60405180910390a361098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ae5611f32565b610aee82612002565b610af8828261200d565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610b2681611b39565b610b2e611c30565b610b36611c8e565b83600003610b70576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610bb0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bba8686612131565b610bf0576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613521565b610cb2576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbd858484611d0f565b50610cc88686612131565b610cfe576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d82919061353e565b90508015610d9457610d9487826121c1565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610ddb93929190613408565b60405180910390a350610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610e1f6123e7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610e4c611c30565b610e54611c8e565b82600003610e8e576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610ece576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed9338385612449565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610aac93929190613557565b610f28611c30565b610f30611c8e565b34600003610f6a576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610faa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b5050905080611037576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161107f93929190613557565b60405180910390a350610af860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110db81611b39565b610a12612686565b6110eb611c30565b6110f3611c8e565b8460000361112d576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661116d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611178338587612449565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd87878787876040516111c395949392919061358d565b60405180910390a3610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006111ff81611b39565b6001600160a01b03821661123f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031615611282576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ac7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113335750825b905060008267ffffffffffffffff1660011480156113505750303b155b90508115801561135e575080155b15611395576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141357506001600160a01b038716155b1561144a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114526126ff565b61145a612707565b6114626126ff565b61146a612717565b611475600087611b43565b506114a07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b43565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114fe7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b43565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115935784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96115c781611b39565b6115cf611c30565b6115d7611c8e565b84600003611611576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611651576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116656001600160a01b0388168787612727565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906116aa90859060040161362e565b600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b1436878787876040516117259493929190613641565b60405180910390a361175660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461179981611b39565b6109898383611dde565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6117cd81611b39565b6117d5611c30565b6117dd611c8e565b6001600160a01b03851661181d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d806000811461186a576040519150601f19603f3d011682016040523d82523d6000602084013e61186f565b606091505b50509050806118aa576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906118ef90869060040161362e565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14363488888860405161196b9493929190613641565b60405180910390a35061199d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6119ac611c30565b6119b4611c8e565b346000036119ee576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611a2e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611abb576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611b0795949392919061358d565b60405180910390a35061098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610a12813361279b565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c26576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bdc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c8c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d09576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611d2f929190613678565b60006040518083038185875af1925050503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b509150915081611dad576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c26576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611eaa612828565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fbf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610af881611b39565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612085575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120829181019061353e565b60015b6120cb576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612127576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120c2565b6109db8383612883565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190613521565b6003546001600160a01b0390811690831603612310576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613521565b61229d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122fc57600080fd5b505af1158015610e0d573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613521565b6123cd576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610af8906001600160a01b03848116911683612727565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b03908116908316036125ad576124746001600160a01b0383168430846128d9565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613521565b61253a576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561259957600080fd5b505af1158015611756573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190613521565b61266a576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546109db906001600160a01b0384811691869116846128d9565b61268e611c30565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611f14565b611c8c612912565b61270f612912565b611c8c612979565b61271f612912565b611c8c612981565b6040516001600160a01b038381166024830152604482018390526109db91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d2565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610af8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120c2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c8c576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61288c82612a4e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128d1576109db8282612af6565b610af8612b6c565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401612754565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c8c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db8612912565b612989612912565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60006129e76001600160a01b03841683612ba4565b90508051600014158015612a0c575080806020019051810190612a0a9190613521565b155b156109db576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120c2565b806001600160a01b03163b600003612a9d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120c2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b139190613688565b600060405180830381855af49150503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b63858383612bb2565b95945050505050565b3415611c8c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611db183836000612c27565b606082612bc757612bc282612cdd565b611db1565b8151158015612bde57506001600160a01b0384163b155b15612c20576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120c2565b5080611db1565b606081471015612c65576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120c2565b600080856001600160a01b03168486604051612c819190613688565b60006040518083038185875af1925050503d8060008114612cbe576040519150601f19603f3d011682016040523d82523d6000602084013e612cc3565b606091505b5091509150612cd3868383612bb2565b9695505050505050565b805115612ced5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611db157600080fd5b80356001600160a01b0381168114612d7857600080fd5b919050565b600060208284031215612d8f57600080fd5b611db182612d61565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b602083019150836020828501011115612dda57600080fd5b9250929050565b600080600060408486031215612df657600080fd5b612dff84612d61565b9250602084013567ffffffffffffffff811115612e1b57600080fd5b612e2786828701612d98565b9497909650939450505050565b60005b83811015612e4f578181015183820152602001612e37565b50506000910152565b60008151808452612e70816020860160208601612e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db16020830184612e58565b600060208284031215612ec757600080fd5b5035919050565b60008060408385031215612ee157600080fd5b82359150612ef160208401612d61565b90509250929050565b600060808284031215612f0c57600080fd5b50919050565b60008060008060608587031215612f2857600080fd5b612f3185612d61565b9350602085013567ffffffffffffffff811115612f4d57600080fd5b612f5987828801612d98565b909450925050604085013567ffffffffffffffff811115612f7957600080fd5b612f8587828801612efa565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612fd357600080fd5b612fdc83612d61565b9150602083013567ffffffffffffffff811115612ff857600080fd5b8301601f8101851361300957600080fd5b803567ffffffffffffffff81111561302357613023612f91565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561308f5761308f612f91565b6040528181528282016020018710156130a757600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156130df57600080fd5b6130e886612d61565b94506130f660208701612d61565b935060408601359250606086013567ffffffffffffffff81111561311957600080fd5b61312588828901612d98565b969995985093965092949392505050565b6000806000806080858703121561314c57600080fd5b61315585612d61565b93506020850135925061316a60408601612d61565b9150606085013567ffffffffffffffff811115612f7957600080fd5b6000806040838503121561319957600080fd5b6131a283612d61565b9150602083013567ffffffffffffffff8111156131be57600080fd5b6131ca85828601612efa565b9150509250929050565b60008060008060008060a087890312156131ed57600080fd5b6131f687612d61565b95506020870135945061320b60408801612d61565b9350606087013567ffffffffffffffff81111561322757600080fd5b61323389828a01612d98565b909450925050608087013567ffffffffffffffff81111561325357600080fd5b61325f89828a01612efa565b9150509295509295509295565b60008060006060848603121561328157600080fd5b61328a84612d61565b925061329860208501612d61565b91506132a660408501612d61565b90509250925092565b600060608284031215612f0c57600080fd5b60008060008060008060a087890312156132da57600080fd5b6132e387612d61565b95506132f160208801612d61565b945060408701359350606087013567ffffffffffffffff81111561331457600080fd5b61332089828a01612d98565b909450925050608087013567ffffffffffffffff81111561334057600080fd5b61325f89828a016132af565b6000806000806060858703121561336257600080fd5b61336b85612d61565b9350602085013567ffffffffffffffff81111561338757600080fd5b61339387828801612d98565b909450925050604085013567ffffffffffffffff8111156133b357600080fd5b612f85878288016132af565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612b636040830184866133bf565b8015158114610a1257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261346557600080fd5b830160208101925035905067ffffffffffffffff81111561348557600080fd5b803603821315612dda57600080fd5b6001600160a01b036134a582612d61565b168252600060208201356134b881613422565b151560208401526001600160a01b036134d360408401612d61565b1660408401526134e66060830183613430565b60806060860152612b636080860182846133bf565b60408152600061350f6040830185876133bf565b8281036020840152612cd38185613494565b60006020828403121561353357600080fd5b8151611db181613422565b60006020828403121561355057600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612b6360a0830184613494565b8581526001600160a01b03851660208201526080604082015260006135b66080830185876133bf565b82810360608401526135c88185613494565b98975050505050505050565b6001600160a01b036135e582612d61565b1682526000602082013567ffffffffffffffff811680821461360657600080fd5b6020850152506136196040830183613430565b60606040860152612b636060860182846133bf565b602081526000611db160208301846135d4565b84815260606020820152600061365b6060830185876133bf565b828103604084015261366d81856135d4565b979650505050505050565b8183823760009101908152919050565b6000825161369a818460208701612e34565b919091019291505056fea2646970667358221220cb6089a1141e91f88c3d18b5cebf51d96613376a65e1874d62836bd5fbf8adef64736f6c634300081a0033"; type GatewayEVMUpgradeTestConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/GatewayEVM__factory.ts b/v2/types/factories/GatewayEVM__factory.ts index 126f8c5e..be43fd29 100644 --- a/v2/types/factories/GatewayEVM__factory.ts +++ b/v2/types/factories/GatewayEVM__factory.ts @@ -96,6 +96,33 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -113,19 +140,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "deposit", - inputs: [ - { - name: "receiver", - type: "address", - internalType: "address", - }, - ], - outputs: [], - stateMutability: "payable", - }, { type: "function", name: "deposit", @@ -145,13 +159,40 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "depositAndCall", + name: "deposit", inputs: [ { name: "receiver", @@ -159,9 +200,31 @@ const _abi = [ internalType: "address", }, { - name: "payload", - type: "bytes", - internalType: "bytes", + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -191,10 +254,82 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "depositAndCall", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + { + name: "payload", + type: "bytes", + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "payable", + }, { type: "function", name: "execute", @@ -233,6 +368,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "payable", @@ -424,6 +581,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -557,7 +736,7 @@ const _abi = [ }, { type: "event", - name: "Call", + name: "Called", inputs: [ { name: "sender", @@ -577,12 +756,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, { type: "event", - name: "Deposit", + name: "Deposited", inputs: [ { name: "sender", @@ -614,6 +821,34 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -704,42 +939,17 @@ const _abi = [ name: "Reverted", inputs: [ { - name: "destination", + name: "to", type: "address", indexed: true, internalType: "address", }, - { - name: "value", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - { - name: "data", - type: "bytes", - indexed: false, - internalType: "bytes", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RevertedWithERC20", - inputs: [ { name: "token", type: "address", indexed: true, internalType: "address", }, - { - name: "to", - type: "address", - indexed: true, - internalType: "address", - }, { name: "amount", type: "uint256", @@ -752,6 +962,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -904,6 +1137,11 @@ const _abi = [ name: "ApprovalFailed", inputs: [], }, + { + type: "error", + name: "ConnectorInitialized", + inputs: [], + }, { type: "error", name: "CustodyInitialized", @@ -970,6 +1208,11 @@ const _abi = [ name: "NotInitializing", inputs: [], }, + { + type: "error", + name: "NotWhitelistedInCustody", + inputs: [], + }, { type: "error", name: "ReentrancyGuardReentrantCall", @@ -1010,7 +1253,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612f486100fd60003960008181611d4a01528181611d7301526121420152612f486000f3fe6080604052600436106101e35760003560e01c80635c975abb11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461062e578063e63ab1e91461064e578063f340fa0114610682578063f45346dc1461069557600080fd5b8063ae7a3a6f146105ae578063b8969bd4146105ce578063c0c53b8b146105ee578063d547741f1461060e57600080fd5b806391d14854116100d157806391d14854146104b7578063a217fddf1461051c578063a783c78914610531578063ad3cb1cc1461056557600080fd5b80635c975abb146104175780635d62c8601461044e5780638456cb59146104825780638c6f037f1461049757600080fd5b806335c018db1161017a5780635131ab59116101495780635131ab59146103a257806352d1902d146103c257806357bec62f146103d75780635b112591146103f757600080fd5b806335c018db1461034757806336568abe1461035a5780633f4ba83a1461037a5780634f1ef2861461038f57600080fd5b806321e093b1116101b657806321e093b11461027f578063248a9ca3146102b757806329c59b5d146103145780632f2ff15d1461032757600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631b8b921d1461023f5780631cff79cd1461025f575b600080fd5b3480156101f457600080fd5b506102086102033660046129bb565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612a19565b61074e565b005b34801561024b57600080fd5b5061023d61025a366004612a7d565b610842565b61027261026d366004612a7d565b6108cd565b6040516102149190612b3e565b34801561028b57600080fd5b5060035461029f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102c357600080fd5b506103066102d2366004612b51565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b61023d610322366004612a7d565b610990565b34801561033357600080fd5b5061023d610342366004612b6a565b610ae3565b61023d610355366004612a7d565b610b2d565b34801561036657600080fd5b5061023d610375366004612b6a565b610d1c565b34801561038657600080fd5b5061023d610d68565b61023d61039d366004612bc5565b610d9d565b3480156103ae57600080fd5b5061023d6103bd366004612ccc565b610dbc565b3480156103ce57600080fd5b50610306611099565b3480156103e357600080fd5b5060025461029f906001600160a01b031681565b34801561040357600080fd5b5060015461029f906001600160a01b031681565b34801561042357600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561045a57600080fd5b506103067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561048e57600080fd5b5061023d6110c8565b3480156104a357600080fd5b5061023d6104b2366004612d3b565b6110fa565b3480156104c357600080fd5b506102086104d2366004612b6a565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561052857600080fd5b50610306600081565b34801561053d57600080fd5b506103067f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057157600080fd5b506102726040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105ba57600080fd5b5061023d6105c9366004612a19565b6111d0565b3480156105da57600080fd5b5061023d6105e9366004612ccc565b6112c4565b3480156105fa57600080fd5b5061023d610609366004612d8d565b61143d565b34801561061a57600080fd5b5061023d610629366004612b6a565b6116f2565b34801561063a57600080fd5b5060005461029f906001600160a01b031681565b34801561065a57600080fd5b506103067f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d610690366004612a19565b611736565b3480156106a157600080fd5b5061023d6106b0366004612dd0565b61188b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611946565b6002546001600160a01b03161561079c576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166107dc576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611950565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b61084a611a3d565b610852611a9b565b826001600160a01b0316336001600160a01b03167f2a21062ee9199c2e205622999eeb7c3da73153674f36a0acd3f74fa6af67bde38484604051610897929190612e4c565b60405180910390a36108c860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6108f981611946565b610901611a3d565b610909611a9b565b6000610916868686611b42565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f34878760405161095593929190612e68565b60405180910390a2915061098860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b610998611a3d565b6109a0611a9b565b346000036109da576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610a27576040519150601f19603f3d011682016040523d82523d6000602084013e610a2c565b606091505b5050905080610a67576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a43460008787604051610ab19493929190612e82565b60405180910390a3506108c860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610b1d81611946565b610b278383611950565b50505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb610b5781611946565b610b5f611a3d565b610b67611a9b565b6001600160a01b038416610ba7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000846001600160a01b03163460405160006040518083038185875af1925050503d8060008114610bf4576040519150601f19603f3d011682016040523d82523d6000602084013e610bf9565b606091505b5050905080610c34576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8fcaa0b50000000000000000000000000000000000000000000000000000000081526001600160a01b03861690638fcaa0b590610c7b9087908790600401612e4c565b600060405180830381600087803b158015610c9557600080fd5b505af1158015610ca9573d6000803e3d6000fd5b50505050846001600160a01b03167fd5d7616b1678354a0dea9d7e57e6a090bff5babe9f8d6381fdbad16e89ba311c348686604051610cea93929190612e68565b60405180910390a250610b2760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6001600160a01b0381163314610d5e576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c88282611beb565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d9281611946565b610d9a611caf565b50565b610da5611d3f565b610dae82611e0f565b610db88282611e1a565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610de681611946565b610dee611a3d565b610df6611a9b565b83600003610e30576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3a8686611f3e565b610e70576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efc9190612eab565b610f32576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f3f868585611b42565b9050610f4b8787611f3e565b610f81576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015610fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110059190612ecd565b90508015611017576110178882611fce565b866001600160a01b0316886001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b738288888860405161105e93929190612e68565b60405180910390a3505061109160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60006110a3612137565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110f281611946565b610d9a612199565b611102611a3d565b61110a611a9b565b83600003611144576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61114f338486612212565b846001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a4868686866040516111989493929190612e82565b60405180910390a36111c960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b60006111db81611946565b6000546001600160a01b03161561121e576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821661125e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112887f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611950565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96112ee81611946565b6112f6611a3d565b6112fe611a9b565b83600003611338576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61134c6001600160a01b038716868661239b565b6040517f8fcaa0b50000000000000000000000000000000000000000000000000000000081526001600160a01b03861690638fcaa0b5906113939086908690600401612e4c565b600060405180830381600087803b1580156113ad57600080fd5b505af11580156113c1573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b03167f723fc7be2448075379e4fdf1e6bf5fead954d2668d2da05dcb44ccfec4beeda786868660405161140c93929190612e68565b60405180910390a361109160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156114885750825b905060008267ffffffffffffffff1660011480156114a55750303b155b9050811580156114b3575080155b156114ea576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561154b5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061156857506001600160a01b038716155b1561159f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115a761240f565b6115af612417565b6115b761240f565b6115bf612427565b6115ca600087611950565b506115f57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611950565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556116537f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611950565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156116e85784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461172c81611946565b610b278383611beb565b61173e611a3d565b611746611a9b565b34600003611780576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d80600081146117cd576040519150601f19603f3d011682016040523d82523d6000602084013e6117d2565b606091505b505090508061180d576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051348152600060208201819052606082840181905282015290516001600160a01b0384169133917f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a49181900360800190a350610d9a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611893611a3d565b61189b611a9b565b816000036118d5576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118e0338284612212565b826001600160a01b0316336001600160a01b03167f2103daedac6c1eee9e5bfbd02064d751c9ec3c03fb9bc3e4f94ca41afa38c1a484846040516108979291909182526001600160a01b0316602082015260606040820181905260009082015260800190565b610d9a8133612437565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611a33576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556119e93390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611a99576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611b16576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6060600080856001600160a01b0316348686604051611b62929190612ee6565b60006040518083038185875af1925050503d8060008114611b9f576040519150601f19603f3d011682016040523d82523d6000602084013e611ba4565b606091505b509150915081611be0576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611a33576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611cb76124c4565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611dd857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611dcc7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611a99576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610db881611946565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611e92575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611e8f91810190612ecd565b60015b611ed8576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611f34576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611ecf565b6108c8838361251f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af1158015611faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be49190612eab565b6003546001600160a01b039081169083160361211d576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612050573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120749190612eab565b6120aa576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561210957600080fd5b505af1158015611091573d6000803e3d6000fd5b600054610db8906001600160a01b0384811691168361239b565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a99576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121a1611a3d565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611d21565b6003546001600160a01b039081169083160361237f5761223d6001600160a01b038316843084612575565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156122a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cd9190612eab565b612303576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561236257600080fd5b505af1158015612376573d6000803e3d6000fd5b50505050505050565b6000546108c8906001600160a01b038481169186911684612575565b6040516001600160a01b038381166024830152604482018390526108c891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506125ae565b611a9961262a565b61241f61262a565b611a99612691565b61242f61262a565b611a99612699565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610db8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401611ecf565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611a99576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612528826126ea565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561256d576108c88282612792565b610db8612808565b6040516001600160a01b038481166024830152838116604483015260648201839052610b279186918216906323b872dd906084016123c8565b60006125c36001600160a01b03841683612840565b905080516000141580156125e85750808060200190518101906125e69190612eab565b155b156108c8576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611ecf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611a99576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1c61262a565b6126a161262a565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b806001600160a01b03163b600003612739576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401611ecf565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127af9190612ef6565b600060405180830381855af49150503d80600081146127ea576040519150601f19603f3d011682016040523d82523d6000602084013e6127ef565b606091505b50915091506127ff85838361284e565b95945050505050565b3415611a99576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611be4838360006128c3565b6060826128635761285e82612979565b611be4565b815115801561287a57506001600160a01b0384163b155b156128bc576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611ecf565b5080611be4565b606081471015612901576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611ecf565b600080856001600160a01b0316848660405161291d9190612ef6565b60006040518083038185875af1925050503d806000811461295a576040519150601f19603f3d011682016040523d82523d6000602084013e61295f565b606091505b509150915061296f86838361284e565b9695505050505050565b8051156129895780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156129cd57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611be457600080fd5b80356001600160a01b0381168114612a1457600080fd5b919050565b600060208284031215612a2b57600080fd5b611be4826129fd565b60008083601f840112612a4657600080fd5b50813567ffffffffffffffff811115612a5e57600080fd5b602083019150836020828501011115612a7657600080fd5b9250929050565b600080600060408486031215612a9257600080fd5b612a9b846129fd565b9250602084013567ffffffffffffffff811115612ab757600080fd5b612ac386828701612a34565b9497909650939450505050565b60005b83811015612aeb578181015183820152602001612ad3565b50506000910152565b60008151808452612b0c816020860160208601612ad0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611be46020830184612af4565b600060208284031215612b6357600080fd5b5035919050565b60008060408385031215612b7d57600080fd5b82359150612b8d602084016129fd565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612bd857600080fd5b612be1836129fd565b9150602083013567ffffffffffffffff811115612bfd57600080fd5b8301601f81018513612c0e57600080fd5b803567ffffffffffffffff811115612c2857612c28612b96565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612c9457612c94612b96565b604052818152828201602001871015612cac57600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600060808688031215612ce457600080fd5b612ced866129fd565b9450612cfb602087016129fd565b935060408601359250606086013567ffffffffffffffff811115612d1e57600080fd5b612d2a88828901612a34565b969995985093965092949392505050565b600080600080600060808688031215612d5357600080fd5b612d5c866129fd565b945060208601359350612d71604087016129fd565b9250606086013567ffffffffffffffff811115612d1e57600080fd5b600080600060608486031215612da257600080fd5b612dab846129fd565b9250612db9602085016129fd565b9150612dc7604085016129fd565b90509250925092565b600080600060608486031215612de557600080fd5b612dee846129fd565b925060208401359150612dc7604085016129fd565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612e60602083018486612e03565b949350505050565b8381526040602082015260006127ff604083018486612e03565b8481526001600160a01b038416602082015260606040820152600061296f606083018486612e03565b600060208284031215612ebd57600080fd5b81518015158114611be457600080fd5b600060208284031215612edf57600080fd5b5051919050565b8183823760009101908152919050565b60008251612f08818460208701612ad0565b919091019291505056fea26469706673582212208889b449de125bcd9995c2452115e4c4e941948f5ff17d068f0677c925a7730064736f6c634300081a0033"; + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516136da6100fd60003960008181611f3d01528181611f6601526123f201526136da6000f3fe6080604052600436106101e35760003560e01c8063616e877a11610102578063ae7a3a6f11610095578063dda79b7511610064578063dda79b751461063b578063e63ab1e91461065b578063f7ad60db1461068f578063fc93baef146106a257600080fd5b8063ae7a3a6f146105bb578063c0c53b8b146105db578063d0b492c3146105fb578063d547741f1461061b57600080fd5b806391d14854116100d157806391d14854146104c4578063a217fddf14610529578063a783c7891461053e578063ad3cb1cc1461057257600080fd5b8063616e877a1461045c57806370f23f881461047c5780638456cb591461048f578063870de27a146104a457600080fd5b806345ac7a8d1161017a57806357bec62f1161014957806357bec62f146103b15780635b112591146103d15780635c975abb146103f15780635d62c8601461042857600080fd5b806345ac7a8d146103495780634f1ef286146103695780635131ab591461037c57806352d1902d1461039c57600080fd5b8063248a9ca3116101b6578063248a9ca3146102975780632f2ff15d146102f457806336568abe146103145780633f4ba83a1461033457600080fd5b806301ffc9a7146101e857806310188aef1461021d5780631cff79cd1461023f57806321e093b11461025f575b600080fd5b3480156101f457600080fd5b50610208610203366004612d1f565b6106b5565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004612d7d565b61074e565b005b61025261024d366004612de1565b610842565b6040516102149190612ea2565b34801561026b57600080fd5b5060035461027f906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b3480156102a357600080fd5b506102e66102b2366004612eb5565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610214565b34801561030057600080fd5b5061023d61030f366004612ece565b610945565b34801561032057600080fd5b5061023d61032f366004612ece565b61098f565b34801561034057600080fd5b5061023d6109e0565b34801561035557600080fd5b5061023d610364366004612f12565b610a15565b61023d610377366004612fc0565b610add565b34801561038857600080fd5b5061023d6103973660046130c7565b610afc565b3480156103a857600080fd5b506102e6610e15565b3480156103bd57600080fd5b5060025461027f906001600160a01b031681565b3480156103dd57600080fd5b5060015461027f906001600160a01b031681565b3480156103fd57600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610208565b34801561043457600080fd5b506102e67f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b981565b34801561046857600080fd5b5061023d610477366004613136565b610e44565b61023d61048a366004613186565b610f20565b34801561049b57600080fd5b5061023d6110b1565b3480156104b057600080fd5b5061023d6104bf3660046131d4565b6110e3565b3480156104d057600080fd5b506102086104df366004612ece565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561053557600080fd5b506102e6600081565b34801561054a57600080fd5b506102e67f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b34801561057e57600080fd5b506102526040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156105c757600080fd5b5061023d6105d6366004612d7d565b6111f4565b3480156105e757600080fd5b5061023d6105f636600461326c565b6112e8565b34801561060757600080fd5b5061023d6106163660046132c1565b61159d565b34801561062757600080fd5b5061023d610636366004612ece565b61175f565b34801561064757600080fd5b5060005461027f906001600160a01b031681565b34801561066757600080fd5b506102e67f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61023d61069d36600461334c565b6117a3565b61023d6106b0366004612f12565b6119a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061074857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600061075981611b39565b6001600160a01b038216610799576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b0316156107dc576040517f0c8dc01600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108067f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60607f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61086e81611b39565b610876611c30565b61087e611c8e565b6001600160a01b0385166108be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108cb868686611d0f565b9050856001600160a01b03167fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f34878760405161090a93929190613408565b60405180910390a2915061093d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b509392505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461097f81611b39565b6109898383611b43565b50505050565b6001600160a01b03811633146109d1576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109db8282611dde565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0a81611b39565b610a12611ea2565b50565b610a1d611c30565b610a25611c8e565b6001600160a01b038416610a65576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b0316336001600160a01b03167f6bbdf224569c498ef04873202299f2d405bf840a265c83e83880a614ba2ae113858585604051610aac939291906134fb565b60405180910390a361098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ae5611f32565b610aee82612002565b610af8828261200d565b5050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b9610b2681611b39565b610b2e611c30565b610b36611c8e565b83600003610b70576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610bb0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bba8686612131565b610bf0576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820186905287169063095ea7b3906044016020604051808303816000875af1158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613521565b610cb2576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbd858484611d0f565b50610cc88686612131565b610cfe576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d82919061353e565b90508015610d9457610d9487826121c1565b856001600160a01b0316876001600160a01b03167f29c40793bffd84cb810179f15d1ceec72bc7f0785514c668ba36645cf99b7382878787604051610ddb93929190613408565b60405180910390a350610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b6000610e1f6123e7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610e4c611c30565b610e54611c8e565b82600003610e8e576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416610ece576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed9338385612449565b836001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd858585604051610aac93929190613557565b610f28611c30565b610f30611c8e565b34600003610f6a576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610faa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b5050905080611037576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd3460008660405161107f93929190613557565b60405180910390a350610af860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110db81611b39565b610a12612686565b6110eb611c30565b6110f3611c8e565b8460000361112d576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861661116d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611178338587612449565b856001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd87878787876040516111c395949392919061358d565b60405180910390a3610e0d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60006111ff81611b39565b6001600160a01b03821661123f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031615611282576040517fb337f37800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112ac7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b983611b43565b5050600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156113335750825b905060008267ffffffffffffffff1660011480156113505750303b155b90508115801561135e575080155b15611395576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113f65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038816158061141357506001600160a01b038716155b1561144a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114526126ff565b61145a612707565b6114626126ff565b61146a612717565b611475600087611b43565b506114a07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611b43565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556114fe7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb89611b43565b50600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891617905583156115935784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b7f584a0b16e9f616d90ccec14a0b852c19aceccfd3d60699398a57dce2b0de01b96115c781611b39565b6115cf611c30565b6115d7611c8e565b84600003611611576040517f951e19ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611651576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116656001600160a01b0388168787612727565b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906116aa90859060040161362e565b600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b50505050866001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b1436878787876040516117259493929190613641565b60405180910390a361175660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461179981611b39565b6109898383611dde565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb6117cd81611b39565b6117d5611c30565b6117dd611c8e565b6001600160a01b03851661181d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856001600160a01b03163460405160006040518083038185875af1925050503d806000811461186a576040519150601f19603f3d011682016040523d82523d6000602084013e61186f565b606091505b50509050806118aa576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063660b9de0906118ef90869060040161362e565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060006001600160a01b0316866001600160a01b03167f1647880d5adf27692c774debf932b888ba15381ed4c4115a9eafeb68080b14363488888860405161196b9493929190613641565b60405180910390a35061199d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6119ac611c30565b6119b4611c8e565b346000036119ee576040517f7671265e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611a2e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611abb576040517f79cacff100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316336001600160a01b03167f752904df36dfc0b907cefa45c2d12c3f9dc7aced58ce8d1182a9a4bb33cefedd346000888888604051611b0795949392919061358d565b60405180910390a35061098960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610a12813361279b565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611c26576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611bdc3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610748565b6000915050610748565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615611c8c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d09576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6060600080856001600160a01b0316348686604051611d2f929190613678565b60006040518083038185875af1925050503d8060008114611d6c576040519150601f19603f3d011682016040523d82523d6000602084013e611d71565b606091505b509150915081611dad576040517facfdb44400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150505b9392505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611c26576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610748565b611eaa612828565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611fbf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610af881611b39565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612085575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120829181019061353e565b60015b6120cb576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612127576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016120c2565b6109db8383612883565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052919084169063095ea7b3906044016020604051808303816000875af115801561219d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190613521565b6003546001600160a01b0390811690831603612310576002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613521565b61229d576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b1580156122fc57600080fd5b505af1158015610e0d573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613521565b6123cd576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610af8906001600160a01b03848116911683612727565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c8c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546001600160a01b03908116908316036125ad576124746001600160a01b0383168430846128d9565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613521565b61253a576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f743e0c9b000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063743e0c9b90602401600060405180830381600087803b15801561259957600080fd5b505af1158015611756573d6000803e3d6000fd5b6000546040517fd936547e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063d936547e90602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190613521565b61266a576040517fac2175f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546109db906001600160a01b0384811691869116846128d9565b61268e611c30565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611f14565b611c8c612912565b61270f612912565b611c8c612979565b61271f612912565b611c8c612981565b6040516001600160a01b038381166024830152604482018390526109db91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d2565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610af8576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016120c2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16611c8c576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61288c82612a4e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128d1576109db8282612af6565b610af8612b6c565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401612754565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611c8c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db8612912565b612989612912565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60006129e76001600160a01b03841683612ba4565b90508051600014158015612a0c575080806020019051810190612a0a9190613521565b155b156109db576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016120c2565b806001600160a01b03163b600003612a9d576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016120c2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b139190613688565b600060405180830381855af49150503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b63858383612bb2565b95945050505050565b3415611c8c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060611db183836000612c27565b606082612bc757612bc282612cdd565b611db1565b8151158015612bde57506001600160a01b0384163b155b15612c20576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016120c2565b5080611db1565b606081471015612c65576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016120c2565b600080856001600160a01b03168486604051612c819190613688565b60006040518083038185875af1925050503d8060008114612cbe576040519150601f19603f3d011682016040523d82523d6000602084013e612cc3565b606091505b5091509150612cd3868383612bb2565b9695505050505050565b805115612ced5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611db157600080fd5b80356001600160a01b0381168114612d7857600080fd5b919050565b600060208284031215612d8f57600080fd5b611db182612d61565b60008083601f840112612daa57600080fd5b50813567ffffffffffffffff811115612dc257600080fd5b602083019150836020828501011115612dda57600080fd5b9250929050565b600080600060408486031215612df657600080fd5b612dff84612d61565b9250602084013567ffffffffffffffff811115612e1b57600080fd5b612e2786828701612d98565b9497909650939450505050565b60005b83811015612e4f578181015183820152602001612e37565b50506000910152565b60008151808452612e70816020860160208601612e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db16020830184612e58565b600060208284031215612ec757600080fd5b5035919050565b60008060408385031215612ee157600080fd5b82359150612ef160208401612d61565b90509250929050565b600060808284031215612f0c57600080fd5b50919050565b60008060008060608587031215612f2857600080fd5b612f3185612d61565b9350602085013567ffffffffffffffff811115612f4d57600080fd5b612f5987828801612d98565b909450925050604085013567ffffffffffffffff811115612f7957600080fd5b612f8587828801612efa565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612fd357600080fd5b612fdc83612d61565b9150602083013567ffffffffffffffff811115612ff857600080fd5b8301601f8101851361300957600080fd5b803567ffffffffffffffff81111561302357613023612f91565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561308f5761308f612f91565b6040528181528282016020018710156130a757600080fd5b816020840160208301376000602083830101528093505050509250929050565b6000806000806000608086880312156130df57600080fd5b6130e886612d61565b94506130f660208701612d61565b935060408601359250606086013567ffffffffffffffff81111561311957600080fd5b61312588828901612d98565b969995985093965092949392505050565b6000806000806080858703121561314c57600080fd5b61315585612d61565b93506020850135925061316a60408601612d61565b9150606085013567ffffffffffffffff811115612f7957600080fd5b6000806040838503121561319957600080fd5b6131a283612d61565b9150602083013567ffffffffffffffff8111156131be57600080fd5b6131ca85828601612efa565b9150509250929050565b60008060008060008060a087890312156131ed57600080fd5b6131f687612d61565b95506020870135945061320b60408801612d61565b9350606087013567ffffffffffffffff81111561322757600080fd5b61323389828a01612d98565b909450925050608087013567ffffffffffffffff81111561325357600080fd5b61325f89828a01612efa565b9150509295509295509295565b60008060006060848603121561328157600080fd5b61328a84612d61565b925061329860208501612d61565b91506132a660408501612d61565b90509250925092565b600060608284031215612f0c57600080fd5b60008060008060008060a087890312156132da57600080fd5b6132e387612d61565b95506132f160208801612d61565b945060408701359350606087013567ffffffffffffffff81111561331457600080fd5b61332089828a01612d98565b909450925050608087013567ffffffffffffffff81111561334057600080fd5b61325f89828a016132af565b6000806000806060858703121561336257600080fd5b61336b85612d61565b9350602085013567ffffffffffffffff81111561338757600080fd5b61339387828801612d98565b909450925050604085013567ffffffffffffffff8111156133b357600080fd5b612f85878288016132af565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000612b636040830184866133bf565b8015158114610a1257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261346557600080fd5b830160208101925035905067ffffffffffffffff81111561348557600080fd5b803603821315612dda57600080fd5b6001600160a01b036134a582612d61565b168252600060208201356134b881613422565b151560208401526001600160a01b036134d360408401612d61565b1660408401526134e66060830183613430565b60806060860152612b636080860182846133bf565b60408152600061350f6040830185876133bf565b8281036020840152612cd38185613494565b60006020828403121561353357600080fd5b8151611db181613422565b60006020828403121561355057600080fd5b5051919050565b8381526001600160a01b0383166020820152608060408201526000608082015260a060608201526000612b6360a0830184613494565b8581526001600160a01b03851660208201526080604082015260006135b66080830185876133bf565b82810360608401526135c88185613494565b98975050505050505050565b6001600160a01b036135e582612d61565b1682526000602082013567ffffffffffffffff811680821461360657600080fd5b6020850152506136196040830183613430565b60606040860152612b636060860182846133bf565b602081526000611db160208301846135d4565b84815260606020820152600061365b6060830185876133bf565b828103604084015261366d81856135d4565b979650505050505050565b8183823760009101908152919050565b6000825161369a818460208701612e34565b919091019291505056fea26469706673582212203b8368ea9f86c48250158fbefa10354ff79bda36471e56e56adf2940d977abbb64736f6c634300081a0033"; type GatewayEVMConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/GatewayZEVM__factory.ts b/v2/types/factories/GatewayZEVM__factory.ts index 9c6a4352..a7dd5fb3 100644 --- a/v2/types/factories/GatewayZEVM__factory.ts +++ b/v2/types/factories/GatewayZEVM__factory.ts @@ -83,15 +83,47 @@ const _abi = [ internalType: "bytes", }, { - name: "chainId", - type: "uint256", - internalType: "uint256", + name: "zrc20", + type: "address", + internalType: "address", }, { name: "message", type: "bytes", internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -218,28 +250,6 @@ const _abi = [ type: "function", name: "depositAndRevert", inputs: [ - { - name: "context", - type: "tuple", - internalType: "struct revertContext", - components: [ - { - name: "origin", - type: "bytes", - internalType: "bytes", - }, - { - name: "sender", - type: "address", - internalType: "address", - }, - { - name: "chainID", - type: "uint256", - internalType: "uint256", - }, - ], - }, { name: "zrc20", type: "address", @@ -256,9 +266,26 @@ const _abi = [ internalType: "address", }, { - name: "message", - type: "bytes", - internalType: "bytes", + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -319,47 +346,32 @@ const _abi = [ name: "executeRevert", inputs: [ { - name: "context", + name: "target", + type: "address", + internalType: "address", + }, + { + name: "revertContext", type: "tuple", - internalType: "struct revertContext", + internalType: "struct RevertContext", components: [ { - name: "origin", - type: "bytes", - internalType: "bytes", - }, - { - name: "sender", + name: "asset", type: "address", internalType: "address", }, { - name: "chainID", - type: "uint256", - internalType: "uint256", + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", }, ], }, - { - name: "zrc20", - type: "address", - internalType: "address", - }, - { - name: "amount", - type: "uint256", - internalType: "uint256", - }, - { - name: "target", - type: "address", - internalType: "address", - }, - { - name: "message", - type: "bytes", - internalType: "bytes", - }, ], outputs: [], stateMutability: "nonpayable", @@ -575,6 +587,33 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -583,6 +622,11 @@ const _abi = [ type: "function", name: "withdraw", inputs: [ + { + name: "receiver", + type: "bytes", + internalType: "bytes", + }, { name: "amount", type: "uint256", @@ -593,6 +637,33 @@ const _abi = [ type: "uint256", internalType: "uint256", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -612,15 +683,42 @@ const _abi = [ internalType: "uint256", }, { - name: "zrc20", - type: "address", - internalType: "address", + name: "chainId", + type: "uint256", + internalType: "uint256", }, { name: "message", type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -629,21 +727,58 @@ const _abi = [ type: "function", name: "withdrawAndCall", inputs: [ + { + name: "receiver", + type: "bytes", + internalType: "bytes", + }, { name: "amount", type: "uint256", internalType: "uint256", }, { - name: "chainId", - type: "uint256", - internalType: "uint256", + name: "zrc20", + type: "address", + internalType: "address", }, { name: "message", type: "bytes", internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -663,7 +798,7 @@ const _abi = [ }, { type: "event", - name: "Call", + name: "Called", inputs: [ { name: "sender", @@ -672,10 +807,10 @@ const _abi = [ internalType: "address", }, { - name: "chainId", - type: "uint256", + name: "zrc20", + type: "address", indexed: true, - internalType: "uint256", + internalType: "address", }, { name: "receiver", @@ -689,6 +824,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -821,7 +990,7 @@ const _abi = [ }, { type: "event", - name: "Withdrawal", + name: "Withdrawn", inputs: [ { name: "sender", @@ -871,6 +1040,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -927,6 +1130,11 @@ const _abi = [ name: "ERC1967NonPayable", inputs: [], }, + { + type: "error", + name: "EmptyMessage", + inputs: [], + }, { type: "error", name: "EnforcedPause", @@ -957,6 +1165,11 @@ const _abi = [ name: "InsufficientZRC20Amount", inputs: [], }, + { + type: "error", + name: "InsufficientZetaAmount", + inputs: [], + }, { type: "error", name: "InvalidInitialization", @@ -1026,7 +1239,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612d476100fd60003960008181611e7801528181611ea101526120590152612d476000f3fe6080604052600436106101bb5760003560e01c80635af65967116100ec578063a217fddf1161008a578063c39aca3711610064578063c39aca3714610600578063d547741f14610620578063e63ab1e914610640578063f45346dc1461067457600080fd5b8063a217fddf14610575578063ad3cb1cc1461058a578063bcf7f32b146105e057600080fd5b80637993c1e0116100c65780637993c1e0146104bb57806380bd3d03146104db5780638456cb59146104fb57806391d148541461051057600080fd5b80635af65967146104445780635c975abb146104645780635d40e1781461049b57600080fd5b806336568abe11610159578063441a3e7011610133578063441a3e70146103dc578063485cc955146103fc5780634f1ef2861461041c57806352d1902d1461042f57600080fd5b806336568abe1461037f5780633ce4a5bc1461039f5780633f4ba83a146103c757600080fd5b806321e093b11161019557806321e093b1146102aa578063248a9ca3146102e25780632f2ff15d1461033f578063309f50041461035f57600080fd5b806301ffc9a714610235578063135390f91461026a57806321501a951461028a57600080fd5b36610230576101c8610694565b6000546001600160a01b031633148015906101f757503373735b14bb79463307aacbed86daf3322b1e6226ab14155b1561022e576040517f229930b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b34801561024157600080fd5b50610255610250366004612537565b6106f2565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061022e61028536600461264d565b61078b565b34801561029657600080fd5b5061022e6102a5366004612709565b610884565b3480156102b657600080fd5b506000546102ca906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b3480156102ee57600080fd5b506103316102fd366004612795565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610261565b34801561034b57600080fd5b5061022e61035a3660046127ae565b6109d7565b34801561036b57600080fd5b5061022e61037a3660046127de565b610a21565b34801561038b57600080fd5b5061022e61039a3660046127ae565b610afd565b3480156103ab57600080fd5b506102ca73735b14bb79463307aacbed86daf3322b1e6226ab81565b3480156103d357600080fd5b5061022e610b49565b3480156103e857600080fd5b5061022e6103f736600461287c565b610b7e565b34801561040857600080fd5b5061022e61041736600461289e565b610c61565b61022e61042a3660046128cc565b610ea3565b34801561043b57600080fd5b50610331610ebe565b34801561045057600080fd5b5061022e61045f3660046127de565b610eed565b34801561047057600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610255565b3480156104a757600080fd5b5061022e6104b636600461291c565b61106e565b3480156104c757600080fd5b5061022e6104d6366004612991565b6110ed565b3480156104e757600080fd5b5061022e6104f63660046129cc565b6111ec565b34801561050757600080fd5b5061022e61129e565b34801561051c57600080fd5b5061025561052b3660046127ae565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561058157600080fd5b50610331600081565b34801561059657600080fd5b506105d36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102619190612a57565b3480156105ec57600080fd5b5061022e6105fb3660046127de565b6112d0565b34801561060c57600080fd5b5061022e61061b3660046127de565b611372565b34801561062c57600080fd5b5061022e61063b3660046127ae565b6114f3565b34801561064c57600080fd5b506103317f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561068057600080fd5b5061022e61068f366004612a6a565b611537565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16156106f0576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061078557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6107936116b8565b61079b610694565b60006107a78383611739565b90506000336001600160a01b03167fde19dbe881cc0aeeb6e73ce19ac7b5ca695e6be8a076e3eb42292005a7fec1b586858786886001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083c9190612aa1565b60405161084d959493929190612aba565b60405180910390a35061087f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108d1576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d9610694565b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab148061090c57506001600160a01b03831630145b15610943576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61094d8484611a2c565b6000546040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b038086169263de43156e9261099e928a921690899088908890600401612bd9565b600060405180830381600087803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b505050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a1181611bfa565b610a1b8383611c04565b50505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a6e576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a76610694565b6040517f69582bee0000000000000000000000000000000000000000000000000000000081526001600160a01b038416906369582bee90610ac39089908990899088908890600401612bd9565b600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b50505050505050505050565b6001600160a01b0381163314610b3f576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61087f8282611cf1565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b7381611bfa565b610b7b611db5565b50565b610b866116b8565b610b8e610694565b610bac8273735b14bb79463307aacbed86daf3322b1e6226ab611a2c565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab0000000000000000000000006020820152819033907fde19dbe881cc0aeeb6e73ce19ac7b5ca695e6be8a076e3eb42292005a7fec1b59060340160408051601f198184030181529082905260008054610c2c936001600160a01b039091169189918190612aba565b60405180910390a3610c5d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610cac5750825b905060008267ffffffffffffffff166001148015610cc95750303b155b905081158015610cd7575080155b15610d0e576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610d6f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b038716610daf576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db7611e45565b610dbf611e45565b610dc7611e4d565b610dcf611e5d565b610dda600087611c04565b50610e057f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87611c04565b50600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790558315610e9a5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610eab611e6d565b610eb482611f3d565b610c5d8282611f48565b6000610ec861204e565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610f3a576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f42610694565b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab1480610f7557506001600160a01b03831630145b15610fac576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015611014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110389190612c20565b610a76576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110766116b8565b61107e610694565b82336001600160a01b03167f5322ffbbf9261ff1f8138247942d2b03b28717141ef0a0dd080fc4be9c4e78d38685856040516110bc93929190612c42565b60405180910390a3610a1b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6110f56116b8565b6110fd610694565b60006111098585611739565b90506000336001600160a01b03167fde19dbe881cc0aeeb6e73ce19ac7b5ca695e6be8a076e3eb42292005a7fec1b5888789868a6001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190612aa1565b8a8a6040516111b39796959493929190612c72565b60405180910390a3506111e560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b6111f46116b8565b6111fc610694565b61121a8473735b14bb79463307aacbed86daf3322b1e6226ab611a2c565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab0000000000000000000000006020820152839033907fde19dbe881cc0aeeb6e73ce19ac7b5ca695e6be8a076e3eb42292005a7fec1b59060340160408051601f1981840301815290829052600080546110bc936001600160a01b03909116918b9181908b908b90612c72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6112c881611bfa565b610b7b6120b0565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461131d576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611325610694565b6040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063de43156e90610ac39089908990899088908890600401612bd9565b3373735b14bb79463307aacbed86daf3322b1e6226ab146113bf576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113c7610694565b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab14806113fa57506001600160a01b03831630145b15611431576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd9190612c20565b611325576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461152d81611bfa565b610a1b8383611cf1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611584576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61158c610694565b6001600160a01b03811673735b14bb79463307aacbed86daf3322b1e6226ab14806115bf57506001600160a01b03811630145b156115f6576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152602482018490528416906347e7ef24906044016020604051808303816000875af115801561165e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116829190612c20565b61087f576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611733576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6000806000836001600160a01b031663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa15801561177b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179f9190612cc7565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118489190612c20565b61187e576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526001600160a01b038516906323b872dd906064016020604051808303816000875af11580156118ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190e9190612c20565b611944576040517f4dd9ee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b038516906342966c68906024016020604051808303816000875af11580156119a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c89190612c20565b6119fe576040517f2c77e05c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b949350505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6000546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac09190612c20565b611af6576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b505050506000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611bba576040519150601f19603f3d011682016040523d82523d6000602084013e611bbf565b606091505b505090508061087f576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b7b8133612129565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611ce7576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611c9d3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610785565b6000915050610785565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611ce7576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610785565b611dbd6121b6565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6106f0612211565b611e55612211565b6106f0612278565b611e65612211565b6106f06122c9565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611f0657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611efa7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610c5d81611bfa565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611fa2575060408051601f3d908101601f19168201909252611f9f91810190612aa1565b60015b611fe8576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612044576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611fdf565b61087f83836122d1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b8610694565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611e27565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16610c5d576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401611fdf565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166106f0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166106f0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612280612211565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b611a06612211565b6122da82612327565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561231f5761087f82826123cf565b610c5d612445565b806001600160a01b03163b600003612376576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401611fdf565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516123ec9190612cf5565b600060405180830381855af49150503d8060008114612427576040519150601f19603f3d011682016040523d82523d6000602084013e61242c565b606091505b509150915061243c85838361247d565b95945050505050565b34156106f0576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826124925761248d826124f5565b6124ee565b81511580156124a957506001600160a01b0384163b155b156124eb576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611fdf565b50805b9392505050565b8051156125055780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561254957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146124ee57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126125b957600080fd5b813567ffffffffffffffff8111156125d3576125d3612579565b604051601f19603f601f19601f8501160116810181811067ffffffffffffffff8211171561260357612603612579565b60405281815283820160200185101561261b57600080fd5b816020850160208301376000918101602001919091529392505050565b6001600160a01b0381168114610b7b57600080fd5b60008060006060848603121561266257600080fd5b833567ffffffffffffffff81111561267957600080fd5b612685868287016125a8565b93505060208401359150604084013561269d81612638565b809150509250925092565b6000606082840312156126ba57600080fd5b50919050565b60008083601f8401126126d257600080fd5b50813567ffffffffffffffff8111156126ea57600080fd5b60208301915083602082850101111561270257600080fd5b9250929050565b60008060008060006080868803121561272157600080fd5b853567ffffffffffffffff81111561273857600080fd5b612744888289016126a8565b95505060208601359350604086013561275c81612638565b9250606086013567ffffffffffffffff81111561277857600080fd5b612784888289016126c0565b969995985093965092949392505050565b6000602082840312156127a757600080fd5b5035919050565b600080604083850312156127c157600080fd5b8235915060208301356127d381612638565b809150509250929050565b60008060008060008060a087890312156127f757600080fd5b863567ffffffffffffffff81111561280e57600080fd5b61281a89828a016126a8565b965050602087013561282b81612638565b945060408701359350606087013561284281612638565b9250608087013567ffffffffffffffff81111561285e57600080fd5b61286a89828a016126c0565b979a9699509497509295939492505050565b6000806040838503121561288f57600080fd5b50508035926020909101359150565b600080604083850312156128b157600080fd5b82356128bc81612638565b915060208301356127d381612638565b600080604083850312156128df57600080fd5b82356128ea81612638565b9150602083013567ffffffffffffffff81111561290657600080fd5b612912858286016125a8565b9150509250929050565b6000806000806060858703121561293257600080fd5b843567ffffffffffffffff81111561294957600080fd5b612955878288016125a8565b94505060208501359250604085013567ffffffffffffffff81111561297957600080fd5b612985878288016126c0565b95989497509550505050565b6000806000806000608086880312156129a957600080fd5b853567ffffffffffffffff8111156129c057600080fd5b612744888289016125a8565b600080600080606085870312156129e257600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561297957600080fd5b60005b83811015612a22578181015183820152602001612a0a565b50506000910152565b60008151808452612a43816020860160208601612a07565b601f01601f19169290920160200192915050565b6020815260006124ee6020830184612a2b565b600080600060608486031215612a7f57600080fd5b8335612a8a81612638565b925060208401359150604084013561269d81612638565b600060208284031215612ab357600080fd5b5051919050565b60c081526000612acd60c0830188612a2b565b6001600160a01b038716602084015285604084015284606084015283608084015282810360a084015260008152602081019150509695505050505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b600081357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112612b6a57600080fd5b820160208101903567ffffffffffffffff811115612b8757600080fd5b803603821315612b9657600080fd5b60608552612ba8606086018284612b0b565b9150506020830135612bb981612638565b6001600160a01b0316602085015260409283013592909301919091525090565b608081526000612bec6080830188612b36565b6001600160a01b03871660208401528560408401528281036060840152612c14818587612b0b565b98975050505050505050565b600060208284031215612c3257600080fd5b815180151581146124ee57600080fd5b604081526000612c556040830186612a2b565b8281036020840152612c68818587612b0b565b9695505050505050565b60c081526000612c8560c083018a612a2b565b6001600160a01b038916602084015287604084015286606084015285608084015282810360a0840152612cb9818587612b0b565b9a9950505050505050505050565b60008060408385031215612cda57600080fd5b8251612ce581612638565b6020939093015192949293505050565b60008251612d07818460208701612a07565b919091019291505056fea264697066735822122018f5dd94cb7d7e393ae5b4b1a7aca779c9842febec22a45f0cd7ba66c7aa7f0664736f6c634300081a0033"; + "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161391b6100fd6000396000818161230a015281816123330152612509015261391b6000f3fe6080604052600436106101bb5760003560e01c8063717d335f116100ec578063ad3cb1cc1161008a578063d547741f11610064578063d547741f14610600578063dc9ca2e714610620578063e63ab1e914610640578063f45346dc1461067457600080fd5b8063ad3cb1cc1461056a578063bcf7f32b146105c0578063c39aca37146105e057600080fd5b806390ad3e23116100c657806390ad3e23146104b057806391d14854146104d05780639ec6048414610535578063a217fddf1461055557600080fd5b8063717d335f1461045b57806371f6af541461047b5780638456cb591461049b57600080fd5b806336568abe11610159578063485cc95511610133578063485cc955146103dc5780634f1ef286146103fc57806352d1902d1461040f5780635c975abb1461042457600080fd5b806336568abe1461037f5780633ce4a5bc1461039f5780633f4ba83a146103c757600080fd5b806321501a951161019557806321501a95146102aa57806321e093b1146102ca578063248a9ca3146103025780632f2ff15d1461035f57600080fd5b806301ffc9a7146102355780630310eb761461026a5780631e83da291461028a57600080fd5b36610230576101c8610694565b6000546001600160a01b031633148015906101f757503373735b14bb79463307aacbed86daf3322b1e6226ab14155b1561022e576040517f229930b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b34801561024157600080fd5b50610255610250366004612d2b565b6106f2565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061022e610285366004612d9a565b61078b565b34801561029657600080fd5b5061022e6102a5366004612f5c565b610a17565b3480156102b657600080fd5b5061022e6102c5366004613008565b610b42565b3480156102d657600080fd5b506000546102ea906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b34801561030e57600080fd5b5061035161031d366004613094565b60009081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b604051908152602001610261565b34801561036b57600080fd5b5061022e61037a3660046130ad565b610d0f565b34801561038b57600080fd5b5061022e61039a3660046130ad565b610d59565b3480156103ab57600080fd5b506102ea73735b14bb79463307aacbed86daf3322b1e6226ab81565b3480156103d357600080fd5b5061022e610daa565b3480156103e857600080fd5b5061022e6103f73660046130dd565b610ddf565b61022e61040a36600461310b565b611035565b34801561041b57600080fd5b50610351611054565b34801561043057600080fd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610255565b34801561046757600080fd5b5061022e61047636600461315b565b611083565b34801561048757600080fd5b5061022e6104963660046131a1565b61118b565b3480156104a757600080fd5b5061022e611359565b3480156104bc57600080fd5b5061022e6104cb36600461321a565b61138b565b3480156104dc57600080fd5b506102556104eb3660046130ad565b60009182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561054157600080fd5b5061022e6105503660046132da565b6114fd565b34801561056157600080fd5b50610351600081565b34801561057657600080fd5b506105b36040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161026191906133ac565b3480156105cc57600080fd5b5061022e6105db3660046133bf565b61161c565b3480156105ec57600080fd5b5061022e6105fb3660046133bf565b61174c565b34801561060c57600080fd5b5061022e61061b3660046130ad565b61195b565b34801561062c57600080fd5b5061022e61063b36600461345d565b61199f565b34801561064c57600080fd5b506103517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561068057600080fd5b5061022e61068f3660046134f9565b611c08565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16156106f0576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061078557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146107d8576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107e0610694565b6001600160a01b03841615806107fd57506001600160a01b038216155b15610834576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260000361086e576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821673735b14bb79463307aacbed86daf3322b1e6226ab14806108a157506001600160a01b03821630145b156108d8576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018590528516906347e7ef24906044016020604051808303816000875af1158015610940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109649190613549565b61099a576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063660b9de0906109df908490600401613613565b600060405180830381600087803b1580156109f957600080fd5b505af1158015610a0d573d6000803e3d6000fd5b5050505050505050565b610a1f611e17565b610a27610694565b8551600003610a62576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84600003610a9c576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aba8573735b14bb79463307aacbed86daf3322b1e6226ab611e98565b60008054604051869233927ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c092610b09928c926001600160a01b0316918c919081908c908c9083908d906136e4565b60405180910390a3610b3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610b8f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b97610694565b6001600160a01b038316610bd7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003610c11576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab1480610c4457506001600160a01b03831630145b15610c7b576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c858484611e98565b6000546040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b038086169263de43156e92610cd6928a921690899088908890600401613757565b600060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b505050505050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610d498161208c565b610d538383612096565b50505050565b6001600160a01b0381163314610d9b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da58282612183565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610dd48161208c565b610ddc612247565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610e2a5750825b905060008267ffffffffffffffff166001148015610e475750303b155b905081158015610e55575080155b15610e8c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610eed5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b0387161580610f0a57506001600160a01b038616155b15610f41576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f496122d7565b610f516122d7565b610f596122df565b610f616122ef565b610f6c600087612096565b50610f977f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a87612096565b50600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038916179055831561102c5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61103d6122ff565b611046826123cf565b61105082826123da565b5050565b600061105e6124fe565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b3373735b14bb79463307aacbed86daf3322b1e6226ab146110d0576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d8610694565b6001600160a01b038216611118576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f660b9de00000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063660b9de09061115d908490600401613613565b600060405180830381600087803b15801561117757600080fd5b505af1158015610b3a573d6000803e3d6000fd5b611193611e17565b61119b610694565b83516000036111d6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611210576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061121c8484612560565b90506000336001600160a01b03167ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c087868886896001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b191906137d4565b8a6001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131391906137d4565b8a60405161132797969594939291906137ed565b60405180910390a350610d5360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6113838161208c565b610ddc6125d5565b611393611e17565b61139b610694565b86516000036113d6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600003611410576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061141d87878561264e565b90506000336001600160a01b03167ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c08a898b868c6001600160a01b0316634d8943bb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b291906137d4565b8c8c8c8c6040516114cb999897969594939291906136e4565b60405180910390a35061102c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611505611e17565b61150d610694565b8351600003611548576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611582576040517f19c08f4900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115a08373735b14bb79463307aacbed86daf3322b1e6226ab611e98565b60008054604051849233927ff6e8f2c19d797cd515ed61d8ac909afa628f4df0bb153a3f81d0f5fb7b8207c0926115eb928a926001600160a01b0316918a9190819081908b906137ed565b60405180910390a3610d5360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611669576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611671610694565b6001600160a01b038516158061168e57506001600160a01b038316155b156116c5576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fde43156e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063de43156e906117129089908990899088908890600401613757565b600060405180830381600087803b15801561172c57600080fd5b505af1158015611740573d6000803e3d6000fd5b50505050505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611799576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117a1610694565b6001600160a01b03851615806117be57506001600160a01b038316155b156117f5576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360000361182f576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831673735b14bb79463307aacbed86daf3322b1e6226ab148061186257506001600160a01b03831630145b15611899576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015611901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119259190613549565b6116c5576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546119958161208c565b610d538383612183565b6119a7611e17565b6119af610694565b85516000036119ea576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000839003611a25576040517fbb1b658000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ffc5fecd50000000000000000000000000000000000000000000000000000000081526004810183905260009081906001600160a01b0388169063fc5fecd5906024016040805180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab919061385b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b549190613549565b611b8a576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866001600160a01b0316336001600160a01b03167f885ccd61b2cc8be1daa203d4456750151d128d2da2ace4c9fa4b63c395fd99d88a89898989604051611bd5959493929190613889565b60405180910390a35050610b3a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3373735b14bb79463307aacbed86daf3322b1e6226ab14611c55576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5d610694565b6001600160a01b0383161580611c7a57506001600160a01b038116155b15611cb1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003611ceb576040517f5d67094f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811673735b14bb79463307aacbed86daf3322b1e6226ab1480611d1e57506001600160a01b03811630145b15611d55576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef240000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152602482018490528416906347e7ef24906044016020604051808303816000875af1158015611dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de19190613549565b610da5576040517f47d19fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611e92576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6000546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2c9190613549565b611f62576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015611fc157600080fd5b505af1158015611fd5573d6000803e3d6000fd5b505050506000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b5050905080610da5576040517fc7ffc47b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610ddc8133612929565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16612179576000848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561212f3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610785565b6000915050610785565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615612179576000848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610785565b61224f6129b6565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6106f0612a11565b6122e7612a11565b6106f0612a78565b6122f7612a11565b6106f0612ac9565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061239857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661238c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110508161208c565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612452575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261244f918101906137d4565b60015b612498576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146124f4576040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004810182905260240161248f565b610da58383612ad1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106f0576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006125ce8383846001600160a01b031663091d27886040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c991906137d4565b61264e565b9392505050565b6125dd610694565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336122b9565b6000806000846001600160a01b031663fc5fecd5856040518263ffffffff1660e01b815260040161268191815260200190565b6040805180830381865afa15801561269d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c1919061385b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab60248201526044810182905291935091506001600160a01b038316906323b872dd906064016020604051808303816000875af1158015612746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276a9190613549565b6127a0576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526001600160a01b038616906323b872dd906064016020604051808303816000875af115801561280c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128309190613549565b612866576040517f4dd9ee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038616906342966c68906024016020604051808303816000875af11580156128c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ea9190613549565b612920576040517f2c77e05c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b60008281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16611050576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810183905260440161248f565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166106f0576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166106f0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a80612a11565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612066612a11565b612ada82612b27565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612b1f57610da58282612bcf565b611050612c3c565b806001600160a01b03163b600003612b76576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161248f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612bec91906138c9565b600060405180830381855af49150503d8060008114612c27576040519150601f19603f3d011682016040523d82523d6000602084013e612c2c565b606091505b5091509150612920858383612c74565b34156106f0576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082612c8957612c8482612ce9565b6125ce565b8151158015612ca057506001600160a01b0384163b155b15612ce2576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161248f565b50806125ce565b805115612cf95780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612d3d57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146125ce57600080fd5b6001600160a01b0381168114610ddc57600080fd5b600060608284031215612d9457600080fd5b50919050565b60008060008060808587031215612db057600080fd5b8435612dbb81612d6d565b9350602085013592506040850135612dd281612d6d565b9150606085013567ffffffffffffffff811115612dee57600080fd5b612dfa87828801612d82565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612e4657600080fd5b813567ffffffffffffffff811115612e6057612e60612e06565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715612ecc57612ecc612e06565b604052818152838201602001851015612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f840112612f1357600080fd5b50813567ffffffffffffffff811115612f2b57600080fd5b602083019150836020828501011115612f4357600080fd5b9250929050565b600060808284031215612d9457600080fd5b60008060008060008060a08789031215612f7557600080fd5b863567ffffffffffffffff811115612f8c57600080fd5b612f9889828a01612e35565b9650506020870135945060408701359350606087013567ffffffffffffffff811115612fc357600080fd5b612fcf89828a01612f01565b909450925050608087013567ffffffffffffffff811115612fef57600080fd5b612ffb89828a01612f4a565b9150509295509295509295565b60008060008060006080868803121561302057600080fd5b853567ffffffffffffffff81111561303757600080fd5b61304388828901612d82565b95505060208601359350604086013561305b81612d6d565b9250606086013567ffffffffffffffff81111561307757600080fd5b61308388828901612f01565b969995985093965092949392505050565b6000602082840312156130a657600080fd5b5035919050565b600080604083850312156130c057600080fd5b8235915060208301356130d281612d6d565b809150509250929050565b600080604083850312156130f057600080fd5b82356130fb81612d6d565b915060208301356130d281612d6d565b6000806040838503121561311e57600080fd5b823561312981612d6d565b9150602083013567ffffffffffffffff81111561314557600080fd5b61315185828601612e35565b9150509250929050565b6000806040838503121561316e57600080fd5b823561317981612d6d565b9150602083013567ffffffffffffffff81111561319557600080fd5b61315185828601612d82565b600080600080608085870312156131b757600080fd5b843567ffffffffffffffff8111156131ce57600080fd5b6131da87828801612e35565b9450506020850135925060408501356131f281612d6d565b9150606085013567ffffffffffffffff81111561320e57600080fd5b612dfa87828801612f4a565b600080600080600080600060c0888a03121561323557600080fd5b873567ffffffffffffffff81111561324c57600080fd5b6132588a828b01612e35565b97505060208801359550604088013561327081612d6d565b9450606088013567ffffffffffffffff81111561328c57600080fd5b6132988a828b01612f01565b9095509350506080880135915060a088013567ffffffffffffffff8111156132bf57600080fd5b6132cb8a828b01612f4a565b91505092959891949750929550565b600080600080608085870312156132f057600080fd5b843567ffffffffffffffff81111561330757600080fd5b61331387828801612e35565b9450506020850135925060408501359150606085013567ffffffffffffffff81111561320e57600080fd5b60005b83811015613359578181015183820152602001613341565b50506000910152565b6000815180845261337a81602086016020860161333e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006125ce6020830184613362565b60008060008060008060a087890312156133d857600080fd5b863567ffffffffffffffff8111156133ef57600080fd5b6133fb89828a01612d82565b965050602087013561340c81612d6d565b945060408701359350606087013561342381612d6d565b9250608087013567ffffffffffffffff81111561343f57600080fd5b61344b89828a01612f01565b979a9699509497509295939492505050565b60008060008060008060a0878903121561347657600080fd5b863567ffffffffffffffff81111561348d57600080fd5b61349989828a01612e35565b96505060208701356134aa81612d6d565b9450604087013567ffffffffffffffff8111156134c657600080fd5b6134d289828a01612f01565b90955093505060608701359150608087013567ffffffffffffffff811115612fef57600080fd5b60008060006060848603121561350e57600080fd5b833561351981612d6d565b925060208401359150604084013561353081612d6d565b809150509250925092565b8015158114610ddc57600080fd5b60006020828403121561355b57600080fd5b81516125ce8161353b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261359b57600080fd5b830160208101925035905067ffffffffffffffff8111156135bb57600080fd5b803603821315612f4357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000823561362481612d6d565b6001600160a01b038116602084015250602083013567ffffffffffffffff811680821461365057600080fd5b80604085015250506136656040840184613566565b6060808501526129206080850182846135ca565b6000813561368681612d6d565b6001600160a01b03168352602082013561369f8161353b565b1515602084015260408201356136b481612d6d565b6001600160a01b031660408401526136cf6060830183613566565b608060608601526129206080860182846135ca565b610100815260006136f961010083018c613362565b6001600160a01b038b16602084015289604084015288606084015287608084015282810360a084015261372d8187896135ca565b90508460c084015282810360e08401526137478185613679565b9c9b505050505050505050505050565b6080815260006137678788613566565b6060608085015261377c60e0850182846135ca565b915050602088013561378d81612d6d565b6001600160a01b0390811660a085015260408981013560c08601529088166020850152830186905282810360608401526137c88185876135ca565b98975050505050505050565b6000602082840312156137e657600080fd5b5051919050565b6101008152600061380261010083018a613362565b6001600160a01b03891660208401528760408401528660608401528560808401528281038060a0850152600082528560c08501526020810160e08501525061384d6020820185613679565b9a9950505050505050505050565b6000806040838503121561386e57600080fd5b825161387981612d6d565b6020939093015192949293505050565b60808152600061389c6080830188613362565b82810360208401526138af8187896135ca565b905084604084015282810360608401526137c88185613679565b600082516138db81846020870161333e565b919091019291505056fea26469706673582212203f7202f59f76134e10533009447494716bb4d5889a6225405c1acf671fbd184b64736f6c634300081a0033"; type GatewayZEVMConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/IERC20Custody.sol/IERC20CustodyErrors__factory.ts b/v2/types/factories/IERC20Custody.sol/IERC20CustodyErrors__factory.ts index f30ec9ca..33cb99b0 100644 --- a/v2/types/factories/IERC20Custody.sol/IERC20CustodyErrors__factory.ts +++ b/v2/types/factories/IERC20Custody.sol/IERC20CustodyErrors__factory.ts @@ -9,6 +9,11 @@ import type { } from "../../IERC20Custody.sol/IERC20CustodyErrors"; const _abi = [ + { + type: "error", + name: "NotWhitelisted", + inputs: [], + }, { type: "error", name: "ZeroAddress", diff --git a/v2/types/factories/IERC20Custody.sol/IERC20CustodyEvents__factory.ts b/v2/types/factories/IERC20Custody.sol/IERC20CustodyEvents__factory.ts index 08163fdb..3d2318a1 100644 --- a/v2/types/factories/IERC20Custody.sol/IERC20CustodyEvents__factory.ts +++ b/v2/types/factories/IERC20Custody.sol/IERC20CustodyEvents__factory.ts @@ -11,7 +11,7 @@ import type { const _abi = [ { type: "event", - name: "Withdraw", + name: "Unwhitelisted", inputs: [ { name: "token", @@ -19,12 +19,38 @@ const _abi = [ indexed: true, internalType: "address", }, + ], + anonymous: false, + }, + { + type: "event", + name: "Whitelisted", + inputs: [ + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Withdrawn", + inputs: [ { name: "to", type: "address", indexed: true, internalType: "address", }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, { name: "amount", type: "uint256", @@ -36,16 +62,16 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { - name: "token", + name: "to", type: "address", indexed: true, internalType: "address", }, { - name: "to", + name: "token", type: "address", indexed: true, internalType: "address", @@ -67,16 +93,16 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { - name: "token", + name: "to", type: "address", indexed: true, internalType: "address", }, { - name: "to", + name: "token", type: "address", indexed: true, internalType: "address", @@ -93,6 +119,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, diff --git a/v2/types/factories/IERC20Custody.sol/IERC20Custody__factory.ts b/v2/types/factories/IERC20Custody.sol/IERC20Custody__factory.ts new file mode 100644 index 00000000..c2308cad --- /dev/null +++ b/v2/types/factories/IERC20Custody.sol/IERC20Custody__factory.ts @@ -0,0 +1,291 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IERC20Custody, + IERC20CustodyInterface, +} from "../../IERC20Custody.sol/IERC20Custody"; + +const _abi = [ + { + type: "function", + name: "whitelisted", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "withdraw", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "withdrawAndCall", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "withdrawAndRevert", + inputs: [ + { + name: "token", + type: "address", + internalType: "address", + }, + { + name: "to", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "Unwhitelisted", + inputs: [ + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Whitelisted", + inputs: [ + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Withdrawn", + inputs: [ + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "WithdrawnAndCalled", + inputs: [ + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "WithdrawnAndReverted", + inputs: [ + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "error", + name: "NotWhitelisted", + inputs: [], + }, + { + type: "error", + name: "ZeroAddress", + inputs: [], + }, +] as const; + +export class IERC20Custody__factory { + static readonly abi = _abi; + static createInterface(): IERC20CustodyInterface { + return new Interface(_abi) as IERC20CustodyInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IERC20Custody { + return new Contract(address, _abi, runner) as unknown as IERC20Custody; + } +} diff --git a/v2/types/factories/IERC20Custody.sol/index.ts b/v2/types/factories/IERC20Custody.sol/index.ts index 9ad68318..93a54174 100644 --- a/v2/types/factories/IERC20Custody.sol/index.ts +++ b/v2/types/factories/IERC20Custody.sol/index.ts @@ -1,5 +1,6 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export { IERC20Custody__factory } from "./IERC20Custody__factory"; export { IERC20CustodyErrors__factory } from "./IERC20CustodyErrors__factory"; export { IERC20CustodyEvents__factory } from "./IERC20CustodyEvents__factory"; diff --git a/v2/types/factories/IGatewayEVM.sol/IGatewayEVMErrors__factory.ts b/v2/types/factories/IGatewayEVM.sol/IGatewayEVMErrors__factory.ts index 39b14449..842b99ee 100644 --- a/v2/types/factories/IGatewayEVM.sol/IGatewayEVMErrors__factory.ts +++ b/v2/types/factories/IGatewayEVM.sol/IGatewayEVMErrors__factory.ts @@ -14,6 +14,11 @@ const _abi = [ name: "ApprovalFailed", inputs: [], }, + { + type: "error", + name: "ConnectorInitialized", + inputs: [], + }, { type: "error", name: "CustodyInitialized", @@ -39,6 +44,11 @@ const _abi = [ name: "InsufficientETHAmount", inputs: [], }, + { + type: "error", + name: "NotWhitelistedInCustody", + inputs: [], + }, { type: "error", name: "ZeroAddress", diff --git a/v2/types/factories/IGatewayEVM.sol/IGatewayEVMEvents__factory.ts b/v2/types/factories/IGatewayEVM.sol/IGatewayEVMEvents__factory.ts index aff49e3a..2e840c2f 100644 --- a/v2/types/factories/IGatewayEVM.sol/IGatewayEVMEvents__factory.ts +++ b/v2/types/factories/IGatewayEVM.sol/IGatewayEVMEvents__factory.ts @@ -11,7 +11,7 @@ import type { const _abi = [ { type: "event", - name: "Call", + name: "Called", inputs: [ { name: "sender", @@ -31,12 +31,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, { type: "event", - name: "Deposit", + name: "Deposited", inputs: [ { name: "sender", @@ -68,6 +96,34 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -132,42 +188,17 @@ const _abi = [ name: "Reverted", inputs: [ { - name: "destination", + name: "to", type: "address", indexed: true, internalType: "address", }, - { - name: "value", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - { - name: "data", - type: "bytes", - indexed: false, - internalType: "bytes", - }, - ], - anonymous: false, - }, - { - type: "event", - name: "RevertedWithERC20", - inputs: [ { name: "token", type: "address", indexed: true, internalType: "address", }, - { - name: "to", - type: "address", - indexed: true, - internalType: "address", - }, { name: "amount", type: "uint256", @@ -180,6 +211,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, diff --git a/v2/types/factories/IGatewayEVM.sol/IGatewayEVM__factory.ts b/v2/types/factories/IGatewayEVM.sol/IGatewayEVM__factory.ts index f1627cbb..d2e9ec7f 100644 --- a/v2/types/factories/IGatewayEVM.sol/IGatewayEVM__factory.ts +++ b/v2/types/factories/IGatewayEVM.sol/IGatewayEVM__factory.ts @@ -23,22 +23,36 @@ const _abi = [ type: "bytes", internalType: "bytes", }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "deposit", - inputs: [ { - name: "receiver", - type: "address", - internalType: "address", + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], - stateMutability: "payable", + stateMutability: "nonpayable", }, { type: "function", @@ -59,13 +73,40 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "depositAndCall", + name: "deposit", inputs: [ { name: "receiver", @@ -73,9 +114,31 @@ const _abi = [ internalType: "address", }, { - name: "payload", - type: "bytes", - internalType: "bytes", + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -105,10 +168,82 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "depositAndCall", + inputs: [ + { + name: "receiver", + type: "address", + internalType: "address", + }, + { + name: "payload", + type: "bytes", + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "payable", + }, { type: "function", name: "execute", @@ -147,6 +282,28 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "payable", @@ -203,10 +360,305 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, + { + type: "event", + name: "Called", + inputs: [ + { + name: "sender", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "receiver", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "payload", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Deposited", + inputs: [ + { + name: "sender", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "receiver", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "asset", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "payload", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Executed", + inputs: [ + { + name: "destination", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "value", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ExecutedWithERC20", + inputs: [ + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Reverted", + inputs: [ + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "token", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "amount", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "data", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ApprovalFailed", + inputs: [], + }, + { + type: "error", + name: "ConnectorInitialized", + inputs: [], + }, + { + type: "error", + name: "CustodyInitialized", + inputs: [], + }, + { + type: "error", + name: "DepositFailed", + inputs: [], + }, + { + type: "error", + name: "ExecutionFailed", + inputs: [], + }, + { + type: "error", + name: "InsufficientERC20Amount", + inputs: [], + }, + { + type: "error", + name: "InsufficientETHAmount", + inputs: [], + }, + { + type: "error", + name: "NotWhitelistedInCustody", + inputs: [], + }, + { + type: "error", + name: "ZeroAddress", + inputs: [], + }, ] as const; export class IGatewayEVM__factory { diff --git a/v2/types/factories/IGatewayEVM.sol/index.ts b/v2/types/factories/IGatewayEVM.sol/index.ts index 5f406b5d..4092d594 100644 --- a/v2/types/factories/IGatewayEVM.sol/index.ts +++ b/v2/types/factories/IGatewayEVM.sol/index.ts @@ -4,4 +4,3 @@ export { IGatewayEVM__factory } from "./IGatewayEVM__factory"; export { IGatewayEVMErrors__factory } from "./IGatewayEVMErrors__factory"; export { IGatewayEVMEvents__factory } from "./IGatewayEVMEvents__factory"; -export { Revertable__factory } from "./Revertable__factory"; diff --git a/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMErrors__factory.ts b/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMErrors__factory.ts index 9411fb85..456c372d 100644 --- a/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMErrors__factory.ts +++ b/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMErrors__factory.ts @@ -14,6 +14,11 @@ const _abi = [ name: "CallerIsNotFungibleModule", inputs: [], }, + { + type: "error", + name: "EmptyMessage", + inputs: [], + }, { type: "error", name: "FailedZetaSent", @@ -29,6 +34,11 @@ const _abi = [ name: "InsufficientZRC20Amount", inputs: [], }, + { + type: "error", + name: "InsufficientZetaAmount", + inputs: [], + }, { type: "error", name: "InvalidTarget", diff --git a/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMEvents__factory.ts b/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMEvents__factory.ts index 10a0d89a..09d098c0 100644 --- a/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMEvents__factory.ts +++ b/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVMEvents__factory.ts @@ -11,7 +11,7 @@ import type { const _abi = [ { type: "event", - name: "Call", + name: "Called", inputs: [ { name: "sender", @@ -20,10 +20,10 @@ const _abi = [ internalType: "address", }, { - name: "chainId", - type: "uint256", + name: "zrc20", + type: "address", indexed: true, - internalType: "uint256", + internalType: "address", }, { name: "receiver", @@ -37,12 +37,46 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, { type: "event", - name: "Withdrawal", + name: "Withdrawn", inputs: [ { name: "sender", @@ -92,6 +126,40 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, diff --git a/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVM__factory.ts b/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVM__factory.ts index 955b4e4e..ad195273 100644 --- a/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVM__factory.ts +++ b/v2/types/factories/IGatewayZEVM.sol/IGatewayZEVM__factory.ts @@ -19,15 +19,47 @@ const _abi = [ internalType: "bytes", }, { - name: "chainId", - type: "uint256", - internalType: "uint256", + name: "zrc20", + type: "address", + internalType: "address", }, { name: "message", type: "bytes", internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -154,28 +186,6 @@ const _abi = [ type: "function", name: "depositAndRevert", inputs: [ - { - name: "context", - type: "tuple", - internalType: "struct revertContext", - components: [ - { - name: "origin", - type: "bytes", - internalType: "bytes", - }, - { - name: "sender", - type: "address", - internalType: "address", - }, - { - name: "chainID", - type: "uint256", - internalType: "uint256", - }, - ], - }, { name: "zrc20", type: "address", @@ -192,9 +202,26 @@ const _abi = [ internalType: "address", }, { - name: "message", - type: "bytes", - internalType: "bytes", + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -255,31 +282,44 @@ const _abi = [ name: "executeRevert", inputs: [ { - name: "context", + name: "target", + type: "address", + internalType: "address", + }, + { + name: "revertContext", type: "tuple", - internalType: "struct revertContext", + internalType: "struct RevertContext", components: [ { - name: "origin", - type: "bytes", - internalType: "bytes", - }, - { - name: "sender", + name: "asset", type: "address", internalType: "address", }, { - name: "chainID", - type: "uint256", - internalType: "uint256", + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", }, ], }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "withdraw", + inputs: [ { - name: "zrc20", - type: "address", - internalType: "address", + name: "receiver", + type: "bytes", + internalType: "bytes", }, { name: "amount", @@ -287,14 +327,36 @@ const _abi = [ internalType: "uint256", }, { - name: "target", + name: "zrc20", type: "address", internalType: "address", }, { - name: "message", - type: "bytes", - internalType: "bytes", + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -315,9 +377,36 @@ const _abi = [ internalType: "uint256", }, { - name: "zrc20", - type: "address", - internalType: "address", + name: "chainId", + type: "uint256", + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -325,8 +414,13 @@ const _abi = [ }, { type: "function", - name: "withdraw", + name: "withdrawAndCall", inputs: [ + { + name: "receiver", + type: "bytes", + internalType: "bytes", + }, { name: "amount", type: "uint256", @@ -337,6 +431,38 @@ const _abi = [ type: "uint256", internalType: "uint256", }, + { + name: "message", + type: "bytes", + internalType: "bytes", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -365,32 +491,255 @@ const _abi = [ type: "bytes", internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", }, { - type: "function", - name: "withdrawAndCall", + type: "event", + name: "Called", inputs: [ { - name: "amount", + name: "sender", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "zrc20", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "receiver", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "message", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "gasLimit", type: "uint256", + indexed: false, internalType: "uint256", }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Withdrawn", + inputs: [ + { + name: "sender", + type: "address", + indexed: true, + internalType: "address", + }, { name: "chainId", type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "receiver", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "zrc20", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "value", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "gasfee", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "protocolFlatFee", + type: "uint256", + indexed: false, internalType: "uint256", }, { name: "message", type: "bytes", + indexed: false, internalType: "bytes", }, + { + name: "gasLimit", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "revertOptions", + type: "tuple", + indexed: false, + internalType: "struct RevertOptions", + components: [ + { + name: "revertAddress", + type: "address", + internalType: "address", + }, + { + name: "callOnRevert", + type: "bool", + internalType: "bool", + }, + { + name: "abortAddress", + type: "address", + internalType: "address", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], - outputs: [], - stateMutability: "nonpayable", + anonymous: false, + }, + { + type: "error", + name: "CallerIsNotFungibleModule", + inputs: [], + }, + { + type: "error", + name: "EmptyMessage", + inputs: [], + }, + { + type: "error", + name: "FailedZetaSent", + inputs: [], + }, + { + type: "error", + name: "GasFeeTransferFailed", + inputs: [], + }, + { + type: "error", + name: "InsufficientZRC20Amount", + inputs: [], + }, + { + type: "error", + name: "InsufficientZetaAmount", + inputs: [], + }, + { + type: "error", + name: "InvalidTarget", + inputs: [], + }, + { + type: "error", + name: "OnlyWZETAOrFungible", + inputs: [], + }, + { + type: "error", + name: "WithdrawalFailed", + inputs: [], + }, + { + type: "error", + name: "ZRC20BurnFailed", + inputs: [], + }, + { + type: "error", + name: "ZRC20DepositFailed", + inputs: [], + }, + { + type: "error", + name: "ZRC20TransferFailed", + inputs: [], }, ] as const; diff --git a/v2/types/factories/IReceiverEVM.sol/IReceiverEVMEvents__factory.ts b/v2/types/factories/IReceiverEVM.sol/IReceiverEVMEvents__factory.ts index dab09064..4a7a781a 100644 --- a/v2/types/factories/IReceiverEVM.sol/IReceiverEVMEvents__factory.ts +++ b/v2/types/factories/IReceiverEVM.sol/IReceiverEVMEvents__factory.ts @@ -132,10 +132,27 @@ const _abi = [ internalType: "address", }, { - name: "data", - type: "bytes", - indexed: false, - internalType: "bytes", + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], anonymous: false, diff --git a/v2/types/factories/IZRC20.sol/IZRC20Metadata__factory.ts b/v2/types/factories/IZRC20.sol/IZRC20Metadata__factory.ts index 3352f12f..ffcba683 100644 --- a/v2/types/factories/IZRC20.sol/IZRC20Metadata__factory.ts +++ b/v2/types/factories/IZRC20.sol/IZRC20Metadata__factory.ts @@ -9,6 +9,19 @@ import type { } from "../../IZRC20.sol/IZRC20Metadata"; const _abi = [ + { + type: "function", + name: "GAS_LIMIT", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, { type: "function", name: "PROTOCOL_FLAT_FEE", @@ -279,6 +292,30 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "withdrawGasFeeWithGasLimit", + inputs: [ + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, ] as const; export class IZRC20Metadata__factory { diff --git a/v2/types/factories/IZRC20.sol/IZRC20__factory.ts b/v2/types/factories/IZRC20.sol/IZRC20__factory.ts index 12c53aa6..59edab1d 100644 --- a/v2/types/factories/IZRC20.sol/IZRC20__factory.ts +++ b/v2/types/factories/IZRC20.sol/IZRC20__factory.ts @@ -6,6 +6,19 @@ import { Contract, Interface, type ContractRunner } from "ethers"; import type { IZRC20, IZRC20Interface } from "../../IZRC20.sol/IZRC20"; const _abi = [ + { + type: "function", + name: "GAS_LIMIT", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, { type: "function", name: "PROTOCOL_FLAT_FEE", @@ -237,6 +250,30 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "withdrawGasFeeWithGasLimit", + inputs: [ + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, ] as const; export class IZRC20__factory { diff --git a/v2/types/factories/IZetaConnector.sol/IZetaConnectorEvents__factory.ts b/v2/types/factories/IZetaConnector.sol/IZetaConnectorEvents__factory.ts index 92dae62d..43da6ae5 100644 --- a/v2/types/factories/IZetaConnector.sol/IZetaConnectorEvents__factory.ts +++ b/v2/types/factories/IZetaConnector.sol/IZetaConnectorEvents__factory.ts @@ -11,7 +11,7 @@ import type { const _abi = [ { type: "event", - name: "Withdraw", + name: "Withdrawn", inputs: [ { name: "to", @@ -30,7 +30,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { name: "to", @@ -55,7 +55,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { name: "to", @@ -75,6 +75,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, diff --git a/v2/types/factories/ReceiverEVM__factory.ts b/v2/types/factories/ReceiverEVM__factory.ts index 3cd1a430..267aaf82 100644 --- a/v2/types/factories/ReceiverEVM__factory.ts +++ b/v2/types/factories/ReceiverEVM__factory.ts @@ -25,9 +25,26 @@ const _abi = [ name: "onRevert", inputs: [ { - name: "data", - type: "bytes", - internalType: "bytes", + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], outputs: [], @@ -255,10 +272,27 @@ const _abi = [ internalType: "address", }, { - name: "data", - type: "bytes", + name: "revertContext", + type: "tuple", indexed: false, - internalType: "bytes", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], }, ], anonymous: false, @@ -314,7 +348,7 @@ const _abi = [ ] as const; const _bytecode = - "0x6080604052348015600f57600080fd5b506001600055610d3a806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c5780636ed701691461008c5780638fcaa0b5146100a157005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106c0565b610114565b34801561009857600080fd5b5061006a6101aa565b3480156100ad57600080fd5b5061006a6100bc3660046106fc565b6101df565b3480156100cd57600080fd5b5061006a6100dc3660046106c0565b61021e565b61006a6100ef366004610895565b6102f9565b34801561010057600080fd5b5061006a61010f366004610981565b61033d565b61011c610372565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b5565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b7f0d3f65f00e631663aa85c96330b5c7a83bb29af3630c0063776f985edc3037aa33838360405161021293929190610a6b565b60405180910390a15050565b610226610372565b6000610233600285610ad5565b90508060000361026f576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61029173ffffffffffffffffffffffffffffffffffffffff84163384846103b5565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa3334858585604051610330959493929190610b7e565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b146338484846040516103309493929190610c08565b6002600054036103ae576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044a908590610450565b50505050565b600061047273ffffffffffffffffffffffffffffffffffffffff8416836104eb565b905080516000141580156104975750808060200190518101906104959190610ccb565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f983836000610500565b9392505050565b60608147101561053e576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104e2565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105679190610ce8565b60006040518083038185875af1925050503d80600081146105a4576040519150601f19603f3d011682016040523d82523d6000602084013e6105a9565b606091505b50915091506105b98683836105c3565b9695505050505050565b6060826105d8576105d382610652565b6104f9565b81511580156105fc575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561064b576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104e2565b50806104f9565b8051156106625780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106bb57600080fd5b919050565b6000806000606084860312156106d557600080fd5b833592506106e560208501610697565b91506106f360408501610697565b90509250925092565b6000806020838503121561070f57600080fd5b823567ffffffffffffffff81111561072657600080fd5b8301601f8101851361073757600080fd5b803567ffffffffffffffff81111561074e57600080fd5b85602082840101111561076057600080fd5b6020919091019590945092505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107e6576107e6610770565b604052919050565b600082601f8301126107ff57600080fd5b813567ffffffffffffffff81111561081957610819610770565b61084a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161079f565b81815284602083860101111561085f57600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069457600080fd5b80356106bb8161087c565b6000806000606084860312156108aa57600080fd5b833567ffffffffffffffff8111156108c157600080fd5b6108cd868287016107ee565b9350506020840135915060408401356108e58161087c565b809150509250925092565b600067ffffffffffffffff82111561090a5761090a610770565b5060051b60200190565b600082601f83011261092557600080fd5b8135610938610933826108f0565b61079f565b8082825260208201915060208360051b86010192508583111561095a57600080fd5b602085015b8381101561097757803583526020928301920161095f565b5095945050505050565b60008060006060848603121561099657600080fd5b833567ffffffffffffffff8111156109ad57600080fd5b8401601f810186136109be57600080fd5b80356109cc610933826108f0565b8082825260208201915060208360051b8501019250888311156109ee57600080fd5b602084015b83811015610a3057803567ffffffffffffffff811115610a1257600080fd5b610a218b6020838901016107ee565b845250602092830192016109f3565b509550505050602084013567ffffffffffffffff811115610a5057600080fd5b610a5c86828701610914565b9250506106f36040850161088a565b73ffffffffffffffffffffffffffffffffffffffff8416815260406020820152816040820152818360608301376000818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b600082610b0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610b2b578181015183820152602001610b13565b50506000910152565b60008151808452610b4c816020860160208601610b10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610bb360a0830186610b34565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610bfe578151865260209586019590910190600101610be0565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610c9b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610c86858351610b34565b94506020938401939190910190600101610c4c565b505050508281036040840152610cb18186610bcc565b915050610cc2606083018415159052565b95945050505050565b600060208284031215610cdd57600080fd5b81516104f98161087c565b60008251610cfa818460208701610b10565b919091019291505056fea2646970667358221220556072e1abafc3c4063b8cce832228b4f309b93726aaa6a6dfab20cb880c6d1864736f6c634300081a0033"; + "0x6080604052348015600f57600080fd5b506001600055610dbc806100246000396000f3fe6080604052600436106100635760003560e01c8063c513169111610040578063c5131691146100c1578063e04d4f97146100e1578063f05b6abf146100f457005b8063357fc5a21461006c578063660b9de01461008c5780636ed70169146100ac57005b3661006a57005b005b34801561007857600080fd5b5061006a6100873660046106bd565b610114565b34801561009857600080fd5b5061006a6100a73660046106f9565b6101aa565b3480156100b857600080fd5b5061006a6101e6565b3480156100cd57600080fd5b5061006a6100dc3660046106bd565b61021b565b61006a6100ef366004610859565b6102f6565b34801561010057600080fd5b5061006a61010f366004610945565b61033a565b61011c61036f565b61013e73ffffffffffffffffffffffffffffffffffffffff83163383866103b2565b604080513381526020810185905273ffffffffffffffffffffffffffffffffffffffff848116828401528316606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a16101a56001600055565b505050565b7f024f3ba167dca37cfa8409bf4c2f05a4d9c2d9b39a94d7a6c970352fabaa320e33826040516101db929190610a78565b60405180910390a150565b6040513381527fbcaadb46b82a48af60b608f58959ae6b8310d1b0a0d094c2e9ec3208ed39f2a09060200160405180910390a1565b61022361036f565b6000610230600285610b57565b90508060000361026c576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61028e73ffffffffffffffffffffffffffffffffffffffff84163384846103b2565b604080513381526020810183905273ffffffffffffffffffffffffffffffffffffffff858116828401528416606082015290517f2b58128f24a9f59127cc5b5430d70542b22220f2d9adaa86e442b816ab98af609181900360800190a1506101a56001600055565b7f1f1ff1f5fb41346850b2f5c04e6c767e2f1c8a525c5c0c5cdb60cdf3ca5f62fa333485858560405161032d959493929190610c00565b60405180910390a1505050565b7f74a53cd528a921fca7dbdee62f86819051d3cc98f214951f4238e8843f20b1463384848460405161032d9493929190610c8a565b6002600054036103ab576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261044790859061044d565b50505050565b600061046f73ffffffffffffffffffffffffffffffffffffffff8416836104e8565b905080516000141580156104945750808060200190518101906104929190610d4d565b155b156101a5576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b60606104f6838360006104fd565b9392505050565b60608147101561053b576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016104df565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516105649190610d6a565b60006040518083038185875af1925050503d80600081146105a1576040519150601f19603f3d011682016040523d82523d6000602084013e6105a6565b606091505b50915091506105b68683836105c0565b9695505050505050565b6060826105d5576105d08261064f565b6104f6565b81511580156105f9575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610648576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104df565b50806104f6565b80511561065f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b857600080fd5b919050565b6000806000606084860312156106d257600080fd5b833592506106e260208501610694565b91506106f060408501610694565b90509250925092565b60006020828403121561070b57600080fd5b813567ffffffffffffffff81111561072257600080fd5b8201606081850312156104f657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107aa576107aa610734565b604052919050565b600082601f8301126107c357600080fd5b813567ffffffffffffffff8111156107dd576107dd610734565b61080e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610763565b81815284602083860101111561082357600080fd5b816020850160208301376000918101602001919091529392505050565b801515811461069157600080fd5b80356106b881610840565b60008060006060848603121561086e57600080fd5b833567ffffffffffffffff81111561088557600080fd5b610891868287016107b2565b9350506020840135915060408401356108a981610840565b809150509250925092565b600067ffffffffffffffff8211156108ce576108ce610734565b5060051b60200190565b600082601f8301126108e957600080fd5b81356108fc6108f7826108b4565b610763565b8082825260208201915060208360051b86010192508583111561091e57600080fd5b602085015b8381101561093b578035835260209283019201610923565b5095945050505050565b60008060006060848603121561095a57600080fd5b833567ffffffffffffffff81111561097157600080fd5b8401601f8101861361098257600080fd5b80356109906108f7826108b4565b8082825260208201915060208360051b8501019250888311156109b257600080fd5b602084015b838110156109f457803567ffffffffffffffff8111156109d657600080fd5b6109e58b6020838901016107b2565b845250602092830192016109b7565b509550505050602084013567ffffffffffffffff811115610a1457600080fd5b610a20868287016108d8565b9250506106f06040850161084e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015273ffffffffffffffffffffffffffffffffffffffff610ab683610694565b1660408201526000602083013567ffffffffffffffff8116808214610ada57600080fd5b6060840152506040830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112610b1657600080fd5b830160208101903567ffffffffffffffff811115610b3357600080fd5b803603821315610b4257600080fd5b606060808501526105b660a085018284610a2f565b600082610b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015610bad578181015183820152602001610b95565b50506000910152565b60008151808452610bce816020860160208601610b92565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a060408201526000610c3560a0830186610bb6565b6060830194909452509015156080909101529392505050565b600081518084526020840193506020830160005b82811015610c80578151865260209586019590910190600101610c62565b5093949350505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff871683526080602084015280865180835260a08501915060a08160051b86010192506020880160005b82811015610d1d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60878603018452610d08858351610bb6565b94506020938401939190910190600101610cce565b505050508281036040840152610d338186610c4e565b915050610d44606083018415159052565b95945050505050565b600060208284031215610d5f57600080fd5b81516104f681610840565b60008251610d7c818460208701610b92565b919091019291505056fea2646970667358221220d72588ea8acbf56155273edae233d1fe939bca804f44cf5204c615539f68e9ae64736f6c634300081a0033"; type ReceiverEVMConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/Revert.sol/Revertable__factory.ts b/v2/types/factories/Revert.sol/Revertable__factory.ts new file mode 100644 index 00000000..6a071ef5 --- /dev/null +++ b/v2/types/factories/Revert.sol/Revertable__factory.ts @@ -0,0 +1,52 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + Revertable, + RevertableInterface, +} from "../../Revert.sol/Revertable"; + +const _abi = [ + { + type: "function", + name: "onRevert", + inputs: [ + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, +] as const; + +export class Revertable__factory { + static readonly abi = _abi; + static createInterface(): RevertableInterface { + return new Interface(_abi) as RevertableInterface; + } + static connect(address: string, runner?: ContractRunner | null): Revertable { + return new Contract(address, _abi, runner) as unknown as Revertable; + } +} diff --git a/v2/types/factories/Revert.sol/index.ts b/v2/types/factories/Revert.sol/index.ts new file mode 100644 index 00000000..eefdeed8 --- /dev/null +++ b/v2/types/factories/Revert.sol/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Revertable__factory } from "./Revertable__factory"; diff --git a/v2/types/factories/SenderZEVM__factory.ts b/v2/types/factories/SenderZEVM__factory.ts index 4905b6be..f447b1f5 100644 --- a/v2/types/factories/SenderZEVM__factory.ts +++ b/v2/types/factories/SenderZEVM__factory.ts @@ -21,7 +21,7 @@ const _abi = [ type: "constructor", inputs: [ { - name: "_gateway", + name: "gateway_", type: "address", internalType: "address", }, @@ -38,9 +38,9 @@ const _abi = [ internalType: "bytes", }, { - name: "chainId", - type: "uint256", - internalType: "uint256", + name: "zrc20", + type: "address", + internalType: "address", }, { name: "str", @@ -120,7 +120,7 @@ const _abi = [ ] as const; const _bytecode = - "0x6080604052348015600f57600080fd5b5060405161080c38038061080c833981016040819052602c916050565b600080546001600160a01b0319166001600160a01b0392909216919091179055607e565b600060208284031215606157600080fd5b81516001600160a01b0381168114607757600080fd5b9392505050565b61077f8061008d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630abd890514610046578063116191b61461005b578063865b36f6146100a4575b600080fd5b6100596100543660046104c4565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100596100b236600461057f565b6102af565b60008383836040516024016100ce93929190610674565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810189905291925086169063095ea7b3906044016020604051808303816000875af11580156101be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e2919061069e565b610218576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517f7993c1e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637993c1e090610274908a908a908a9087906004016106c2565b600060405180830381600087803b15801561028e57600080fd5b505af11580156102a2573d6000803e3d6000fd5b5050505050505050505050565b60008383836040516024016102c693929190610674565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490517f5d40e17800000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff1690635d40e1789061039690899089908690600401610714565b600060405180830381600087803b1580156103b057600080fd5b505af11580156103c4573d6000803e3d6000fd5b50505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261041057600080fd5b81356020830160008067ffffffffffffffff841115610431576104316103d0565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff8211171561047e5761047e6103d0565b60405283815290508082840187101561049657600080fd5b838360208301376000602085830101528094505050505092915050565b80151581146104c157600080fd5b50565b60008060008060008060c087890312156104dd57600080fd5b863567ffffffffffffffff8111156104f457600080fd5b61050089828a016103ff565b96505060208701359450604087013573ffffffffffffffffffffffffffffffffffffffff8116811461053157600080fd5b9350606087013567ffffffffffffffff81111561054d57600080fd5b61055989828a016103ff565b9350506080870135915060a0870135610571816104b3565b809150509295509295509295565b600080600080600060a0868803121561059757600080fd5b853567ffffffffffffffff8111156105ae57600080fd5b6105ba888289016103ff565b95505060208601359350604086013567ffffffffffffffff8111156105de57600080fd5b6105ea888289016103ff565b935050606086013591506080860135610602816104b3565b809150509295509295909350565b6000815180845260005b818110156106365760208185018101518683018201520161061a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6060815260006106876060830186610610565b602083019490945250901515604090910152919050565b6000602082840312156106b057600080fd5b81516106bb816104b3565b9392505050565b6080815260006106d56080830187610610565b85602084015273ffffffffffffffffffffffffffffffffffffffff8516604084015282810360608401526107098185610610565b979650505050505050565b6060815260006107276060830186610610565b846020840152828103604084015261073f8185610610565b969550505050505056fea26469706673582212200eb2d64f6bd03198b904dea273f648b094222e30263233833cd64525d96f81ba64736f6c634300081a0033"; + "0x6080604052348015600f57600080fd5b50604051610a12380380610a12833981016040819052602c916050565b600080546001600160a01b0319166001600160a01b0392909216919091179055607e565b600060208284031215606157600080fd5b81516001600160a01b0381168114607757600080fd5b9392505050565b6109858061008d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630abd890514610046578063116191b61461005b5780637a34d8bb146100a4575b600080fd5b6100596100543660046105e7565b6100b7565b005b60005461007b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100596100b2366004610687565b61030c565b60008383836040516024016100ce93929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905260005490915073ffffffffffffffffffffffffffffffffffffffff8087169163095ea7b391166101758960026107ad565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156101e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020991906107ed565b61023f576040517f8164f84200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160808101825261032180825260016020808401829052838501929092528351918201845260008083526060840192909252905492517f90ad3e23000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff16916390ad3e23916102d0918c918c918c918991899060040161087a565b600060405180830381600087803b1580156102ea57600080fd5b505af11580156102fe573d6000803e3d6000fd5b505050505050505050505050565b600083838360405160240161032393929190610783565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe04d4f970000000000000000000000000000000000000000000000000000000017905281516080810183526103218082526001828401819052828501919091528351928301845260008084526060830193909352915492517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201526024810183905293945092909188169063095ea7b3906044016020604051808303816000875af1158015610447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046b91906107ed565b506000546040517fdc9ca2e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063dc9ca2e7906102d0908b908b908890879089906004016108e8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261050a57600080fd5b81356020830160008067ffffffffffffffff84111561052b5761052b6104ca565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610578576105786104ca565b60405283815290508082840187101561059057600080fd5b838360208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146105d157600080fd5b919050565b80151581146105e457600080fd5b50565b60008060008060008060c0878903121561060057600080fd5b863567ffffffffffffffff81111561061757600080fd5b61062389828a016104f9565b96505060208701359450610639604088016105ad565b9350606087013567ffffffffffffffff81111561065557600080fd5b61066189828a016104f9565b9350506080870135915060a0870135610679816105d6565b809150509295509295509295565b600080600080600060a0868803121561069f57600080fd5b853567ffffffffffffffff8111156106b657600080fd5b6106c2888289016104f9565b9550506106d1602087016105ad565b9350604086013567ffffffffffffffff8111156106ed57600080fd5b6106f9888289016104f9565b935050606086013591506080860135610711816105d6565b809150509295509295909350565b6000815180845260005b8181101561074557602081850181015186830182015201610729565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b606081526000610796606083018661071f565b602083019490945250901515604090910152919050565b808201808211156107e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000602082840312156107ff57600080fd5b815161080a816105d6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff815116825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff60408201511660408301526000606082015160806060850152610872608085018261071f565b949350505050565b60c08152600061088d60c083018961071f565b87602084015273ffffffffffffffffffffffffffffffffffffffff8716604084015282810360608401526108c1818761071f565b905084608084015282810360a08401526108db8185610811565b9998505050505050505050565b60a0815260006108fb60a083018861071f565b73ffffffffffffffffffffffffffffffffffffffff871660208401528281036040840152610929818761071f565b905084606084015282810360808401526109438185610811565b9897505050505050505056fea26469706673582212207447884a874c8537c3ef840e4ddffbc65b7e07105578a7028d806e21fe26e52164736f6c634300081a0033"; type SenderZEVMConstructorParams = | [signer?: Signer] @@ -140,16 +140,16 @@ export class SenderZEVM__factory extends ContractFactory { } override getDeployTransaction( - _gateway: AddressLike, + gateway_: AddressLike, overrides?: NonPayableOverrides & { from?: string } ): Promise { - return super.getDeployTransaction(_gateway, overrides || {}); + return super.getDeployTransaction(gateway_, overrides || {}); } override deploy( - _gateway: AddressLike, + gateway_: AddressLike, overrides?: NonPayableOverrides & { from?: string } ) { - return super.deploy(_gateway, overrides || {}) as Promise< + return super.deploy(gateway_, overrides || {}) as Promise< SenderZEVM & { deploymentTransaction(): ContractTransactionResponse; } diff --git a/v2/types/factories/SystemContract.sol/SystemContract__factory.ts b/v2/types/factories/SystemContract.sol/SystemContract__factory.ts index 378dbfc6..4c814b23 100644 --- a/v2/types/factories/SystemContract.sol/SystemContract__factory.ts +++ b/v2/types/factories/SystemContract.sol/SystemContract__factory.ts @@ -439,7 +439,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea2646970667358221220431a07541a491b54259bdf8fcd05ade6751bfbbf0e72e605f27325b56d7d464f64736f6c634300081a0033"; + "0x60c060405234801561001057600080fd5b5060405161106f38038061106f83398101604081905261002f916100db565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0385811691909117909155828116608052811660a0526040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a150505061011e565b80516001600160a01b03811681146100d657600080fd5b919050565b6000806000606084860312156100f057600080fd5b6100f9846100bf565b9250610107602085016100bf565b9150610115604085016100bf565b90509250925092565b60805160a051610f2561014a60003960006101e50152600081816102b9015261045b0152610f256000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806397770dff11610097578063c63585cc11610066578063c63585cc14610273578063d7fd7afb14610286578063d936a012146102b4578063ee2815ba146102db57600080fd5b806397770dff1461021a578063a7cb05071461022d578063c39aca3714610240578063c62178ac1461025357600080fd5b8063513a9c05116100d3578063513a9c051461018a578063569541b9146101c0578063842da36d146101e057806391dd645f1461020757600080fd5b80630be15547146100fa5780631f0e251b1461015a5780633ce4a5bc1461016f575b600080fd5b610130610108366004610bd1565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61016d610168366004610c13565b6102ee565b005b61013073735b14bb79463307aacbed86daf3322b1e6226ab81565b610130610198366004610bd1565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101309073ffffffffffffffffffffffffffffffffffffffff1681565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d610215366004610c35565b610402565b61016d610228366004610c13565b610526565b61016d61023b366004610c61565b610633565b61016d61024e366004610c83565b6106ce565b6004546101309073ffffffffffffffffffffffffffffffffffffffff1681565b610130610281366004610d53565b6108cd565b6102a6610294366004610bd1565b60006020819052908152604090205481565b604051908152602001610151565b6101307f000000000000000000000000000000000000000000000000000000000000000081565b61016d6102e9366004610c35565b610a02565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461033b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610388576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3ade88e3922d64780e1bf4460d364c2970b69da813f9c0c07a1c187b5647636c906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461044f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600090610497907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff16846108cd565b60008481526002602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251878152918201529192507f0ecec485166da6139b13bb7e033e9446e2d35348e80ebf1180d4afe2dba1704e910160405180910390a1505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610573576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166105c0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e906020016103f7565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610680576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461071b576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831673735b14bb79463307aacbed86daf3322b1e6226ab1480610768575073ffffffffffffffffffffffffffffffffffffffff831630145b1561079f576040517f82d5d76a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690528616906347e7ef24906044016020604051808303816000875af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190610d96565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063de43156e906108939089908990899088908890600401610e01565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b50505050505050505050565b60008060006108dc8585610ad3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016109c29291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a4f576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d91016106c2565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b3b576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610b75578284610b78565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610bca576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b600060208284031215610be357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0e57600080fd5b919050565b600060208284031215610c2557600080fd5b610c2e82610bea565b9392505050565b60008060408385031215610c4857600080fd5b82359150610c5860208401610bea565b90509250929050565b60008060408385031215610c7457600080fd5b50508035926020909101359150565b60008060008060008060a08789031215610c9c57600080fd5b863567ffffffffffffffff811115610cb357600080fd5b87016060818a031215610cc557600080fd5b9550610cd360208801610bea565b945060408701359350610ce860608801610bea565b9250608087013567ffffffffffffffff811115610d0457600080fd5b8701601f81018913610d1557600080fd5b803567ffffffffffffffff811115610d2c57600080fd5b896020828401011115610d3e57600080fd5b60208201935080925050509295509295509295565b600080600060608486031215610d6857600080fd5b610d7184610bea565b9250610d7f60208501610bea565b9150610d8d60408501610bea565b90509250925092565b600060208284031215610da857600080fd5b81518015158114610c2e57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112610e3957600080fd5b870160208101903567ffffffffffffffff811115610e5657600080fd5b803603821315610e6557600080fd5b60606080850152610e7a60e085018284610db8565b91505073ffffffffffffffffffffffffffffffffffffffff610e9e60208a01610bea565b1660a0840152604088013560c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401528281036060840152610ee3818587610db8565b9897505050505050505056fea264697066735822122008474639ce364cbb25d83e495dc4d0a78e2d65a2d539f4c42e4aa870df459f5f64736f6c634300081a0033"; type SystemContractConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/SystemContractMock.sol/SystemContractMock__factory.ts b/v2/types/factories/SystemContractMock.sol/SystemContractMock__factory.ts index 1db1919a..bc10e11c 100644 --- a/v2/types/factories/SystemContractMock.sol/SystemContractMock__factory.ts +++ b/v2/types/factories/SystemContractMock.sol/SystemContractMock__factory.ts @@ -342,7 +342,7 @@ const _abi = [ ] as const; const _bytecode = - "0x608060405234801561001057600080fd5b50604051610b3f380380610b3f83398101604081905261002f916100b9565b600380546001600160a01b038086166001600160a01b0319928316179092556004805485841690831617905560058054928416929091169190911790556040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a15050506100fc565b80516001600160a01b03811681146100b457600080fd5b919050565b6000806000606084860312156100ce57600080fd5b6100d78461009d565b92506100e56020850161009d565b91506100f36040850161009d565b90509250925092565b610a348061010b6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806397770dff11610081578063d7fd7afb1161005b578063d7fd7afb146101f2578063d936a01214610220578063ee2815ba1461024057600080fd5b806397770dff146101b9578063a7cb0507146101cc578063c63585cc146101df57600080fd5b8063513a9c05116100b2578063513a9c0514610143578063569541b914610179578063842da36d1461019957600080fd5b80630be15547146100ce5780633c669d551461012e575b600080fd5b6101046100dc36600461071e565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61014161013c366004610760565b610253565b005b61010461015136600461071e565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6005546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6101416101c73660046107fd565b6103a0565b6101416101da36600461081f565b610419565b6101046101ed366004610841565b610467565b61021261020036600461071e565b60006020819052908152604090205481565b604051908152602001610125565b6004546101049073ffffffffffffffffffffffffffffffffffffffff1681565b61014161024e366004610884565b61059c565b604080516080810182526000606082019081528152336020820152468183015290517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820186905286169063a9059cbb906044016020604051808303816000875af11580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b91906108b0565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87169063de43156e90610366908490899089908990899060040161091b565b600060405180830381600087803b15801561038057600080fd5b505af1158015610394573d6000803e3d6000fd5b50505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e9060200160405180910390a150565b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b60008060006104768585610620565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012060405160200161055c9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d910161045b565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610688576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106106c25782846106c5565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610717576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b60006020828403121561073057600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461075b57600080fd5b919050565b60008060008060006080868803121561077857600080fd5b61078186610737565b945061078f60208701610737565b935060408601359250606086013567ffffffffffffffff8111156107b257600080fd5b8601601f810188136107c357600080fd5b803567ffffffffffffffff8111156107da57600080fd5b8860208284010111156107ec57600080fd5b959894975092955050506020019190565b60006020828403121561080f57600080fd5b61081882610737565b9392505050565b6000806040838503121561083257600080fd5b50508035926020909101359150565b60008060006060848603121561085657600080fd5b61085f84610737565b925061086d60208501610737565b915061087b60408501610737565b90509250925092565b6000806040838503121561089757600080fd5b823591506108a760208401610737565b90509250929050565b6000602082840312156108c257600080fd5b8151801515811461081857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086516060608084015280518060e085015260005b81811015610953576020818401810151610100878401015201610935565b5060008482016101000152602089015173ffffffffffffffffffffffffffffffffffffffff811660a0860152601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168401915050604088015160c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401526101008382030160608401526109f2610100820185876108d2565b9897505050505050505056fea264697066735822122044450a00a3ccd112d5abf008f947389875d330f56afa78b6ab0863159c2d87f664736f6c634300081a0033"; + "0x608060405234801561001057600080fd5b50604051610b3f380380610b3f83398101604081905261002f916100b9565b600380546001600160a01b038086166001600160a01b0319928316179092556004805485841690831617905560058054928416929091169190911790556040517f80699e81136d69cb8367ad52a994e25c722a86da654b561d0c14b61a777e7ac590600090a15050506100fc565b80516001600160a01b03811681146100b457600080fd5b919050565b6000806000606084860312156100ce57600080fd5b6100d78461009d565b92506100e56020850161009d565b91506100f36040850161009d565b90509250925092565b610a348061010b6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806397770dff11610081578063d7fd7afb1161005b578063d7fd7afb146101f2578063d936a01214610220578063ee2815ba1461024057600080fd5b806397770dff146101b9578063a7cb0507146101cc578063c63585cc146101df57600080fd5b8063513a9c05116100b2578063513a9c0514610143578063569541b914610179578063842da36d1461019957600080fd5b80630be15547146100ce5780633c669d551461012e575b600080fd5b6101046100dc36600461071e565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61014161013c366004610760565b610253565b005b61010461015136600461071e565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6003546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6005546101049073ffffffffffffffffffffffffffffffffffffffff1681565b6101416101c73660046107fd565b6103a0565b6101416101da36600461081f565b610419565b6101046101ed366004610841565b610467565b61021261020036600461071e565b60006020819052908152604090205481565b604051908152602001610125565b6004546101049073ffffffffffffffffffffffffffffffffffffffff1681565b61014161024e366004610884565b61059c565b604080516080810182526000606082019081528152336020820152468183015290517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820186905286169063a9059cbb906044016020604051808303816000875af11580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b91906108b0565b506040517fde43156e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87169063de43156e90610366908490899089908990899060040161091b565b600060405180830381600087803b15801561038057600080fd5b505af1158015610394573d6000803e3d6000fd5b50505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdba79d534382d1a8ae108e4c8ecb27c6ae42ab8b91d44eedf88bd329f3868d5e9060200160405180910390a150565b6000828152602081815260409182902083905581518481529081018390527f49f492222906ac486c3c1401fa545626df1f0c0e5a77a05597ea2ed66af9850d91015b60405180910390a15050565b60008060006104768585610620565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012060405160200161055c9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b60008281526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091558251858152918201527fd1b36d30f6248e97c473b4d1348ca164a4ef6759022f54a58ec200326c39c45d910161045b565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610688576040517fcb1e7cfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106106c25782846106c5565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610717576040517f78b507da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250929050565b60006020828403121561073057600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461075b57600080fd5b919050565b60008060008060006080868803121561077857600080fd5b61078186610737565b945061078f60208701610737565b935060408601359250606086013567ffffffffffffffff8111156107b257600080fd5b8601601f810188136107c357600080fd5b803567ffffffffffffffff8111156107da57600080fd5b8860208284010111156107ec57600080fd5b959894975092955050506020019190565b60006020828403121561080f57600080fd5b61081882610737565b9392505050565b6000806040838503121561083257600080fd5b50508035926020909101359150565b60008060006060848603121561085657600080fd5b61085f84610737565b925061086d60208501610737565b915061087b60408501610737565b90509250925092565b6000806040838503121561089757600080fd5b823591506108a760208401610737565b90509250929050565b6000602082840312156108c257600080fd5b8151801515811461081857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60808152600086516060608084015280518060e085015260005b81811015610953576020818401810151610100878401015201610935565b5060008482016101000152602089015173ffffffffffffffffffffffffffffffffffffffff811660a0860152601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168401915050604088015160c084015273ffffffffffffffffffffffffffffffffffffffff871660208401528560408401526101008382030160608401526109f2610100820185876108d2565b9897505050505050505056fea2646970667358221220fecb52d63ec1b967fad2855018329377964bac04ed54a998543272d32f4338fd64736f6c634300081a0033"; type SystemContractMockConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/TestUniversalContract__factory.ts b/v2/types/factories/TestUniversalContract__factory.ts new file mode 100644 index 00000000..2943e07e --- /dev/null +++ b/v2/types/factories/TestUniversalContract__factory.ts @@ -0,0 +1,223 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../common"; +import type { + TestUniversalContract, + TestUniversalContractInterface, +} from "../TestUniversalContract"; + +const _abi = [ + { + type: "fallback", + stateMutability: "payable", + }, + { + type: "receive", + stateMutability: "payable", + }, + { + type: "function", + name: "onCrossChainCall", + inputs: [ + { + name: "context", + type: "tuple", + internalType: "struct zContext", + components: [ + { + name: "origin", + type: "bytes", + internalType: "bytes", + }, + { + name: "sender", + type: "address", + internalType: "address", + }, + { + name: "chainID", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "zrc20", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "message", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "onRevert", + inputs: [ + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "event", + name: "ContextData", + inputs: [ + { + name: "origin", + type: "bytes", + indexed: false, + internalType: "bytes", + }, + { + name: "sender", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "chainID", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "msgSender", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "message", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ContextDataRevert", + inputs: [ + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + anonymous: false, + }, +] as const; + +const _bytecode = + "0x6080604052348015600f57600080fd5b5061061e8061001f6000396000f3fe60806040526004361061002a5760003560e01c8063660b9de014610033578063de43156e1461005357005b3661003157005b005b34801561003f57600080fd5b5061003161004e366004610140565b610073565b34801561005f57600080fd5b5061003161006e3660046101a6565b6100ad565b7f35a9324413457251c1059312318f6f1cec6bd0da4105d01315f3151b1e3a2c76816040516100a291906102a7565b60405180910390a150565b606081156100c4576100c1828401846103a2565b90505b7fcdc8ee677dc5ebe680fb18cebda5e26ba5ea1f0ba504a47e2a9a2ecb476dc98e6100ef8780610498565b6100ff60408a0160208b01610504565b8960400135338660405161011896959493929190610526565b60405180910390a1505050505050565b60006060828403121561013a57600080fd5b50919050565b60006020828403121561015257600080fd5b813567ffffffffffffffff81111561016957600080fd5b61017584828501610128565b949350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101a157600080fd5b919050565b6000806000806000608086880312156101be57600080fd5b853567ffffffffffffffff8111156101d557600080fd5b6101e188828901610128565b9550506101f06020870161017d565b935060408601359250606086013567ffffffffffffffff81111561021357600080fd5b8601601f8101881361022457600080fd5b803567ffffffffffffffff81111561023b57600080fd5b88602082840101111561024d57600080fd5b959894975092955050506020019190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff6102c98361017d565b1660208201526000602083013567ffffffffffffffff81168082146102ed57600080fd5b806040850152505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261032a57600080fd5b830160208101903567ffffffffffffffff81111561034757600080fd5b80360382131561035657600080fd5b60608085015261036a60808501828461025e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103b457600080fd5b813567ffffffffffffffff8111156103cb57600080fd5b8201601f810184136103dc57600080fd5b803567ffffffffffffffff8111156103f6576103f6610373565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561046257610462610373565b60405281815282820160200186101561047a57600080fd5b81602084016020830137600091810160200191909152949350505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126104cd57600080fd5b83018035915067ffffffffffffffff8211156104e857600080fd5b6020019150368190038213156104fd57600080fd5b9250929050565b60006020828403121561051657600080fd5b61051f8261017d565b9392505050565b60a08152600061053a60a08301888a61025e565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015273ffffffffffffffffffffffffffffffffffffffff851660608401528281036080840152835180825260005b818110156105a457602081870181015184830182015201610588565b5060006020828401015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168301019250505097965050505050505056fea2646970667358221220bb6e62150859f03aca6fe4999cc24cdd05253b707ded08a7425095e3124a55a564736f6c634300081a0033"; + +type TestUniversalContractConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: TestUniversalContractConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class TestUniversalContract__factory extends ContractFactory { + constructor(...args: TestUniversalContractConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + TestUniversalContract & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect( + runner: ContractRunner | null + ): TestUniversalContract__factory { + return super.connect(runner) as TestUniversalContract__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): TestUniversalContractInterface { + return new Interface(_abi) as TestUniversalContractInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): TestUniversalContract { + return new Contract( + address, + _abi, + runner + ) as unknown as TestUniversalContract; + } +} diff --git a/v2/types/factories/UniversalContract.sol/UniversalContract__factory.ts b/v2/types/factories/UniversalContract.sol/UniversalContract__factory.ts new file mode 100644 index 00000000..1955f373 --- /dev/null +++ b/v2/types/factories/UniversalContract.sol/UniversalContract__factory.ts @@ -0,0 +1,100 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + UniversalContract, + UniversalContractInterface, +} from "../../UniversalContract.sol/UniversalContract"; + +const _abi = [ + { + type: "function", + name: "onCrossChainCall", + inputs: [ + { + name: "context", + type: "tuple", + internalType: "struct zContext", + components: [ + { + name: "origin", + type: "bytes", + internalType: "bytes", + }, + { + name: "sender", + type: "address", + internalType: "address", + }, + { + name: "chainID", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "zrc20", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "message", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "onRevert", + inputs: [ + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, +] as const; + +export class UniversalContract__factory { + static readonly abi = _abi; + static createInterface(): UniversalContractInterface { + return new Interface(_abi) as UniversalContractInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): UniversalContract { + return new Contract(address, _abi, runner) as unknown as UniversalContract; + } +} diff --git a/v2/types/factories/UniversalContract.sol/ZContract__factory.ts b/v2/types/factories/UniversalContract.sol/ZContract__factory.ts new file mode 100644 index 00000000..80d1aab3 --- /dev/null +++ b/v2/types/factories/UniversalContract.sol/ZContract__factory.ts @@ -0,0 +1,67 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + ZContract, + ZContractInterface, +} from "../../UniversalContract.sol/ZContract"; + +const _abi = [ + { + type: "function", + name: "onCrossChainCall", + inputs: [ + { + name: "context", + type: "tuple", + internalType: "struct zContext", + components: [ + { + name: "origin", + type: "bytes", + internalType: "bytes", + }, + { + name: "sender", + type: "address", + internalType: "address", + }, + { + name: "chainID", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "zrc20", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "message", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, +] as const; + +export class ZContract__factory { + static readonly abi = _abi; + static createInterface(): ZContractInterface { + return new Interface(_abi) as ZContractInterface; + } + static connect(address: string, runner?: ContractRunner | null): ZContract { + return new Contract(address, _abi, runner) as unknown as ZContract; + } +} diff --git a/v2/types/factories/UniversalContract.sol/index.ts b/v2/types/factories/UniversalContract.sol/index.ts new file mode 100644 index 00000000..c297a535 --- /dev/null +++ b/v2/types/factories/UniversalContract.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { UniversalContract__factory } from "./UniversalContract__factory"; +export { ZContract__factory } from "./ZContract__factory"; diff --git a/v2/types/factories/ZRC20.sol/ZRC20__factory.ts b/v2/types/factories/ZRC20.sol/ZRC20__factory.ts index 794315a1..d09a1918 100644 --- a/v2/types/factories/ZRC20.sol/ZRC20__factory.ts +++ b/v2/types/factories/ZRC20.sol/ZRC20__factory.ts @@ -464,6 +464,30 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "withdrawGasFeeWithGasLimit", + inputs: [ + { + name: "gasLimit", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, { type: "event", name: "Approval", @@ -671,7 +695,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60e060405234801561001057600080fd5b50604051611bb9380380611bb983398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161174861047160003960006102170152600061033a0152600081816102eb01528181610ad70152610bdd01526117486000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c80638b851b95116100e3578063ccc775991161008c578063eddeb12311610066578063eddeb12314610431578063f2441b3214610444578063f687d12a1461046457600080fd5b8063ccc77599146103a4578063d9eeebed146103b7578063dd62ed3e146103eb57600080fd5b8063a9059cbb116100bd578063a9059cbb14610369578063c70126261461037c578063c835d7cc1461038f57600080fd5b80638b851b951461030d57806395d89b411461032d578063a3413d031461033557600080fd5b80633ce4a5bc116101455780634d8943bb1161011f5780634d8943bb146102a757806370a08231146102b057806385e1f4d0146102e657600080fd5b80633ce4a5bc1461024157806342966c681461028157806347e7ef241461029457600080fd5b806318160ddd1161017657806318160ddd146101f557806323b872dd146101fd578063313ce5671461021057600080fd5b806306fdde031461019d578063091d2788146101bb578063095ea7b3146101d2575b600080fd5b6101a5610477565b6040516101b29190611327565b60405180910390f35b6101c460015481565b6040519081526020016101b2565b6101e56101e0366004611366565b610509565b60405190151581526020016101b2565b6005546101c4565b6101e561020b366004611392565b610520565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101b2565b61025c73735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b2565b6101e561028f3660046113d3565b6105b7565b6101e56102a2366004611366565b6105cb565b6101c460025481565b6101c46102be3660046113ec565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101c47f000000000000000000000000000000000000000000000000000000000000000081565b60085461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101a561071f565b61035c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101b29190611409565b6101e5610377366004611366565b61072e565b6101e561038a366004611479565b61073b565b6103a261039d3660046113ec565b61088a565b005b6103a26103b23660046113ec565b61099e565b6103bf610aab565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101b2565b6101c46103f9366004611571565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103a261043f3660046113d3565b610cc9565b60005461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b6103a26104723660046113d3565b610d4b565b606060068054610486906115aa565b80601f01602080910402602001604051908101604052809291908181526020018280546104b2906115aa565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b6000610516338484610dcd565b5060015b92915050565b600061052d848484610ed6565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482811015610598576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ac85336105a7868561162c565b610dcd565b506001949350505050565b60006105c33383611091565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610609575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561062d575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610664576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61066e83836111d3565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261070e91869061163f565b60405180910390a250600192915050565b606060078054610486906115aa565b6000610516338484610ed6565b6000806000610748610aab565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fe9190611661565b610834576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3385611091565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d9559161087791899189918791611683565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108d7576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610924576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab146109eb576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a38576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a38790602001610993565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6291906116b2565b905073ffffffffffffffffffffffffffffffffffffffff8116610bb1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6491906116cf565b905080600003610ca0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cb391906116e8565b610cbd91906116ff565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d16576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f90602001610993565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d98576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a90602001610993565b73ffffffffffffffffffffffffffffffffffffffff8316610e1a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610e67576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610f23576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610f70576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205481811015610fd0576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fda828261162c565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260036020526040808220939093559085168152908120805484929061101d9084906116ff565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161108391815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff82166110de576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020548181101561113e576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611148828261162c565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120919091556005805484929061118390849061162c565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ec9565b73ffffffffffffffffffffffffffffffffffffffff8216611220576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461123291906116ff565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805483929061126c9084906116ff565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b818110156112e9576020818501810151868301820152016112cd565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061133a60208301846112c3565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461136357600080fd5b50565b6000806040838503121561137957600080fd5b823561138481611341565b946020939093013593505050565b6000806000606084860312156113a757600080fd5b83356113b281611341565b925060208401356113c281611341565b929592945050506040919091013590565b6000602082840312156113e557600080fd5b5035919050565b6000602082840312156113fe57600080fd5b813561133a81611341565b6020810160038310611444577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561148c57600080fd5b823567ffffffffffffffff8111156114a357600080fd5b8301601f810185136114b457600080fd5b803567ffffffffffffffff8111156114ce576114ce61144a565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561153a5761153a61144a565b60405281815282820160200187101561155257600080fd5b8160208401602083013760006020928201830152969401359450505050565b6000806040838503121561158457600080fd5b823561158f81611341565b9150602083013561159f81611341565b809150509250929050565b600181811c908216806115be57607f821691505b6020821081036115f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561051a5761051a6115fd565b60408152600061165260408301856112c3565b90508260208301529392505050565b60006020828403121561167357600080fd5b8151801515811461133a57600080fd5b60808152600061169660808301876112c3565b6020830195909552506040810192909252606090910152919050565b6000602082840312156116c457600080fd5b815161133a81611341565b6000602082840312156116e157600080fd5b5051919050565b808202811582820484141761051a5761051a6115fd565b8082018082111561051a5761051a6115fd56fea26469706673582212204013e39523742118b3f2227e145ee7e48176ba6aebead33c596dca2acb59a74c64736f6c634300081a0033"; + "0x60e060405234801561001057600080fd5b50604051611e01380380611e0183398101604081905261002f9161020e565b3373735b14bb79463307aacbed86daf3322b1e6226ab1461006357604051632b2add3d60e01b815260040160405180910390fd5b6001600160a01b038216158061008057506001600160a01b038116155b1561009e5760405163d92e233d60e01b815260040160405180910390fd5b60066100aa8982610360565b5060076100b78882610360565b5060ff861660c05260808590528360028111156100d6576100d661041e565b60a08160028111156100ea576100ea61041e565b905250600192909255600080546001600160a01b039283166001600160a01b03199182161790915560088054929093169116179055506104349350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261015157600080fd5b81516001600160401b0381111561016a5761016a61012a565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101985761019861012a565b6040528181528382016020018510156101b057600080fd5b60005b828110156101cf576020818601810151838301820152016101b3565b506000918101602001919091529392505050565b8051600381106101f257600080fd5b919050565b80516001600160a01b03811681146101f257600080fd5b600080600080600080600080610100898b03121561022b57600080fd5b88516001600160401b0381111561024157600080fd5b61024d8b828c01610140565b60208b015190995090506001600160401b0381111561026b57600080fd5b6102778b828c01610140565b975050604089015160ff8116811461028e57600080fd5b60608a015190965094506102a460808a016101e3565b60a08a015190945092506102ba60c08a016101f7565b91506102c860e08a016101f7565b90509295985092959890939650565b600181811c908216806102eb57607f821691505b60208210810361030b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035b57806000526020600020601f840160051c810160208510156103385750805b601f840160051c820191505b818110156103585760008155600101610344565b50505b505050565b81516001600160401b038111156103795761037961012a565b61038d8161038784546102d7565b84610311565b6020601f8211600181146103c157600083156103a95750848201515b600019600385901b1c1916600184901b178455610358565b600084815260208120601f198516915b828110156103f157878501518255602094850194600190920191016103d1565b508482101561040f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05161198261047f6000396000610222015260006103450152600081816102f601528181610af501528181610bfb01528181610e170152610f1d01526119826000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80638b851b95116100ee578063ccc7759911610097578063eddeb12311610071578063eddeb1231461043c578063f2441b321461044f578063f687d12a1461046f578063fc5fecd51461048257600080fd5b8063ccc77599146103af578063d9eeebed146103c2578063dd62ed3e146103f657600080fd5b8063a9059cbb116100c8578063a9059cbb14610374578063c701262614610387578063c835d7cc1461039a57600080fd5b80638b851b951461031857806395d89b4114610338578063a3413d031461034057600080fd5b80633ce4a5bc116101505780634d8943bb1161012a5780634d8943bb146102b257806370a08231146102bb57806385e1f4d0146102f157600080fd5b80633ce4a5bc1461024c57806342966c681461028c57806347e7ef241461029f57600080fd5b806318160ddd1161018157806318160ddd1461020057806323b872dd14610208578063313ce5671461021b57600080fd5b806306fdde03146101a8578063091d2788146101c6578063095ea7b3146101dd575b600080fd5b6101b0610495565b6040516101bd9190611561565b60405180910390f35b6101cf60015481565b6040519081526020016101bd565b6101f06101eb3660046115a0565b610527565b60405190151581526020016101bd565b6005546101cf565b6101f06102163660046115cc565b61053e565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101bd565b61026773735b14bb79463307aacbed86daf3322b1e6226ab81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bd565b6101f061029a36600461160d565b6105d5565b6101f06102ad3660046115a0565b6105e9565b6101cf60025481565b6101cf6102c9366004611626565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6008546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6101b061073d565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516101bd9190611643565b6101f06103823660046115a0565b61074c565b6101f06103953660046116b3565b610759565b6103ad6103a8366004611626565b6108a8565b005b6103ad6103bd366004611626565b6109bc565b6103ca610ac9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101bd565b6101cf6104043660046117ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103ad61044a36600461160d565b610ce7565b6000546102679073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad61047d36600461160d565b610d69565b6103ca61049036600461160d565b610deb565b6060600680546104a4906117e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906117e4565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b6000610534338484611007565b5060015b92915050565b600061054b848484611110565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152902054828110156105b6576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105ca85336105c58685611866565b611007565b506001949350505050565b60006105e133836112cb565b506001919050565b60003373735b14bb79463307aacbed86daf3322b1e6226ab14801590610627575060005473ffffffffffffffffffffffffffffffffffffffff163314155b801561064b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15610682576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068c838361140d565b6040517f735b14bb79463307aacbed86daf3322b1e6226ab000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff8416907f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261072c918690611879565b60405180910390a250600192915050565b6060600780546104a4906117e4565b6000610534338484611110565b6000806000610766610ac9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273735b14bb79463307aacbed86daf3322b1e6226ab602482015260448101829052919350915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af11580156107f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081c919061189b565b610852576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085c33856112cb565b60025460405133917f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d95591610895918991899187916118bd565b60405180910390a2506001949350505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab146108f5576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd55614e962c5fd6ece71614f6348d702468a997a394dd5e5c1677950226d97ae906020015b60405180910390a150565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610a09576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a56576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f88815d964e380677e86d817e7d65dea59cb7b4c3b5b7a0c8ec7ea4a74f90a387906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610bcf576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611909565b905080600003610cbe576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060025460015483610cd19190611922565b610cdb9190611939565b92959294509192505050565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610d34576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016109b1565b3373735b14bb79463307aacbed86daf3322b1e6226ab14610db6576040517f2b2add3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016109b1565b600080546040517f0be155470000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201528291829173ffffffffffffffffffffffffffffffffffffffff90911690630be1554790602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea291906118ec565b905073ffffffffffffffffffffffffffffffffffffffff8116610ef1576040517f78fff39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190611909565b905080600003610fe0576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090610ff08784611922565b610ffa9190611939565b9296929550919350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611054576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166110a1576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661115d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166111aa576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260409020548181101561120a576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112148282611866565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600360205260408082209390935590851681529081208054849290611257908490611939565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112bd91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216611318576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604090205481811015611378576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113828282611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040812091909155600580548492906113bd908490611866565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611103565b73ffffffffffffffffffffffffffffffffffffffff821661145a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806005600082825461146c9190611939565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080548392906114a6908490611939565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000815180845260005b8181101561152357602081850181015186830182015201611507565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061157460208301846114fd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461159d57600080fd5b50565b600080604083850312156115b357600080fd5b82356115be8161157b565b946020939093013593505050565b6000806000606084860312156115e157600080fd5b83356115ec8161157b565b925060208401356115fc8161157b565b929592945050506040919091013590565b60006020828403121561161f57600080fd5b5035919050565b60006020828403121561163857600080fd5b81356115748161157b565b602081016003831061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156116c657600080fd5b823567ffffffffffffffff8111156116dd57600080fd5b8301601f810185136116ee57600080fd5b803567ffffffffffffffff81111561170857611708611684565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561177457611774611684565b60405281815282820160200187101561178c57600080fd5b8160208401602083013760006020928201830152969401359450505050565b600080604083850312156117be57600080fd5b82356117c98161157b565b915060208301356117d98161157b565b809150509250929050565b600181811c908216806117f857607f821691505b602082108103611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053857610538611837565b60408152600061188c60408301856114fd565b90508260208301529392505050565b6000602082840312156118ad57600080fd5b8151801515811461157457600080fd5b6080815260006118d060808301876114fd565b6020830195909552506040810192909252606090910152919050565b6000602082840312156118fe57600080fd5b81516115748161157b565b60006020828403121561191b57600080fd5b5051919050565b808202811582820484141761053857610538611837565b808201808211156105385761053861183756fea2646970667358221220af0e942a7477c448c9068e05c443b6b8aa66c25114141f907c19366098ed4ca864736f6c634300081a0033"; type ZRC20ConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/ZetaConnectorBase__factory.ts b/v2/types/factories/ZetaConnectorBase__factory.ts index c79b6ca4..47b37ccb 100644 --- a/v2/types/factories/ZetaConnectorBase__factory.ts +++ b/v2/types/factories/ZetaConnectorBase__factory.ts @@ -35,6 +35,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "TSS_ROLE", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, { type: "function", name: "WITHDRAWER_ROLE", @@ -292,6 +305,28 @@ const _abi = [ type: "bytes32", internalType: "bytes32", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -412,7 +447,7 @@ const _abi = [ }, { type: "event", - name: "Withdraw", + name: "Withdrawn", inputs: [ { name: "to", @@ -431,7 +466,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { name: "to", @@ -456,7 +491,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { name: "to", @@ -476,6 +511,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, diff --git a/v2/types/factories/ZetaConnectorNative__factory.ts b/v2/types/factories/ZetaConnectorNative__factory.ts index 8c297454..f48ceefc 100644 --- a/v2/types/factories/ZetaConnectorNative__factory.ts +++ b/v2/types/factories/ZetaConnectorNative__factory.ts @@ -72,6 +72,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "TSS_ROLE", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, { type: "function", name: "WITHDRAWER_ROLE", @@ -329,6 +342,28 @@ const _abi = [ type: "bytes32", internalType: "bytes32", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -449,7 +484,7 @@ const _abi = [ }, { type: "event", - name: "Withdraw", + name: "Withdrawn", inputs: [ { name: "to", @@ -468,7 +503,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { name: "to", @@ -493,7 +528,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { name: "to", @@ -513,6 +548,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -598,7 +656,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60c060405234801561001057600080fd5b506040516115f63803806115f683398101604081905261002f916101ef565b60016000819055805460ff19169055838383836001600160a01b038416158061005f57506001600160a01b038316155b8061007157506001600160a01b038216155b8061008357506001600160a01b038116155b156100a15760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100bf600082610123565b506100ea7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610123565b506101157f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610123565b505050505050505050610243565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101c95760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101813390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101cd565b5060005b92915050565b80516001600160a01b03811681146101ea57600080fd5b919050565b6000806000806080858703121561020557600080fd5b61020e856101d3565b935061021c602086016101d3565b925061022a604086016101d3565b9150610238606086016101d3565b905092959194509250565b60805160a0516113486102ae600039600081816101dc01528181610432015281816104e3015281816105fd0152818161079101528181610842015261091001526000818161019001528181610454015281816104b6015281816107b3015261081501526113486000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80635c975abb116100b257806385f438c111610081578063a217fddf11610066578063a217fddf14610303578063d547741f1461030b578063e63ab1e91461031e57600080fd5b806385f438c11461029657806391d14854146102bd57600080fd5b80635c975abb1461025d5780635e3e9fef14610268578063743e0c9b1461027b5780638456cb591461028e57600080fd5b806321e093b1116101095780632f2ff15d116100ee5780632f2ff15d1461022f57806336568abe146102425780633f4ba83a1461025557600080fd5b806321e093b1146101d7578063248a9ca3146101fe57600080fd5b806301ffc9a71461013b57806302d5c89914610163578063106e629014610178578063116191b61461018b575b600080fd5b61014e610149366004611083565b610345565b60405190151581526020015b60405180910390f35b6101766101713660046110ee565b6103de565b005b610176610186366004611180565b6105a9565b6101b27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b6101b27f000000000000000000000000000000000000000000000000000000000000000081565b61022161020c3660046111b3565b60009081526002602052604090206001015490565b60405190815260200161015a565b61017661023d3660046111cc565b610684565b6101766102503660046111cc565b6106af565b610176610708565b60015460ff1661014e565b6101766102763660046110ee565b61073d565b6101766102893660046111b3565b6108ee565b610176610938565b6102217f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61014e6102cb3660046111cc565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610221600081565b6101766103193660046111cc565b61096a565b6102217f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806103d857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6103e661098f565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610410816109d2565b6104186109dc565b61047973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000087610a1b565b6040517fb8969bd400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b8969bd490610513907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a90600401611241565b600060405180830381600087803b15801561052d57600080fd5b505af1158015610541573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167fba96f26bdda53eb8c8ba39045dfb4ff39753fbc7a6edcf250a88e75e78d102fe86868660405161058f9392919061129e565b60405180910390a2506105a26001600055565b5050505050565b6105b161098f565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46105db816109d2565b6105e36109dc565b61062473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168585610a1b565b8373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648460405161066c91815260200190565b60405180910390a25061067f6001600055565b505050565b60008281526002602052604090206001015461069f816109d2565b6106a98383610a9c565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146106fe576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61067f8282610b9c565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610732816109d2565b61073a610c5b565b50565b61074561098f565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461076f816109d2565b6107776109dc565b6107d873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000087610a1b565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610872907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a90600401611241565b600060405180830381600087803b15801561088c57600080fd5b505af11580156108a0573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f7772f56296d3a5202974a45c61c9188d844ab4d6eeb18c851e4b8d5384ca6ced86868660405161058f9392919061129e565b6108f66109dc565b61073a73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cd8565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610962816109d2565b61073a610d1e565b600082815260026020526040902060010154610985816109d2565b6106a98383610b9c565b6002600054036109cb576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b61073a8133610d77565b60015460ff1615610a19576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261067f91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e08565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610b9457600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610b323390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016103d8565b5060006103d8565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610b9457600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016103d8565b610c63610e9e565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526106a99186918216906323b872dd90608401610a55565b610d266109dc565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610cae565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610e04576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610e2a73ffffffffffffffffffffffffffffffffffffffff841683610eda565b90508051600014158015610e4f575080806020019051810190610e4d91906112c1565b155b1561067f576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610dfb565b60015460ff16610a19576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610ee883836000610eef565b9392505050565b606081471015610f2d576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610dfb565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051610f5691906112e3565b60006040518083038185875af1925050503d8060008114610f93576040519150601f19603f3d011682016040523d82523d6000602084013e610f98565b606091505b5091509150610fa8868383610fb2565b9695505050505050565b606082610fc757610fc282611041565b610ee8565b8151158015610feb575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561103a576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610dfb565b5080610ee8565b8051156110515780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561109557600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ee857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146110e957600080fd5b919050565b60008060008060006080868803121561110657600080fd5b61110f866110c5565b945060208601359350604086013567ffffffffffffffff81111561113257600080fd5b8601601f8101881361114357600080fd5b803567ffffffffffffffff81111561115a57600080fd5b88602082840101111561116c57600080fd5b959894975060200195606001359392505050565b60008060006060848603121561119557600080fd5b61119e846110c5565b95602085013595506040909401359392505050565b6000602082840312156111c557600080fd5b5035919050565b600080604083850312156111df57600080fd5b823591506111ef602084016110c5565b90509250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006112936080830184866111f8565b979650505050505050565b8381526040602082015260006112b86040830184866111f8565b95945050505050565b6000602082840312156112d357600080fd5b81518015158114610ee857600080fd5b6000825160005b8181101561130457602081860181015185830152016112ea565b50600092019182525091905056fea2646970667358221220acfa51062c59716e02e413798f47a294f807ab6bfe6bcb7c13ce0530e6e5b1b864736f6c634300081a0033"; + "0x60c060405234801561001057600080fd5b5060405161188c38038061188c83398101604081905261002f9161021a565b60016000819055805460ff19169055838383836001600160a01b038416158061005f57506001600160a01b038316155b8061007157506001600160a01b038216155b8061008357506001600160a01b038116155b156100a15760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100bf60008261014e565b506100ea7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e48361014e565b506101157f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb8361014e565b506101407f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8261014e565b50505050505050505061026e565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101f45760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101ac3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101f8565b5060005b92915050565b80516001600160a01b038116811461021557600080fd5b919050565b6000806000806080858703121561023057600080fd5b610239856101fe565b9350610247602086016101fe565b9250610255604086016101fe565b9150610263606086016101fe565b905092959194509250565b60805160a0516115b36102d9600039600081816101f7015281816104740152818161052501528181610644015281816107d80152818161088901526109710152600081816101ab01528181610496015281816104f8015281816107fa015261085c01526115b36000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80635c975abb116100cd57806391d1485411610081578063a783c78911610066578063a783c78914610326578063d547741f1461034d578063e63ab1e91461036057600080fd5b806391d14854146102d8578063a217fddf1461031e57600080fd5b8063743e0c9b116100b2578063743e0c9b146102965780638456cb59146102a957806385f438c1146102b157600080fd5b80635c975abb146102785780635e3e9fef1461028357600080fd5b806321e093b1116101245780632f2ff15d116101095780632f2ff15d1461024a57806336568abe1461025d5780633f4ba83a1461027057600080fd5b806321e093b1146101f2578063248a9ca31461021957600080fd5b806301ffc9a714610156578063057e0f251461017e578063106e629014610193578063116191b6146101a6575b600080fd5b6101696101643660046110e4565b610387565b60405190151581526020015b60405180910390f35b61019161018c366004611198565b610420565b005b6101916101a1366004611230565b6105f0565b6101cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b6101cd7f000000000000000000000000000000000000000000000000000000000000000081565b61023c610227366004611263565b60009081526002602052604090206001015490565b604051908152602001610175565b61019161025836600461127c565b6106cb565b61019161026b36600461127c565b6106f6565b61019161074f565b60015460ff16610169565b6101916102913660046112a8565b610784565b6101916102a4366004611263565b61094f565b610191610999565b61023c7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101696102e636600461127c565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61023c600081565b61023c7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b61019161035b36600461127c565b6109cb565b61023c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061041a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6104286109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461045281610a33565b61045a610a3d565b6104bb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000088610a7c565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610557907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a90600401611418565b600060405180830381600087803b15801561057157600080fd5b505af1158015610585573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105d59493929190611489565b60405180910390a2506105e86001600055565b505050505050565b6105f86109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062281610a33565b61062a610a3d565b61066b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168585610a7c565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5846040516106b391815260200190565b60405180910390a2506106c66001600055565b505050565b6000828152600260205260409020600101546106e681610a33565b6106f08383610afd565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610745576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c68282610bfd565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61077981610a33565b610781610cbc565b50565b61078c6109f0565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46107b681610a33565b6107be610a3d565b61081f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000087610a7c565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab59906108b9907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016114c0565b600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d86868660405161093593929190611512565b60405180910390a2506109486001600055565b5050505050565b610957610a3d565b61078173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610d39565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6109c381610a33565b610781610d7f565b6000828152600260205260409020600101546109e681610a33565b6106f08383610bfd565b600260005403610a2c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107818133610dd8565b60015460ff1615610a7a576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60405173ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390526106c691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e69565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610bf557600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610b933390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161041a565b50600061041a565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610bf557600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161041a565b610cc4610eff565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401610ab6565b610d87610a3d565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610d0f565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610e65576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b5050565b6000610e8b73ffffffffffffffffffffffffffffffffffffffff841683610f3b565b90508051600014158015610eb0575080806020019051810190610eae919061152c565b155b156106c6576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610e5c565b60015460ff16610a7a576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060610f4983836000610f50565b9392505050565b606081471015610f8e576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610e5c565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051610fb7919061154e565b60006040518083038185875af1925050503d8060008114610ff4576040519150601f19603f3d011682016040523d82523d6000602084013e610ff9565b606091505b5091509150611009868383611013565b9695505050505050565b60608261102857611023826110a2565b610f49565b815115801561104c575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561109b576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610e5c565b5080610f49565b8051156110b25780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156110f657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4957600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461114a57600080fd5b919050565b60008083601f84011261116157600080fd5b50813567ffffffffffffffff81111561117957600080fd5b60208301915083602082850101111561119157600080fd5b9250929050565b60008060008060008060a087890312156111b157600080fd5b6111ba87611126565b955060208701359450604087013567ffffffffffffffff8111156111dd57600080fd5b6111e989828a0161114f565b90955093505060608701359150608087013567ffffffffffffffff81111561121057600080fd5b87016060818a03121561122257600080fd5b809150509295509295509295565b60008060006060848603121561124557600080fd5b61124e84611126565b95602085013595506040909401359392505050565b60006020828403121561127557600080fd5b5035919050565b6000806040838503121561128f57600080fd5b8235915061129f60208401611126565b90509250929050565b6000806000806000608086880312156112c057600080fd5b6112c986611126565b945060208601359350604086013567ffffffffffffffff8111156112ec57600080fd5b6112f88882890161114f565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff61137182611126565b1682526000602082013567ffffffffffffffff811680821461139257600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126113ce57600080fd5b820160208101903567ffffffffffffffff8111156113eb57600080fd5b8036038213156113fa57600080fd5b6060604086015261140f60608601828461130a565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061146a60a08301858761130a565b828103608084015261147c8185611353565b9998505050505050505050565b8481526060602082015260006114a360608301858761130a565b82810360408401526114b58185611353565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006114b560808301848661130a565b83815260406020820152600061140f60408301848661130a565b60006020828403121561153e57600080fd5b81518015158114610f4957600080fd5b6000825160005b8181101561156f5760208186018101518583015201611555565b50600092019182525091905056fea26469706673582212209d5e0f021d5693e9892c17d94d8884fd81287eed442c49865c927a0f8528df5364736f6c634300081a0033"; type ZetaConnectorNativeConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/ZetaConnectorNonNative__factory.ts b/v2/types/factories/ZetaConnectorNonNative__factory.ts index 242eb24a..214059e0 100644 --- a/v2/types/factories/ZetaConnectorNonNative__factory.ts +++ b/v2/types/factories/ZetaConnectorNonNative__factory.ts @@ -72,6 +72,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "TSS_ROLE", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, { type: "function", name: "WITHDRAWER_ROLE", @@ -355,6 +368,28 @@ const _abi = [ type: "bytes32", internalType: "bytes32", }, + { + name: "revertContext", + type: "tuple", + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], outputs: [], stateMutability: "nonpayable", @@ -488,7 +523,7 @@ const _abi = [ }, { type: "event", - name: "Withdraw", + name: "Withdrawn", inputs: [ { name: "to", @@ -507,7 +542,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndCall", + name: "WithdrawnAndCalled", inputs: [ { name: "to", @@ -532,7 +567,7 @@ const _abi = [ }, { type: "event", - name: "WithdrawAndRevert", + name: "WithdrawnAndReverted", inputs: [ { name: "to", @@ -552,6 +587,29 @@ const _abi = [ indexed: false, internalType: "bytes", }, + { + name: "revertContext", + type: "tuple", + indexed: false, + internalType: "struct RevertContext", + components: [ + { + name: "asset", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint64", + internalType: "uint64", + }, + { + name: "revertMessage", + type: "bytes", + internalType: "bytes", + }, + ], + }, ], anonymous: false, }, @@ -604,7 +662,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60c060405260001960035534801561001657600080fd5b506040516117f93803806117f9833981016040819052610035916101f5565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610129565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610129565b5061011b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610129565b505050505050505050610249565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101cf5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101873390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101d3565b5060005b92915050565b80516001600160a01b03811681146101f057600080fd5b919050565b6000806000806080858703121561020b57600080fd5b610214856101d9565b9350610222602086016101d9565b9250610230604086016101d9565b915061023e606086016101d9565b905092959194509250565b60805160a0516115306102c9600039600081816102120152818161046f015281816105b1015281816106770152818161077c0152818161089e01528181610a5201528181610b9401528181610c5a0152610db10152600081816101c60152818161057b0152818161064801528181610b5e0152610c2b01526115306000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80635e3e9fef116100cd57806391d1485411610081578063d547741f11610066578063d547741f14610354578063d5abeb0114610367578063e63ab1e91461037057600080fd5b806391d1485414610306578063a217fddf1461034c57600080fd5b8063743e0c9b116100b2578063743e0c9b146102c45780638456cb59146102d757806385f438c1146102df57600080fd5b80635e3e9fef1461029e5780636f8b44b0146102b157600080fd5b8063248a9ca31161012457806336568abe1161010957806336568abe146102785780633f4ba83a1461028b5780635c975abb1461029357600080fd5b8063248a9ca3146102345780632f2ff15d1461026557600080fd5b8063106e629011610155578063106e6290146101ae578063116191b6146101c157806321e093b11461020d57600080fd5b806301ffc9a71461017157806302d5c89914610199575b600080fd5b61018461017f366004611262565b610397565b60405190151581526020015b60405180910390f35b6101ac6101a73660046112d4565b610430565b005b6101ac6101bc366004611366565b61073d565b6101e87f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101e87f000000000000000000000000000000000000000000000000000000000000000081565b610257610242366004611399565b60009081526002602052604090206001015490565b604051908152602001610190565b6101ac6102733660046113b2565b61095a565b6101ac6102863660046113b2565b610985565b6101ac6109de565b60015460ff16610184565b6101ac6102ac3660046112d4565b610a13565b6101ac6102bf366004611399565b610d06565b6101ac6102d2366004611399565b610d74565b6101ac610e1e565b6102577f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b6101846103143660046113b2565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610257600081565b6101ac6103623660046113b2565b610e50565b61025760035481565b6102577f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061042a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610438610e75565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461046281610eb8565b61046a610ec2565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fc91906113de565b61050690876113f7565b111561053e576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052604482018490527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b1580156105f557600080fd5b505af1158015610609573d6000803e3d6000fd5b50506040517fb8969bd400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016925063b8969bd491506106a7907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a9060040161147a565b600060405180830381600087803b1580156106c157600080fd5b505af11580156106d5573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167fba96f26bdda53eb8c8ba39045dfb4ff39753fbc7a6edcf250a88e75e78d102fe868686604051610723939291906114d7565b60405180910390a2506107366001600055565b5050505050565b610745610e75565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461076f81610eb8565b610777610ec2565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080991906113de565b61081390856113f7565b111561084b576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260248201859052604482018490527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648460405161094291815260200190565b60405180910390a2506109556001600055565b505050565b60008281526002602052604090206001015461097581610eb8565b61097f8383610f01565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146109d4576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109558282611001565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a0881610eb8565b610a106110c0565b50565b610a1b610e75565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610a4581610eb8565b610a4d610ec2565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adf91906113de565b610ae990876113f7565b1115610b21576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201879052604482018490527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610bd857600080fd5b505af1158015610bec573d6000803e3d6000fd5b50506040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169250635131ab599150610c8a907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a9060040161147a565b600060405180830381600087803b158015610ca457600080fd5b505af1158015610cb8573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f7772f56296d3a5202974a45c61c9188d844ab4d6eeb18c851e4b8d5384ca6ced868686604051610723939291906114d7565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e4610d3081610eb8565b610d38610ec2565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610d7c610ec2565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b158015610e0a57600080fd5b505af1158015610736573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e4881610eb8565b610a1061113d565b600082815260026020526040902060010154610e6b81610eb8565b61097f8383611001565b600260005403610eb1576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b610a108133611196565b60015460ff1615610eff576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610ff957600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610f973390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161042a565b50600061042a565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610ff957600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161042a565b6110c8611226565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b611145610ec2565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611113565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611222576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610eff576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561127457600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146112a457600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112cf57600080fd5b919050565b6000806000806000608086880312156112ec57600080fd5b6112f5866112ab565b945060208601359350604086013567ffffffffffffffff81111561131857600080fd5b8601601f8101881361132957600080fd5b803567ffffffffffffffff81111561134057600080fd5b88602082840101111561135257600080fd5b959894975060200195606001359392505050565b60008060006060848603121561137b57600080fd5b611384846112ab565b95602085013595506040909401359392505050565b6000602082840312156113ab57600080fd5b5035919050565b600080604083850312156113c557600080fd5b823591506113d5602084016112ab565b90509250929050565b6000602082840312156113f057600080fd5b5051919050565b8082018082111561042a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006114cc608083018486611431565b979650505050505050565b8381526040602082015260006114f1604083018486611431565b9594505050505056fea264697066735822122083f8ba25d15d0dacb4bf73d1472e680a549b02f1b26b83dcb21bfef553fb6e1d64736f6c634300081a0033"; + "0x60c060405260001960035534801561001657600080fd5b5060405161178338038061178383398101604081905261003591610220565b60016000819055805460ff19169055838383836001600160a01b038416158061006557506001600160a01b038316155b8061007757506001600160a01b038216155b8061008957506001600160a01b038116155b156100a75760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a0526100c5600082610154565b506100f07f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e483610154565b5061011b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb83610154565b506101467f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82610154565b505050505050505050610274565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166101fa5760008381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101fe565b5060005b92915050565b80516001600160a01b038116811461021b57600080fd5b919050565b6000806000806080858703121561023657600080fd5b61023f85610204565b935061024d60208601610204565b925061025b60408601610204565b915061026960608601610204565b905092959194509250565b60805160a0516114ab6102d86000396000818161021d01528181610531015281816108290152818161099a01528181610aef0152610c110152600081816101d1015281816104a1015281816105040152818161079901526107fc01526114ab6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80635e3e9fef116100d857806391d148541161008c578063d547741f11610066578063d547741f14610386578063d5abeb0114610399578063e63ab1e9146103a257600080fd5b806391d1485414610311578063a217fddf14610357578063a783c7891461035f57600080fd5b8063743e0c9b116100bd578063743e0c9b146102cf5780638456cb59146102e257806385f438c1146102ea57600080fd5b80635e3e9fef146102a95780636f8b44b0146102bc57600080fd5b8063248a9ca31161012f57806336568abe1161011457806336568abe146102835780633f4ba83a146102965780635c975abb1461029e57600080fd5b8063248a9ca31461023f5780632f2ff15d1461027057600080fd5b8063106e629011610160578063106e6290146101b9578063116191b6146101cc57806321e093b11461021857600080fd5b806301ffc9a71461017c578063057e0f25146101a4575b600080fd5b61018f61018a366004610fd3565b6103c9565b60405190151581526020015b60405180910390f35b6101b76101b236600461108e565b610462565b005b6101b76101c7366004611126565b6105fc565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f37f000000000000000000000000000000000000000000000000000000000000000081565b61026261024d366004611159565b60009081526002602052604090206001015490565b60405190815260200161019b565b6101b761027e366004611172565b6106a1565b6101b7610291366004611172565b6106cc565b6101b7610725565b60015460ff1661018f565b6101b76102b736600461119e565b61075a565b6101b76102ca366004611159565b6108ef565b6101b76102dd366004611159565b61095d565b6101b7610a07565b6102627f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b61018f61031f366004611172565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610262600081565b6102627f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb81565b6101b7610394366004611172565b610a39565b61026260035481565b6102627f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061045c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61046a610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461049481610aa1565b61049c610aab565b6104c77f00000000000000000000000000000000000000000000000000000000000000008785610aea565b6040517fd0b492c300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0b492c390610563907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908b908a9060040161130e565b600060405180830381600087803b15801561057d57600080fd5b505af1158015610591573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167f52d8cccccf212da1f2b87140143958eb3bbf8a92e3833c50a8bf8a719a0da44c878787866040516105e1949392919061137f565b60405180910390a2506105f46001600055565b505050505050565b610604610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461062e81610aa1565b610636610aab565b610641848484610aea565b8373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161068991815260200190565b60405180910390a25061069c6001600055565b505050565b6000828152600260205260409020600101546106bc81610aa1565b6106c68383610c72565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461071b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61069c8282610d72565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61074f81610aa1565b610757610e31565b50565b610762610a5e565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e461078c81610aa1565b610794610aab565b6107bf7f00000000000000000000000000000000000000000000000000000000000000008684610aea565b6040517f5131ab5900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635131ab5990610859907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908a906004016113b6565b600060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff167f23b9573b29ff81f01c7aa1968188e1cb7d5858b08582e111fdaf386d9ef9bd8d8686866040516108d593929190611408565b60405180910390a2506108e86001600055565b5050505050565b7f0da06bffcb63442de88b7f8385468eaf51e47079d4fa96875938e2c27c451deb61091981610aa1565b610921610aab565b60038290556040518281527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c9060200160405180910390a15050565b610965610aab565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156109f357600080fd5b505af11580156108e8573d6000803e3d6000fd5b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a3181610aa1565b610757610eae565b600082815260026020526040902060010154610a5481610aa1565b6106c68383610d72565b600260005403610a9a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b6107578133610f07565b60015460ff1615610ae8576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190611422565b610b86908461143b565b1115610bbe576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f1e458bee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390527f00000000000000000000000000000000000000000000000000000000000000001690631e458bee90606401600060405180830381600087803b158015610c5557600080fd5b505af1158015610c69573d6000803e3d6000fd5b50505050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610d083390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161045c565b50600061045c565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615610d6a57600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161045c565b610e39610f97565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b610eb6610aab565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e84565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f93576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024810183905260440160405180910390fd5b5050565b60015460ff16610ae8576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215610fe557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461101557600080fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461104057600080fd5b919050565b60008083601f84011261105757600080fd5b50813567ffffffffffffffff81111561106f57600080fd5b60208301915083602082850101111561108757600080fd5b9250929050565b60008060008060008060a087890312156110a757600080fd5b6110b08761101c565b955060208701359450604087013567ffffffffffffffff8111156110d357600080fd5b6110df89828a01611045565b90955093505060608701359150608087013567ffffffffffffffff81111561110657600080fd5b87016060818a03121561111857600080fd5b809150509295509295509295565b60008060006060848603121561113b57600080fd5b6111448461101c565b95602085013595506040909401359392505050565b60006020828403121561116b57600080fd5b5035919050565b6000806040838503121561118557600080fd5b823591506111956020840161101c565b90509250929050565b6000806000806000608086880312156111b657600080fd5b6111bf8661101c565b945060208601359350604086013567ffffffffffffffff8111156111e257600080fd5b6111ee88828901611045565b96999598509660600135949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff6112678261101c565b1682526000602082013567ffffffffffffffff811680821461128857600080fd5b6020850152506040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126112c457600080fd5b820160208101903567ffffffffffffffff8111156112e157600080fd5b8036038213156112f057600080fd5b60606040860152611305606086018284611200565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015260a06060820152600061136060a083018587611200565b82810360808401526113728185611249565b9998505050505050505050565b848152606060208201526000611399606083018587611200565b82810360408401526113ab8185611249565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006113ab608083018486611200565b838152604060208201526000611305604083018486611200565b60006020828403121561143457600080fd5b5051919050565b8082018082111561045c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122088ba4caf813dddb87f7b16ee6c2b7d47544e7ce3683f60d6984a2dd9c9279b0d64736f6c634300081a0033"; type ZetaConnectorNonNativeConstructorParams = | [signer?: Signer] diff --git a/v2/types/factories/index.ts b/v2/types/factories/index.ts index 51ee61f2..8015db11 100644 --- a/v2/types/factories/index.ts +++ b/v2/types/factories/index.ts @@ -10,11 +10,13 @@ export * as iReceiverEvmSol from "./IReceiverEVM.sol"; export * as iwzetaSol from "./IWZETA.sol"; export * as izrc20Sol from "./IZRC20.sol"; export * as iZetaConnectorSol from "./IZetaConnector.sol"; +export * as revertSol from "./Revert.sol"; export * as stdErrorSol from "./StdError.sol"; export * as stdStorageSol from "./StdStorage.sol"; export * as systemContractSol from "./SystemContract.sol"; export * as systemContractMockSol from "./SystemContractMock.sol"; export * as transparentUpgradeableProxySol from "./TransparentUpgradeableProxy.sol"; +export * as universalContractSol from "./UniversalContract.sol"; export * as vmSol from "./Vm.sol"; export * as wzetaSol from "./WZETA.sol"; export * as zrc20Sol from "./ZRC20.sol"; @@ -23,7 +25,6 @@ export * as draftIerc1822Sol from "./draft-IERC1822.sol"; export * as draftIerc6093Sol from "./draft-IERC6093.sol"; export * as introspection from "./introspection"; export * as utils from "./utils"; -export * as zContractSol from "./zContract.sol"; export { AccessControl__factory } from "./AccessControl__factory"; export { AccessControlUpgradeable__factory } from "./AccessControlUpgradeable__factory"; export { Address__factory } from "./Address__factory"; @@ -72,7 +73,7 @@ export { StdAssertions__factory } from "./StdAssertions__factory"; export { StdInvariant__factory } from "./StdInvariant__factory"; export { Test__factory } from "./Test__factory"; export { TestERC20__factory } from "./TestERC20__factory"; -export { TestZContract__factory } from "./TestZContract__factory"; +export { TestUniversalContract__factory } from "./TestUniversalContract__factory"; export { UUPSUpgradeable__factory } from "./UUPSUpgradeable__factory"; export { UpgradeableBeacon__factory } from "./UpgradeableBeacon__factory"; export { ZetaConnectorBase__factory } from "./ZetaConnectorBase__factory"; diff --git a/v2/types/index.ts b/v2/types/index.ts index c3d0734e..9564c5a1 100644 --- a/v2/types/index.ts +++ b/v2/types/index.ts @@ -19,6 +19,8 @@ import type * as izrc20Sol from "./IZRC20.sol"; export type { izrc20Sol }; import type * as iZetaConnectorSol from "./IZetaConnector.sol"; export type { iZetaConnectorSol }; +import type * as revertSol from "./Revert.sol"; +export type { revertSol }; import type * as stdErrorSol from "./StdError.sol"; export type { stdErrorSol }; import type * as stdStorageSol from "./StdStorage.sol"; @@ -29,6 +31,8 @@ import type * as systemContractMockSol from "./SystemContractMock.sol"; export type { systemContractMockSol }; import type * as transparentUpgradeableProxySol from "./TransparentUpgradeableProxy.sol"; export type { transparentUpgradeableProxySol }; +import type * as universalContractSol from "./UniversalContract.sol"; +export type { universalContractSol }; import type * as vmSol from "./Vm.sol"; export type { vmSol }; import type * as wzetaSol from "./WZETA.sol"; @@ -45,8 +49,6 @@ import type * as introspection from "./introspection"; export type { introspection }; import type * as utils from "./utils"; export type { utils }; -import type * as zContractSol from "./zContract.sol"; -export type { zContractSol }; export type { AccessControl } from "./AccessControl"; export type { AccessControlUpgradeable } from "./AccessControlUpgradeable"; export type { Address } from "./Address"; @@ -95,7 +97,7 @@ export type { StdAssertions } from "./StdAssertions"; export type { StdInvariant } from "./StdInvariant"; export type { Test } from "./Test"; export type { TestERC20 } from "./TestERC20"; -export type { TestZContract } from "./TestZContract"; +export type { TestUniversalContract } from "./TestUniversalContract"; export type { UUPSUpgradeable } from "./UUPSUpgradeable"; export type { UpgradeableBeacon } from "./UpgradeableBeacon"; export type { ZetaConnectorBase } from "./ZetaConnectorBase"; @@ -133,6 +135,8 @@ export { IAccessControl__factory } from "./factories/IAccessControl__factory"; export { IBeacon__factory } from "./factories/IBeacon__factory"; export { IERC165__factory } from "./factories/IERC165__factory"; export { IERC1967__factory } from "./factories/IERC1967__factory"; +export type { IERC20Custody } from "./IERC20Custody.sol/IERC20Custody"; +export { IERC20Custody__factory } from "./factories/IERC20Custody.sol/IERC20Custody__factory"; export type { IERC20CustodyErrors } from "./IERC20Custody.sol/IERC20CustodyErrors"; export { IERC20CustodyErrors__factory } from "./factories/IERC20Custody.sol/IERC20CustodyErrors__factory"; export type { IERC20CustodyEvents } from "./IERC20Custody.sol/IERC20CustodyEvents"; @@ -153,8 +157,6 @@ export type { IGatewayEVMErrors } from "./IGatewayEVM.sol/IGatewayEVMErrors"; export { IGatewayEVMErrors__factory } from "./factories/IGatewayEVM.sol/IGatewayEVMErrors__factory"; export type { IGatewayEVMEvents } from "./IGatewayEVM.sol/IGatewayEVMEvents"; export { IGatewayEVMEvents__factory } from "./factories/IGatewayEVM.sol/IGatewayEVMEvents__factory"; -export type { Revertable } from "./IGatewayEVM.sol/Revertable"; -export { Revertable__factory } from "./factories/IGatewayEVM.sol/Revertable__factory"; export type { IGatewayZEVM } from "./IGatewayZEVM.sol/IGatewayZEVM"; export { IGatewayZEVM__factory } from "./factories/IGatewayZEVM.sol/IGatewayZEVM__factory"; export type { IGatewayZEVMErrors } from "./IGatewayZEVM.sol/IGatewayZEVMErrors"; @@ -191,6 +193,8 @@ export { ProxyAdmin__factory } from "./factories/ProxyAdmin__factory"; export { ReceiverEVM__factory } from "./factories/ReceiverEVM__factory"; export { ReentrancyGuard__factory } from "./factories/ReentrancyGuard__factory"; export { ReentrancyGuardUpgradeable__factory } from "./factories/ReentrancyGuardUpgradeable__factory"; +export type { Revertable } from "./Revert.sol/Revertable"; +export { Revertable__factory } from "./factories/Revert.sol/Revertable__factory"; export { SafeERC20__factory } from "./factories/SafeERC20__factory"; export { SenderZEVM__factory } from "./factories/SenderZEVM__factory"; export { StdAssertions__factory } from "./factories/StdAssertions__factory"; @@ -207,11 +211,15 @@ export type { SystemContractMock } from "./SystemContractMock.sol/SystemContract export { SystemContractMock__factory } from "./factories/SystemContractMock.sol/SystemContractMock__factory"; export { Test__factory } from "./factories/Test__factory"; export { TestERC20__factory } from "./factories/TestERC20__factory"; -export { TestZContract__factory } from "./factories/TestZContract__factory"; +export { TestUniversalContract__factory } from "./factories/TestUniversalContract__factory"; export type { ITransparentUpgradeableProxy } from "./TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy"; export { ITransparentUpgradeableProxy__factory } from "./factories/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory"; export type { TransparentUpgradeableProxy } from "./TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy"; export { TransparentUpgradeableProxy__factory } from "./factories/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory"; +export type { UniversalContract } from "./UniversalContract.sol/UniversalContract"; +export { UniversalContract__factory } from "./factories/UniversalContract.sol/UniversalContract__factory"; +export type { ZContract } from "./UniversalContract.sol/ZContract"; +export { ZContract__factory } from "./factories/UniversalContract.sol/ZContract__factory"; export { UpgradeableBeacon__factory } from "./factories/UpgradeableBeacon__factory"; export type { Strings } from "./utils/Strings"; export { Strings__factory } from "./factories/utils/Strings__factory"; @@ -222,10 +230,6 @@ export type { VmSafe } from "./Vm.sol/VmSafe"; export { VmSafe__factory } from "./factories/Vm.sol/VmSafe__factory"; export type { WETH9 } from "./WZETA.sol/WETH9"; export { WETH9__factory } from "./factories/WZETA.sol/WETH9__factory"; -export type { UniversalContract } from "./zContract.sol/UniversalContract"; -export { UniversalContract__factory } from "./factories/zContract.sol/UniversalContract__factory"; -export type { ZContract } from "./zContract.sol/ZContract"; -export { ZContract__factory } from "./factories/zContract.sol/ZContract__factory"; export type { ZetaErrors } from "./Zeta.non-eth.sol/ZetaErrors"; export { ZetaErrors__factory } from "./factories/Zeta.non-eth.sol/ZetaErrors__factory"; export type { ZetaNonEth } from "./Zeta.non-eth.sol/ZetaNonEth";