183 txs
195 calls
constructor
constructor(address _swapTokenAddress, address[] _allowedTokens, uint256[] _minSwapAmounts, uint256 _fee, address _treasury)
functions
allowedTokens
viewfunction allowedTokens(address token) view returns (bool isAllowed)
collectedFee
viewfunction collectedFee() view returns (uint256)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
defaultAdmin
viewfunction defaultAdmin() view returns (address)
defaultAdminDelay
viewfunction defaultAdminDelay() view returns (uint48)
defaultAdminDelayIncreaseWait
viewfunction defaultAdminDelayIncreaseWait() view returns (uint48)
FEE_DENOMINATOR
viewfunction FEE_DENOMINATOR() view returns (uint256)
fee
viewfunction fee() view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
MAX_FEE
viewfunction MAX_FEE() view returns (uint256)
minSwapAmounts
viewfunction minSwapAmounts(address token) view returns (uint256 minSwapAmount)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
pendingDefaultAdmin
viewfunction pendingDefaultAdmin() view returns (address newAdmin, uint48 schedule)
pendingDefaultAdminDelay
viewfunction pendingDefaultAdminDelay() view returns (uint48 newDelay, uint48 schedule)
SERVICE_ROLE
viewfunction SERVICE_ROLE() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
SWAP_TOKEN_ADDRESS
viewfunction SWAP_TOKEN_ADDRESS() view returns (address)
swapRequests
viewfunction swapRequests(uint256 id) view returns (uint256 id, uint256 amount, uint256 minExpectedAmount, address provider, address token, uint8 state)
swapRequestsCounter
viewfunction swapRequestsCounter() view returns (uint256)
treasury
viewfunction treasury() view returns (address)
acceptDefaultAdminTransfer
nonpayablefunction acceptDefaultAdminTransfer()
addAllowedToken
nonpayablefunction addAllowedToken(address _allowedTokenAddress, uint256 _minSwapAmount)
beginDefaultAdminTransfer
nonpayablefunction beginDefaultAdminTransfer(address newAdmin)
cancelDefaultAdminTransfer
nonpayablefunction cancelDefaultAdminTransfer()
cancelSwap
nonpayablefunction cancelSwap(uint256 _id)
changeDefaultAdminDelay
nonpayablefunction changeDefaultAdminDelay(uint48 newDelay)
completeSwap
nonpayablefunction completeSwap(bytes32 _idempotencyKey, uint256 _id, uint256 _targetAmount)
emergencyWithdraw
nonpayablefunction emergencyWithdraw(address _token)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
pause
nonpayablefunction pause()
removeAllowedToken
nonpayablefunction removeAllowedToken(address _allowedTokenAddress)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address account)
requestSwap
nonpayablefunction requestSwap(address _depositTokenAddress, uint256 _amount, uint256 _minExpectedAmount)
requestSwapWithPermit
nonpayablefunction requestSwapWithPermit(address _depositTokenAddress, uint256 _amount, uint256 _minExpectedAmount, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
rollbackDefaultAdminDelay
nonpayablefunction rollbackDefaultAdminDelay()
setFee
nonpayablefunction setFee(uint256 _feePart)
setMinSwapAmount
nonpayablefunction setMinSwapAmount(address requestedTokenAddress, uint256 newAmount)
setTreasury
nonpayablefunction setTreasury(address _treasuryAddress)
transferFee
nonpayablefunction transferFee()
unpause
nonpayablefunction unpause()
events
AllowedTokenAdded
event AllowedTokenAdded(address tokenAddress)
AllowedTokenRemoved
event AllowedTokenRemoved(address tokenAddres)
DefaultAdminDelayChangeCanceled
event DefaultAdminDelayChangeCanceled()
DefaultAdminDelayChangeScheduled
event DefaultAdminDelayChangeScheduled(uint48 newDelay, uint48 effectSchedule)
DefaultAdminTransferCanceled
event DefaultAdminTransferCanceled()
DefaultAdminTransferScheduled
event DefaultAdminTransferScheduled(address indexed newAdmin, uint48 acceptSchedule)
EmergencyWithdrawn
event EmergencyWithdrawn(address tokenAddress, uint256 amount)
FeeSet
event FeeSet(uint256 fee)
FeeTransferred
event FeeTransferred(uint256 amount)
MinimumSwapAmountSet
event MinimumSwapAmountSet(address requestedTokenAddress, uint256 newAmount)
Paused
event Paused(address account)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SwapRequestCancelled
event SwapRequestCancelled(uint256 indexed id)
SwapRequestCompleted
event SwapRequestCompleted(bytes32 indexed idempotencyKey, uint256 indexed id, uint256 swappedAmount, uint256 takenFee)
SwapRequestCreated
event SwapRequestCreated(uint256 indexed id, address indexed provider, address depositToken, uint256 amount, uint256 minSwapAmount)
TreasurySet
event TreasurySet(address treasuryAddress)
Unpaused
event Unpaused(address account)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlEnforcedDefaultAdminDelay
error AccessControlEnforcedDefaultAdminDelay(uint48 schedule)
AccessControlEnforcedDefaultAdminRules
error AccessControlEnforcedDefaultAdminRules()
AccessControlInvalidDefaultAdmin
error AccessControlInvalidDefaultAdmin(address defaultAdmin)
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AddressIsNotContract
error AddressIsNotContract(address actual)
EnforcedPause
error EnforcedPause()
ExpectedPause
error ExpectedPause()
FailedInnerCall
error FailedInnerCall()
FeeMoreThanMaxFee
error FeeMoreThanMaxFee(uint256 fee, uint256 maxFee)
IdempotencyKeyAlreadyExist
error IdempotencyKeyAlreadyExist(bytes32 _idempotencyKey)
IllegalAddress
error IllegalAddress(address expected, address actual)
IllegalMinSwapParameters
error IllegalMinSwapParameters(address[] tokens, uint256[] minSwapAmounts)
IllegalState
error IllegalState(uint8 expected, uint8 current)
InsufficientAmount
error InsufficientAmount(uint256 amount, uint256 minAmount)
InvalidAmount
error InvalidAmount(uint256 _amount)
InvalidTokenAddress
error InvalidTokenAddress(address token)
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SwapRequestNotExist
error SwapRequestNotExist(uint256 id)
TokenIsNotSupported
error TokenIsNotSupported(address _tokenAddress)
TokenNotAllowed
error TokenNotAllowed(address token)
ZeroAddress
error ZeroAddress()
ZeroFee
error ZeroFee()
creation bytecode
0x60a0604052346100455761001d61001461023b565b939290926104a2565b6040516130b46107e9823960805181818161048f01528181611d1f01526120dd01526130b490f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761008157604052565b61004a565b9061009a61009360405190565b9283610060565b565b6001600160a01b031690565b90565b6001600160a01b0381165b0361004557565b9050519061009a826100ab565b6001600160401b0381116100815760208091020190565b909291926100f66100f1826100ca565b610086565b938185526020808601920283019281841161004557915b83831061011a5750505050565b6020809161012884866100bd565b81520192019161010d565b9080601f830112156100455781516100a8926020016100e1565b806100b6565b9050519061009a8261014d565b909291926101706100f1826100ca565b938185526020808601920283019281841161004557915b8383106101945750505050565b602080916101a28486610153565b815201920191610187565b9080601f830112156100455781516100a892602001610160565b919060a083820312610045576101dd81846100bd565b60208401519093906001600160401b03811161004557826101ff918301610133565b60408201519093906001600160401b03811161004557610224846100a89285016101ad565b9360806102348260608701610153565b94016100bd565b61025961389d8038038061024e81610086565b9283398101906101c7565b9091929394565b61026d6100a86100a89290565b65ffffffffffff1690565b61009c6100a86100a89290565b6100a890610278565b1561029557565b63d92e233d60e01b6000908152600490fd5b906102c76102c06102b6845190565b8084529260200190565b9260200190565b9060005b8181106102d85750505090565b9091926102fe6102f760019286516001600160a01b0316815260200190565b9460200190565b9291016102cb565b906103156102c06102b6845190565b9060005b8181106103265750505090565b90919261033c6102f76001928651815260200190565b929101610319565b60408082526100a893919261035b918401906102a7565b916020818403910152610306565b15610372575050565b61039461037e60405190565b6330db812d60e11b815292839260048401610344565b0390fd5b6100a86100a86100a89290565b634e487b7160e01b600052603260045260246000fd5b906103c4825190565b8110156103d5576020809102010190565b6103a5565b6100a89061009c906001600160a01b031682565b6100a8906103da565b6100a8906103ee565b9061040a906103f7565b600052602052604060002090565b90600019905b9181191691161790565b906104386100a861043f92610398565b8254610418565b9055565b9060ff9061041e565b9061045c6100a861043f92151590565b8254610443565b1561046a57565b63af13986d60e01b6000908152600490fd5b906001600160a01b039061041e565b9061049b6100a861043f926103f7565b825461047c565b94909192936104bd6104b662015180610260565b33906105e8565b6000946104c986610285565b966104ea6001600160a01b0389165b6001600160a01b0383165b141561028e565b60805261051285856104fa815190565b61050c6105086100a8855190565b9190565b14610369565b61051b86610398565b6105266100a8865190565b8110156105b257806105a760016105a28b61059b61058b610587878e6105828f6105666105596105ad9e610573936103bb565b516001600160a01b031690565b976001600160a01b031690565b6001600160a01b0388166104e3565b6103bb565b5190565b610596836008610400565b610428565b6009610400565b61044c565b60010190565b61051b565b506104d892969194506105e1935061009c906105da6105d361009a98610398565b8211610463565b6004610428565b600a61048b565b906105f291610647565b61009a6000600361044c565b906001600160d01b03199060d01b61041e565b61026d6100a86100a89265ffffffffffff1690565b906106366100a861043f92610611565b82546105fe565b6100a86000610398565b600061065281610285565b6001600160a01b0381166001600160a01b0385161461068c5750509061067c610689926001610626565b61068461063d565b6106a9565b50565b636116401160e11b82526001600160a01b03166004820152602490fd5b91906106b66100a861063d565b83146106c7575b6100a8919261073f565b6106cf61072f565b926000936106ef6106e261009c87610285565b916001600160a01b031690565b0361070d576100a892935061070582600261048b565b9291506106bd565b631fe1e13d60e11b8452600484fd5b6100a89061009c565b6100a8905461071c565b6100a86002610725565b9061040a565b61075061074c83836107c5565b1590565b156107be5761077060016105a284600061076a8682610739565b01610400565b61078a61078461077e339390565b936103f7565b916103f7565b917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d6107b560405190565b600090a4600190565b5050600090565b6100a891600061076a6107e1936107da600090565b5082610739565b5460ff169056fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146102bd578063022d63fb146102b85780630aa6220b146102b3578063248a9ca3146102ae57806327200be0146102a95780632ce0ea5c146102a45780632f2ff15d1461029f5780632f6ce9681461029a57806334e181251461029557806336568abe146102905780633f4ba83a1461028b578063496dbfd91461028657806354d6a2b7146102815780635a46e31d1461027c5780635b5031d8146102775780635c975abb1461027257806361d027b31461026d578063634e93da14610268578063649a5ec71461026357806369fe0e2d1461025e5780636ff1c9bc146102595780638456cb591461025457806384ef8ffc1461024f5780638da5cb5b1461024f57806390469a9d1461024a57806391d14854146102455780639c61d7a414610240578063a1eda53c1461023b578063a20e7d4714610236578063a217fddf14610231578063acb2ad6f1461022c578063bc063e1a14610227578063cc8463c814610222578063cefc14291461021d578063cf6eefb714610218578063d547741f14610213578063d602b9fd1461020e578063d73792a914610209578063ddca3f4314610204578063e744092e146101ff578063e811f50a146101fa578063f0f44260146101f55763fc44d58c036102ed57610cf9565b610cc8565b610cad565b610c86565b610c3e565b610c17565b610beb565b610bd2565b610ba4565b610b60565b610b45565b610b2a565b610afe565b610ae3565b610a98565b610a6a565b610a0e565b610863565b61084b565b610819565b610801565b6107e9565b6107d1565b6107b9565b610772565b610757565b610718565b6106ff565b6106b7565b61062a565b610611565b6105f9565b6105e0565b6105c5565b610534565b6104f9565b61047a565b610461565b6103d1565b61038d565b610358565b61031c565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b036102ed57565b600080fd5b905035906102ff826102c2565b565b906020828203126102ed57610315916102f2565b90565b9052565b346102ed57610349610337610332366004610301565b610d12565b60405191829182901515815260200190565b0390f35b60009103126102ed57565b346102ed5761036836600461034d565b610349610373610d84565b6040515b9182918265ffffffffffff909116815260200190565b346102ed5761039d36600461034d565b6103a5610dab565b604051005b806102e6565b905035906102ff826103aa565b906020828203126102ed57610315916103b0565b346102ed576103496103ec6103e73660046103bd565b610db9565b6040519182918290815260200190565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81166102e6565b905035906102ff82610415565b91906040838203126102ed5761031590602061045a8286610431565b94016103b0565b346102ed576103a561047436600461043e565b90610f91565b346102ed5761048a36600461034d565b6103497f00000000000000000000000000000000000000000000000000000000000000005b6040519182918273ffffffffffffffffffffffffffffffffffffffff909116815260200190565b91906040838203126102ed576103159060206104f282866103b0565b9401610431565b346102ed576103a561050c3660046104d6565b90610f9b565b610315916008021c81565b906103159154610512565b6103156000600661051d565b346102ed5761054436600461034d565b6103496103ec610528565b906020828203126102ed5761031591610431565b6103fc6103156103159273ffffffffffffffffffffffffffffffffffffffff1690565b61031590610563565b61031590610586565b906105a29061058f565b600052602052604060002090565b60006105c0610315926008610598565b61051d565b346102ed576103496103ec6105db36600461054f565b6105b0565b346102ed576103a56105f33660046104d6565b90611039565b346102ed5761060936600461034d565b6103a5611174565b346102ed576103a561062436600461043e565b9061132f565b346102ed576103a561063d3660046103bd565b6115d7565b60ff81166102e6565b905035906102ff82610642565b60e0818303126102ed5761066c8282610431565b9261067a83602084016103b0565b9261068881604085016103b0565b9261069682606083016103b0565b926103156106a7846080850161064b565b9360c061045a8260a087016103b0565b346102ed576103a56106ca366004610658565b959490949391936116c7565b90916060828403126102ed576103156106ef8484610431565b93604061045a82602087016103b0565b346102ed576103a56107123660046106d6565b91611970565b346102ed5761072836600461034d565b61034961033761197b565b610315916008021c6103fc565b906103159154610733565b6103156000600a610740565b346102ed5761076736600461034d565b6103496104af61074b565b346102ed576103a561078536600461054f565b61199d565b65ffffffffffff81166102e6565b905035906102ff8261078a565b906020828203126102ed5761031591610798565b346102ed576103a56107cc3660046107a5565b6119be565b346102ed576103a56107e43660046103bd565b611a5b565b346102ed576103a56107fc36600461054f565b611b7d565b346102ed5761081136600461034d565b6103a5611b9c565b346102ed5761082936600461034d565b6103496104af60025473ffffffffffffffffffffffffffffffffffffffff1690565b346102ed576103a561085e36600461054f565b611c0b565b346102ed576103496103376108793660046104d6565b90611c14565b6103156103156103159290565b906105a29061087f565b6103159081565b6103159054610896565b6103159060a01c5b60ff1690565b61031590546108a7565b6108ca90600761088c565b906108d48261089d565b916108e16001820161089d565b916108ee6002830161089d565b91610910600382015473ffffffffffffffffffffffffffffffffffffffff1690565b9161031560046109368185015473ffffffffffffffffffffffffffffffffffffffff1690565b93016108b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003111561097657565b61093d565b906102ff8261096c565b6103159061097b565b61031890610985565b91946109ea610a07929897956109cd60a0966109c66102ff9a6109bf60c08a019e60008b0152565b6020890152565b6040870152565b73ffffffffffffffffffffffffffffffffffffffff166060850152565b73ffffffffffffffffffffffffffffffffffffffff166080830152565b019061098e565b346102ed57610349610a29610a243660046103bd565b6108bf565b92610a3996949692919260405190565b96879687610997565b65ffffffffffff90911681526040810192916102ff916020905b019065ffffffffffff169052565b346102ed57610a7a36600461034d565b610a82611c77565b90610349610a8f60405190565b92839283610a42565b346102ed57610aa836600461034d565b6103497fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b6103ec565b610315600061087f565b610315610ad1565b346102ed57610af336600461034d565b6103496103ec610adb565b346102ed57610b0e36600461034d565b6103a5611d4a565b610315620186a061087f565b610315610b16565b346102ed57610b3a36600461034d565b6103496103ec610b22565b346102ed57610b5536600461034d565b610349610373611d52565b346102ed57610b7036600461034d565b6103a5611d96565b73ffffffffffffffffffffffffffffffffffffffff90911681526040810192916102ff91602090610a5c565b346102ed57610bb436600461034d565b610bbc611e15565b90610349610bc960405190565b92839283610b78565b346102ed576103a5610be53660046104d6565b90611e39565b346102ed57610bfb36600461034d565b6103a5611e6a565b610315620f424061087f565b610315610c03565b346102ed57610c2736600461034d565b6103496103ec610c0f565b6103156000600461051d565b346102ed57610c4e36600461034d565b6103496103ec610c32565b610315916008021c6108af565b906103159154610c59565b6000610c81610315926009610598565b610c66565b346102ed57610349610337610c9c36600461054f565b610c71565b6103156000600561051d565b346102ed57610cbd36600461034d565b6103496103ec610ca1565b346102ed576103a5610cdb36600461054f565b611ef9565b90916060828403126102ed576103156106ef84846103b0565b346102ed576103a5610d0c366004610ce0565b91612205565b7f31498786000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821614908115610d62575090565b6103159150612210565b610d796103156103159290565b65ffffffffffff1690565b61031562069780610d6c565b610da0610d9b610ad1565b6122ac565b6102ff6102ff6122b7565b6102ff610d90565b906105a2565b6001610dd261031592610dca600090565b506000610db3565b0161089d565b906102ff91610de8610d9b610ad1565b610ef1565b6103fc6103156103159290565b61031590610ded565b15610e0a57565b7fd92e233d00000000000000000000000000000000000000000000000000000000600090815260045b036000fd5b15610e405750565b7f7330680300000000000000000000000000000000000000000000000000000000600090815273ffffffffffffffffffffffffffffffffffffffff9091166004526024036000fd5b9060ff905b9181191691161790565b90610ea7610315610eae92151590565b8254610e88565b9055565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90610e8d565b90610eea610315610eae9261087f565b8254610eb2565b610f8c906104af7ff849d00bc67e9e4bf072df9680646c59b8c5380160834c2e1d4896ce5ec81f7593610f49610f2a6103fc6000610dfa565b73ffffffffffffffffffffffffffffffffffffffff85165b1415610e03565b610f6783803b610f60610f5c600061087f565b9190565b1415610e38565b610f7c6001610f77856009610598565b610e97565b610f87836008610598565b610eda565b0390a1565b906102ff91610dd8565b90610fa7610315610ad1565b8214610fb6576102ff916122e8565b7f3fc3c27a000000000000000000000000000000000000000000000000000000006000908152600490fd5b91906008610e8d910291610ffa65ffffffffffff841b90565b921b90565b610d796103156103159265ffffffffffff1690565b9190611025610315610eae93610fff565b908354610fe1565b6102ff91600091611014565b9190611046610315610ad1565b83148061111e575b61105d575b6102ff9192612334565b611065611e15565b600094916110926110786103fc88610dfa565b9173ffffffffffffffffffffffffffffffffffffffff1690565b1415801561110c575b80156110f6575b6110c157506102ff9293506110b96014600161102d565b929150611053565b7f19ca5ebb00000000000000000000000000000000000000000000000000000000855265ffffffffffff166004850152602484fd5b5061110761110382612325565b1590565b6110a2565b50611119611103826122f2565b61109b565b506111416103fc60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff82161461104e565b611169610d9b610ad1565b6102ff6102ff6123cf565b6102ff61115e565b610315906108af565b610315905461117c565b156111975750565b7f94403b7000000000000000000000000000000000000000000000000000000000600090815273ffffffffffffffffffffffffffffffffffffffff9091166004526024036000fd5b906102ff916112106111f46103fc6000610dfa565b73ffffffffffffffffffffffffffffffffffffffff8316610f42565b61122c81611227611222826009610598565b611185565b61118f565b906102ff9161123c610d9b610ad1565b6112bf565b156112495750565b7ff08997ea00000000000000000000000000000000000000000000000000000000600090815273ffffffffffffffffffffffffffffffffffffffff9091166004526024036000fd5b73ffffffffffffffffffffffffffffffffffffffff90911681526040810192916102ff9160200152565b0152565b907fd400ea161e2c6efd2ccce9fd83982dd8e137c4aff608148b3454849e2e265fb5916112f26111f46103fc6000610dfa565b61130b81803b611305610f5c600061087f565b11611241565b61131a82610f87836008610598565b610f8c61132660405190565b92839283611291565b906102ff916111df565b156113415750565b7fd9e5955f000000000000000000000000000000000000000000000000000000006000908152600491909152602490fd5b6102ff906113bc816113a5600361138a83600761088c565b015473ffffffffffffffffffffffffffffffffffffffff1690565b6113b56110786103fc6000610dfa565b1415611339565b6114a2565b156113ca575050565b7f95eed10500000000000000000000000000000000000000000000000000000000600090815273ffffffffffffffffffffffffffffffffffffffff9182166004529116602452604490fd5b9160206102ff929493610a076040820196600083019061098e565b15611439575050565b7f074104ef00000000000000000000000000000000000000000000000000000000600090815291610e33916004611415565b9074ff00000000000000000000000000000000000000009060a01b610e8d565b9061149b610315610eae92610985565b825461146b565b6115a5906115a06114b761031583600761088c565b600381019061150c6114dd835473ffffffffffffffffffffffffffffffffffffffff1690565b6114e633611078565b14611505845473ffffffffffffffffffffffffffffffffffffffff1690565b33916113c1565b61159a60016115936115786115736004860161154e61153261152d836108b5565b61097b565b61153c600061097b565b146000611548846108b5565b91611430565b61155960028261148b565b5473ffffffffffffffffffffffffffffffffffffffff1690565b61058f565b945473ffffffffffffffffffffffffffffffffffffffff1690565b920161089d565b91612415565b61087f565b7f1bfd07a0b46ace4436adac2a6736e704c48d823ee42794668a933dd3ae12d2d56115cf60405190565b80805b0390a2565b6102ff90611372565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810190811067ffffffffffffffff82111761164f57604052565b6115e0565b949290979695939160e0860198600087016116839173ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660208601526040850152606084015260ff16608083015260a082015260c00152565b6040513d6000823e3d90fd5b9294909391946116d96115738561058f565b6116e23061058f565b92813b156102ed57600080946117346102ff9b8a9461170060405190565b998a98899788967fd505accf0000000000000000000000000000000000000000000000000000000088523360048901611654565b03925af1908161174a575b501561197057611970565b6117639060005b61175b818361160f565b81019061034d565b3861173f565b503d611751565b906102ff92916117866111f46103fc6000610dfa565b61179881611227611222826009610598565b906102ff92916117a661245d565b611866565b156117b35750565b7f3728b83d000000000000000000000000000000000000000000000000000000006000908152600491909152602490fd5b9081526040810192916102ff9160200152565b15611800575050565b7f6d400e3800000000000000000000000000000000000000000000000000000000600090815291610e339160046117e4565b73ffffffffffffffffffffffffffffffffffffffff90911681526060810193926102ff9290916040916112bb906020830152565b906118c692916118828261187a600061087f565b8114156117ab565b6118a3611898611893836008610598565b61089d565b83815b8110156117f7565b6118c1826118b08361058f565b6118b93061058f565b9033906124c8565b612626565b8051907f312f5710dedbe1188a87079cc83fb2e0b7e29744b0f336a07172b67ca993222661190b606083015173ffffffffffffffffffffffffffffffffffffffff1690565b9161192d608082015173ffffffffffffffffffffffffffffffffffffffff1690565b61196b61195861195261194c6040611946602088015190565b96015190565b9761087f565b9561058f565b9561196260405190565b93849384611832565b0390a3565b906102ff9291611770565b6103156003611185565b6102ff90611994610d9b610ad1565b6102ff906126db565b6102ff90611985565b6102ff906119b5610d9b610ad1565b6102ff90612731565b6102ff906119a6565b6102ff906119d6610d9b610ad1565b611a16565b156119e4575050565b7f5e3d9ef200000000000000000000000000000000000000000000000000000000600090815291610e339160046117e4565b610f8c7f20461e09b8e557b77e107939f9ce6544698123aad0fc964ac5cc59b7df2e608f91611a50611a46610b16565b82818111156119db565b6103ec816004610eda565b6102ff906119c7565b6102ff90611a73610d9b610ad1565b611a99565b905051906102ff826103aa565b906020828203126102ed5761031591611a78565b611b0090611aa68161058f565b6020611ab13061058f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015293849081906024820190565b0381845afa918215611b78577f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e5193600093611b43575b508261131a913390612415565b61131a919350611b6a9060203d602011611b71575b611b62818361160f565b810190611a85565b9290611b36565b503d611b58565b6116bb565b6102ff90611a64565b611b91610d9b610ad1565b6102ff6102ff6127c0565b6102ff611b86565b6102ff90611bb3610d9b610ad1565b610f8c7fbf996b4fd74f0c7159bb017b1db415b0d9a6f13129f46d0b93309d170b78df3191611be86111f46103fc6000610dfa565b611bfb81803b610f60610f5c600061087f565b6104af6000610f77836009610598565b6102ff90611ba4565b610315916000611c3061122293611c29600090565b5082610db3565b01610598565b6103159060d01c610d79565b6103159054611c36565b611c5b61031591939293610d6c565b92610d6c565b6103159060a01c610d79565b6103159054611c61565b611c816002611c42565b90611c8b826122f2565b80611cb4575b60009015611ca45750610f5c6002611c6d565b611cb091925080611c4c565b9091565b50611cc161110383612325565b611c91565b611cd1610d9b610ad1565b6102ff7f5cda24acfa5bfafbaf2d2b6c11aef72aa9a990722fefe85b90f06f3c878a553f610f8c611d02600561089d565b611d16611d0f600061087f565b6005610eda565b6103ec81611d437f000000000000000000000000000000000000000000000000000000000000000061058f565b3390612415565b6102ff611cc6565b611d5c6002611c42565b611d65816122f2565b9081611d86575b5015611d7c576103156002611c6d565b6103156001611c42565b611d909150612325565b38611d6c565b611d9e611e15565b50611da833611078565b73ffffffffffffffffffffffffffffffffffffffff821603611dcd57506102ff612814565b7fc22c802200000000000000000000000000000000000000000000000000000000600090815273ffffffffffffffffffffffffffffffffffffffff9091166004526024036000fd5b60015473ffffffffffffffffffffffffffffffffffffffff16906103156001611c6d565b90611e45610315610ad1565b8214610fb6576102ff916128ee565b611e5f610d9b610ad1565b6102ff6102ff6128f8565b6102ff611e54565b6102ff90611e81610d9b610ad1565b611eb9565b9073ffffffffffffffffffffffffffffffffffffffff90610e8d565b90611eb2610315610eae9261058f565b8254611e86565b610f8c7f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f91611eee6111f46103fc6000610dfa565b6104af81600a611ea2565b6102ff90611e72565b6102ff929190611f317fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b6122ac565b906102ff9291611f4b826113a5600361138a83600761088c565b612023565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810292918115918404141715611f9257565b611f50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8115611fd0570490565b611f97565b91908203918211611f9257565b9081526060810193926102ff9290916040916112bb905b73ffffffffffffffffffffffffffffffffffffffff166020830152565b91908201809211611f9257565b61203161031583600761088c565b906000600483019461205c61204861152d886108b5565b6120518461097b565b1483611548896108b5565b61208061207261206c600461089d565b83611f7f565b61207a610c03565b90611fc6565b926120db6120b66115736120948786611fd5565b996120ab6120a460028b0161089d565b8c8161189b565b61155960018261148b565b600a5473ffffffffffffffffffffffffffffffffffffffff1661159a6001890161089d565b7f00000000000000000000000000000000000000000000000000000000000000006121086115738261058f565b926121123061058f565b90843b156102ed5761214a9486928361212a60405190565b80988195829461213e637ed9db5960e01b90565b84528a60048501611fe2565b03925af1908115611b78577fa8a95077b6db52bf36d8a13581553d880f9ebb49b0d9b50ad6b3dec3d48985b0966121c660036121aa8c946121d2996121cc99610315986121e8575b5050611573611d0f8c6121a5600561089d565b612016565b92015473ffffffffffffffffffffffffffffffffffffffff1690565b90612415565b9361087f565b9361196b6121df60405190565b928392836117e4565b816121fe92903d106117695761175b818361160f565b3880612192565b906102ff9291611f02565b7f7965db0b000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821614908115612260575090565b61031591507fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b6102ff903390612915565b6102ff6122c46000610d6c565b806129db565b906102ff916122db610d9b82610db9565b906122e591612a65565b50565b906102ff916122ca565b61230b6122ff6000610d6c565b9165ffffffffffff1690565b141590565b6103156103156103159265ffffffffffff1690565b612330425b91612310565b1090565b9061233e336103fc565b73ffffffffffffffffffffffffffffffffffffffff821603612363576122e591612af5565b7f6697b232000000000000000000000000000000000000000000000000000000006000908152600490fd5b612396612b63565b6102ff6123a560006003610e97565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610f8c336104af565b6102ff61238e565b6123f06123ea6103159263ffffffff1690565b60e01b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b6124586004926124496102ff9561242f63a9059cbb6123d7565b9261243960405190565b9687946020860190815201611291565b6020820181038252038361160f565b612bc8565b61246561197b565b61246b57565b7fd93c0665000000000000000000000000000000000000000000000000000000006000908152600490fd5b73ffffffffffffffffffffffffffffffffffffffff90911681526060810193926102ff9290916040916112bb90611ff9565b90612458906124496102ff956004956124e46323b872dd6123d7565b936124ee60405190565b9788956020870190815201612496565b906102ff61250b60405190565b928361160f565b61031560c06124fe565b612524612512565b906000825260208080808080870160008152016000815201600081520160008152016000905250565b61031561251c565b906103189061097b565b610315905161097b565b9061261660a060046102ff94612589612583600087015190565b82610eda565b6125a0612597602087015190565b60018301610eda565b6125b76125ae604087015190565b60028301610eda565b6125e46125db606087015173ffffffffffffffffffffffffffffffffffffffff1690565b60038301611ea2565b019261261061260a608083015173ffffffffffffffffffffffffffffffffffffffff1690565b85611ea2565b0161255f565b9061148b565b906102ff91612569565b906126976109c69361268261269c9461263d61254d565b5061265f61264b600661089d565b93612654612512565b9889976109bf878a52565b33606086015273ffffffffffffffffffffffffffffffffffffffff166080850152565b612690600060a08501612555565b600761088c565b61261c565b6103156126b26126ac600661089d565b60010190565b6006610eda565b6126ca9065ffffffffffff166122ff565b019065ffffffffffff8211611f9257565b7f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed66115d261272761271c61270e42612c9e565b612716611d52565b906126b9565b936115738582612cf0565b9261037760405190565b7ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b9061276861275f42612c9e565b61271683612d72565b9061277382826129db565b610f8c610a8f60405190565b61278761245d565b6102ff61279660016003610e97565b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610f8c336104af565b6102ff61277f565b91906008610e8d910291610ffa73ffffffffffffffffffffffffffffffffffffffff841b90565b9190612800610315610eae9361058f565b9083546127c8565b6102ff916000916127ef565b61281c611e15565b612828611103826122f2565b80156128c1575b612887575061286e90612840610ad1565b61286861286260025473ffffffffffffffffffffffffffffffffffffffff1690565b82612af5565b50612a65565b5061287b60006001612808565b6102ff6014600161102d565b7f19ca5ebb00000000000000000000000000000000000000000000000000000000600090815265ffffffffffff9091166004526024036000fd5b506128ce61110382612325565b61282f565b906102ff916128e4610d9b82610db9565b906122e591612af5565b906102ff916128d3565b6102ff6129056000610dfa565b61290f6000610d6c565b90612cf0565b906129236111038284611c14565b61292b575050565b7fe2517d3f00000000000000000000000000000000000000000000000000000000600090815291610e33916004611291565b907fffffffffffff00000000000000000000000000000000000000000000000000009060d01b610e8d565b90612998610315610eae92610fff565b825461295d565b9079ffffffffffff00000000000000000000000000000000000000009060a01b610e8d565b906129d4610315610eae92610fff565b825461299f565b90612a036102ff926129ed6002611c42565b6129f6816122f2565b612a0a575b5060026129c4565b6002612988565b612a1390612325565b15612a3257612a2c612a256002611c6d565b6001612988565b386129fb565b7f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec5612a5c60405190565b600090a1612a2c565b9190612a72610315610ad1565b8314612a83575b6103159192612dc3565b60025473ffffffffffffffffffffffffffffffffffffffff1692600093612aaf6110786103fc87610dfa565b03612acd57610315929350612ac5826002611ea2565b929150612a79565b7f3fc3c27a000000000000000000000000000000000000000000000000000000008452600484fd5b6103159190612b05610315610ad1565b811480612b23575b15612e3f57612b1e60006002612808565b612e3f565b50612b466103fc60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff831614612b0d565b612b6e61110361197b565b612b7457565b7f8dfc202b000000000000000000000000000000000000000000000000000000006000908152600490fd5b8015156102e6565b905051906102ff82612b9f565b906020828203126102ed5761031591612ba7565b612bd4612bdb9161058f565b9182612e9b565b90612be4825190565b91600092612bf4610f5c8561087f565b14159081612c49575b50612c06575050565b7f5274afe700000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff166004820152602490fd5b612c679150806020612c5c611103935190565b818301019101612bb4565b38612bfd565b6108af6103156103159290565b61031890612c6d565b9160206102ff9294936112bb60408201966000830190612c7a565b612cad65ffffffffffff612310565b8111612cbc5761031590610d6c565b610e336000917f6dfcc650000000000000000000000000000000000000000000000000000000008352603060048401612c83565b612d13612d1892612d0c612d02611e15565b9490506001611ea2565b60016129c4565b6122f2565b612d1e57565b7f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a9605109612d4860405190565b8080610f8c565b612d609065ffffffffffff166122ff565b90039065ffffffffffff8211611f9257565b612d7a611d52565b65ffffffffffff811665ffffffffffff83161115612db95750612db461031591612dae61232a612da8610d84565b92612310565b90612eaf565b610d6c565b9061031591612d4f565b612dd06111038383611c14565b15612e3857612dea6001610f77846000611c308682610db3565b612e04612dfe612df8339390565b9361058f565b9161058f565b917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d612e2f60405190565b600090a4600190565b5050600090565b612e498282611c14565b15612e3857612e626000610f778482611c308682610db3565b612e70612dfe612df8339390565b917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b612e2f60405190565b61031591612ea9600061087f565b91612f32565b9080821015612ebc575090565b905090565b67ffffffffffffffff811161164f57602090601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b90612f0e612f0983612ec1565b6124fe565b918252565b3d15612f2d57612f223d612efc565b903d6000602084013e565b606090565b91929190612f3f3061058f565b9380853110612f6c5761031593945081600092916020849351920190855af1612f66612f13565b91612fb1565b7fcd78605900000000000000000000000000000000000000000000000000000000600090815273ffffffffffffffffffffffffffffffffffffffff8616600452602490fd5b90612fbc5750613036565b815190600091612fce610f5c8461087f565b1480613021575b612fde57505090565b7f9996b31500000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff166004820152602490fd5b50803b613030610f5c8461087f565b14612fd5565b8051600090613047610f5c8361087f565b11156130565750805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000008152600490fdfea26469706673582212207d50bba3d96d5ace949dee45f4f04d2597d1f673cbfaaca5ffbfaa2e9037226764736f6c634300081c00330000000000000000000000004956b52ae2ff65d74ca2d61207523288e4528f9600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000acb7027f271b03b502d65feba617a0d817d62b8e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710