[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "AddressInsufficientBalance", "type": "error" }, { "inputs": [], "name": "ClaimableAmountOfImportIsGreaterThanExpected", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [], "name": "EqualPercentagesOnlyAllowedBeforeLinear", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "IncorrectClaimFee", "type": "error" }, { "inputs": [], "name": "InputArraysMustHaveSameLength", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "InvalidTotalAmount", "type": "error" }, { "inputs": [], "name": "LastPercentageMustBe100", "type": "error" }, { "inputs": [], "name": "MaxAllowedMilestonesHit", "type": "error" }, { "inputs": [], "name": "MilestonePercentagesNotSorted", "type": "error" }, { "inputs": [], "name": "MilestoneTimestampsNotSorted", "type": "error" }, { "inputs": [], "name": "MinMilestonesNotReached", "type": "error" }, { "inputs": [], "name": "MoreThanTwoEqualPercentages", "type": "error" }, { "inputs": [], "name": "NoClaimableAmount", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [], "name": "OnlyLastPercentageCanBe100", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "inputs": [], "name": "UnlockedIsGreaterThanExpected", "type": "error" }, { "inputs": [], "name": "UnsuccessfulFetchOfTokenBalance", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Claim", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "milestoneIndex", "type": "uint256" } ], "name": "MilestoneReached", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "addRecipient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "recipients", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "uint256", "name": "totalAmount", "type": "uint256" } ], "name": "addRecipients", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "claim", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "claimFeeData", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "claimableBalanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "claimableSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "claimedBalanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "claimedSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "exportRecipient", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "recipients", "type": "address[]" } ], "name": "exportRecipients", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "claimableAmountOfImport", "type": "uint256" }, { "internalType": "uint256", "name": "unlocked", "type": "uint256" } ], "name": "importRecipient", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "recipients", "type": "address[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "claimableAmountsOfImport", "type": "uint256[]" }, { "internalType": "uint256", "name": "totalAmount", "type": "uint256" }, { "internalType": "uint256", "name": "unlocked", "type": "uint256" } ], "name": "importRecipients", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "address", "name": "underlyingTokenAddress", "type": "address" }, { "components": [ { "internalType": "uint64", "name": "timestamp", "type": "uint64" }, { "internalType": "enum IVestingToken.Ramp", "name": "ramp", "type": "uint8" }, { "internalType": "uint64", "name": "percentage", "type": "uint64" } ], "internalType": "struct IVestingToken.Milestone[]", "name": "milestonesArray", "type": "tuple[]" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "lockedBalanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lockedSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "manager", "outputs": [ { "internalType": "contract IFeeManager", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "metadataOf", "outputs": [ { "components": [ { "internalType": "uint256", "name": "claimedAmountAfterTransfer", "type": "uint256" }, { "internalType": "uint256", "name": "claimedBalance", "type": "uint256" } ], "internalType": "struct VestingToken.Metadata", "name": "metadata", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "milestones", "outputs": [ { "components": [ { "internalType": "uint64", "name": "timestamp", "type": "uint64" }, { "internalType": "enum IVestingToken.Ramp", "name": "ramp", "type": "uint8" }, { "internalType": "uint64", "name": "percentage", "type": "uint64" } ], "internalType": "struct IVestingToken.Milestone[]", "name": "", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "transferFeeData", "outputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "underlyingToken", "outputs": [ { "internalType": "contract ERC20Upgradeable", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "unlockedPercentage", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "startIndex", "type": "uint256" } ], "name": "updateLastReachedMilestone", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613aab80620000e66000396000f3fe6080604052600436106101e35760003560e01c80636fa9669311610102578063bfc2aa2a11610095578063d67d13ce11610064578063d67d13ce14610619578063dd62ed3e14610639578063e194aa251461069e578063f79822431461071b57600080fd5b8063bfc2aa2a146105a1578063c8de1d56146105b6578063ca5c7b91146105ef578063d5ab20b41461060457600080fd5b80639c3ee244116100d15780639c3ee2441461052a578063a1c7bd771461054a578063a9059cbb1461055f578063ad4126b61461057f57600080fd5b80636fa966931461047a57806370a082311461048f57806389392c7c146104e457806395d89b411461051557600080fd5b8063358f0a151161017a578063481c6a7511610149578063481c6a75146103e85780634e71d92d1461040857806357c2f2e814610410578063593557361461045a57600080fd5b8063358f0a15146103755780633e2a34731461039557806340bf0506146103b557806342966c68146103d557600080fd5b806323b872dd116101b657806323b872dd146102a35780632495a599146102c35780632ae7888b146102fb578063313ce5671461033857600080fd5b806306fdde03146101e8578063095ea7b3146102135780630f0e60a21461024357806318160ddd14610265575b600080fd5b3480156101f457600080fd5b506101fd61073b565b60405161020a919061300c565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004613072565b610810565b604051901515815260200161020a565b34801561024f57600080fd5b5061026361025e3660046130ea565b61082a565b005b34801561027157600080fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b60405190815260200161020a565b3480156102af57600080fd5b506102336102be366004613193565b610ad7565b3480156102cf57600080fd5b506000546102e3906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b34801561030757600080fd5b50610310610af1565b604080516001600160a01b03909316835267ffffffffffffffff90911660208301520161020a565b34801561034457600080fd5b5060015474010000000000000000000000000000000000000000900460ff1660405160ff909116815260200161020a565b34801561038157600080fd5b506102636103903660046131d4565b610b87565b3480156103a157600080fd5b506102636103b036600461328a565b610d9c565b3480156103c157600080fd5b506102636103d0366004613369565b61102e565b6102636103e33660046133a4565b61116a565b3480156103f457600080fd5b506001546102e3906001600160a01b031681565b6102636112dd565b34801561041c57600080fd5b5061043061042b3660046133bd565b611443565b604080516001600160a01b039095168552602085019390935291830152606082015260800161020a565b34801561046657600080fd5b506102956104753660046133bd565b6114a8565b34801561048657600080fd5b506103106114f5565b34801561049b57600080fd5b506102956104aa3660046133bd565b6001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b3480156104f057600080fd5b506105046104ff3660046133da565b611547565b60405161020a959493929190613458565b34801561052157600080fd5b506101fd6116d9565b34801561053657600080fd5b506102956105453660046133bd565b61172a565b34801561055657600080fd5b50610295611781565b34801561056b57600080fd5b5061023361057a366004613072565b6117c8565b34801561058b57600080fd5b506105946117e0565b60405161020a9190613505565b3480156105ad57600080fd5b506102956118a7565b3480156105c257600080fd5b506102956105d13660046133bd565b6001600160a01b031660009081526006602052604090206001015490565b3480156105fb57600080fd5b506102956118eb565b34801561061057600080fd5b5061029561191c565b34801561062557600080fd5b506102636106343660046133a4565b611aae565b34801561064557600080fd5b506102956106543660046135a2565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b3480156106aa57600080fd5b506107006106b93660046133bd565b6040805180820190915260008082526020820152506001600160a01b0316600090815260066020908152604091829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161020a565b34801561072757600080fd5b50610263610736366004613072565b611c34565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace009161078c906135db565b80601f01602080910402602001604051908101604052809291908181526020018280546107b8906135db565b80156108055780601f106107da57610100808354040283529160200191610805565b820191906000526020600020905b8154815290600101906020018083116107e857829003601f168201915b505050505091505090565b60003361081e818585611cc2565b60019150505b92915050565b610832611cd4565b61083a61191c565b811115610873576040517fd52b679700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8685811415806108835750838614155b156108ba576040517f028a6c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108c4611d55565b6000549091506108df906001600160a01b0316333087611e71565b6000816108ea611d55565b6108f4919061365d565b9050600080845b8015610a56578060019003905060006109488d8d80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250611eed915050565b90506109548184613670565b925060008f8f8481811061096a5761096a613683565b905060200201602081019061097f91906133bd565b905060008a87146109a4578a61099588856136b2565b61099f91906136c9565b6109a6565b825b905060006109e88e8e80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250611eed915050565b905060006109f783838e611efb565b9050610a038484611fa2565b6001600160a01b038416600090815260066020526040902054610a27908290613670565b6001600160a01b038516600090815260066020526040902055610a4a8189613670565b975050505050506108fb565b50868114610a90576040517f908128d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600354610a9e9190613670565b6003556002548290610ab1908590613670565b610abb9190613670565b60025550610acd9350611ff692505050565b5050505050505050565b6000610ae6848484600061201c565b5060015b9392505050565b600154600080546040517f0f3db9da0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291928392911690630f3db9da906024015b6040805180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f919061371a565b915091509091565b610b8f611cd4565b838214610bc8576040517f028a6c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610bd2611d55565b600054909150610bed906001600160a01b0316333085611e71565b600081610bf8611d55565b610c02919061365d565b905080600254610c129190613670565b600255600086805b8015610d2e57806001900390506000610c678b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250611eed915050565b90506000610ca98a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250611eed915050565b9050610ce98a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250611eed915050565b610cf39086613670565b94506000888714610d185788610d0988846136b2565b610d1391906136c9565b610d1a565b815b9050610d268382611fa2565b505050610c1a565b50848214610d68576040517f908128d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050610d9560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610de75750825b905060008267ffffffffffffffff166001148015610e045750303b155b905081158015610e12575080155b15610e49576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610eaa5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b610f2e8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061226392505050565b610f36612275565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055610f6a8787612285565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055610fa5612633565b600160146101000a81548160ff021916908360ff16021790555083156110205784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b611036611cd4565b61103e61191c565b811115611077576040517fd52b679700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611081611d55565b60005490915061109c906001600160a01b0316333087611e71565b6000816110a7611d55565b6110b1919061365d565b905060006110c0828686611efb565b6001600160a01b0388166000908152600660205260409020549091506110e7908290613670565b6001600160a01b03881660009081526006602052604090205560035461110e908290613670565b6003556002548190611121908490613670565b61112b9190613670565b6002556111388783611fa2565b50505061116460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050565b6000611174611d55565b60005460405184815291925033916001600160a01b039091169082907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260408051602480820187905282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f42966c680000000000000000000000000000000000000000000000000000000090811790915291516000916001600160a01b0385169161123f9190613749565b6000604051808303816000865af19150503d806000811461127c576040519150601f19603f3d011682016040523d82523d6000602084013e611281565b606091505b50509050806112a3576000546112a3906001600160a01b031661dead88612721565b60006112ad611d55565b6112b7908761365d565b9050806002546112c7919061365d565b6002556112d48588612752565b50505050505050565b6112e5611cd4565b33600081815260066020526040902060055461130090611aae565b6001600160a01b03821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526040812054825461134e9161134791613670565b83546127a1565b90508060000361138a576040517f493c1ab700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113948382612752565b81546113a1908290613670565b825560018201546113b3908290613670565b60018301556040518181526001600160a01b038416907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a260005461140d906001600160a01b03168483612721565b6114156127e5565b50505061144160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b565b60008060008084611488866001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6114918761172a565b61149961191c565b93509350935093509193509193565b60006114b38261172a565b6001600160a01b03831660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526040902054610824919061365d565b600154600080546040517f4b2675ef0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291928392911690634b2675ef90602401610b3f565b3660006060808285818167ffffffffffffffff81111561156957611569613765565b604051908082528060200260200182016040528015611592578160200160208202803683370190505b50905060008267ffffffffffffffff8111156115b0576115b0613765565b6040519080825280602002602001820160405280156115d9578160200160208202803683370190505b509050825b80156116b65780600190039050600061162b8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250611eed915050565b905061166b816001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b84838151811061167d5761167d613683565b6020026020010181815250506116928161172a565b8383815181106116a4576116a4613683565b602002602001018181525050506115de565b50898983836116c361191c565b939e929d50909b50995090975095505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace009161078c906135db565b6001600160a01b0381166000908152600660209081526040808320547f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00909252822054610aea9061177b9083613670565b826127a1565b60006117c36002546117b17f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b6002546117be919061365d565b6127a1565b905090565b60006117d7338484600161201c565b50600192915050565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101561189e5760008481526020908190206040805160608101909152908401805467ffffffffffffffff81168352919290919083019068010000000000000000900460ff16600181111561185c5761185c6134d6565b600181111561186d5761186d6134d6565b8152905467ffffffffffffffff69010000000000000000009091041660209182015290825260019092019101611804565b50505050905090565b60006003546118d47f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b6002546118e1919061365d565b6117c3919061365d565b60006118f5611781565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546118e1565b60008060046005548154811061193457611934613683565b600091825260209091200180549091504267ffffffffffffffff909116111561195f57600091505090565b8054600454600554690100000000000000000090920467ffffffffffffffff169160009061198e906001613670565b90505b81811015611aa5576000600482815481106119ae576119ae613683565b600091825260209091200180549091504267ffffffffffffffff909116116119f65780549094506901000000000000000000900467ffffffffffffffff169250600101611991565b6001815468010000000000000000900460ff166001811115611a1a57611a1a6134d6565b03611aa35784548154611a3a9167ffffffffffffffff9081169116613794565b8554825467ffffffffffffffff92831692611a68926901000000000000000000908190048216920416613794565b865467ffffffffffffffff91821691611a8291164261365d565b611a8c91906136b2565b611a9691906136c9565b611aa09085613670565b93505b505b50909392505050565b4260048281548110611ac257611ac2613683565b60009182526020909120015467ffffffffffffffff161115611ae15750565b600554600480549060009084838110611afc57611afc613683565b60009182526020909120019050835b82811015611bbf57600060048281548110611b2857611b28613683565b600091825260209091200180549091504267ffffffffffffffff90911611611b54579150600101611b0b565b611b5f856001613670565b821115611bb7576040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301955085907f25fcf68a4a87624d7edc6ca2f4f2cd6975c31a3133784e8e8e7942fa65974f6c90600090a25b505050505050565b50611bcb60018361365d565b831015611c23576040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301935083907f25fcf68a4a87624d7edc6ca2f4f2cd6975c31a3133784e8e8e7942fa65974f6c90600090a25b600554831461116457505060055550565b611c3c611cd4565b6000611c46611d55565b600054909150611c61906001600160a01b0316333085611e71565b600081611c6c611d55565b611c76919061365d565b905080600254611c869190613670565b600255611c938482611fa2565b5050611cbe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b611ccf8383836001612906565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611d4f576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b60008054604080513060248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f70a08231000000000000000000000000000000000000000000000000000000001790529051839283926001600160a01b0390911691611ddc9190613749565b600060405180830381855afa9150503d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b5091509150818015611e3057506020815110155b15611e3f576020015192915050565b6040517f7677db4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0384811660248301528381166044830152606482018390526111649186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a31565b602090810291909101015190565b6000670de0b6b3a76400008203611f1457506000610aea565b6000611f2085846136b2565b90506000611f3685670de0b6b3a76400006136b2565b905081811115611f72576040517f4484113f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f8484670de0b6b3a764000061365d565b611f8e828461365d565b611f9891906136c9565b9695505050505050565b6001600160a01b038216611fea576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b611cbe60008383612aad565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6001600160a01b03841660009081526006602090815260408083207f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00909252822054909190825461206e9086906136b2565b61207891906136c9565b825490915061208890829061365d565b82556001600160a01b038581169087161461220557600154600080546040517f4b2675ef0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291928392911690634b2675ef906024016040805180830381865afa158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a919061371a565b915091508067ffffffffffffffff1660001461220257600061215667ffffffffffffffff8316886136b2565b670de0b6b3a764000090049050600061217967ffffffffffffffff8416866136b2565b670de0b6b3a764000090049050612190828961365d565b975061219c818661365d565b6001600160a01b0385166000908152600660205260409020549095506121c3908290613670565b6001600160a01b03851660009081526006602052604090205586156121f2576121ec8483612c16565b506121ff565b6121fd8a8584612c24565b505b50505b50505b6001600160a01b038516600090815260066020526040902054612229908290613670565b6001600160a01b0386166000908152600660205260409020558215612258576122528585612c16565b50611bb7565b6112d4868686612c24565b61226b612c48565b611cbe8282612caf565b61227d612c48565b611441612d12565b60008190036122c0576040517f4fc0948300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61033a8111156122fc576040517f8375f01500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b368282600081811061231057612310613683565b6060029190910191506000905082815b81811015611bb7578015612521578386868381811061234157612341613683565b606002919091019550612359905060208601866137bc565b67ffffffffffffffff1661237060208301836137bc565b67ffffffffffffffff16106123b1576040517f2ecb688400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123c160608601604087016137bc565b67ffffffffffffffff166123db60608301604084016137bc565b67ffffffffffffffff16111561241d576040517f218d22d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83156124e85761243360608601604087016137bc565b67ffffffffffffffff1661244d60608301604084016137bc565b67ffffffffffffffff160361248e576040517f04855a8f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016124a060408701602088016137e6565b60018111156124b1576124b16134d6565b146124e8576040517f71e2986a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f860608601604087016137bc565b67ffffffffffffffff1661251260608301604084016137bc565b67ffffffffffffffff16149350505b61252c60018361365d565b810361259157670de0b6b3a764000061254b60608601604087016137bc565b67ffffffffffffffff161461258c576040517f5be691b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125eb565b670de0b6b3a76400006125aa60608601604087016137bc565b67ffffffffffffffff16036125eb576040517fe575499300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805460018101825560009190915284907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016126298282613803565b5050600101612320565b6000805460408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051839283926001600160a01b03909116916126a99190613749565b600060405180830381855afa9150503d80600081146126e4576040519150601f19603f3d011682016040523d82523d6000602084013e6126e9565b606091505b50915091508180156126fd57506020815110155b1561271857602081015160ff8111612716579392505050565b505b60129250505090565b6040516001600160a01b03838116602483015260448201839052611ccf91859182169063a9059cbb90606401611ea6565b6001600160a01b038216612795576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401611fe1565b611cbe82600083612aad565b600080836127ad61191c565b6127b791906136b2565b670de0b6b3a7640000900490508281106127da576127d5838261365d565b6127dd565b60005b949350505050565b600154600080546040517f0f3db9da0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015291928392911690630f3db9da906024016040805180830381865afa15801561284e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612872919061371a565b915091508067ffffffffffffffff16600014611cbe578067ffffffffffffffff1634146128cb576040517f9ed72d2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fc155047b0000000000000000000000000000000000000000000000000000000090600080808034885af180610d9557828252600482fd5b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661296a576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401611fe1565b6001600160a01b0384166129ad576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401611fe1565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115610d9557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612a2291815260200190565b60405180910390a35050505050565b6000612a466001600160a01b03841683612d1a565b90508051600014158015612a6b575080806020019051810190612a69919061391a565b155b15611ccf576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611fe1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416612afb5781816002016000828254612af09190613670565b90915550612b869050565b6001600160a01b03841660009081526020829052604090205482811015612b67576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401611fe1565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316612ba4576002810180548390039055612bc3565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612c0891815260200190565b60405180910390a350505050565b60003361081e818585612d28565b600033612c32858285612db9565b612c3d858585612d28565b506001949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611441576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cb7612c48565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612d038482613984565b50600481016111648382613984565b611ff6612c48565b6060610aea83836000612e87565b6001600160a01b038316612d6b576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401611fe1565b6001600160a01b038216612dae576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401611fe1565b611ccf838383612aad565b6001600160a01b0383811660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111645781811015612e78576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401611fe1565b61116484848484036000612906565b606081471015612ec5576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611fe1565b600080856001600160a01b03168486604051612ee19190613749565b60006040518083038185875af1925050503d8060008114612f1e576040519150601f19603f3d011682016040523d82523d6000602084013e612f23565b606091505b5091509150611f98868383606082612f4357612f3e82612fa3565b610aea565b8151158015612f5a57506001600160a01b0384163b155b15612f9c576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611fe1565b5080610aea565b805115612fb35780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60005b83811015613003578181015183820152602001612feb565b50506000910152565b602081526000825180602084015261302b816040850160208701612fe8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b0381168114612fe557600080fd5b6000806040838503121561308557600080fd5b82356130908161305d565b946020939093013593505050565b60008083601f8401126130b057600080fd5b50813567ffffffffffffffff8111156130c857600080fd5b6020830191508360208260051b85010111156130e357600080fd5b9250929050565b60008060008060008060008060a0898b03121561310657600080fd5b883567ffffffffffffffff8082111561311e57600080fd5b61312a8c838d0161309e565b909a50985060208b013591508082111561314357600080fd5b61314f8c838d0161309e565b909850965060408b013591508082111561316857600080fd5b506131758b828c0161309e565b999c989b509699959896976060870135966080013595509350505050565b6000806000606084860312156131a857600080fd5b83356131b38161305d565b925060208401356131c38161305d565b929592945050506040919091013590565b6000806000806000606086880312156131ec57600080fd5b853567ffffffffffffffff8082111561320457600080fd5b61321089838a0161309e565b9097509550602088013591508082111561322957600080fd5b506132368882890161309e565b96999598509660400135949350505050565b60008083601f84011261325a57600080fd5b50813567ffffffffffffffff81111561327257600080fd5b6020830191508360208285010111156130e357600080fd5b60008060008060008060006080888a0312156132a557600080fd5b873567ffffffffffffffff808211156132bd57600080fd5b6132c98b838c01613248565b909950975060208a01359150808211156132e257600080fd5b6132ee8b838c01613248565b909750955060408a013591506133038261305d565b9093506060890135908082111561331957600080fd5b818a0191508a601f83011261332d57600080fd5b81358181111561333c57600080fd5b8b602060608302850101111561335157600080fd5b60208301945080935050505092959891949750929550565b6000806000806080858703121561337f57600080fd5b843561338a8161305d565b966020860135965060408601359560600135945092505050565b6000602082840312156133b657600080fd5b5035919050565b6000602082840312156133cf57600080fd5b8135610aea8161305d565b600080602083850312156133ed57600080fd5b823567ffffffffffffffff81111561340457600080fd5b6134108582860161309e565b90969095509350505050565b60008151808452602080850194506020840160005b8381101561344d57815187529582019590820190600101613431565b509495945050505050565b6080808252810185905260008660a08301825b8881101561349b57823561347e8161305d565b6001600160a01b031682526020928301929091019060010161346b565b5083810360208501526134ae818861341c565b91505082810360408401526134c3818661341c565b9150508260608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208082528251828201819052600091906040908185019086840185805b8381101561359457825167ffffffffffffffff8082511687528882015160028110613575577f4e487b710000000000000000000000000000000000000000000000000000000085526021600452602485fd5b878a015290870151168686015260609094019391860191600101613523565b509298975050505050505050565b600080604083850312156135b557600080fd5b82356135c08161305d565b915060208301356135d08161305d565b809150509250929050565b600181811c908216806135ef57607f821691505b602082108103613628577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108245761082461362e565b808201808211156108245761082461362e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820281158282048414176108245761082461362e565b6000826136ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81168114612fe557600080fd5b6000806040838503121561372d57600080fd5b82516137388161305d565b60208401519092506135d081613704565b6000825161375b818460208701612fe8565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8281168282160390808211156137b5576137b561362e565b5092915050565b6000602082840312156137ce57600080fd5b8135610aea81613704565b60028110612fe557600080fd5b6000602082840312156137f857600080fd5b8135610aea816137d9565b813561380e81613704565b67ffffffffffffffff811690508154817fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082161783556020840135613852816137d9565b60028110613889577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b68ff00000000000000008160401b16905080837fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000084161717845560408501356138d181613704565b70ffffffffffffffff0000000000000000008160481b16847fffffffffffffffffffffffffffffff00000000000000000000000000000000008516178317178555505050505050565b60006020828403121561392c57600080fd5b81518015158114610aea57600080fd5b601f821115611ccf576000816000526020600020601f850160051c810160208610156139655750805b601f850160051c820191505b81811015611bb757828155600101613971565b815167ffffffffffffffff81111561399e5761399e613765565b6139b2816139ac84546135db565b8461393c565b602080601f831160018114613a0557600084156139cf5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611bb7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613a5257888601518255948401946001909101908401613a33565b5085821015613a8e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a