6 txs
0 calls
constructor
constructor(string uri_, address transferValidator_, address[] nonBeneficiaryAddresses_, address[] adminAddresses_, (address owner, address oracle, address priceFeed, address wormholeRelayer, address cnt, address rollupInbox, address erc20Bridge) configAddresses_, (uint256 parentChainId, uint256 childChainId, uint16 parentWormholeId) chainIds_, uint256[] wormholeChainIds_, address royaltyReceiver_, uint96 royaltyAmount_)
functions
ADMIN
viewfunction ADMIN() view returns (bytes32)
airdropEnabled
viewfunction airdropEnabled() view returns (bool)
allWormholeChainIds
viewfunction allWormholeChainIds() view returns (uint256[] wormholeChainIds_)
balanceOf
viewfunction balanceOf(address account, uint256 id) view returns (uint256)
balanceOfBatch
viewfunction balanceOfBatch(address[] accounts, uint256[] ids) view returns (uint256[])
beneficiaryBalanceOf
viewfunction beneficiaryBalanceOf(address account_, uint256 id_) view returns (uint256 balance_)
beneficiaryBalances
viewfunction beneficiaryBalances(uint256, address) view returns (uint256)
bridgeRelayer
viewfunction bridgeRelayer() view returns (address)
childArguments
viewfunction childArguments() view returns (uint256 callValue, uint256 maxSubmissionCost, uint256 gasLimit, uint256 maxFeePerGas, uint256 amount)
childChainDeliveryFee
viewfunction childChainDeliveryFee() view returns (uint256)
childChainId
viewfunction childChainId() view returns (uint256)
cnt
viewfunction cnt() view returns (address)
cntForGas
viewfunction cntForGas(uint16) view returns (uint256)
completedDeliveryWH
viewfunction completedDeliveryWH(bytes32) view returns (bool)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DEFAULT_TRANSFER_VALIDATOR
viewfunction DEFAULT_TRANSFER_VALIDATOR() view returns (address)
erc20Bridge
viewfunction erc20Bridge() view returns (address)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getTransferValidationFunction
purefunction getTransferValidationFunction() pure returns (bytes4 functionSignature, bool isViewFunction)
getTransferValidator
viewfunction getTransferValidator() view returns (address validator)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isApprovedForAll
viewfunction isApprovedForAll(address account_, address operator_) view returns (bool)
isChild
viewfunction isChild() view returns (bool isChild_)
isParent
viewfunction isParent() view returns (bool isParent_)
isShiftable
purefunction isShiftable() pure returns (bool)
isValidWormholeId
viewfunction isValidWormholeId(uint256 wormholeChainId_) view returns (bool isValid_)
name
viewfunction name() view returns (string)
NON_BENEFICIARY
viewfunction NON_BENEFICIARY() view returns (bytes32)
oracle
viewfunction oracle() view returns (address)
owner
viewfunction owner() view returns (address)
parentChainDeliveryFee
viewfunction parentChainDeliveryFee() view returns (uint256)
parentChainId
viewfunction parentChainId() view returns (uint256)
parentWormholeId
viewfunction parentWormholeId() view returns (uint16)
pendingOwner
viewfunction pendingOwner() view returns (address)
priceFeed
viewfunction priceFeed() view returns (address)
quote
viewfunction quote(uint16 targetWormholeId_, uint256 gasLimit_, bool toChildChain_, uint256 value_) view returns (uint256 cost_)
quoteCNTForDelivery
viewfunction quoteCNTForDelivery(uint16 targetWormholeId_, uint256 gasLimit_, uint256 value_) view returns (uint256 cntCost_)
quoteShiftOut
viewfunction quoteShiftOut(uint16 targetChain_, uint256 gasLimit_, bool toChildChain_) view returns (uint256 cost_)
refundAddress
viewfunction refundAddress() view returns (address)
rollupInbox
viewfunction rollupInbox() view returns (address)
royaltyInfo
viewfunction royaltyInfo(uint256 tokenId, uint256 salePrice) view returns (address receiver, uint256 amount)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId_) view returns (bool)
symbol
viewfunction symbol() view returns (string)
targetIsParent
viewfunction targetIsParent(uint16 targetWormholeId_) view returns (bool targetIsParent_)
uri
viewfunction uri(uint256) view returns (string)
wormholeRelayer
viewfunction wormholeRelayer() view returns (address)
acceptOwnership
nonpayablefunction acceptOwnership()
addWormholeChainIds
nonpayablefunction addWormholeChainIds(uint256[] wormholeChainIds_)
airdrop
nonpayablefunction airdrop(address[] recipients_, uint256[] amounts_)
burn
nonpayablefunction burn(address account, uint256 id, uint256 value)
burnBatch
nonpayablefunction burnBatch(address account, uint256[] ids, uint256[] values)
disableAirdrop
nonpayablefunction disableAirdrop()
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
receiveChildMessage
payablefunction receiveChildMessage(bytes bytesPayload_, address sourceAddress_, uint16 targetWormholeId_, uint256 gasLimit_, tuple shiftOptional_, uint256 value_) payable
receiveParentMessage
payablefunction receiveParentMessage(bytes bytesPayload_) payable
receiveWormholeMessages
payablefunction receiveWormholeMessages(bytes bytesPayload_, bytes[], bytes32 sourceAddress_, uint16 sourceWormholeChainId_, bytes32 deliveryHash_) payable
removeWormholeChainIds
nonpayablefunction removeWormholeChainIds(uint256[] wormholeChainIds_)
renounceOwnership
nonpayablefunction renounceOwnership()
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
rescueERC20
nonpayablefunction rescueERC20(address tokenAddress_, uint256 amount_, address to_)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
safeBatchTransferFrom
nonpayablefunction safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data)
setApprovalForAll
nonpayablefunction setApprovalForAll(address operator, bool approved)
setApprovalForAll
nonpayablefunction setApprovalForAll(address owner_, address operator_, bool approved_)
setBridgeRelayer
nonpayablefunction setBridgeRelayer(address bridgeRelayer_)
setChildArguments
nonpayablefunction setChildArguments(tuple childArguments_)
setChildChainDeliveryFee
nonpayablefunction setChildChainDeliveryFee(uint256 fee_)
setCNTForGas
nonpayablefunction setCNTForGas(uint16 wormholeChainId_, uint256 cntAmountForGas_)
setOracle
nonpayablefunction setOracle(address newOracle_)
setParentChainDeliveryFee
nonpayablefunction setParentChainDeliveryFee(uint256 fee_)
setPriceFeedAddress
nonpayablefunction setPriceFeedAddress(address priceFeed_)
setRefundAddress
nonpayablefunction setRefundAddress(address refundAddress_)
setRoyaltyInfo
nonpayablefunction setRoyaltyInfo(address receiver_, uint96 royaltyAmount_)
setTransferValidator
nonpayablefunction setTransferValidator(address transferValidator_)
setURI
nonpayablefunction setURI(string newURI_)
shiftOut
payablefunction shiftOut(uint16 targetChain_, uint256[] tokenIds_, uint256[] amounts_, tuple shiftOptional_, uint256 gasLimit_, bool transferToChild_) payable
shiftOut
payablefunction shiftOut(uint16 targetWormholeId_, uint256[] tokenIds_, uint256[] amounts_, bytes data_, tuple shiftOptional_, uint256 gasLimit_, bool transferToChild_) payable
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdraw
nonpayablefunction withdraw(address recipient_, uint256 value_) returns (bool)
withdrawCNT
nonpayablefunction withdrawCNT(address recipient_, uint256 amount_)
events
AirdropDisabled
event AirdropDisabled()
ApprovalForAll
event ApprovalForAll(address indexed account, address indexed operator, bool approved)
BridgeRelayerUpdated
event BridgeRelayerUpdated(address oldAddress, address newAddress)
ChildCallArgumentsUpdated
event ChildCallArgumentsUpdated((uint256 callValue, uint256 maxSubmissionCost, uint256 gasLimit, uint256 maxFeePerGas, uint256 amount) oldArgs, (uint256 callValue, uint256 maxSubmissionCost, uint256 gasLimit, uint256 maxFeePerGas, uint256 amount) newArgs)
ChildChainDeliveryFeeUpdated
event ChildChainDeliveryFeeUpdated(uint256 oldFee, uint256 newFee)
CNTForGasUpdated
event CNTForGasUpdated(uint16 wormholeChainId, uint256 oldCNT, uint256 newCNT)
OracleUpdated
event OracleUpdated(address oldOracle, address newOracle)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
ParentChainDeliveryFeeUpdated
event ParentChainDeliveryFeeUpdated(uint256 oldFee, uint256 newFee)
PayloadFailed
event PayloadFailed()
PriceFeedAddressUpdated
event PriceFeedAddressUpdated(address oldAddress, address newAddress)
RefundAddressUpdated
event RefundAddressUpdated(address oldAddress, address newAddress)
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)
RoyaltyInfoUpdated
event RoyaltyInfoUpdated(address receiver, uint96 royaltyAmount)
ShiftOut
event ShiftOut(uint16 targetChain, bool toChildChain)
TransferBatch
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)
TransferSingle
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)
TransferValidatorUpdated
event TransferValidatorUpdated(address oldValidator, address newValidator)
URI
event URI(string value, uint256 indexed id)
URIChanged
event URIChanged(string newURI)
WormholeChainIdAdded
event WormholeChainIdAdded(uint256 wormholeChainId)
WormholeChainIdRemoved
event WormholeChainIdRemoved(uint256 wormholeChainId)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
CalldataTooShort
error CalldataTooShort()
CannotSendChildToChild
error CannotSendChildToChild()
CanOnlySendValueFromChildChain
error CanOnlySendValueFromChildChain()
ChainAlreadyPresent
error ChainAlreadyPresent()
ChildAmountTooHigh
error ChildAmountTooHigh()
ConfigItemsAlreadySet
error ConfigItemsAlreadySet()
ConfigItemsMustAllBeSet
error ConfigItemsMustAllBeSet()
ContractCannotBeShiftable
error ContractCannotBeShiftable()
ContractIsNotShiftable
error ContractIsNotShiftable()
CreatorTokenBase__InvalidTransferValidatorContract
error CreatorTokenBase__InvalidTransferValidatorContract()
DeployerOnly
error DeployerOnly()
ERC1155InsufficientBalance
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId)
ERC1155InvalidApprover
error ERC1155InvalidApprover(address approver)
ERC1155InvalidArrayLength
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength)
ERC1155InvalidOperator
error ERC1155InvalidOperator(address operator)
ERC1155InvalidReceiver
error ERC1155InvalidReceiver(address receiver)
ERC1155InvalidSender
error ERC1155InvalidSender(address sender)
ERC1155MissingApprovalForAll
error ERC1155MissingApprovalForAll(address operator, address owner)
ERC1155TemplateFailedDeployment
error ERC1155TemplateFailedDeployment()
ERC20TemplateFailedDeployment
error ERC20TemplateFailedDeployment()
ERC2981InvalidDefaultRoyalty
error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)
ERC2981InvalidDefaultRoyaltyReceiver
error ERC2981InvalidDefaultRoyaltyReceiver(address receiver)
ERC2981InvalidTokenRoyalty
error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)
ERC2981InvalidTokenRoyaltyReceiver
error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)
ERC721TemplateFailedDeployment
error ERC721TemplateFailedDeployment()
GatewayCannotBeTarget
error GatewayCannotBeTarget()
GatewayIsNotActive
error GatewayIsNotActive()
GatewayIsNotConfigured
error GatewayIsNotConfigured()
GatewayOnly
error GatewayOnly()
GovernorOnly
error GovernorOnly()
IncorrectChain
error IncorrectChain()
InsufficientNativeToken
error InsufficientNativeToken()
InsufficientToken
error InsufficientToken()
InsufficientValue
error InsufficientValue(uint256 expected, uint256 actual)
InvalidWormholeChainId
error InvalidWormholeChainId()
JustInTimeCreationMismatch
error JustInTimeCreationMismatch()
LayerZeroDeliveryAlreadyComplete
error LayerZeroDeliveryAlreadyComplete()
MustBeOverridden
error MustBeOverridden()
NotAuthorised
error NotAuthorised()
OnlyERC20Bridge
error OnlyERC20Bridge()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
OwnerOrOracleOnly
error OwnerOrOracleOnly()
RelayerOnly
error RelayerOnly()
SetActiveCallFromNonCoreChain
error SetActiveCallFromNonCoreChain()
ShouldNotMintToBurnAddress
error ShouldNotMintToBurnAddress()
TokenDecimalsUndefined
error TokenDecimalsUndefined()
TokenTypeNotFound
error TokenTypeNotFound()
WithdrawalFailed
error WithdrawalFailed()
WormholeDeliveryAlreadyComplete
error WormholeDeliveryAlreadyComplete()
creation bytecode
0x61016060405234610f0257600061601d90813803809261002182610160610f07565b6101603981906102208212610efb57610160516001600160401b038111610efe5761016001908361016001601f83011215610efb5781516001600160401b038111610ee7576040519261007e601f8301601f191660200185610f07565b818452856101600160208383010111610ecc57908291825b828110610ed05750508301602001526100b0610180610f40565b6101a0519092906001600160401b038111610ecc576100d89086610160019061016001610f6b565b6101c0519091906001600160401b038111610ec8576101009087610160019061016001610f6b565b9360e0607f19870112610ec8576040519560e087016001600160401b03811188821017610eb4576040526060906101386101e0610f40565b8852610145610200610f40565b6020890152610155610220610f40565b6040890152610165610240610f40565b88830152610174610260610f40565b6080890152610184610280610f40565b60a08901526101946102a0610f40565b60c089015261015f190112610ec85760405191606083016001600160401b03811184821017610eb4576040526102c05183526102e05160208401526103005161ffff8116810361095357604084015261032051976001600160401b03891161095357610160810161017f8a0112156109535788610160015161021581610f54565b996102236040519b8c610f07565b818b526020808c019260051b8261016001010192610160018311610a675761018001905b828210610ea4575050506102606101e061016001610f40565b61036051909390916001600160601b0383168303610a635760409384516102878682610f07565b600c81526b21a1a627a1a5902a37b5b2b760a11b60208201528551906102ad8783610f07565b60078252662443434c4f434b60c81b60208301528b5184516001600160a01b03909116946001600160401b038211610e9057600254600181811c91168015610e86575b6020821014610e72579081601f849311610e05575b506020908d601f8411600114610da05792610d95575b50508160011b916000199060031b1c1916176002555b3315610d815761034033611182565b600080516020615f5d8339815191528780518c815273721c008fdff27bf06e7e123956e2fe03b63342e36020820152a173721c008fdff27bf06e7e123956e2fe03b63342e33b610d0c575b8051906001600160401b038211610cf857600654600181811c91168015610cee575b6020821014610cda579081601f849311610c6d575b50602090601f8311600114610c08578c92610bfd575b50508160011b916000199060031b1c1916176006555b8051906001600160401b038211610be957600754600181811c91168015610bdf575b6020821014610bcb579081601f849311610b5d575b50602090601f8311600114610af8578b92610aed575b50508160011b916000199060031b1c1916176007555b6003546001600160a01b03163303610aaa576001600160a01b0381169081151580823b1581610aa2575b50610a93576005548a95949392919083906001600160a01b0381168015610a6b575b8a516001600160a01b03909116815260208101839052600080516020615f5d833981519152908b90a16004805460ff60a01b1916600160a01b1790556001600160a01b03191617600555610a04575b50506104f790611182565b6020890151601280546001600160a01b03199081166001600160a01b039384161790915560408b01516009805490921690831617905560608a015116806109fc575046612105036109695773706f82e9bb5b0813501714ab5974216704980e316080525b80516101008190526020820151610140526040919091015161ffff166101205260808901516001600160a01b0390811660a08190528a51601180546001600160a01b03191691909316179091559046146108a4575b505b88518110156105d857806105d16105cb6001938c610fd0565b516111d6565b50016105b2565b50601a805460ff1916600117905586516105fa906001600160a01b0316610ffa565b50845b865181101561062c576001906106256001600160a01b0361061e838b610fd0565b5116611076565b50016105fd565b5084600080516020615f9d83398151915281526017602052600080516020615fbd83398151915260018483200154600080516020615f9d833981519152835260176020528160018685200155600080516020615f9d8339815191527fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff8480a4805b85518110156106dc576001906106d56001600160a01b036106ce838a610fd0565b51166110fc565b50016106ad565b50836127106001600160601b03841611610880576001600160a01b031690811561086c57835190818501906001600160401b03821183831017610858575084528181526001600160601b0383166020909101526001600160a01b031660a09190911b6001600160a01b0319161760185551614cef908161124e8239608051818181610ca7015281816128e301528181612f720152818161318a015281816132c7015261391b015260a05181818161143a015261289e015260c051818181610fac0152612c9e015260e0518181816122a8015261410f015261010051818181610bde01528181610fed0152818161239701528181612820015281816130db0152818161321801528181613c060152613f1e015261012051818181610cf201528181610d77015281816110400152818161121e01528181612994015281816131e80152818161330d015261336f015261014051818181610c3001528181611169015281816125750152818161311d0152818161325a0152613ed00152f35b634e487b7160e01b81526041600452602490fd5b635b6cc80560e11b81526004819052602490fd5b50636f483d0960e01b81526001600160601b03909116600452612710602452604490fd5b655af3107a4000600d5562989680600e819055600f5565b5e620f4800060105560a0890180516001600160a01b0390811660e05260c0808c0151821690529051855163095ea7b360e01b81529116600482015260001960248201529160209183916044918391905af1801561095f5761091f575b85906105b0565b6020813d602011610957575b8161093860209383610f07565b8101031261095357518015150361094f5738610918565b8480fd5b8580fd5b3d915061092b565b83513d88823e3d90fd5b62aa36a7461480156109f0575b1561099857737b1bd7a6b4e61c2a123ac6bc2cbfc614437d047060805261055b565b62aa37dc461480156109e4575b156109c7577393bad53ddfb6132b0ac8e37f6029163e63372cee60805261055b565b7327428dd2d3dd32a4d7f7c497eaaa23130d89491160805261055b565b5062014a3446146109a5565b5062066eee4614610976565b60805261055b565b3b610a10575b806104ec565b80919293503b15610a6757908780809493604488518094819363fb2de5d760e01b835230600484015261048360248401525af115610a0a5783610a569194929394610f07565b610a635790869138610a0a565b8680fd5b8780fd5b60ff60045460a01c1661049d575073721c008fdff27bf06e7e123956e2fe03b63342e361049d565b6332483afb60e01b8a5260048afd5b90503861047b565b6064855162461bcd60e51b815260206004820152602060248201527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e65726044820152fd5b01519050388061043b565b60078c52818c209250601f1984168c5b818110610b455750908460019594939210610b2c575b505050811b01600755610451565b015160001960f88460031b161c19169055388080610b1e565b92936020600181928786015181550195019301610b08565b60078c529091507fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688601f840160051c81019160208510610bc1575b90601f859493920160051c01905b818110610bb35750610425565b8c8155849350600101610ba6565b9091508190610b98565b634e487b7160e01b8b52602260045260248bfd5b90607f1690610410565b634e487b7160e01b8a52604160045260248afd5b0151905038806103d8565b60068d52818d209250601f1984168d5b818110610c555750908460019594939210610c3c575b505050811b016006556103ee565b015160001960f88460031b161c19169055388080610c2e565b92936020600181928786015181550195019301610c18565b60068d529091507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f840160051c810160208510610cd3575b84939291908e5b601f840160051c83018210610cc5575050506103c2565b81558594506001018e610cae565b5080610ca7565b634e487b7160e01b8c52602260045260248cfd5b90607f16906103ad565b634e487b7160e01b8b52604160045260248bfd5b73721c008fdff27bf06e7e123956e2fe03b63342e33b15610d7d57865163fb2de5d760e01b815230600482015261048360248201528a816044818373721c008fdff27bf06e7e123956e2fe03b63342e35af1610d69575b5061038b565b8a610d76919b929b610f07565b9838610d63565b8980fd5b631e4fbdf760e01b8a5260048a905260248afd5b01519050388061031b565b600281528281209350601f198516905b818110610ded5750908460019594939210610dd4575b505050811b01600255610331565b015160001960f88460031b161c19169055388080610dc6565b92936020600181928786015181550195019301610db0565b60028e529091507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810160208510610e6b575b84939291908f5b601f840160051c83018210610e5d57505050610305565b81558594506001018f610e46565b5080610e3f565b634e487b7160e01b8d52602260045260248dfd5b90607f16906102f0565b634e487b7160e01b8c52604160045260248cfd5b8151815260209182019101610247565b634e487b7160e01b86526041600452602486fd5b8380fd5b8280fd5b602082820181015187830182015285945001610096565b634e487b7160e01b82526041600452602482fd5b80fd5b5080fd5b600080fd5b601f909101601f19168101906001600160401b03821190821017610f2a57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203610f0257565b6001600160401b038111610f2a5760051b60200190565b9080601f83011215610f02578151610f8281610f54565b92610f906040519485610f07565b81845260208085019260051b820101928311610f0257602001905b828210610fb85750505090565b60208091610fc584610f40565b815201910190610fab565b8051821015610fe45760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381166000908152600080516020615f7d833981519152602052604090205460ff16611070576001600160a01b03166000818152600080516020615f7d83398151915260205260408120805460ff19166001179055339190600080516020615f3d8339815191528180a4600190565b50600090565b6001600160a01b0381166000908152600080516020615ffd833981519152602052604090205460ff16611070576001600160a01b03166000818152600080516020615ffd83398151915260205260408120805460ff19166001179055339190600080516020615fbd83398151915290600080516020615f3d8339815191529080a4600190565b6001600160a01b0381166000908152600080516020615fdd833981519152602052604090205460ff16611070576001600160a01b03166000818152600080516020615fdd83398151915260205260408120805460ff19166001179055339190600080516020615f9d83398151915290600080516020615f3d8339815191529080a4600190565b600480546001600160a01b0319908116909155600380549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b806000526014602052604060002054156000146110705760135468010000000000000000811015610f2a576001810180601355811015610fe4577f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090018190556013546000918252601460205260409091205560019056fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c8062cf5db414610529578062fdd58e14610524578063014635461461051f57806301ffc9a71461051a57806302fa7c471461051557806302fe53051461051057806306fdde031461050b5780630871e78514610506578063098144d4146105015780630b89696a146104fc5780630bf23e6d146104f75780630cb61f6c146104f25780630d705df6146104ed5780630dfb0e84146104e85780630e688030146104e35780630e89341c146104de57806311f2d494146104d957806315b75bea146104d45780631e7cc791146104cf57806320104289146104ca57806320d153b5146104c5578063248a9ca3146104c05780632a0acc6a146104bb5780632a55205a146104b65780632cb276c2146104b15780632eb2c2d6146104ac5780632f2ff15d146104a757806336568abe146104a2578063367605ca1461049d5780633d2d07e2146104985780634e1273f414610493578063529dca321461048e57806357c004d3146104895780635f92d85e14610484578063672434821461047f578063696ccde01461047a5780636b20c45414610475578063715018a61461047057806371c6b95f1461046b57806373e3aabc14610466578063741bef1a14610461578063756de00b1461045c5780637686372814610457578063770ffe581461045257806377662ffc1461044d578063788ce3c11461044857806379ba5097146104435780637adbf9731461043e5780637dc0d1d0146104395780637f6577b6146104345780638da5cb5b1461042f5780638db442e91461042a57806391d148541461042557806393e82b4b1461042057806395d89b411461041b5780639c65582c14610416578063a217fddf14610411578063a22cb4651461040c578063a9fc664e14610407578063ac3d5f0a14610402578063b14b0f56146103fd578063b1f456bf146103f8578063b7265947146103f3578063bbf3c57b146103ee578063c8c3566a146103e9578063d547741f146103e4578063d6d838ad146103df578063da25b725146103da578063e30c3978146103d5578063e985e9c5146103d0578063e9c9e3b3146103cb578063ee5544d4146103c6578063eedc8b4e146103c1578063f242432a146103bc578063f2fde38b146103b7578063f3fef3a3146103b2578063f5298aca146103ad578063f688e0fe146103a8578063f8ffea7e146103a3578063f9c5bd9e1461039e5763fe199a600361000e57612d43565b612ccd565b612c88565b612c6a565b612bd4565b612b9a565b612b29565b612a25565b6129fb565b6129bb565b61296f565b61293b565b612912565b6128cd565b612888565b612845565b612808565b612668565b61262d565b612598565b61255d565b61252c565b612409565b6123d6565b6123ba565b61237f565b6122d7565b612292565b61223c565b6121a4565b61217b565b612152565b612129565b6120a9565b61201f565b611fd7565b611f4c565b611f16565b611ee0565b611e55565b611dda565b611d57565b611cd4565b611c6d565b611bc2565b611b0b565b611a42565b6119f8565b61199e565b6118cb565b611800565b611712565b611630565b6115e6565b61159e565b61150c565b6113d5565b61134d565b611312565b6112e5565b611265565b611242565b611203565b61118e565b611151565b6110a9565b61108d565b610f5a565b610ef5565b610ecc565b610e49565b610dcf565b610da2565b610baf565b610aa1565b6108c1565b6106e9565b610662565b610621565b6105c5565b610544565b6001600160a01b0381160361053f57565b600080fd5b3461053f57602036600319011261053f577f6471dce0518061dac24889e06526368f6f7ee7d7640122e1fb5f9ac4d081a2506004356105828161052e565b61058a613644565b600980546001600160a01b039283166001600160a01b031982168117909255604080519390911683526020830191909152819081015b0390a1005b3461053f57604036600319011261053f57602061060d6004356105e78161052e565b6024356000526000835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b600091031261053f57565b3461053f57600036600319011261053f57602060405173721c008fdff27bf06e7e123956e2fe03b63342e38152f35b6001600160e01b031981160361053f57565b3461053f57602036600319011261053f57602060043561068181610650565b61068a81613658565b9081156106d8575b81156106a4575b506040519015158152f35b6001600160e01b0319811663152a902d60e11b14915081156106c8575b5038610699565b6106d291506136b4565b386106c1565b90506106e3816136b4565b90610692565b3461053f57604036600319011261053f576004356107068161052e565b6024356001600160601b03811680820361053f57610722613644565b61271081116107de57506001600160a01b038216156107c8577fae1d656a1268648b04ffa79c1416f05879338ae295aae3234d8db217356a1c629161079d61076861084f565b6001600160a01b0383168082526001600160601b0385166020909201919091526001600160a01b031960a085901b1617601855565b604080516001600160a01b0390921682526001600160601b03909216602082015290819081016105c0565b635b6cc80560e11b600052600060045260246000fd5b636f483d0960e01b60005260045261271060245260446000fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761082957604052565b6107f8565b90601f801991011681019081106001600160401b0382111761082957604052565b6040519061085e60408361082e565b565b6040519061085e60a08361082e565b6001600160401b03811161082957601f01601f191660200190565b9291926108968261086f565b916108a4604051938461082e565b82948184528183011161053f578281602093846000960137010152565b3461053f57602036600319011261053f576004356001600160401b03811161053f573660238201121561053f5761090290369060248160040135910161088a565b61090a6136dd565b80516001600160401b0381116108295761092e81610929600254612d61565b6137aa565b6020601f821160011461099d5791610982826105c0937fbd06d92759c326896ec0f7c3a981e801ae4644e020f89b2a198909b692df0ddd95600091610992575b508160011b916000199060031b1c19161790565b6002555b60405191829182610a8d565b90508301513861096e565b6002600052601f198216907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9160005b818110610a2d5750927fbd06d92759c326896ec0f7c3a981e801ae4644e020f89b2a198909b692df0ddd9492600192826105c09610610a14575b5050811b01600255610986565b84015160001960f88460031b161c191690553880610a07565b919260206001819286890151815501940192016109cd565b60005b838110610a585750506000910152565b8181015183820152602001610a48565b90602091610a8181518092818552858086019101610a45565b601f01601f1916010190565b906020610a9e928181520190610a68565b90565b3461053f57600036600319011261053f576040516000600654610ac381612d61565b8084529060018116908115610b4e5750600114610aef575b610aeb836109868185038261082e565b0390f35b600660009081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610b3457509091508101602001610986610adb565b919260018160209254838588010152019101909291610b1c565b60ff191660208086019190915291151560051b840190910191506109869050610adb565b6004359061ffff8216820361053f57565b6044359061ffff8216820361053f57565b6064359061ffff8216820361053f57565b8015150361053f57565b3461053f57606036600319011261053f57610bc8610b72565b60243560443591610bd883610ba5565b600092467f00000000000000000000000000000000000000000000000000000000000000001480610d71575b80610d6a575b15610c2957505050610c24576020600a545b604051908152f35b6137fd565b91929091467f000000000000000000000000000000000000000000000000000000000000000003610c6e57610c6957602092610c6492613568565b610c1c565b61381f565b6040805163c23ee3c360e01b815261ffff8516600482015260006024820152604481019590955290929150836064816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa928315610d6557600093610d33575b508291610cea575b5060209150610c1c565b905061ffff807f000000000000000000000000000000000000000000000000000000000000000016911603610d2e57610d28602091600a54906130c7565b38610ce0565b61380e565b610d5691935060403d604011610d5e575b610d4e818361082e565b8101906130b1565b509138610cd8565b503d610d44565b612e27565b5080610c0a565b5061ffff7f00000000000000000000000000000000000000000000000000000000000000001661ffff831614610c04565b3461053f57600036600319011261053f576020610dbd612d9b565b6040516001600160a01b039091168152f35b3461053f57602036600319011261053f5761ffff610deb610b72565b1660005260156020526020604060002054604051908152f35b906020808351928381520192019060005b818110610e225750505090565b8251845260209384019390920191600101610e15565b906020610a9e928181520190610e04565b3461053f57600036600319011261053f5760405180602060135491828152019060136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909060005b818110610eb657610aeb85610eaa8187038261082e565b60405191829182610e38565b8254845260209093019260019283019201610e93565b3461053f57600036600319011261053f576011546040516001600160a01b039091168152602090f35b3461053f57600036600319011261053f5760408051631854b24160e01b815260006020820152f35b9080601f8301121561053f57816020610a9e9335910161088a565b604090608319011261053f57608490565b604090606319011261053f57606490565b60e036600319011261053f576004356001600160401b03811161053f57610f85903690600401610f1d565b602435610f918161052e565b610f99610b83565b606435610fa536610f38565b9060c435937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361107c57306001600160a01b039091160361106b577f000000000000000000000000000000000000000000000000000000000000000046148061103a575b15611026575050505061001990613a27565b6100199461103482856130d4565b936138c2565b5061ffff7f00000000000000000000000000000000000000000000000000000000000000001661ffff841614611014565b6327c89f5b60e11b60005260046000fd5b6319b6341760e11b60005260046000fd5b3461053f57600036600319011261053f57602060405160018152f35b3461053f57602036600319011261053f5760405160006002546110cb81612d61565b8084529060018116908115610b4e57506001146110f257610aeb836109868185038261082e565b600260009081527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b80821061113757509091508101602001610986610adb565b91926001816020925483858801015201910190929161111f565b3461053f57600036600319011261053f5760206040517f000000000000000000000000000000000000000000000000000000000000000046148152f35b3461053f57602036600319011261053f577f57b5839c3435f5b2eb2d2e286fb44ca7303d01d9b25a5d9c05c489523474285960406004356111ce8161052e565b6111d6613644565b601180546001600160a01b039283166001600160a01b0319821681179092558351921682526020820152a1005b3461053f57600036600319011261053f57602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461053f57600036600319011261053f57602060ff601a54166040519015158152f35b3461053f57602036600319011261053f577f9dd7ed060b0f48665a5be9c82df1d1ac57741a038399901e3c3ccf6cbc0f3e656004356112a38161052e565b6112ab613644565b600880546001600160a01b039283166001600160a01b031982168117909255604080519390911683526020830191909152819081016105c0565b3461053f57602036600319011261053f576020610c1c600435600052601760205260016040600020015490565b3461053f57600036600319011261053f5760206040517fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428152f35b3461053f57604036600319011261053f576004356000908152601960205260409020546001600160a01b038116906024359060a01c82156113bd575b612710916001600160601b036113a0921690612def565b604080516001600160a01b03949094168452919004602083015290f35b506018546001600160a01b038116925060a01c611389565b3461053f57604036600319011261053f5761143460206004356113f78161052e565b60243590611403613644565b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b038160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610d655761147057005b6100199060203d602011611491575b611489818361082e565b810190612e12565b503d61147f565b6001600160401b0381116108295760051b60200190565b9080601f8301121561053f5781356114c681611498565b926114d4604051948561082e565b81845260208085019260051b82010192831161053f57602001905b8282106114fc5750505090565b81358152602091820191016114ef565b3461053f5760a036600319011261053f576004356115298161052e565b602435906115368261052e565b6044356001600160401b03811161053f576115559036906004016114af565b6064356001600160401b03811161053f576115749036906004016114af565b90608435936001600160401b03851161053f57611598610019953690600401610f1d565b93612e33565b3461053f57604036600319011261053f576100196024356004356115c18261052e565b6115e16115dc82600052601760205260016040600020015490565b61374f565b613c2b565b3461053f57604036600319011261053f576004356024356116068161052e565b336001600160a01b0382160361161f5761001991613cbf565b63334bd91960e11b60005260046000fd5b3461053f57606036600319011261053f576116bd6004356116508161052e565b60243561165c8161052e565b6044359161166983610ba5565b611679611674613d4a565b612e7d565b60206040516116a181611693848201602090600481520190565b03601f19810183528261082e565b604051809681926319ff791f60e01b8352853360048501612ebb565b03816eb830264ac5e8004250e1f7003d6a685afa938415610d6557610019946116ee916000916116f3575b50612ee4565b613d74565b61170c915060203d60201161149157611489818361082e565b386116e8565b3461053f57604036600319011261053f57602061060d6024356004356117378261052e565b600052601b835260406000209060018060a01b0316600052602052604060002090565b90604060031983011261053f576004356001600160401b03811161053f578260238201121561053f5780600401359061179282611498565b916117a0604051938461082e565b8083526024602084019160051b8301019185831161053f57602401905b8282106117e65750505091602435906001600160401b03821161053f57610a9e916004016114af565b6020809183356117f58161052e565b8152019101906117bd565b3461053f5761180e3661175a565b90805182518082036118b457505080519161182883611498565b92611836604051948561082e565b808452611845601f1991611498565b0136602085013760005b82518110156118a6578061189560019260051b60208082880101519186010151906000918252602082815260408084206001600160a01b03909316845291905290205490565b61189f8287612f58565b520161184f565b60405180610aeb8682610e38565b635b05999160e01b60005260045260245260446000fd5b60a036600319011261053f576004356001600160401b03811161053f576118f6903690600401610f1d565b602435906001600160401b03821161053f573660238301121561053f5781600401359161192283611498565b90611930604051928361082e565b8382526024602083019460051b8201019036821161053f5760248101945b82861061196f576100198585604435611965610b94565b9160843593612f6c565b85356001600160401b03811161053f57602091611993839260243691870101610f1d565b81520195019461194e565b602036600319011261053f576004356001600160401b03811161053f576119c9903690600401610f1d565b30731111000000000000000000000000000000001111016001600160a01b0316330361106b5761001990613a27565b3461053f57600036600319011261053f57611a11613644565b60ff19601a5416601a557f200837fed758f962db406f2ba2a9d31b7bd77e6dfaf82347b1cf69e48511387a600080a1005b3461053f57611a503661175a565b90611a59613644565b60ff601a541615611abc57611a718151835114613031565b60005b81518110156100195780611ab6611a9d611a9060019486612f58565b516001600160a01b031690565b611aa78387612f58565b51611ab061308c565b91613e0a565b01611a74565b60405162461bcd60e51b815260206004820152602160248201527f41697264726f702066756e6374696f6e616c6974792069732064697361626c656044820152601960fa1b6064820152608490fd5b3461053f57604036600319011261053f57611b24610b72565b6024359060018060a01b036003541633141580611bad575b611b9c577ff2a4dae53c7c300d7661c314065f70d790efe259e54b64571fc725362cd2c26e9161ffff60609216908160005260156020526040600020548260005260156020528160406000205560405192835260208301526040820152a1005b63bc85be0f60e01b60005260046000fd5b506012546001600160a01b0316331415611b3c565b3461053f57606036600319011261053f57600435611bdf8161052e565b6024356001600160401b03811161053f57611bfe9036906004016114af565b6044356001600160401b03811161053f57611c1d9036906004016114af565b6001600160a01b038316929091903384141580611c5c575b611c43576100199350613e50565b8363711bec9160e11b6000523360045260245260446000fd5b50611c673382613459565b15611c35565b3461053f57600036600319011261053f57611c86613644565b600480546001600160a01b03199081169091556003805491821690556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461053f57602036600319011261053f5760043560018060a01b036003541633141580611d42575b611b9c57600a8054908290556040805191825260208201929092527f5dbfb04288fae4f59ddcddadd138ab9cb4ef6abbba1217e6c79163ce7908903d91819081016105c0565b506012546001600160a01b0316331415611cfc565b3461053f57602036600319011261053f5760043560018060a01b036003541633141580611dc5575b611b9c57600b8054908290556040805191825260208201929092527f6161cb9906a7988846e3adb6aac0a27a6b455530e72e8a7e3a3f5d312e9353cf91819081016105c0565b506012546001600160a01b0316331415611d7f565b3461053f57600036600319011261053f576009546040516001600160a01b039091168152602090f35b90602060031983011261053f576004356001600160401b03811161053f578260238201121561053f578060040135926001600160401b03841161053f5760248460051b8301011161053f576024019190565b3461053f57611e6336611e03565b611e6b613644565b60005b818110611e7757005b611e8b611e858284866130a1565b3561432f565b15611ecf57807fcc60b32ab8298b1b9e48be6bafa72b82f8a74a6e5610c64e38bb5b5cd3b840246020611ec160019486886130a1565b35604051908152a101611e6e565b63c5e44dc960e01b60005260046000fd5b3461053f57608036600319011261053f576020610c1c611efe610b72565b604435602435611f0d82610ba5565b60643592613213565b3461053f57602036600319011261053f576020611f426004356000526014602052604060002054151590565b6040519015158152f35b3461053f57606036600319011261053f57611fbe6020600435611f6e8161052e565b60243590604435611f7e8161052e565b611f86613644565b60405163a9059cbb60e01b81526001600160a01b03909116600482015260248101929092529092839190829060009082906044820190565b03926001600160a01b03165af18015610d655761147057005b3461053f57604036600319011261053f57602061060d600435611ff98161052e565b602435600052601b835260406000209060018060a01b0316600052602052604060002090565b3461053f57600036600319011261053f57600454336001600160a01b039091160361209457600480546001600160a01b0319908116909155600380543392811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63118cdaa760e01b6000523360045260246000fd5b3461053f57602036600319011261053f577f078c3b417dadf69374a59793b829c52001247130433427049317bde56607b1b76004356120e78161052e565b6120ef613644565b601280546001600160a01b039283166001600160a01b031982168117909255604080519390911683526020830191909152819081016105c0565b3461053f57600036600319011261053f576012546040516001600160a01b039091168152602090f35b3461053f57600036600319011261053f576008546040516001600160a01b039091168152602090f35b3461053f57600036600319011261053f576003546040516001600160a01b039091168152602090f35b61010036600319011261053f576121b9610b72565b6024356001600160401b03811161053f576121d89036906004016114af565b906044356001600160401b03811161053f576121f89036906004016114af565b91606435926001600160401b03841161053f5761221c610019943690600401610f1d565b61222536610f38565b9160c4359360e4359561223787610ba5565b61339a565b3461053f57604036600319011261053f57602060ff6122866024356004356122638261052e565b6000526017845260406000209060018060a01b0316600052602052604060002090565b54166040519015158152f35b3461053f57600036600319011261053f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461053f57600036600319011261053f5760405160006007546122f981612d61565b8084529060018116908115610b4e575060011461232057610aeb836109868185038261082e565b600760009081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b80821061236557509091508101602001610986610adb565b91926001816020925483858801015201910190929161234d565b3461053f57600036600319011261053f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461053f57600036600319011261053f57602060405160008152f35b3461053f57604036600319011261053f576100196004356123f68161052e565b6024359061240382610ba5565b33613d74565b3461053f57602036600319011261053f576004356124268161052e565b6003546001600160a01b031633036124e8576001600160a01b0381161515813b15816124e0575b506124cf57807fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac61001992612480612d9b565b604080516001600160a01b03928316815292909116602083015290a16004805460ff60a01b1916600160a01b179055600580546001600160a01b0319166001600160a01b038316179055613f8a565b6332483afb60e01b60005260046000fd5b90503861244d565b606460405162461bcd60e51b815260206004820152602060248201527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e65726044820152fd5b3461053f57602036600319011261053f576004356000526016602052602060ff604060002054166040519015158152f35b3461053f57600036600319011261053f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60e036600319011261053f576125ac610b72565b6024356001600160401b03811161053f576125cb9036906004016114af565b604435916001600160401b03831161053f576125ee6100199336906004016114af565b906125f836610f49565b9060a4359260c4359461260a86610ba5565b6040519261261960408561082e565b6002845261060f60f31b602085015261339a565b3461053f57600036600319011261053f5760206040517f428900282e26ba72f7b6103eb810cb7c7a97ce38847f4bc62d49eb88cec0a7e88152f35b3461053f5760a036600319011261053f57600060018060a01b0360035416331415806127f3575b6127e45760405161269f8161080e565b600c548152600d546020820152600e546040820152600f54606082015260105460808201526084356024356004356126d781836130c7565b90604435926126f3606435936126ed8587612def565b906130c7565b85106127af57867fb63a95a1ca8ce6cf10034976cbfe172696c954b4b24e02e913a7bc4889cdc4376127a988612742600435600c55602435600d55604435600e55606435600f55608435601055565b604051918291829190916080610140820193805183526020810151602084015260408101516040840152606081015160608401520151608082015260043560a082015260243560c082015260443560e0820152606435610100820152610120608435910152565b0390a180f35b6127e19550916127c66126ed926127cc95946130c7565b92612def565b631c102d6360e21b8452600452602452604490565b90fd5b63bc85be0f60e01b8152600490fd5b506012546001600160a01b031633141561268f565b3461053f57600036600319011261053f5760206040517f000000000000000000000000000000000000000000000000000000000000000046148152f35b3461053f57604036600319011261053f576100196024356004356128688261052e565b6128836115dc82600052601760205260016040600020015490565b613cbf565b3461053f57600036600319011261053f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461053f57600036600319011261053f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461053f57600036600319011261053f576004546040516001600160a01b039091168152602090f35b3461053f57604036600319011261053f576020611f4260043561295d8161052e565b6024359061296a8261052e565b613459565b3461053f57602036600319011261053f57602061298a610b72565b6040519061ffff807f0000000000000000000000000000000000000000000000000000000000000000169116148152f35b3461053f57600036600319011261053f5760a0600c54600d54600e54600f5490601054926040519485526020850152604084015260608301526080820152f35b3461053f57606036600319011261053f576020610c1c612a19610b72565b60243560443591613568565b3461053f5760a036600319011261053f57600435612a428161052e565b602435612a4e8161052e565b60443590606435926084356001600160401b03811161053f57612a75903690600401610f1d565b926001600160a01b0382163381141580612b18575b612b00576001600160a01b03841615612aea5715612ad55761001994612acd60405192600184526020840152604083019160018352606084015260808301604052565b92909161427d565b626a0d4560e21b600052600060045260246000fd5b632bfa23e760e11b600052600060045260246000fd5b63711bec9160e11b6000523360045260245260446000fd5b50612b233384613459565b15612a8a565b3461053f57602036600319011261053f57600435612b468161052e565b612b4e613644565b600480546001600160a01b0319166001600160a01b039283169081179091556003549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700600080a3005b3461053f57604036600319011261053f5760206000808080600435612bbe8161052e565b60243590612bca613644565b5af1610699613614565b3461053f57606036600319011261053f57600435612bf18161052e565b604435906024356001600160a01b0382163381141580612c59575b612b005715612ad55761001992612c4060405192600184526020840152604083019160018352606084015260808301604052565b9060405192612c5060208561082e565b6000845261415e565b50612c643384613459565b15612c0c565b3461053f57600036600319011261053f576020600a54604051908152f35b3461053f57600036600319011261053f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461053f57612cdb36611e03565b612ce3613644565b60005b818110612cef57005b80612d06612d0060019385876130a1565b356144c5565b507ffe3b900f2aabb109964262d78a3fc6beedc149660ce20988000c39e9a2969d9b6020612d358386886130a1565b35604051908152a101612ce6565b3461053f57600036600319011261053f576020600b54604051908152f35b90600182811c92168015612d91575b6020831014612d7b57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612d70565b6005546001600160a01b0316908115612db057565b60ff60045460a01c1615612dc057565b73721c008fdff27bf06e7e123956e2fe03b63342e39150565b634e487b7160e01b600052601160045260246000fd5b81810292918115918404141715612e0257565b612dd9565b519061085e82610ba5565b9081602091031261053f5751610a9e81610ba5565b6040513d6000823e3d90fd5b939291906001600160a01b0385163381141580612e6c575b612b00576001600160a01b03821615612aea5715612ad55761085e9461427d565b50612e773387613459565b15612e4b565b15612e8457565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb88109b195cdcdb995d608a1b6044820152606490fd5b6001600160a01b03918216815291166020820152606060408201819052610a9e92910190610a68565b15612eeb57565b60405162461bcd60e51b815260206004820152601760248201527f4e6f7420656c696769626c6520746f20617070726f76650000000000000000006044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b805115612f535760200190565b612f30565b8051821015612f535760209160051b010190565b939190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361302057300361106b5780600052601660205260ff6040600020541661300f57612ff09161ffff9160005260166020526040600020600160ff19825416179055166000526014602052604060002054151590565b15612ffe5761085e90613b13565b630c139d6960e41b60005260046000fd5b63daa9598b60e01b60005260046000fd5b637378cebb60e01b60005260046000fd5b1561303857565b60405162461bcd60e51b815260206004820152602660248201527f526563697069656e747320616e6420616d6f756e7473206c656e677468206d696044820152650e6dac2e8c6d60d31b6064820152608490fd5b6040519061309b60208361082e565b60008252565b9190811015612f535760051b0190565b919082604091031261053f576020825192015190565b91908201809211612e0257565b60009190467f000000000000000000000000000000000000000000000000000000000000000014806131e2575b806131db575b15613118575050610c2457600a5490565b9091467f00000000000000000000000000000000000000000000000000000000000000000361315157610c6957610a9e91600091613568565b506040805163c23ee3c360e01b815261ffff92909216600483015260006024830152604482019290925290816064816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115610d65576000916131be575090565b6131d7915060403d604011610d5e57610d4e818361082e565b5090565b5082613107565b5061ffff7f00000000000000000000000000000000000000000000000000000000000000001661ffff821614613101565b9291467f00000000000000000000000000000000000000000000000000000000000000001480613369575b80613362575b156132575750509050610c2457600a5490565b467f00000000000000000000000000000000000000000000000000000000000000000361328b57610c6957610a9e92613568565b929091610c24576040805163c23ee3c360e01b815261ffff83166004820152600060248201526044810193909352826064816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa918215610d6557600092613340575b50819261330457505090565b90915061ffff807f000000000000000000000000000000000000000000000000000000000000000016911603610d2e57600a54610a9e916130c7565b61335a91925060403d604011610d5e57610d4e818361082e565b5090386132f8565b5080613244565b5061ffff7f00000000000000000000000000000000000000000000000000000000000000001661ffff85161461323e565b9094926134549061085e9795936133b2818933613e50565b61343d604051926133c28461080e565b33845260208401998a52604084019283526060840190815261342a60808501938a151585526134176040519c8d976020808a015260018060a01b0390511660408901525160a0606089015260e0880190610e04565b9051868203603f19016080880152610e04565b9051848203603f190160a0860152610a68565b9051151560c083015203601f19810187528661082e565b613e74565b9061349b6134948261347d8560018060a01b03166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b5460ff1690565b613552576134a7613d4a565b91826134be575b50506134b957600090565b600190565b6020919250604051926134ea846134dc858201602090600481520190565b03601f19810186528561082e565b61350860405194859384936319ff791f60e01b855260048501612ebb565b03816eb830264ac5e8004250e1f7003d6a685afa908115610d6557600091613533575b5038806134ae565b61354c915060203d60201161149157611489818361082e565b3861352b565b5050600190565b9081602091031261053f575190565b613587600b549261ffff83166000526015602052604060002054612def565b8201809211612e0257600954604051636b31b71160e01b815261ffff929092166004830152602482019390935291602090839060449082906001600160a01b03165afa908115610d6557610a9e926000926135e3575b506130c7565b61360691925060203d60201161360d575b6135fe818361082e565b810190613559565b90386135dd565b503d6135f4565b3d1561363f573d906136258261086f565b91613633604051938461082e565b82523d6000602084013e565b606090565b6003546001600160a01b0316330361209457565b63ffffffff60e01b16636cdb3d1360e11b81149081156136a3575b8115613692575b8115613684575090565b632b435fdb60e21b14919050565b6301ffc9a760e01b8114915061367a565b6303a24d0760e21b81149150613673565b6001600160e01b03198116637965db0b60e01b149081156136d3575090565b610a9e9150613658565b3360009081527f4130507e0fae8f580a29d4b7ffcd21a16497411021a62e1079c659a675ffcbd7602052604090205460ff161561371657565b63e2517d3f60e01b600052336004527fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260245260446000fd5b600081815260176020908152604080832033845290915290205460ff16156137745750565b63e2517d3f60e01b6000523360045260245260446000fd5b916137a69183549060031b91821b91600019901b19161790565b9055565b601f81116137b6575050565b60026000526020600020906020601f840160051c830193106137f3575b601f0160051c01905b8181106137e7575050565b600081556001016137dc565b90915081906137d3565b63c7937a3760e01b60005260046000fd5b6377d30c8b60e11b60005260046000fd5b630fddefaf60e31b60005260046000fd5b6001600160801b0381160361053f57565b91908203918211612e0257565b9081602091031261053f57516001600160401b038116810361053f5790565b959161ffff936138a1918560c098949b9a979b16895260018060a01b0316602089015260e0604089015260e0880190610a68565b606087019890985260808601521660a08401526001600160a01b0316910152565b94909391926001600160801b0390356138da81613830565b168203918211612e025760115460209490613917906001600160a01b03166040516312d729bd60e21b81529788968795869530846004890161386d565b03917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610d65576139525750565b6139739060203d602011613976575b61396b818361082e565b81019061384e565b50565b503d613961565b519061085e8261052e565b9080601f8301121561053f57815161399f81611498565b926139ad604051948561082e565b81845260208085019260051b82010192831161053f57602001905b8282106139d55750505090565b81518152602091820191016139c8565b81601f8201121561053f5780516139fb8161086f565b92613a09604051948561082e565b8184526020828401011161053f57610a9e9160208085019101610a45565b90600091805181016020810191602081830312613b0f576020810151906001600160401b038211613b0757019060a09082900312613b0b57613a67610860565b91613a746020830161397d565b835260408201516001600160401b038111613b0757816020613a9892850101613988565b602084015260608201516001600160401b038111613b0757816020613abf92850101613988565b604084015260808201516001600160401b038111613b075782613af1613afc93602060a09461085e999a9701016139e5565b606086015201612e07565b608083015250613ff1565b8580fd5b8380fd5b8480fd5b80518101602081019060208382031261053f5760208301516001600160401b03811161053f5783019060a0908290031261053f57613b4f610860565b91613b5c6020830161397d565b835260408201516001600160401b03811161053f57816020613b8092850101613988565b602084015260608201516001600160401b03811161053f57816020613ba792850101613988565b60408401526080820151906001600160401b03821161053f5782613af160a0926020613bd895613be39701016139e5565b806080840152151590565b80613c02575b15613bf8575061085e906140a1565b61085e9150613ff1565b50467f000000000000000000000000000000000000000000000000000000000000000014613be9565b60008181526017602090815260408083206001600160a01b038616845290915290205460ff16613cb85760008181526017602090815260408083206001600160a01b03861684529091529020805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b60008181526017602090815260408083206001600160a01b038616845290915290205460ff1615613cb85760008181526017602090815260408083206001600160a01b03861684529091529020805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b62aa112946148015613d69575b8015613d605790565b50617a69461490565b5061b1c94614613d57565b6001600160a01b03821692908315613df5577f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191613ddb60209260018060a01b031694856000526001845260406000209060018060a01b0316600052602052604060002090565b9015159060ff1981541660ff8316179055604051908152a3565b62ced3e160e81b600052600060045260246000fd5b9091906001600160a01b03811615612aea57613e4a61085e9360019160405192600184526020840152604083019160018352606084015260808301604052565b916141e0565b90916001600160a01b03821615612ad55761085e9260405192612c5060208561082e565b919390613e9261ffff84166000526014602052604060002054151590565b15612ffe57613ea46000858786613213565b3410613f79577f03576581ba63e4576004fab120b503be860bc1197cf6fbd072c0aaf301b1dfdf9483467f000000000000000000000000000000000000000000000000000000000000000003613f1a579060009291613f02946143c4565b6040805161ffff9290921682529115156020820152a1565b50467f00000000000000000000000000000000000000000000000000000000000000001480613f72575b15613f59575050613f54906140a1565b613f02565b91600091613f5493613f6b8434613841565b92866138c2565b5084613f44565b6332201f6960e11b60005260046000fd5b6001600160a01b0381169081613f9e575050565b3b613fa65750565b610483813b1561053f5760009160448392604051948593849263fb2de5d760e01b845230600485015260248401525af1156139735780613fe86000809361082e565b80031261053f57565b8051602082015160408301516060909301516001600160a01b0390921692908315612aea5761085e936141e0565b90614037602091949394604084526040840190610a68565b6001600160a01b03909416910152565b9592610a9e9998959261012098959260018060a01b031688526020880152604087015260018060a01b0316606086015260018060a01b0316608085015260a084015260c083015260e0820152816101008201520190610a68565b6040516357c004d360e01b6020820152906140c79082906116939030906024840161401f565b600c54600d5460115460209290614109906001600160a01b031694600e54600f546010549188604051998a988998632a4f421360e11b8a523060048b01614047565b038160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610d65576141465750565b6139739060203d60201161360d576135fe818361082e565b91909250825115612f53576001602084015114806141d5575b1561419d576141968161419160009361085e9685876147a2565b612f46565b5191614878565b60405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a5908151bdad95b88125160821b6044820152606490fd5b506001835114614177565b909291835115612f53576020840193600185511480614272575b1561419d5761420c82828560006147a2565b61422161421883612f46565b51846000614878565b6001600160a01b038316614237575b5050505050565b805160010361425e57506020614254945191015191600033614702565b3880808080614230565b909161426d94506000336145ce565b614254565b5060018151146141fa565b91939290845115612f5357602085019460018651148061430c575b1561419d576142a9838284876147a2565b6142bd6142b584612f46565b518386614878565b6001600160a01b0382166142d4575b505050505050565b80516001036142fa575060206142ef95519201519233614702565b3880808080806142cc565b91926143079550336145ce565b6142ef565b506001815114614298565b8054821015612f535760005260206000200190600090565b60008181526014602052604090205461439c57601354680100000000000000008110156108295761438361436c8260018594016013556013614317565b819391549060031b91821b91600019901b19161790565b9055601354906000526014602052604060002055600190565b50600090565b6001600160a01b039091168152604060208201819052610a9e92910190610a68565b9093926020906040519363037ec3a160e21b8386015261ffff6143f3602487019560e0875260e0870190610a68565b30868601529716604085015260608401526001600160801b03813561441781613830565b1660808401520135906001600160801b0319821680920361053f576144719460209460c0836144569560a088960152015203601f19810183528261082e565b604051809381926349460b4d60e11b835230600484016143a2565b0381600060645af18015610d65576141465750565b805480156144af57600019019061449d8282614317565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b600081815260146020526040902054908115613cb857600019820190828211612e0257601354600019810193908411612e02578383600095614525950361452b575b5050506145146013614486565b601490600052602052604060002090565b55600190565b6145146145579161454d61454361455d956013614317565b90549060031b1c90565b9283916013614317565b9061378c565b55388080614507565b9081602091031261053f5751610a9e81610650565b6001600160a01b0391821681529116602082015260a060408201819052610a9e94919391926145c092916145b29190860190610e04565b908482036060860152610e04565b916080818403910152610a68565b9091949293853b6145e157505050505050565b60209361460391604051968795869563bc197c8160e01b87526004870161457b565b038160006001600160a01b0387165af160009181614698575b50614658575061462a613614565b805191908261465157632bfa23e760e11b6000526001600160a01b03821660045260246000fd5b6020915001fd5b6001600160e01b0319166343e6837f60e01b0161467b57503880808080806142cc565b632bfa23e760e11b6000526001600160a01b031660045260246000fd5b6146bb91925060203d6020116146c2575b6146b3818361082e565b810190614566565b903861461c565b503d6146a9565b6001600160a01b039182168152911660208201526040810191909152606081019190915260a060808201819052610a9e92910190610a68565b9091949293853b61471557505050505050565b60209361473791604051968795869563f23a6e6160e01b8752600487016146c9565b038160006001600160a01b0387165af160009181614781575b5061475e575061462a613614565b6001600160e01b031916630dc5919f60e01b0161467b57503880808080806142cc565b61479b91925060203d6020116146c2576146b3818361082e565b9038614750565b90919283519360005b8581106147fa57506147bf82828686614a0e565b60005b8581106147d157505050505050565b806147de60019284612f58565b506147e98185612f58565b506147f48686614bd4565b016147c2565b6148048183612f58565b51906148108185612f58565b516001600160a01b03868116159391908816158480614871575b1561484057635cbd944160e01b60005260046000fd5b60019415614852575b505050016147ab565b1561485e575b80614849565b61486a91888833614c0e565b3880614858565b508061482a565b7f428900282e26ba72f7b6103eb810cb7c7a97ce38847f4bc62d49eb88cec0a7e8600052601760205260ff6148cd837fd77c01ea8363a58197718bb1934c324522c0ef01ca567a9cb82059c351a0e20361347d565b5416801561498c575b614987576001600160a01b03811661493f575b506001600160a01b0381166148fc575050565b6001600052601b602052614930907f9fafca4c9c0d5c2cbf85f49fd8ab8212430ce78c2a0cb75b51e0f9c4f9ace00361347d565b8054918201809211612e025755565b6001600052601b602052614973907f9fafca4c9c0d5c2cbf85f49fd8ab8212430ce78c2a0cb75b51e0f9c4f9ace00361347d565b805490838203918211612e025755386148e9565b505050565b507f428900282e26ba72f7b6103eb810cb7c7a97ce38847f4bc62d49eb88cec0a7e8600052601760205260ff6149e2827fd77c01ea8363a58197718bb1934c324522c0ef01ca567a9cb82059c351a0e20361347d565b54166148d6565b9091614a00610a9e93604084526040840190610e04565b916020818403910152610e04565b9392918051835190818103614bbd57505060005b8151811015614b17578060051b90602080838501015192860101518460018060a01b038916614a94575b6001936001600160a01b038216614a67575b50505001614a22565b614a8a9161347d614a82926000526000602052604060002090565b9182546130c7565b9055388481614a5e565b509091614aaf8861347d836000526000602052604060002090565b54828110614ae057829160019493879203614ad88b61347d846000526000602052604060002090565b559350614a4c565b6040516303dee4c560e01b81526001600160a01b038a16600482015260248101919091526044810183905260648101829052608490fd5b508051939493919291600103614b7a576020908101519181015160408051938452918301526001600160a01b03928316939092169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291819081015b0390a4565b6040516001600160a01b03938416949093169233927f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb928291614b7591836149e9565b635b05999160e01b60005260045260245260446000fd5b6001600160a01b0316159081614bfc575b501561085e57635cbd944160e01b60005260046000fd5b6001600160a01b031615905038614be5565b919390916001600160a01b03614c22612d9b565b169384614c3157505050505050565b8433146142cc57843b1561053f57604051631854b24160e01b81526001600160a01b03928316600482015293821660248501529416604483015260648201939093526084810192909252600090829060a490829084905af18015610d6557614c9e575b80808080806142cc565b80614cad6000614cb39361082e565b80610616565b38614c9456fea264697066735822122055dbe91e4e6929d9650241cd7f999351835f9ba854b9eb24fa1e089cc878988364736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aacd840e16649f6b9a295d95876f4633d3a6b10b55e8162971cf78afd886d5ec89b428900282e26ba72f7b6103eb810cb7c7a97ce38847f4bc62d49eb88cec0a7e8df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42d77c01ea8363a58197718bb1934c324522c0ef01ca567a9cb82059c351a0e2034130507e0fae8f580a29d4b7ffcd21a16497411021a62e1079c659a675ffcbd70000000000000000000000000000000000000000000000000000000000000220000000000000000000000000721c002b0059009a671d00ad1700c9748146cd1b00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000da9cf2ec45b8f3b05926d2c684205b1bef946ee3000000000000000000000000c792adc8fda7fd18af7fdc87e230a5bb954462c90000000000000000000000000000000000019b6e29d82abbe0d9686ad63fb2bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cca70b6e0997a94681a3114eddd700000000000000000000000046b6462301182b393ac5f014779687d3b6d4fb57000000000000000000000000c1bf6e0ac80e92a331c4d448652c4824d4195459000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000000000000000b1c900000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000300000000000000000000000000da9cf2ec45b8f3b05926d2c684205b1bef946ee300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000004868747470733a2f2f6c6f636b2e6e7963332e63646e2e6469676974616c6f6365616e7370616365732e636f6d2f70726f642f746f6b656e732f646c6f636b2f6c6f636b2e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000da9cf2ec45b8f3b05926d2c684205b1bef946ee30000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e