UNPKG

@layerzerolabs/oft-alt-evm

Version:

LayerZero Labs reference EVM OmniChain Fungible Token (OFT) implementation

1 lines 273 kB
{"abi":[{"type":"constructor","inputs":[{"name":"_verifyHelper","type":"address","internalType":"address payable"},{"name":"_endpoint","type":"address","internalType":"address"},{"name":"_treasuryGasCap","type":"uint256","internalType":"uint256"},{"name":"_treasuryGasForFeeCap","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"executorConfigs","inputs":[{"name":"oapp","type":"address","internalType":"address"},{"name":"eid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"maxMessageSize","type":"uint32","internalType":"uint32"},{"name":"executor","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fees","inputs":[{"name":"worker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getAppUlnConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct UlnConfig","components":[{"name":"confirmations","type":"uint64","internalType":"uint64"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getConfig","inputs":[{"name":"_eid","type":"uint32","internalType":"uint32"},{"name":"_oapp","type":"address","internalType":"address"},{"name":"_configType","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getExecutorConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"rtnConfig","type":"tuple","internalType":"struct ExecutorConfig","components":[{"name":"maxMessageSize","type":"uint32","internalType":"uint32"},{"name":"executor","type":"address","internalType":"address"}]}],"stateMutability":"view"},{"type":"function","name":"getUlnConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"rtnConfig","type":"tuple","internalType":"struct UlnConfig","components":[{"name":"confirmations","type":"uint64","internalType":"uint64"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"isSupportedEid","inputs":[{"name":"_eid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageLibType","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"enum MessageLibType"}],"stateMutability":"pure"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"quote","inputs":[{"name":"_packet","type":"tuple","internalType":"struct Packet","components":[{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"srcEid","type":"uint32","internalType":"uint32"},{"name":"sender","type":"address","internalType":"address"},{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"receiver","type":"bytes32","internalType":"bytes32"},{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"message","type":"bytes","internalType":"bytes"}]},{"name":"_options","type":"bytes","internalType":"bytes"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","internalType":"struct MessagingFee","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"send","inputs":[{"name":"_packet","type":"tuple","internalType":"struct Packet","components":[{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"srcEid","type":"uint32","internalType":"uint32"},{"name":"sender","type":"address","internalType":"address"},{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"receiver","type":"bytes32","internalType":"bytes32"},{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"message","type":"bytes","internalType":"bytes"}]},{"name":"_options","type":"bytes","internalType":"bytes"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"fee","type":"tuple","internalType":"struct MessagingFee","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}]},{"name":"encodedPacket","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"setConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_params","type":"tuple[]","internalType":"struct SetConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"configType","type":"uint32","internalType":"uint32"},{"name":"config","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultExecutorConfigs","inputs":[{"name":"_params","type":"tuple[]","internalType":"struct SetDefaultExecutorConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct ExecutorConfig","components":[{"name":"maxMessageSize","type":"uint32","internalType":"uint32"},{"name":"executor","type":"address","internalType":"address"}]}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultUlnConfigs","inputs":[{"name":"_params","type":"tuple[]","internalType":"struct SetDefaultUlnConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct UlnConfig","components":[{"name":"confirmations","type":"uint64","internalType":"uint64"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreasury","inputs":[{"name":"_treasury","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreasuryNativeFeeCap","inputs":[{"name":"_newTreasuryNativeFeeCap","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"_interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"testHelper","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract TestHelperOz5"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"treasury","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"major","type":"uint64","internalType":"uint64"},{"name":"minor","type":"uint8","internalType":"uint8"},{"name":"endpointVersion","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"type":"function","name":"withdrawFee","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawLzTokenFee","inputs":[{"name":"_lzToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DVNFeePaid","inputs":[{"name":"requiredDVNs","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"fees","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"DefaultExecutorConfigsSet","inputs":[{"name":"params","type":"tuple[]","indexed":false,"internalType":"struct SetDefaultExecutorConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct ExecutorConfig","components":[{"name":"maxMessageSize","type":"uint32","internalType":"uint32"},{"name":"executor","type":"address","internalType":"address"}]}]}],"anonymous":false},{"type":"event","name":"DefaultUlnConfigsSet","inputs":[{"name":"params","type":"tuple[]","indexed":false,"internalType":"struct SetDefaultUlnConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct UlnConfig","components":[{"name":"confirmations","type":"uint64","internalType":"uint64"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}]}],"anonymous":false},{"type":"event","name":"ExecutorConfigSet","inputs":[{"name":"oapp","type":"address","indexed":false,"internalType":"address"},{"name":"eid","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"config","type":"tuple","indexed":false,"internalType":"struct ExecutorConfig","components":[{"name":"maxMessageSize","type":"uint32","internalType":"uint32"},{"name":"executor","type":"address","internalType":"address"}]}],"anonymous":false},{"type":"event","name":"ExecutorFeePaid","inputs":[{"name":"executor","type":"address","indexed":false,"internalType":"address"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"LzTokenFeeWithdrawn","inputs":[{"name":"lzToken","type":"address","indexed":false,"internalType":"address"},{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NativeFeeWithdrawn","inputs":[{"name":"worker","type":"address","indexed":false,"internalType":"address"},{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TreasuryNativeFeeCapSet","inputs":[{"name":"newTreasuryNativeFeeCap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TreasurySet","inputs":[{"name":"treasury","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"UlnConfigSet","inputs":[{"name":"oapp","type":"address","indexed":false,"internalType":"address"},{"name":"eid","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"config","type":"tuple","indexed":false,"internalType":"struct UlnConfig","components":[{"name":"confirmations","type":"uint64","internalType":"uint64"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"anonymous":false},{"type":"error","name":"DVN_InvalidDVNIdx","inputs":[]},{"type":"error","name":"DVN_InvalidDVNOptions","inputs":[{"name":"cursor","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_MessageLib_CannotWithdrawAltToken","inputs":[]},{"type":"error","name":"LZ_MessageLib_InvalidAmount","inputs":[{"name":"requested","type":"uint256","internalType":"uint256"},{"name":"available","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_MessageLib_InvalidExecutor","inputs":[]},{"type":"error","name":"LZ_MessageLib_InvalidMessageSize","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_MessageLib_NotTreasury","inputs":[]},{"type":"error","name":"LZ_MessageLib_OnlyEndpoint","inputs":[]},{"type":"error","name":"LZ_MessageLib_TransferFailed","inputs":[]},{"type":"error","name":"LZ_MessageLib_ZeroMessageSize","inputs":[]},{"type":"error","name":"LZ_ULN_AtLeastOneDVN","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidConfigType","inputs":[{"name":"configType","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"LZ_ULN_InvalidConfirmations","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidLegacyType1Option","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidLegacyType2Option","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidOptionalDVNCount","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidOptionalDVNThreshold","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidRequiredDVNCount","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidWorkerId","inputs":[{"name":"workerId","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"LZ_ULN_InvalidWorkerOptions","inputs":[{"name":"cursor","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_ULN_Unsorted","inputs":[]},{"type":"error","name":"LZ_ULN_UnsupportedEid","inputs":[{"name":"eid","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"LZ_ULN_UnsupportedOptionType","inputs":[{"name":"optionType","type":"uint16","internalType":"uint16"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"Transfer_NativeFailed","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Transfer_ToAddressIsZero","inputs":[]}],"bytecode":{"object":"0x60e060405234801562000010575f80fd5b506040516200588138038062005881833981016040819052620000339162000185565b82828282836001600160a01b031663416ecebf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001cf565b6001600160a01b03821660805263ffffffff811660a05283833380620000d957604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000e4816200011e565b5060c0919091526002555050600680546001600160a01b0319166001600160a01b03989098169790971790965550620001fb945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811462000182575f80fd5b50565b5f805f806080858703121562000199575f80fd5b8451620001a6816200016d565b6020860151909450620001b9816200016d565b6040860151606090960151949790965092505050565b5f60208284031215620001e0575f80fd5b815163ffffffff81168114620001f4575f80fd5b9392505050565b60805160a05160c0516156426200023f5f395f8181612458015261264f01525f50505f81816107f80152818161093b015281816116c30152611daa01526156425ff3fe608060405260043610610186575f3560e01c806361d027b3116100d1578063d15b0d491161007c578063f2fde38b11610057578063f2fde38b14610528578063faaebd2114610547578063fd9be52214610580575f80fd5b8063d15b0d49146104be578063d80e9bd9146104dd578063f0f4426014610509575f80fd5b80638da5cb5b116100ac5780638da5cb5b1461044a5780639c33abf714610473578063c14c43491461049f575f80fd5b806361d027b3146103eb5780636750cd4c14610417578063715018a614610436575f80fd5b806329460b0b1161013157806343ea4fa91161010c57806343ea4fa9146103145780634d9632001461033357806354fd4d50146103c0575f80fd5b806329460b0b1461029c57806339e3f938146102bb5780634389e58f146102e7575f80fd5b80631881d94d116101615780631881d94d14610242578063200175f71461025c57806320efd7221461027d575f80fd5b806301ffc9a7146101915780630e97289b146101c5578063188183f414610216575f80fd5b3661018d57005b5f80fd5b34801561019c575f80fd5b506101b06101ab3660046141f9565b61059f565b60405190151581526020015b60405180910390f35b3480156101d0575f80fd5b506006546101f19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b348015610221575f80fd5b50610235610230366004614285565b610683565b6040516101bc91906142bc565b34801561024d575f80fd5b505f6040516101bc91906142ef565b348015610267575f80fd5b5061027b61027636600461432e565b61078e565b005b348015610288575f80fd5b5061027b6102973660046143ad565b610939565b3480156102a7575f80fd5b5061027b6102b63660046143fe565b610aec565b3480156102c6575f80fd5b506102da6102d5366004614285565b610ccf565b6040516101bc91906144fe565b3480156102f2575f80fd5b5061030661030136600461451f565b610e6a565b6040516101bc929190614631565b34801561031f575f80fd5b506102da61032e366004614285565b610f1f565b34801561033e575f80fd5b5061038f61034d366004614285565b600460209081525f928352604080842090915290825290205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016101bc565b3480156103cb575f80fd5b5060408051600381525f60208201526002918101919091526060016101bc565b3480156103f6575f80fd5b506003546101f19073ffffffffffffffffffffffffffffffffffffffff1681565b348015610422575f80fd5b506101b0610431366004614654565b6112d0565b348015610441575f80fd5b5061027b6112da565b348015610455575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166101f1565b34801561047e575f80fd5b5061049261048d36600461466f565b6112ed565b6040516101bc91906146b7565b3480156104aa575f80fd5b5061027b6104b93660046146c9565b6113d4565b3480156104c9575f80fd5b5061027b6104d8366004614738565b611547565b3480156104e8575f80fd5b506104fc6104f736600461451f565b6115d5565b6040516101bc919061474f565b348015610514575f80fd5b5061027b610523366004614766565b611643565b348015610533575f80fd5b5061027b610542366004614766565b611657565b348015610552575f80fd5b50610572610561366004614766565b60056020525f908152604090205481565b6040519081526020016101bc565b34801561058b575f80fd5b5061027b61059a366004614781565b6116b7565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f97f0258400000000000000000000000000000000000000000000000000000000148061063157507fffffffff0000000000000000000000000000000000000000000000000000000082167fb6e9ace300000000000000000000000000000000000000000000000000000000145b8061067d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080518082019091525f808252602082015263ffffffff8083165f8181527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845260048352818420948452939091528120805492939092169081900361071257825463ffffffff16610714565b805b63ffffffff1684528154640100000000900473ffffffffffffffffffffffffffffffffffffffff1680610766578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16610768565b805b73ffffffffffffffffffffffffffffffffffffffff166020860152509295945050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146107df576040517f885762a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088391906147ab565b73ffffffffffffffffffffffffffffffffffffffff16036108d0576040517fe695d04400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108db8383836117ae565b6040805173ffffffffffffffffffffffffffffffffffffffff8086168252841660208201529081018290527fe081464b7278501267de69fa85b7b9560b0ae05d5fbfaab9b1986c70356e2efe906060015b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a8576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610ae657368383838181106109c5576109c56147c6565b90506020028101906109d791906147f3565b90506109ee6109e96020830183614654565b611821565b6001610a006040830160208401614654565b63ffffffff1603610a4057610a3b610a1b6020830183614654565b86610a29604085018561482f565b810190610a369190614958565b611868565b610add565b6002610a526040830160208401614654565b63ffffffff1603610a8d57610a3b610a6d6020830183614654565b86610a7b604085018561482f565b810190610a889190614b11565b611914565b610a9d6040820160208301614654565b6040517fba97c1fa00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024015b60405180910390fd5b506001016109aa565b50505050565b610af461195d565b5f5b81811015610c915736838383818110610b1157610b116147c6565b9050602002810190610b239190614b43565b905060ff610b346020830183614b75565b610b45906040810190602001614ba7565b60ff1603610b7f576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff610b8e6020830183614b75565b610b9f906060810190604001614ba7565b60ff1603610bd9576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff610bef6020830183614b75565b610bfd906020810190614bc0565b67ffffffffffffffff1603610c3e576040517f503667ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5c610c4e6020830183614b75565b610c5790614bd9565b6119af565b610c885f610c6d6020840184614654565b610c7a6020850185614b75565b610c8390614bd9565b611a00565b50600101610af6565b507faaf3aaa0c11056e86ac56eb653e25b005ca1a7d4dcd21ba24647f7ab63f3b5608282604051610cc3929190614c90565b60405180910390a15050565b6040805160c0810182525f808252602082018190529181018290526060808201929092526080810182905260a081019190915273ffffffffffffffffffffffffffffffffffffffff83165f90815260016020818152604080842063ffffffff87168552825292839020835160c081018552815467ffffffffffffffff8116825260ff680100000000000000008204811683860152690100000000000000000082048116838801526a01000000000000000000009091041660608201529281018054855181850281018501909652808652939491936080860193830182828015610dec57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dc1575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e5957602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2e575b505050505081525050905092915050565b604080518082019091525f80825260208201526060610e8b86868686611d93565b6006546040517ffaed6c5800000000000000000000000000000000000000000000000000000000815292945090925073ffffffffffffffffffffffffffffffffffffffff169063faed6c5890610ee990849089908990600401614e2d565b5f604051808303815f87803b158015610f00575f80fd5b505af1158015610f12573d5f803e3d5ffd5b5050505094509492505050565b6040805160c0810182525f808252602080830182905282840182905260608084018390526080840181905260a084015263ffffffff85168083527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49825284832073ffffffffffffffffffffffffffffffffffffffff88168452600183528584209184529152929020805491929167ffffffffffffffff1680610fce57825467ffffffffffffffff168452610fed565b67ffffffffffffffff81811614610fed5767ffffffffffffffff811684525b815468010000000000000000900460ff166110a157825468010000000000000000900460ff161561109c578260010180548060200260200160405190810160405280929190818152602001828054801561107b57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611050575b50505050506080850152825468010000000000000000900460ff1660208501525b61113d565b815468010000000000000000900460ff9081161461113d578160010180548060200260200160405190810160405280929190818152602001828054801561111c57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116110f1575b50505050506080850152815468010000000000000000900460ff1660208501525b81546901000000000000000000900460ff1661120a5782546901000000000000000000900460ff161561120557826002018054806020026020016040519081016040528092919081815260200182805480156111cd57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111a2575b505050505060a0850152825460ff69010000000000000000008204811660408701526a01000000000000000000009091041660608501525b6112be565b81546901000000000000000000900460ff908116146112be578160020180548060200260200160405190810160405280929190818152602001828054801561128657602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161125b575b505050505060a0850152815460ff69010000000000000000008204811660408701526a01000000000000000000009091041660608501525b6112c7846119af565b50505092915050565b5f61067d82611e8a565b6112e261195d565b6112eb5f611ef0565b565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff83160161134c576113268385610683565b60405160200161133691906142bc565b60405160208183030381529060405290506113cd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe63ffffffff831601611393576113838385610f1f565b60405160200161133691906144fe565b6040517fba97c1fa00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610ad4565b9392505050565b6113dc61195d565b5f5b8181101561151557368383838181106113f9576113f96147c6565b60609081029290920192505f916114169150830160408401614766565b73ffffffffffffffffffffffffffffffffffffffff1603611463576040517f20e9d05a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114736040820160208301614654565b63ffffffff165f036114b1576040517f49cfac4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808052600460209081528201907f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec906114eb8385614654565b63ffffffff16815260208101919091526040015f2061150a8282614e8f565b5050506001016113de565b507f2b001e1c6683bf79cc52891bd7215b204c787d18134fc7f3d21b4f32a49e47de8282604051610cc3929190614f27565b61154f61195d565b600254811115611599576002546040517f34084fb8000000000000000000000000000000000000000000000000000000008152610ad4918391600401918252602082015260400190565b60028190556040518181527f491ff913b5444f4136b0d4075f020cfe3a5f60de926ec0b091612401a22b7842906020015b60405180910390a150565b604080518082019091525f80825260208201525f806116246115fd6060890160408a01614766565b61160d60808a0160608b01614654565b61161a60c08b018b61482f565b9050878a8a611f64565b604080518082019091529182526020820152925050505b949350505050565b61164b61195d565b61165481612062565b50565b61165f61195d565b73ffffffffffffffffffffffffffffffffffffffff81166116ae576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610ad4565b61165481611ef0565b6116c0816120d5565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174e91906147ab565b905061175b81848461213d565b6040805133815273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527f820b7fd51bf79c54350bab98400651b3314ff6e79b33528821871d94a66698839060600161092c565b73ffffffffffffffffffffffffffffffffffffffff82166117fb576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61181c73ffffffffffffffffffffffffffffffffffffffff8416838361216d565b505050565b61182a81611e8a565b611654576040517ff0c10d0400000000000000000000000000000000000000000000000000000000815263ffffffff82166004820152602401610ad4565b73ffffffffffffffffffffffffffffffffffffffff8083165f90815260046020908152604080832063ffffffff8089168552908352928190208551815493870151909516640100000000027fffffffffffffffff0000000000000000000000000000000000000000000000009093169490931693909317179055517f779cb2dd9d2bb1be1737d05435d744facbfb84a2a4912e21379d39beddcdc8059061092c90849086908590614fb3565b61191f828483611a00565b6119298284610f1f565b507f82118522aa536ac0e96cc5c689407ae42b89d592aa133890a01f1509842f508182848360405161092c9392919061500f565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146112eb576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610ad4565b602081015160ff161580156119c95750606081015160ff16155b15611654576040517fce2c375100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160ff9081161480611a1b5750602081015160ff16155b15611a625760808101515115611a5d576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ae1565b806020015160ff16816080015151141580611a9d57506002611a86600160ff615076565b611a90919061508f565b60ff16816020015160ff16115b15611ad4576040517f83aa17da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ae181608001516121fa565b604081015160ff9081161480611afc5750604081015160ff16155b15611b825760a08101515115611b3e576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff1615611b7d576040517f38682fa900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c59565b806040015160ff168160a0015151141580611bbd57506002611ba6600160ff615076565b611bb0919061508f565b60ff16816040015160ff16115b15611bf4576040517f4221136600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff161580611c155750806040015160ff16816060015160ff16115b15611c4c576040517f38682fa900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c598160a001516121fa565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260016020818152604080842063ffffffff87168552825292839020845181548684015195870151606088015167ffffffffffffffff9093167fffffffffffffffffffffffffffffffffffffffffffffff000000000000000000909216919091176801000000000000000060ff97881602177fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff166901000000000000000000918716919091027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff16176a0100000000000000000000959091169490940293909317835560808401518051859493611d6f93908501920190614166565b5060a08201518051611d8b916002840191602090910190614166565b505050505050565b604080518082019091525f808252602082015260607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611e17576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80611e24888888612292565b90925090505f80611e55611e3e60608c0160408d01614766565b611e4e60808d0160608e01614654565b858a612359565b9092509050611e6482846150d5565b604080518082019091529081526020810191909152945091925050505b94509492505050565b63ffffffff81165f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960205260408120805468010000000000000000900460ff161515806113cd5750546a0100000000000000000000900460ff16151592915050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f80611f7286866124e3565b915091505f611f828b8b846124fc565b90505f611f8f8c8c610683565b9050611fa48a825f015163ffffffff16612508565b806020015173ffffffffffffffffffffffffffffffffffffffff1663709eb6648c8e8d886040518563ffffffff1660e01b8152600401611fe794939291906150e8565b602060405180830381865afa158015612002573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120269190615132565b61203090836150d5565b91505f806120408e8e868e612550565b909250905061204f82856150d5565b9e909d509b505050505050505050505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f906020016115ca565b335f9081526005602052604090205480821115612128576040517f34084fb80000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610ad4565b335f9081526005602052604090209190039055565b73ffffffffffffffffffffffffffffffffffffffff83166121625761181c8282612691565b61181c8383836117ae565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261181c908490612793565b5f805b825181101561181c575f838281518110612219576122196147c6565b602002602001015190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1611612288576040517f447516e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b91506001016121fd565b60605f805f6122a186866124e3565b90925090505f6122ca6122ba60608a0160408b01614766565b61023060808b0160608c01614654565b90505f6122da60c08a018a61482f565b905090506122f181835f015163ffffffff16612508565b60208201516123219061230a60808c0160608d01614654565b61231a60608d0160408e01614766565b8488612832565b61232b90866150d5565b94505f806123398b86612966565b909250905061234882886150d5565b909b909a5098505050505050505050565b6003545f90819073ffffffffffffffffffffffffffffffffffffffff1615611e815760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff861660448201526064810185905283151560848201525f9060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd51c5486000000000000000000000000000000000000000000000000000000001790526003549192505f9182916124809173ffffffffffffffffffffffffffffffffffffffff16907f000000000000000000000000000000000000000000000000000000000000000090849087612988565b9150915061249087878484612a33565b909550935084156124d75760035473ffffffffffffffffffffffffffffffffffffffff165f90815260056020526040812080548792906124d19084906150d5565b90915550505b50505094509492505050565b6060806124f08484612aaa565b915091505b9250929050565b5f61163b848484612b90565b8082111561254c576040517fc667af3e0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610ad4565b5050565b6003545f90819073ffffffffffffffffffffffffffffffffffffffff1615611e815760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff861660448201526064810185905283151560848201525f9060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd4244221000000000000000000000000000000000000000000000000000000001790526003549192505f9182916126759173ffffffffffffffffffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000009086612c04565b9150915061268587878484612a33565b94509450505050611e81565b73ffffffffffffffffffffffffffffffffffffffff82166126de576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114612734576040519150601f19603f3d011682016040523d82523d5f602084013e612739565b606091505b505090508061181c576040517f465bc83400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610ad4565b5f8060205f8451602086015f885af1806127b2576040513d5f823e3d81fd5b50505f513d915081156127c95780600114156127e3565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15610ae6576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610ad4565b6040517f717e8a420000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff87169063717e8a429061288c9088908890889088906004016150e8565b6020604051808303815f875af11580156128a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128cc9190615132565b9050801561290e5773ffffffffffffffffffffffffffffffffffffffff86165f90815260056020526040812080548392906129089084906150d5565b90915550505b6040805173ffffffffffffffffffffffffffffffffffffffff88168152602081018390527f61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a910160405180910390a195945050505050565b5f606061297d6005612977866151d3565b85612cab565b909590945092505050565b5f6060863b8083036129ad57604080515f808252602082019092529250925050612a29565b5f805f8761ffff1667ffffffffffffffff8111156129cd576129cd614890565b6040519080825280601f01601f1916602001820160405280156129f7576020820181803683370190505b5090505f80885160208a018c8f8ff191503d925087831115612a17578792505b828152825f602083013e909450925050505b9550959350505050565b5f80831580612a43575082516020115b15612a5257505f905080611e81565b5f83806020019051810190612a679190615132565b90508515612a7757809150612aa0565b5f6002548811612a8957600254612a8b565b875b9050808211612a9a5781612a9c565b805b9350505b5094509492505050565b6060805f80612ab98686612dfe565b9150915080515f03612b0e57604080515f808252602082019092528391612b02565b604080518082019091525f815260606020820152815260200190600190039081612adb5790505b509350935050506124f5565b6040805160018082528183019092525f91816020015b604080518082019091525f815260606020820152815260200190600190039081612b245790505090506040518060400160405280600260ff16815260200183815250815f81518110612b7857612b786147c6565b60209081029190910101529196919550909350505050565b5f80612b9c8585610f1f565b90505f83515f14612bca57835f81518110612bb957612bb96147c6565b602002602001015160200151612bda565b60405180602001604052805f8152505b90505f80612be783613034565b91509150612bf884888a85856132ce565b98975050505050505050565b5f6060853b808303612c2957604080515f808252602082019092529250925050611e81565b5f805f8761ffff1667ffffffffffffffff811115612c4957612c49614890565b6040519080825280601f01601f191660200182016040528015612c73576020820181803683370190505b5090505f80885160208a018d8dfa91503d925087831115612c92578792505b828152825f602083013e90999098509650505050505050565b5f60605f612cb885613486565b90505f612cc48661356c565b805160208201206060880151604089015192935090915f612ce58284610f1f565b90505f89515f14612d1357895f81518110612d0257612d026147c6565b602002602001015160200151612d23565b60405180602001604052805f8152505b90506060612d828d846040518060a001604052808963ffffffff1681526020018c81526020018a8152602001875f015167ffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681525085613589565b604051919b509150612d9a908990899060200161526e565b60405160208183030381529060405298507f07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db2464483608001518460a0015183604051612de69392919061529c565b60405180910390a15050505050505050935093915050565b6060806002831015612e3e576040517f6592671c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610ad4565b5f612e4c60028286886152f8565b612e559161531f565b60f01c905060027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd820161301d57805f5b86831015612faa575f612e9e60018501858a8c6152f8565b612ea791615367565b60f81c90505f819003612ee8576040517f6780cfaf0000000000000000000000000000000000000000000000000000000081525f6004820152602401610ad4565b8160ff165f03612efa57809150612f36565b8160ff168160ff1614612f3657365f612f1586868c8e6152f8565b91509150612f26898986858561385b565b9099509750859450919250829150505b60018401935f90612f4c90600301868b8d6152f8565b612f559161531f565b60f01c90505f819003612f97576040517f6592671c00000000000000000000000000000000000000000000000000000000815260048101869052602401610ad4565b8060020161ffff16850194505050612e86565b828714612fe6576040517f6592671c00000000000000000000000000000000000000000000000000000000815260048101849052602401610ad4565b600287111561301657365f612ffd85858b8d6152f8565b9150915061300e888885858561385b565b909850965050505b505061302b565b6130288287876139ce565b93505b50509250929050565b60608082515f0361304457915091565b5f61304e84613c49565b90508060ff166001036130fe5760408051600180825281830190925290816020015b606081526020019060019003908161307057905050925083835f8151811061309a5761309a6147c6565b6020908102919091010152604080516001808252818301909252908160200160208202803683370190505091506130d2846003613d6b565b825f815181106130e4576130e46147c6565b602002602001019060ff16908160ff168152505050915091565b8060ff1667ffffffffffffffff81111561311a5761311a614890565b604051908082528060200260200182016040528015613143578160200160208202803683370190505b5091508060ff1667ffffffffffffffff81111561316257613162614890565b60405190808252806020026020018201604052801561319557816020015b60608152602001906001900390816131805790505b5092505f8060ff5b8651831015613245576001909201915f6131b78885613dea565b6002949094019390505f6131cb8986613d6b565b90508260ff1660ff036131e057809250613236565b8260ff168160ff1614613236577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd848603015f61321e8b8784613e69565b905061322c8a8a8784613fe2565b5093909301929150815b5061ffff16929092019161319d565b8183035f613254898584613e69565b905061326288888584613fe2565b5f5b8660ff168160ff1610156132c257878160ff1681518110613287576132876147c6565b6020908102919091010180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff169052600101613264565b50505050505050915091565b5f80866040015187602001516132e491906153ad565b90505f5b8160ff168160ff16101561347b575f886020015160ff168260ff161061333c5760a089015160208a015161331c9084615076565b60ff168151811061332f5761332f6147c6565b602002602001015161335e565b88608001518260ff1681518110613355576133556147c6565b60200260200101515b60408051602081019091525f808252919250905b86518110156133ca578360ff16878281518110613391576133916147c6565b602002602001015160ff16036133c2578781815181106133b3576133b36147c6565b602002602001015191506133ca565b600101613372565b5089516040517f30bb3aac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416916330bb3aac91613423918d918d9087906004016153c6565b602060405180830381865afa15801561343e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134629190615132565b61346c90866150d5565b945050508060010190506132e8565b505095945050505050565b8051602080830151604080850151606080870151608088015193517f01000000000000000000000000000000000000000000000000000000000000009681019690965260c09690961b7fffffffffffffffff00000000000000000000000000000000000000000000000016602186015260e093841b7fffffffff00000000000000000000000000000000000000000000000000000000908116602987015273ffffffffffffffffffffffffffffffffffffffff909216602d8601529490921b909116604d83015260518201526071015b6040516020818303038152906040529050919050565b60608160a001518260c00151604051602001613556929190615410565b5f60605f8061359785613034565b915091505f876040015188602001516135b091906153ad565b90508060ff1667ffffffffffffffff8111156135ce576135ce614890565b6040519080825280602002602001820160405280156135f7578160200160208202803683370190505b5093505f5b8160ff168160ff161015610f12575f896020015160ff168260ff16106136505760a08a015160208b01516136309084615076565b60ff1681518110613643576136436147c6565b6020026020010151613672565b89608001518260ff1681518110613669576136696147c6565b60200260200101515b60408051602081019091525f808252919250905b85518110156136de578360ff168682815181106136a5576136a56147c6565b602002602001015160ff16036136d6578681815181106136c7576136c76147c6565b602002602001015191506136de565b600101613686565b506040517f95d376d700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906395d376d790613733908d908590600401615435565b6020604051808303815f875af115801561374f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137739190615132565b878460ff1681518110613788576137886147c6565b6020026020010181815250505f878460ff16815181106137aa576137aa6147c6565b6020026020010151111561385157868360ff16815181106137cd576137cd6147c6565b60200260200101518c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461381f91906150d5565b92505081905550868360ff168151811061383b5761383b6147c6565b60200260200101518861384e91906150d5565b97505b50506001016135fc565b6060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8616016138f5578651156138b8578684846040516020016138a4939291906154b2565b6040516020818303038152906040526138ee565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b96506139c3565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff86160161398c5785511561394f5785848460405160200161393b939291906154b2565b604051602081830303815290604052613985565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b95506139c3565b6040517f6780cfaf00000000000000000000000000000000000000000000000000000000815260ff86166004820152602401610ad4565b509495939450505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61ffff851601613af35760228214613a35576040517f0dc652a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613a55613a476022600286886152f8565b613a50916154d8565b61410d565b6040517f0100000000000000000000000000000000000000000000000000000000000000602082018190527e11000000000000000000000000000000000000000000000000000000000000602183015260238201527fffffffffffffffffffffffffffffffff00000000000000000000000000000000608083901b1660248201529091506034016040516020818303038152906040529150506113cd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61ffff851601613c1157604282111580613b2e5750606282115b15613b65576040517fc0927c5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b77613a476022600286886152f8565b90505f613b8b613a476042602287896152f8565b90505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe8501613bbe866042818a6152f8565b613bc7916154d8565b60405160086020938403029190911c9250613bf8916001916011918391889183916031916002918b918b9101615514565b60405160208183030381529060405293505050506113cd565b6040517f4170513000000000000000000000000000000000000000000000000000000000815261ffff85166004820152602401610ad4565b5f80805b8351821015613d27576001909101905f613c678584613dea565b905060028301925060028161ffff161015613cb1576040517f04eb6e0c00000000000000000000000000000000000000000000000000000000815260048101849052602401610ad4565b5f613cbc8685613d6b565b90508060ff1660ff03613cfb576040517fd3d3d9bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160ff82161b8316613d185760019485019460ff82161b831792505b5061ffff169190910190613c4d565b83518214613d64576040517f04eb6e0c00000000000000000000000000000000000000000000000000000000815260048101839052602401610ad4565b5050919050565b5f613d778260016150d5565b83511015613de1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e6473000000000000000000000000006044820152606401610ad4565b50016001015190565b5f613df68260026150d5565b83511015613e60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7431365f6f75744f66426f756e64730000000000000000000000006044820152606401610ad4565b50016002015190565b606081613e7781601f6150d5565b1015613edf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ad4565b613ee982846150d5565b84511015613f53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ad4565b606082158015613f715760405191505f825260208201604052613fd9565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613faa578051835260209283019201613f92565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b8160ff1660ff0361401f576040517fd3d3d9bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61402b8360016153ad565b90505f5b8451811015611d8b575f8582815181