0 txs
7 calls
constructor
constructor()
functions
authority
viewfunction authority() view returns (address)
channelOwner
viewfunction channelOwner(uint32) view returns (address)
channels
viewfunction channels(uint32) view returns (uint8 state, uint32 connectionId, uint32 counterpartyChannelId, bytes counterpartyPortId, string version)
clientImpls
viewfunction clientImpls(uint32) view returns (address)
clientRegistry
viewfunction clientRegistry(string) view returns (address)
clientTypes
viewfunction clientTypes(uint32) view returns (string)
commitments
viewfunction commitments(bytes32) view returns (bytes32)
connections
viewfunction connections(uint32) view returns (uint8 state, uint32 clientId, uint32 counterpartyClientId, uint32 counterpartyConnectionId)
getClient
viewfunction getClient(uint32 clientId) view returns (address)
gitRev
purefunction gitRev() pure returns (string)
isConsumingScheduledOp
viewfunction isConsumingScheduledOp() view returns (bytes4)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
acknowledgePacket
nonpayablefunction acknowledgePacket(tuple msg_)
batchAcks
nonpayablefunction batchAcks(tuple msg_)
batchSend
nonpayablefunction batchSend(tuple msg_)
channelCloseConfirm
nonpayablefunction channelCloseConfirm(tuple msg_)
channelCloseInit
nonpayablefunction channelCloseInit(tuple msg_)
channelOpenAck
nonpayablefunction channelOpenAck(tuple msg_)
channelOpenConfirm
nonpayablefunction channelOpenConfirm(tuple msg_)
channelOpenInit
nonpayablefunction channelOpenInit(tuple msg_) returns (uint32)
channelOpenTry
nonpayablefunction channelOpenTry(tuple msg_) returns (uint32)
connectionOpenAck
nonpayablefunction connectionOpenAck(tuple msg_)
connectionOpenConfirm
nonpayablefunction connectionOpenConfirm(tuple msg_)
connectionOpenInit
nonpayablefunction connectionOpenInit(tuple msg_) returns (uint32)
connectionOpenTry
nonpayablefunction connectionOpenTry(tuple msg_) returns (uint32)
createClient
nonpayablefunction createClient(tuple msg_) returns (uint32)
initialize
nonpayablefunction initialize(address authority)
misbehaviour
nonpayablefunction misbehaviour(tuple msg_)
recvIntentPacket
nonpayablefunction recvIntentPacket(tuple msg_)
recvPacket
nonpayablefunction recvPacket(tuple msg_)
registerClient
nonpayablefunction registerClient(string clientType, address client)
sendPacket
nonpayablefunction sendPacket(uint32 sourceChannelId, uint64 timeoutHeight, uint64 timeoutTimestamp, bytes data) returns (tuple)
setAuthority
nonpayablefunction setAuthority(address newAuthority)
timeoutPacket
nonpayablefunction timeoutPacket(tuple msg_)
updateClient
nonpayablefunction updateClient(tuple msg_)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
writeAcknowledgement
nonpayablefunction writeAcknowledgement(tuple packet, bytes acknowledgement)
events
AuthorityUpdated
event AuthorityUpdated(address authority)
BatchedPreviouslyAcked
event BatchedPreviouslyAcked(uint32 indexed channelId, bytes32 indexed batchHash, bytes32 indexed packetHash)
BatchedPreviouslySent
event BatchedPreviouslySent(uint32 indexed channelId, bytes32 indexed batchHash, bytes32 indexed packetHash)
ChannelCloseConfirm
event ChannelCloseConfirm(address indexed portId, uint32 indexed channelId, bytes counterpartyPortId, uint32 counterpartyChannelId)
ChannelCloseInit
event ChannelCloseInit(address indexed portId, uint32 indexed channelId, bytes counterpartyPortId, uint32 counterpartyChannelId)
ChannelOpenAck
event ChannelOpenAck(address indexed portId, uint32 indexed channelId, bytes counterpartyPortId, uint32 counterpartyChannelId, uint32 connectionId)
ChannelOpenConfirm
event ChannelOpenConfirm(address indexed portId, uint32 indexed channelId, bytes counterpartyPortId, uint32 counterpartyChannelId, uint32 connectionId)
ChannelOpenInit
event ChannelOpenInit(address indexed portId, uint32 indexed channelId, bytes counterpartyPortId, uint32 connectionId, string indexed versionIndex, string version)
ChannelOpenTry
event ChannelOpenTry(address indexed portId, uint32 indexed channelId, bytes counterpartyPortId, uint32 counterpartyChannelId, uint32 connectionId, string indexed counterpartyVersionIndex, string counterpartyVersion)
ConnectionOpenAck
event ConnectionOpenAck(uint32 indexed connectionId, uint32 indexed clientId, uint32 counterpartyClientId, uint32 counterpartyConnectionId)
ConnectionOpenConfirm
event ConnectionOpenConfirm(uint32 indexed connectionId, uint32 indexed clientId, uint32 counterpartyClientId, uint32 counterpartyConnectionId)
ConnectionOpenInit
event ConnectionOpenInit(uint32 indexed connectionId, uint32 indexed clientId, uint32 counterpartyClientId)
ConnectionOpenTry
event ConnectionOpenTry(uint32 indexed connectionId, uint32 indexed clientId, uint32 counterpartyClientId, uint32 counterpartyConnectionId)
CreateClient
event CreateClient(string indexed clientTypeIndex, string clientType, uint32 indexed clientId, string counterpartyChainId)
Initialized
event Initialized(uint64 version)
IntentPacketRecv
event IntentPacketRecv(uint32 indexed channelId, bytes32 indexed packetHash, address indexed maker, bytes makerMsg)
Misbehaviour
event Misbehaviour(uint32 indexed clientId)
PacketAck
event PacketAck(uint32 indexed channelId, bytes32 indexed packetHash, bytes acknowledgement, address indexed maker)
PacketRecv
event PacketRecv(uint32 indexed channelId, bytes32 indexed packetHash, address indexed maker, bytes makerMsg)
PacketSend
event PacketSend(uint32 indexed channelId, bytes32 indexed packetHash, (uint32 sourceChannelId, uint32 destinationChannelId, bytes data, uint64 timeoutHeight, uint64 timeoutTimestamp) packet)
PacketTimeout
event PacketTimeout(uint32 indexed channelId, bytes32 indexed packetHash, address indexed maker)
RegisterClient
event RegisterClient(string indexed clientTypeIndex, string clientType, address clientAddress)
UpdateClient
event UpdateClient(uint32 indexed clientId, uint64 height)
Upgraded
event Upgraded(address indexed implementation)
WriteAck
event WriteAck(uint32 indexed channelId, bytes32 indexed packetHash, bytes acknowledgement)
errors
AccessManagedInvalidAuthority
error AccessManagedInvalidAuthority(address authority)
AccessManagedRequiredDelay
error AccessManagedRequiredDelay(address caller, uint32 delay)
AccessManagedUnauthorized
error AccessManagedUnauthorized(address caller)
AddressEmptyCode
error AddressEmptyCode(address target)
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
ErrAcknowledgementAlreadyExists
error ErrAcknowledgementAlreadyExists()
ErrAcknowledgementIsEmpty
error ErrAcknowledgementIsEmpty()
ErrBatchSameChannelOnly
error ErrBatchSameChannelOnly()
ErrClientNotFound
error ErrClientNotFound()
ErrClientTypeAlreadyExists
error ErrClientTypeAlreadyExists()
ErrClientTypeNotFound
error ErrClientTypeNotFound()
ErrCommittedAckNotPresent
error ErrCommittedAckNotPresent()
ErrHeightTimeout
error ErrHeightTimeout()
ErrInvalidChannelState
error ErrInvalidChannelState()
ErrInvalidConnectionState
error ErrInvalidConnectionState()
ErrInvalidProof
error ErrInvalidProof()
ErrLatestTimestampNotFound
error ErrLatestTimestampNotFound()
ErrModuleNotFound
error ErrModuleNotFound()
ErrNotEnoughPackets
error ErrNotEnoughPackets()
ErrPacketAlreadyAcknowledged
error ErrPacketAlreadyAcknowledged()
ErrPacketAlreadyExist
error ErrPacketAlreadyExist()
ErrPacketCommitmentNotFound
error ErrPacketCommitmentNotFound()
ErrPacketNotReceived
error ErrPacketNotReceived()
ErrTimeoutHeightNotReached
error ErrTimeoutHeightNotReached()
ErrTimeoutMustBeSet
error ErrTimeoutMustBeSet()
ErrTimeoutTimestampNotReached
error ErrTimeoutTimestampNotReached()
ErrTimestampTimeout
error ErrTimestampTimeout()
ErrUnauthorized
error ErrUnauthorized()
FailedCall
error FailedCall()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a080604052346100c257306080525f516020615cfe5f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b604051615c3790816100c78239608051818181612ad10152612b870152f35b6001600160401b0319166001600160401b039081175f516020615cfe5f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe60c06040526004361015610011575f80fd5b5f3560e01c80630d27062c146143ef5780630e04968414614020578063113a1b7014613f715780631296c14814613f1e57806318c1987014613de75780632b2c54631461372f57806336853d6d1461364257806341279108146132a557806343085db114613206578063441fd11514612e2c5780634f1ef28614612b4957806352d1902d14612ab75780635f5d288e14612a795780636415d1a314612707578063788903881461254d5780637a9e5e4b1461249057806381408dfd1461229857806382a09c15146120ca578063839df945146120a15780638fb360371461200e578063990491a514611f9e578063999d5c6b14611d475780639aa0346f146119055780639f18077b146117d7578063ad3cb1cc14611778578063afc3619b14611407578063b1892e40146113a3578063b69562bd1461120d578063bf7e214f146111c8578063c4d66de814610f1a578063d36623ad14610de5578063de844ebc14610da7578063dea5a72314610d78578063dee97dc614610bcb578063e1dc07c614610a3c578063e5cbff791461082a578063fb407dca146106105763fed12cbf146101bb575f80fd5b34610537576101c9366146bb565b6101d33633614c8c565b6001600160a01b0360206101e78380614869565b919082604051938492833781016001815203019020541680156105e8577f9b9820486a05c0193efb214c6c2ba8fce02c5a5c84aa057f8199c99f13ff939b5f525f60205263ffffffff60405f2054169063ffffffff61024583615093565b7f9b9820486a05c0193efb214c6c2ba8fce02c5a5c84aa057f8199c99f13ff939b5f908152602052167fa17c46f2d2a87aa05f956999001178d4f3a177d856047a83ccebd64d7a2ef49d5561029a8380614869565b835f52600260205260405f209167ffffffffffffffff82116105bb576102ca826102c485546144ec565b85614944565b5f90601f831160011461055157826103c195935f95936102fe938792610546575b50505f198260011b9260031b1c19161790565b90555b8382526003602052604082206001600160a01b0382167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561034b6020860186614869565b838660606001600160a01b036103d38b61037761036e6040839b9a9b0183614869565b95909201614840565b936040519b8c9a8b998a987f384a3c30000000000000000000000000000000000000000000000000000000008a523360048b015260248a015260a060448a015260a48901916148ba565b916003198784030160648801526148ba565b9116608483015203925af190811561053b575f905f926104ae575b50907f03f4bda014b6bddaa31ba73f9e94f6bf6b7ba5b4f9c65b67640800c2b629643160209483859451610421866159e9565b5f525f885260405f205561044767ffffffffffffffff6040898401519301511686615a0e565b5f525f875260405f205561046a6104a36104618380614869565b92909380614869565b92909381604051928392833781015f8152039020946104966040519485946040865260408601916148ba565b908382038a850152614470565b0390a3604051908152f35b9150503d805f833e6104c081836145f7565b810190608081830312610537576104d78282614be6565b9060608101519067ffffffffffffffff821161053757019180601f840112156105375760209461052e7f03f4bda014b6bddaa31ba73f9e94f6bf6b7ba5b4f9c65b67640800c2b62964319285888897519101614c56565b935094506103ee565b5f80fd5b6040513d5f823e3d90fd5b013590505f806102eb565b601f19831691845f5260205f20925f5b8181106105a357509260019285926103c198965f98961061058a575b505050811b019055610301565b5f1960f88560031b161c199101351690555f808061057d565b91936020600181928787013581550195019201610561565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7faa478af9000000000000000000000000000000000000000000000000000000005f5260045ffd5b346105375761061e36614495565b610626615185565b63ffffffff811690815f52600460205260405f206040840161068061064a82614933565b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1660089190911b64ffffffff0016178355565b600260ff198354161782556106d161069786614933565b83547fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff1660289190911b68ffffffff000000000016178355565b60208501926107206106e285614933565b84547fffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff1660489190911b6cffffffff00000000000000000016178455565b61078861072c87614933565b63ffffffff61073a85614933565b8160405193610748856145db565b600185521660208401521660408201525f606082015261076a60808901614854565b61077760608a018a614869565b9061078189614933565b9288615941565b15610802576020956104a36107df6107d96107d37f0a9d00e740d5a7292ecf25db89826a19ca7963a06c398a7f95947e84d1ce8f31966107ce8b9963ffffffff98615213565b614933565b93614933565b96614933565b60405193849316968390929163ffffffff60209181604085019616845216910152565b7f14209932000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610537576080600319360112610537576108436144c8565b6024359067ffffffffffffffff82168092036105375760443567ffffffffffffffff81168091036105375760643567ffffffffffffffff81116105375761088e903690600401614627565b9390610898614c2b565b50821580610a34575b610a0c576108c98463ffffffff165f5260066020526001600160a01b0360405f205416331490565b156109e4576109099063ffffffff6108e08661576c565b5460281c169563ffffffff604051966108f8886145bf565b169687875260208701523691614720565b604084015260608301526080820152610921816153cf565b61092a816154b0565b92835f525f60205260405f20546109bc576109b8935f525f6020527f010000000000000000000000000000000000000000000000000000000000000060405f20557f635b5d234fe7abddfb29b6c8498780a3175c9002c537f20a3d1bf9d0e625b5fe60405160208152806109a16020820187614796565b0390a3604051918291602083526020830190614796565b0390f35b7fa29bd6ea000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fcc12cef6000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fddd92f79000000000000000000000000000000000000000000000000000000005f5260045ffd5b5081156108a1565b3461053757610a4a36614688565b63ffffffff610a5882614933565b165f52600460205260405f2090815460ff81166004811015610b9e57600203610b7657610ae890610a8883614933565b9063ffffffff60405192610a9b846145db565b60038452818360281c166020850152818360081c16604085015216606083015263ffffffff610acc60408601614854565b91610ada6020870187614869565b92909160481c169287615941565b1561080257610b0e90600360ff198454161783556107ce83610b0983614933565b615213565b90547fc382cf337d6f6a49bfb3fb8ec3fa62783704bd87aa72d534ff1b99195050aad860405180610b7163ffffffff808660081c1696169463ffffffff808260481c169160281c168390929163ffffffff60209181604085019616845216910152565b0390a3005b7f8ca98990000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b3461053757610bd936614688565b610be33633614c8c565b6001600160a01b03610bfc610bf783614933565b615139565b16906060610c0982614933565b92610c176020840184614869565b91905f610c2660408701614840565b96610c61604051988996879586947f8f2a49300000000000000000000000000000000000000000000000000000000086523360048701614993565b03925af191821561053b575f92610d03575b50602063ffffffff67ffffffffffffffff610cf47f078276040a4f9f4dea1214e38413d6bac929b39330be19599176564d23d5ef41948651610cbc610cb783614933565b6159e9565b5f525f865260405f205584870151610ce56040610cd884614933565b990198858a511690615a0e565b5f525f865260405f2055614933565b945116936040519485521692a2005b90915060603d606011610d71575b610d1b81836145f7565b8101906060818303126105375763ffffffff67ffffffffffffffff610cf4610d667f078276040a4f9f4dea1214e38413d6bac929b39330be19599176564d23d5ef4195602095614be6565b959450505050610c73565b503d610d11565b34610537576020600319360112610537576020610d96610bf76144c8565b6001600160a01b0360405191168152f35b346105375760206003193601126105375763ffffffff610dc56144c8565b165f52600660205260206001600160a01b0360405f205416604051908152f35b3461053757610df3366146bb565b63ffffffff610e0182614933565b165f52600460205260405f209081549060ff82166004811015610b9e57600103610b765763ffffffff610e3382614933565b8160405194610e41866145db565b60028652818160281c16602087015260081c166040850152166060830152610e8b610e6e60608301614854565b92610e7c6040840184614869565b60208501959161078187614933565b1561080257610eaa6106e2610eb793600360ff19875416178655614933565b6107ce83610b0983614933565b90547fdb439789af7a0ed4968cc1f35b0c7dfd9c878c6508bd7fd48053e87df31231d060405180610b7163ffffffff808660081c1696169463ffffffff808260481c169160281c168390929163ffffffff60209181604085019616845216910152565b3461053757602060031936011261053757610f336146ee565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c16159167ffffffffffffffff8216801590816111c0575b60011490816111b6575b1590816111ad575b5061118557818360017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000610ff99516177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055611130575b50610fe4615b1e565b610fec615b1e565b610ff4615b1e565b6154d0565b611001615b1e565b5f602081905260017fa17c46f2d2a87aa05f956999001178d4f3a177d856047a83ccebd64d7a2ef49d8190557fa948e29ac0e6a6a5e3c647a07a0505170c972dd4960cbe194aee77626bb52b588190557f8ef07afda4dec4dc66e7d18fc0e3a713f74a11b33a71422c06a4b5e623c3b21a9091527f24072874bb11662934f0c68ca2659a14efae71555bb48eba2450fe6433183f955561109d57005b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005583610fdb565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b90501584610f84565b303b159150610f7c565b849150610f72565b34610537575f6003193601126105375760206001600160a01b037ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a005416604051908152f35b346105375760406003193601126105375763ffffffff61122b61490d565b165f52600560205260405f20805460ff81166005811015610b9e5760030361137b5763ffffffff61125f9160081c16614f6b565b50600460ff1982541617815561127c8161127761490d565b615277565b63ffffffff61128961490d565b165f5260066020526001600160a01b0360405f2054166112a761490d565b602435906001600160a01b038216820361053757823b15610537576040517f172d9c4800000000000000000000000000000000000000000000000000000000815233600482015263ffffffff9190911660248201526001600160a01b039190911660448201525f8160648183865af1801561053b5761136b575b507f5d4b57424fd8ef7d85bed4d570d10b0bf5d38ef1936569ba4ca1f62ff78836e563ffffffff61135061490d565b610b7182865460281c16600160405194859416970183614aea565b5f611375916145f7565b82611321565b7f96d09146000000000000000000000000000000000000000000000000000000005f5260045ffd5b346105375760206003193601126105375763ffffffff6113c16144c8565b165f526004602052608060405f205463ffffffff604051916113e68360ff8316614774565b818160081c166020840152818160281c16604084015260481c166060820152f35b346105375761141536614495565b61141f3633614c8c565b61142981806147ec565b80929150156117505761143c81806147ec565b15611723576107ce8161144e926148da565b9061146a63ffffffff6114608461576c565b5460081c16614f6b565b92611537602061148b61148661148086806147ec565b906152f7565b61556e565b95818501966114a361149d89886147ec565b906156b0565b915f6114b160608901614854565b916114bf60408a018a614869565b9790956001600160a01b036114d384615139565b169560405190898201528881526114eb6040826145f7565b60405191898301528882526115016040836145f7565b604051998a98899788967fa9f9396e00000000000000000000000000000000000000000000000000000000885260048801614fb5565b03925af190811561053b575f916116f4575b5015610802579161155981615795565b6001600160a01b031691608081019163ffffffff16905f5b85811061157a57005b61158e8161158884806147ec565b90614a36565b908363ffffffff61159e84614933565b16036116cc576115ad826157e1565b6115c1816115bb8a866147ec565b90614acf565b906115cb87614840565b93883b15610537575f6040518080977f2cd66b6f000000000000000000000000000000000000000000000000000000008252336004830152608060248301526001600160a01b036116356116226084850188614b6c565b60031985820301604486015289896148ba565b911660648301520381838d5af190811561053b576116886116837f41d958a7d93b50b1f7541c6fc345d0c4657b1e83497baa562c866611ac1f69bb926001988b956116bc575b503690614a4d565b6153cf565b926001600160a01b0361169a8b614840565b16946116b36040519283926020845260208401916148ba565b0390a401611571565b5f6116c6916145f7565b8f61167b565b7f9629d3d7000000000000000000000000000000000000000000000000000000005f5260045ffd5b611716915060203d60201161171c575b61170e81836145f7565b810190614f9d565b85611549565b503d611704565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5458d343000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610537575f600319360112610537576109b86040516117996040826145f7565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190614470565b346105375760406003193601126105375760043567ffffffffffffffff81116105375760a060031982360301126105375760243567ffffffffffffffff811161053757611828903690600401614756565b8051156118dd57602482019161186061184084614933565b63ffffffff165f5260066020526001600160a01b0360405f205416331490565b156109e457610b7163ffffffff6118c76118b46116837f488830ba53f27b7033e966a79427476ad47d550358e894bafeef8b97c6559251956118a96118a48a614933565b61576c565b503690600401614a4d565b956107ce866118c28961556e565b6158a1565b1692604051918291602083526020830190614470565b7f2430f403000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461053757611913366146bb565b61191d3633614c8c565b61192781806148da565b61193081614933565b9161194263ffffffff6114608561576c565b916001600160a01b0361195484615139565b1692604083016044602061196783614854565b96604051928380927fe9946fc300000000000000000000000000000000000000000000000000000000825267ffffffffffffffff63ffffffff89169b8c60048501521660248301525afa801561053b575f90611d06575b67ffffffffffffffff915016918215611cde57602067ffffffffffffffff611a2592875f6119ef611683368b614a4d565b9a611a986119fc8d61556e565b611a866001600160a01b03611a1d611a138d614854565b978b810190614869565b9b9098615139565b1696604051928a840152898352611a3d6040846145f7565b6040519a8b998a9889977f3fd413de00000000000000000000000000000000000000000000000000000000895260048901521660248701526080604487015260848601916148ba565b90600319848303016064850152614470565b03925af190811561053b575f91611cbf575b501561080257611ab986615795565b91611ac3846157e1565b608084019067ffffffffffffffff611ada83614854565b161580611ca2575b610a0c5767ffffffffffffffff611af883614854565b1615159182611c84575b5050611c5c57606083019067ffffffffffffffff611b1f83614854565b1615159182611c32575b5050611c0a576001600160a01b0360609116920191611b4783614840565b91813b15610537575f91611ba2836001600160a01b0393604051968795869485937f168ce11c000000000000000000000000000000000000000000000000000000008552336004860152606060248601526064850190614b6c565b9116604483015203925af1801561053b5763ffffffff926001600160a01b0392611bd192611bfa575b50614840565b1692167f34df62ed9d26dbe71f13d2bd3f645d6cd16b0c44645ef783c2ed799748c80a745f80a4005b5f611c04916145f7565b86611bcb565b7f12c51c64000000000000000000000000000000000000000000000000000000005f5260045ffd5b67ffffffffffffffff919250611c51611c4b8392614854565b93614854565b169116118680611b29565b7f8551d235000000000000000000000000000000000000000000000000000000005f5260045ffd5b67ffffffffffffffff919250611c9990614854565b16118780611b02565b5067ffffffffffffffff611cb860608701614854565b1615611ae2565b611cd8915060203d60201161171c5761170e81836145f7565b87611aaa565b7f9b6c9adc000000000000000000000000000000000000000000000000000000005f5260045ffd5b506020813d602011611d3f575b81611d20602093836145f7565b8101031261053757611d3a67ffffffffffffffff91614b07565b6119be565b3d9150611d13565b3461053757611d55366146bb565b63ffffffff611d6382614933565b165f52600560205260405f209081549060ff82166005811015610b9e5760020361137b57611e9c63ffffffff8360081c16611d9d81614f6b565b63ffffffff611dab85614933565b165f52600660205263ffffffff60405f2054956001600160a01b0387169682611df5611dd689614933565b9663ffffffff165f52600460205263ffffffff60405f205460481c1690565b957fffffffffffffffffffffffffffffffffffffffff0000000000000000000000006040519360601b16602084015260148352611e336034846145f7565b8160405197611e41896145bf565b600389521660208801521660408601526060850152604051611e7181611e6a8160028d0161453d565b03826145f7565b6080850152611e8260408701614854565b611e8f6020880188614869565b93909260281c1693615009565b1561080257600360ff19845416178355611eb98361127783614933565b611ec281614933565b611ece60608301614840565b90833b15610537576040517fce650d3900000000000000000000000000000000000000000000000000000000815233600482015263ffffffff9190911660248201526001600160a01b039190911660448201525f8160648183875af1801561053b577f03c5f9b30a58d1ae49f1cff4d32c3906e7705104c0e815b97492af31137cb9fb9263ffffffff92611f6792611f8e575b50614933565b610b7185546040519384931696600163ffffffff808460081c169360281c16910184614a0b565b5f611f98916145f7565b86611f61565b346105375760206003193601126105375760043567ffffffffffffffff81116105375736602382011215610537576001600160a01b03602080611fec81943690602481600401359101614720565b604051928184925191829101835e810160018152030190205416604051908152f35b34610537575f600319360112610537577ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a005460a01c60ff16156120995760207f8fb36037000000000000000000000000000000000000000000000000000000005b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b60205f61206f565b34610537576020600319360112610537576004355f525f602052602060405f2054604051908152f35b34610537576120d8366146bb565b63ffffffff6120e682614933565b165f52600560205260405f209081549060ff82166005811015610b9e5760030361137b576121ce63ffffffff8360081c1661212081614f6b565b63ffffffff61212e85614933565b165f52600660205263ffffffff60405f2054956001600160a01b0387169682612159611dd689614933565b957fffffffffffffffffffffffffffffffffffffffff0000000000000000000000006040519360601b166020840152601483526121976034846145f7565b81604051976121a5896145bf565b600489521660208801521660408601526060850152604051611e7181611e6a8160028d0161453d565b1561080257600460ff198454161783556121eb8361127783614933565b6121f481614933565b61220060608301614840565b90833b15610537576040517f40380c6100000000000000000000000000000000000000000000000000000000815233600482015263ffffffff9190911660248201526001600160a01b039190911660448201525f8160648183875af1801561053b577ff55ea0b61aba75ba1463c3325f7b0a06baa2d96ee4a621a05dabdf03b489c41d9263ffffffff9261135092611f8e5750614933565b346105375760206003193601126105375760043567ffffffffffffffff811161053757806004019060406003198236030112610537576122d83633614c8c565b6122e282806147ec565b91905060028210611750576122f783806147ec565b1561172357602061230b82612311936148da565b01614933565b9161231f61148085806147ec565b602463ffffffff5f95169301935b828110612361578561235261148661148061234b61149d8a866147ec565b93806147ec565b5f525f60205260405f20555f80f35b61236f8161158888806147ec565b9080612450575b61168361239461238a836115bb8a8c6147ec565b9290943690614a4d565b9261239e8461556e565b5f525f60205260405f20549182158015612427575b6118dd576123cb916123c6913691614720565b61558e565b036123ff5760019183867fdf2b8ea755edd621da990db5273e5ac28efcd0462a19552a690540f9ef63b14f5f80a40161232d565b7f59c3580a000000000000000000000000000000000000000000000000000000005f5260045ffd5b507f010000000000000000000000000000000000000000000000000000000000000083146123b3565b8463ffffffff61246260208501614933565b1614612376577f9629d3d7000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610537576020600319360112610537576124a96146ee565b6001600160a01b037ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a005416330361252157803b156124ec576124ea906154d0565b005b6001600160a01b03907fc2f31e5e000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b7f068ca9d8000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b346105375760206003193601126105375760043567ffffffffffffffff81116105375760206003198260040192360301126105375761258c3633614c8c565b61259681806147ec565b91905060028210611750576125ab81806147ec565b15611723576107ce816125bd926148da565b916125cb61148083806147ec565b9163ffffffff5f9416935b828110612616576125e6846154b0565b5f525f6020527f010000000000000000000000000000000000000000000000000000000000000060405f20555f80f35b6126248161158884806147ec565b816126ca575b611683612638913690614a4d565b90612642826154b0565b5f525f6020527f010000000000000000000000000000000000000000000000000000000000000060405f2054036126a25760019185877f8ffe8d45aea2ea970a08903423957c59d26de1fb69c2928b63562c13ccd5e3cb5f80a4016125d6565b7f4d7cfc57000000000000000000000000000000000000000000000000000000005f5260045ffd5b8563ffffffff6126d983614933565b161461262a577f9629d3d7000000000000000000000000000000000000000000000000000000005f5260045ffd5b346105375761271536614655565b63ffffffff61272382614933565b165f52600560205260405f2090815460ff81166005811015610b9e5760010361137b5760081c63ffffffff169061275982614f6b565b9063ffffffff61276882614933565b165f52600660205260405f2054916128656001600160a01b038416946128316127b261279386614933565b9263ffffffff165f52600460205263ffffffff60405f205460481c1690565b917fffffffffffffffffffffffffffffffffffffffff0000000000000000000000006040519760601b166020880152601487526127f06034886145f7565b63ffffffff60208701976128048989614869565b9290938160405197612815896145bf565b6002895216602088015216604086015260608501523691614720565b608082015261284260808501614854565b926128506060860186614869565b90604087019561285f87614933565b93615009565b1561080257600360ff1986541617855561287f8383614869565b600287019167ffffffffffffffff82116105bb576128a1826102c485546144ec565b5f90601f8311600114612a15576128cd92915f9183612a0a5750505f198260011b9260031b1c19161790565b90555b6129166128dc82614933565b86547fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff1660289190911b68ffffffff000000000016178655565b6129238561127784614933565b61292c82614933565b9261294061293983614933565b9184614869565b91909461294f60a08601614840565b92873b15610537575f936129929160405198899586957fa6071af900000000000000000000000000000000000000000000000000000000875233600488016149cf565b038183885af191821561053b576129e16129db610b71927f958d927ded58a29a450e24013886756bcee58e1146c05e9d0c671e5003cf8d909663ffffffff966129fa5750614933565b92614933565b83875460081c1690600160405195869516980184614a0b565b5f612a04916145f7565b89611f61565b0135905089806102eb565b601f19831691845f5260205f20925f5b818110612a615750908460019594939210612a48575b505050811b0190556128d0565b5f1960f88560031b161c19910135169055888080612a3b565b91936020600181928787013581550195019201612a25565b346105375760206003193601126105375763ffffffff612a976144c8565b165f52600360205260206001600160a01b0360405f205416604051908152f35b34610537575f600319360112610537576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003612b215760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba000000000000000000000000000000000000000000000000000000005f5260045ffd5b604060031936011261053757612b5d6146ee565b60243567ffffffffffffffff811161053757612b7d903690600401614756565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803014908115612df7575b50612b2157612bc13633614c8c565b6001600160a01b038216916040517f52d1902d000000000000000000000000000000000000000000000000000000008152602081600481875afa5f9181612dc3575b50612c3457837f4c9c8ce3000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc859203612d985750813b15612d6d57807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2815115612d3c575f808360206124ea95519101845af43d15612d34573d91612d1883614704565b92612d2660405194856145f7565b83523d5f602085013e615b75565b606091615b75565b505034612d4557005b7fb398979f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4c9c8ce3000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7faa1d49a4000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091506020813d602011612def575b81612ddf602093836145f7565b8101031261053757519085612c03565b3d9150612dd2565b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141583612bb2565b3461053757612e3a36614495565b60408101612e4f612e4a82614933565b614f6b565b50612e586150ab565b9063ffffffff821691825f52600560205260405f2093600160ff19865416178555612ebb612e8584614933565b86547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1660089190911b64ffffffff0016178655565b60608101612ec98183614869565b600288019167ffffffffffffffff82116105bb57612eeb826102c485546144ec565b5f90601f83116001146131a257612f1792915f91836131975750505f198260011b9260031b1c19161790565b90555b612f276020830183614869565b60018801979167ffffffffffffffff82116105bb57612f5082612f4a8b546144ec565b8b614944565b5f90601f831160011461312f579180612f8192612f8a95945f926131245750505f198260011b9260031b1c19161790565b88555b84615277565b612fdc83612f9784614840565b9063ffffffff165f5260066020526001600160a01b0360405f2091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6001600160a01b03612fed83614840565b1692612ff885614933565b906130038385614869565b95909161301260808701614840565b823b15610537575f9461305786926040519a8b97889687957f10cac64800000000000000000000000000000000000000000000000000000000875233600488016149cf565b03925af192831561053b576020966131097f370d54a331c7da62dbd4e3f464f8ca9b0c4726640604fcb08cd4cfb5ed41d033936130f4938997613114575b506130a86130a287614840565b98614933565b906001600160a01b036130c66130be838a614869565b939099614869565b92909881604051928392833781015f81520390209963ffffffff60405197889760608952606089019061453d565b94168d870152858403604087015216966148ba565b0390a4604051908152f35b5f61311e916145f7565b8a613095565b013590508b806102eb565b601f198316918a5f5260205f20925f5b81811061317f5750916001939185612f8a97969410613166575b505050811b018855612f84565b5f1960f88560031b161c199101351690558a8080613159565b9193602060018192878701358155019501920161313f565b013590508a806102eb565b601f19831691845f5260205f20925f5b8181106131ee57509084600195949392106131d5575b505050811b019055612f1a565b5f1960f88560031b161c199101351690558980806131c8565b919360206001819287870135815501950192016131b2565b34610537576040600319360112610537576020613221615185565b61325963ffffffff821691825f526004845260405f209061324361064a61490d565b600160ff19835416178255610b09610697614920565b61326161490d565b817f5c19396f17b2d5b8ebfa9d37569101115f64e85557fe202593aa3e5555bad05d8463ffffffff613291614920565b9481604051961686521693a3604051908152f35b34610537576132f66132b6366146bb565b6132c03633614c8c565b6132ca81806147ec565b9290916132d960408201614840565b6080526132e960208201826147ec565b9290916060810190614869565b505083156117505761330d602061230b85806148da565b9361331f63ffffffff6114608761576c565b5061332985615795565b5f633b9aca0042029267ffffffffffffffff428504633b9aca0014421517159416915b81811061335557005b61336081838a614a36565b90602082019163ffffffff8b1663ffffffff61337b85614933565b16036116cc576060810167ffffffffffffffff61339782614854565b1615159081613624575b506135fc57866135cf576080810167ffffffffffffffff6133c182614854565b16151590816135b1575b50613589576133dd6116833683614a4d565b906133e78261556e565b90815f525f602052878b8b60405f20541580613557575b613413575b505050505050600191500161334c565b6001600160a01b03979361346f959361342f895f958695614acf565b94819b86946040519a8b96879586937f6f104830000000000000000000000000000000000000000000000000000000008552608051903360048701614f2e565b0393165af193841561053b5760019786915f96613533575b507fdbb36eab1a905641d6490533e8dfb257a8633c9a26a166c0954a1fc59d7946b76134dd63ffffffff6134ba88614933565b1692604051918291602083526001600160a01b03608051169760208401916148ba565b0390a482516134f0575b50878b8b613403565b63ffffffff6118c77f488830ba53f27b7033e966a79427476ad47d550358e894bafeef8b97c6559251936107ce86613527956158a1565b0390a38a8080806134e7565b6135509196503d805f833e61354881836145f7565b810190614ef7565b945f613487565b855f525f6020527f010000000000000000000000000000000000000000000000000000000000000060405f20556133fe565b7fa4821270000000000000000000000000000000000000000000000000000000005f5260045ffd5b67ffffffffffffffff91506135c590614854565b168510158c6133cb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7fa9cfb705000000000000000000000000000000000000000000000000000000005f5260045ffd5b67ffffffffffffffff915061363890614854565b164310158c6133a1565b346105375761365036614688565b61365a3633614c8c565b6001600160a01b0361366e610bf783614933565b169061367981614933565b6136866020830183614869565b909361369460408501614840565b94813b15610537575f80946136d9604051988996879586947f553931740000000000000000000000000000000000000000000000000000000086523360048701614993565b03925af190811561053b5763ffffffff926136f89261371f5750614933565b167f2d86933ea68552f2484167a027c9e1a658fee909dffcc151fb2d4fde750311265f80a2005b5f613729916145f7565b83611f61565b346105375761373d36614655565b602081019061374c82826148da565b356005811015610537577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0161137b5761378e612e4a602061230b85856148da565b916138796137c26137a4602061230b85876148da565b63ffffffff165f52600460205263ffffffff60405f205460481c1690565b6137cb84614840565b947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000006040519660601b166020870152601486526138096034876145f7565b61384b604086019661381b8888614869565b909163ffffffff6040519661382f886145bf565b600188521660208701525f604087015260608601523691614720565b608083015261385c60808601614854565b6138696060870187614869565b9161285f604061230b898b6148da565b15610802576138866150ab565b9261389182846148da565b9363ffffffff811694855f52600560205260405f20813560058110156105375760ff60ff1983541691161781556139036138cd60208401614933565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1660089190911b64ffffffff0016178255565b61394c61391260408401614933565b82547fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff1660289190911b68ffffffff000000000016178255565b6001810161395d6060840184614869565b9067ffffffffffffffff82116105bb5761397b826102c485546144ec565b5f90601f8311600114613d7c57826139be9593600295936139af935f92613d715750505f198260011b9260031b1c19161790565b90555b01916080810190614869565b9067ffffffffffffffff82116105bb576139dc826102c485546144ec565b5f90601f8311600114613d0d57613a0892915f9183612a0a5750505f198260011b9260031b1c19161790565b90555b613a1583856148da565b90604051602081019060208252833560058110156105375781613ad2613b0096613a46613ae094604085019061461a565b63ffffffff613a57602083016144db565b16606084015263ffffffff613a6e604083016144db565b166080840152613aa2613a97613a876060840184614b1c565b60a08088015260e08701916148ba565b916080810190614b1c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08584030160c08601526148ba565b03601f1981018352826145f7565b519020613aec82615a45565b5f525f60205260405f2055612f9785614840565b6001600160a01b03613b1184614840565b1691613b22602061230b83876148da565b92613b32604061230b84886148da565b613b49613b3f84886148da565b6080810190614869565b9590613b558689614869565b613b6160a08b01614840565b92863b1561053757604051998a9687967f5101edc400000000000000000000000000000000000000000000000000000000885233600489015263ffffffff1660248801528d604488015263ffffffff1660648701526084860160e0905260e4860190613bcc926148ba565b908482036003190160a4860152613be2926148ba565b906001600160a01b031660c483015203815a5f948591f192831561053b578593613cfd575b50613c1184614840565b93613c1c82826148da565b60608101613c2991614869565b919092613c3681836148da565b604001613c4290614933565b90613c4d90836148da565b602001613c5990614933565b96613c648684614869565b96613c6f9194614869565b96909381604051928392833781015f815203902097604051958695608087526080870190613c9c926148ba565b9263ffffffff16602086015263ffffffff16604085015283820360608501526001600160a01b031694613cce926148ba565b037f9856c775e40c73b8fdab7ee177e147e26a1ee9cda934ab9497a46da9ab5481ce91a4604051908152602090f35b5f613d07916145f7565b85613c07565b601f19831691845f5260205f20925f5b818110613d595750908460019594939210613d40575b505050811b019055613a0b565b5f1960f88560031b161c19910135169055888080613d33565b91936020600181928787013581550195019201613d1d565b013590508d806102eb565b601f19831691845f5260205f20925f5b818110613dcf57509260019285926139be98966002989610613db6575b505050811b0190556139b2565b5f1960f88560031b161c199101351690558c8080613da9565b91936020600181928787013581550195019201613d8c565b346105375760406003193601126105375760043567ffffffffffffffff811161053757613e18903690600401614627565b602435916001600160a01b03831680930361053757613e373633614c8c565b6001600160a01b036040518383823760208185810160018152030190205416613ef6577f52dcd9fec0aa3ec676cc46ae22674ebc00b38c2e1c522b26910c5bdd76a3473c916040518183823760208183810160018152030190206001600160a01b0385167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560405181838237808281015f815203902093613eeb6040519384936040855260408501916148ba565b9060208301520390a2005b7f0c7cc9b9000000000000000000000000000000000000000000000000000000005f5260045ffd5b346105375760206003193601126105375763ffffffff613f3c6144c8565b165f5260026020526109b8611e6a613f5d60405f206040519283809261453d565b604051918291602083526020830190614470565b346105375760206003193601126105375763ffffffff613f8f6144c8565b165f52600560205263ffffffff60405f206109b86002614012835493613fda60405191613fca83613fc3816001850161453d565b03846145f7565b613fc3604051809681930161453d565b6040519585613fed8860ff81991661461a565b818160081c16602088015260281c16604086015260a0606086015260a0850190614470565b908382036080850152614470565b346105375761402e36614495565b6140383633614c8c565b61404281806147ec565b61404e60408401614840565b60a05261405e60208401846147ec565b9161407961406e60808701614854565b956060810190614869565b908215611750576020906140918261230b89806148da565b976140a363ffffffff6114608b61576c565b905f6140b76140b2888c6152f7565b6154b0565b9261411b6001600160a01b036140cc83615139565b169460405190888201528781526140e46040826145f7565b604051907f0100000000000000000000000000000000000000000000000000000000000000898301528882526115016040836145f7565b03925af190811561053b575f916143d0575b50156108025761413c85615795565b5f633b9aca0042029267ffffffffffffffff428504633b9aca0014421517159416915b81811061416857005b61417381838a614a36565b90602082019163ffffffff8b1663ffffffff61418e85614933565b16036116cc576060810167ffffffffffffffff6141aa82614854565b16151590816143b2575b506135fc57866135cf576080810167ffffffffffffffff6141d482614854565b1615159081614394575b50613589576141f06116833683614a4d565b906141fa8261556e565b90815f525f602052878b8b60405f20541580614362575b614226575b505050505050600191500161415f565b6001600160a01b0397936142829593614242895f958695614acf565b94819b86946040519a8b96879586937f667b822e00000000000000000000000000000000000000000000000000000000855260a051903360048701614f2e565b0393165af193841561053b5760019786915f96614346575b507fe450e03249d131499e278eeafd8e27effcceeb40b0b95628a087aa16b4b101d56142f063ffffffff6142cd88614933565b1692604051918291602083526001600160a01b0360a051169760208401916148ba565b0390a48251614303575b50878b8b614216565b63ffffffff6118c77f488830ba53f27b7033e966a79427476ad47d550358e894bafeef8b97c6559251936107ce8661433a956158a1565b0390a38a8080806142fa565b61435b9196503d805f833e61354881836145f7565b945f61429a565b855f525f6020527f010000000000000000000000000000000000000000000000000000000000000060405f2055614211565b67ffffffffffffffff91506143a890614854565b168510158c6141de565b67ffffffffffffffff91506143c690614854565b164310158c6141b4565b6143e9915060203d60201161171c5761170e81836145f7565b8661412d565b34610537575f600319360112610537576109b86040516144106060826145f7565b602881527f326436636362616166386463623664323832653865343939353834646539333760208201527f663937313930363600000000000000000000000000000000000000000000000060408201526040519182916020835260208301905b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6020600319820112610537576004359067ffffffffffffffff8211610537576003198260a0920301126105375760040190565b6004359063ffffffff8216820361053757565b359063ffffffff8216820361053757565b90600182811c92168015614533575b602083101461450657565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f16916144fb565b5f929181549161454c836144ec565b80835292600181169081156145a1575060011461456857505050565b5f9081526020812093945091925b838310614587575060209250010190565b600181602092949394548385870101520191019190614576565b9050602094955060ff1991509291921683830152151560051b010190565b60a0810190811067ffffffffffffffff8211176105bb57604052565b6080810190811067ffffffffffffffff8211176105bb57604052565b90601f601f19910116810190811067ffffffffffffffff8211176105bb57604052565b906005821015610b9e5752565b9181601f840112156105375782359167ffffffffffffffff8311610537576020838186019501011161053757565b6020600319820112610537576004359067ffffffffffffffff8211610537576003198260c0920301126105375760040190565b6020600319820112610537576004359067ffffffffffffffff821161053757600319826060920301126105375760040190565b6020600319820112610537576004359067ffffffffffffffff821161053757600319826080920301126105375760040190565b600435906001600160a01b038216820361053757565b67ffffffffffffffff81116105bb57601f01601f191660200190565b92919261472c82614704565b9161473a60405193846145f7565b829481845281830111610537578281602093845f960137010152565b9080601f830112156105375781602061477193359101614720565b90565b906004821015610b9e5752565b359067ffffffffffffffff8216820361053757565b9063ffffffff825116815263ffffffff6020830151166020820152608067ffffffffffffffff816147d6604086015160a0604087015260a0860190614470565b9482606082015116606086015201511691015290565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610537570180359067ffffffffffffffff821161053757602001918160051b3603831361053757565b356001600160a01b03811681036105375790565b3567ffffffffffffffff811681036105375790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610537570180359067ffffffffffffffff82116105375760200191813603831361053757565b601f8260209493601f1993818652868601375f8582860101520116010190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6181360301821215610537570190565b60043563ffffffff811681036105375790565b60243563ffffffff811681036105375790565b3563ffffffff811681036105375790565b601f821161495157505050565b5f5260205f20906020601f840160051c83019310614989575b601f0160051c01905b81811061497e575050565b5f8155600101614973565b909150819061496a565b939260609363ffffffff6001600160a01b0394856149c8959a999a1688521660208701526080604087015260808601916148ba565b9416910152565b9463ffffffff6001600160a01b0394816149c89587608099969c9b9c168a5216602089015216604087015260a0606087015260a08601916148ba565b91939263ffffffff9081614a2960409460608752606087019061453d565b9616602085015216910152565b90821015611723576147719160051b8101906148da565b91909160a0818403126105375760405190614a67826145bf565b8193614a72826144db565b8352614a80602083016144db565b602084015260408201359067ffffffffffffffff82116105375782614aae60809492614aca94869401614756565b6040860152614abf60608201614781565b606086015201614781565b910152565b9082101561172357614ae69160051b810190614869565b9091565b9063ffffffff6149c860209295949560408552604085019061453d565b519067ffffffffffffffff8216820361053757565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561053757016020813591019167ffffffffffffffff821161053757813603831361053757565b9063ffffffff614b7b836144db565b16815263ffffffff614b8f602084016144db565b166020820152608067ffffffffffffffff614bdf82614bc5614bb46040880188614b1c565b60a0604089015260a08801916148ba565b9583614bd360608301614781565b16606087015201614781565b1691015290565b9190826060910312610537576040516060810181811067ffffffffffffffff8211176105bb576040526040614aca818395805185526020810151602086015201614b07565b60405190614c38826145bf565b5f608083828152826020820152606060408201528260608201520152565b929192614c6282614704565b91614c7060405193846145f7565b829481845281830111610537578281602093845f96015e010152565b7ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a0054916001600160a01b0383169281600411610537575f5f9060405f8151966001600160a01b0360208901917fb700961300000000000000000000000000000000000000000000000000000000835216978860248201523060448201527fffffffff00000000000000000000000000000000000000000000000000000000833516606482015260648152614d416084826145f7565b828052826020525190895afa614ee4575b15614d5f575b5050505050565b63ffffffff1615614eb8577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000177ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a0055823b15610537576020925f92836040518096819582947f94c7d7ee000000000000000000000000000000000000000000000000000000008452600484015260406024840152601f19601f6044850192808452808786860137868582860101520116010103925af1801561053b57614ea8575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a0054167ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00555f80808080614d58565b5f614eb2916145f7565b5f614e37565b827f068ca9d8000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b50505f516020518060201c150290614d52565b6020818303126105375780519067ffffffffffffffff821161053757019080601f8301121561053757815161477192602001614c56565b90614f57614771969495936001600160a01b038093168452608060208501526080840190614b6c565b9416604082015260608185039101526148ba565b63ffffffff165f52600460205260405f205460ff81166004811015610b9e57600303610b765760081c63ffffffff1690565b90816020910312610537575180151581036105375790565b949192614771969467ffffffffffffffff614ffb9563ffffffff614fed9516895216602088015260a0604088015260a08701916148ba565b908482036060860152614470565b916080818403910152614470565b5f9061506560209694959761504e6150326001600160a01b0361502b86615139565b1697615a45565b91604051928a8401528983526150496040846145f7565b615a6b565b9060405191898301528882526115016040836145f7565b03925af190811561053b575f9161507a575090565b614771915060203d60201161171c5761170e81836145f7565b63ffffffff60019116019063ffffffff82116135cf57565b7fc031b20c2b3a8a1fbfa9cc022aa3477489d4b8c91f0e667e900f5ad44daf8b6d5f525f60205263ffffffff60405f20541663ffffffff6150eb82615093565b7fc031b20c2b3a8a1fbfa9cc022aa3477489d4b8c91f0e667e900f5ad44daf8b6d5f908152602052167fa948e29ac0e6a6a5e3c647a07a0505170c972dd4960cbe194aee77626bb52b585590565b63ffffffff165f5260036020526001600160a01b0360405f205416801561515d5790565b7fb6c71f7d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f8ef07afda4dec4dc66e7d18fc0e3a713f74a11b33a71422c06a4b5e623c3b21a5f525f60205263ffffffff60405f20541663ffffffff6151c582615093565b7f8ef07afda4dec4dc66e7d18fc0e3a713f74a11b33a71422c06a4b5e623c3b21a5f908152602052167f24072874bb11662934f0c68ca2659a14efae71555bb48eba2450fe6433183f955590565b9061526a9060405163ffffffff6020820192546152338460ff8316614774565b818160081c166040840152818160281c16606084015260481c1660808201526080815261526160a0826145f7565b51902091615af8565b5f525f60205260405f2055565b9060405190615285826145bf565b80549160ff83166005811015610b9e576152e76152f19363ffffffff61526a966002948652818160081c16602087015260281c1660408501526040516152d281611e6a816001860161453d565b6060850152611e6a604051809481930161453d565b6080820152615a6b565b91615a45565b60405190816020810193806040830160208752526060820160608260051b84010191845f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6181360301935b838310615368575050505050615362925003601f1981018352826145f7565b51902090565b9193957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09086929496030182528635868112156105375760206153b060019386839401614b6c565b98019201930190959391879593615343565b8051156117235760200190565b6040908151906153df83836145f7565b60018252601f1983015f5b8181106154995750506153fc826153c2565b52615406816153c2565b508151908160208101938101916020855280518093526060820192602060608260051b8501019201935f905b82821061544f57505050615362925003601f1981018352826145f7565b91936020615489857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0839460019698030186528851614796565b9601920192018593919492615432565b6020906154a4614c2b565b828287010152016153ea565b6040516020810191600483526040820152604081526153626060826145f7565b60206001600160a01b037f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad9216807fffffffffffffffffffffffff00000000000000000000000000000000000000007ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a005416177ff3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a0055604051908152a1565b6040516020810191600583526040820152604081526153626060826145f7565b90604080519261559e82856145f7565b60018452601f1982015f5b81811061569f5750506155bb846153c2565b526155c5836153c2565b508051602081019181016020835284518091526060820190602060608260051b8501019601915f905b828210615656575050505061562d817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff949503601f1981018352826145f7565b519020167f01000000000000000000000000000000000000000000000000000000000000001790565b90919296602080615691837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528b51614470565b9901920192019092916155ee565b8060606020809389010152016155a9565b9190604051602081019180604083016020855252606082019060608160051b8401019580925f915b83831061571857505050505061562d817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff949503601f1981018352826145f7565b909192939760208061575d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030187526157578d87614b1c565b906148ba565b9a0193019301919392906156d8565b63ffffffff165f52600560205260405f2060ff8154166005811015610b9e5760030361137b5790565b63ffffffff165f5260066020526001600160a01b0360405f20541680156157b95790565b7fc6830cff000000000000000000000000000000000000000000000000000000005f5260045ffd5b6140b26116836157f2923690614a4d565b805f525f60205260405f20547f02000000000000000000000000000000000000000000000000000000000000008114615879577f0100000000000000000000000000000000000000000000000000000000000000036126a2575f525f6020527f020000000000000000000000000000000000000000000000000000000000000060405f2055565b7f40862ab2000000000000000000000000000000000000000000000000000000005f5260045ffd5b90815f525f60205260405f20548015615919577f0100000000000000000000000000000000000000000000000000000000000000036158f1576158e39061558e565b905f525f60205260405f2055565b7f5c6d7711000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f53a55dcb000000000000000000000000000000000000000000000000000000005f5260045ffd5b60209492939561506563ffffffff5f935460081c16916159726001600160a01b0361596b85615139565b1696615af8565b9060405191898301528882526159896040836145f7565b60405163ffffffff60608b8301936159a2858251614774565b828d82015116604085015282604082015116828501520151166080820152608081526159cf60a0826145f7565b5190209060405191898301528882526115016040836145f7565b60405163ffffffff60208201925f8452166040820152604081526153626060826145f7565b9067ffffffffffffffff6040519163ffffffff602084019460018652166040840152166060820152606081526153626080826145f7565b60405163ffffffff602082019260038452166040820152604081526153626060826145f7565b60405161536281613ad2602082019460208652615a8c60408401825161461a565b63ffffffff602082015116606084015263ffffffff60408201511660808401526080615ac6606083015160a08087015260e0860190614470565b9101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160c0850152614470565b60405163ffffffff602082019260028452166040820152604081526153626060826145f7565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615615b4d57565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b90615bb25750805115615b8a57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580615bf8575b615bc3575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15615bbb56fea26469706673582212200a65198fa51536ae0fdbc32e7866a16abad7906f1058e59206a965a0743a82d064736f6c634300081b0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00