Overview
MATIC Balance
MATIC Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Loading...
Loading
Contract Name:
XVMCnftStaking
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-06-05 */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/utils/ERC721Holder.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: xvmc-contracts/NFT/NFTstaking.sol pragma solidity 0.8.1; interface IMasterChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingEgg(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); function emergencyWithdraw(uint256 _pid) external; function feeAddress() external view returns (address); function owner() external view returns (address); } interface IGovernance { function rebalancePools() external; function nftAllocationContract() external view returns (address); function treasuryWallet() external view returns (address); function nftStakingPoolID() external view returns (uint256); } interface IVoting { function addCredit(uint256 amount, address _beneficiary) external; } interface IacPool { function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external; } interface INFTallocation { function getAllocation(address _tokenAddress, uint256 _tokenID, address _allocationContract) external view returns (uint256); } /** * XVMC NFT staking contract * !!! Warning: !!! Licensed under Business Source License 1.1 (BSL 1.1) */ contract XVMCnftStaking is ReentrancyGuard, ERC721Holder { using SafeERC20 for IERC20; struct UserInfo { address tokenAddress; uint256 tokenID; uint256 shares; // number of shares the NFT is worth in the pool uint256 debt; //the allocation for the NFT at the time of deposit(why named debt? idk) //basically debt because it counts as "artificial tokens"(we deposit a singular NFT worth an artificial amount) //simple substitute for using NFTs instead of regular tokens address allocContract; //contract that contains allocation details } struct UserSettings { address pool; //which pool to payout in uint256 harvestThreshold; uint256 feeToPay; } struct PoolPayout { uint256 amount; uint256 minServe; } uint256 public constant MINIMUM_ALLOCATION = 10000; IERC20 public immutable token; // XVMC token IERC20 public immutable oldToken = IERC20(0x6d0c966c8A09e354Df9C48b446A474CE3343D912); IERC20 public immutable dummyToken; IMasterChef public masterchef; mapping(address => UserInfo[]) public userInfo; mapping(address => UserSettings) public userSettings; mapping(address => PoolPayout) public poolPayout; //determines the percentage received depending on withdrawal option uint256 public poolID; uint256 public totalShares; address public admin; //admin = governing contract! address public treasury; //penalties address public allocationContract; // PROXY CONTRACT for looking up allocations address public votingCreditAddress; uint256 public tokenDebt; //sum of allocations of all deposited NFTs //if user settings not set, use default address public defaultHarvest = 0x605c5AA14BdBf0d50a99836e7909C631cf3C8d46; //5yr pool by default uint256 public defaultHarvestThreshold = 1000000 * 1e18; // 1M coins uint256 public defaultFeeToPay = 250; //fee for calling 2.5% default uint256 defaultDirectPayout = 500; //5% if withdrawn into wallet event Deposit(address indexed tokenAddress, uint256 indexed tokenID, address indexed depositor, uint256 shares, uint256 nftAllocation, address allocContract); event Withdraw(address indexed sender, uint256 stakeID, address indexed token, uint256 indexed tokenID, uint256 shares, uint256 harvestAmount); event UserSettingUpdate(address indexed user, address poolAddress, uint256 threshold, uint256 feeToPay); event AddVotingCredit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 _stakeID, address indexed token, uint256 tokenID); event Harvest(address indexed harvester, address indexed benficiary, address harvestInto, uint256 harvestAmount, uint256 penalty, uint256 callFee); //harvestAmount contains the callFee event SelfHarvest(address indexed user, address harvestInto, uint256 harvestAmount, uint256 penalty); /** * @notice Constructor * @param _token: XVMC token contract * @param _dummyToken: Dummy token contract * @param _masterchef: MasterChef contract * @param _admin: address of the admin * @param _treasury: address of the treasury (collects fees) */ constructor( IERC20 _token, IERC20 _dummyToken, IMasterChef _masterchef, address _admin, address _treasury, uint256 _poolID, address _allocationContract ) { token = _token; dummyToken = _dummyToken; masterchef = _masterchef; admin = _admin; treasury = _treasury; poolID = _poolID; allocationContract = _allocationContract; IERC20(_dummyToken).safeApprove(address(_masterchef), type(uint256).max); poolPayout[0xfFB71361dD8Fc3ef0831871Ec8dd51B413ed093C].amount = 750; poolPayout[0xfFB71361dD8Fc3ef0831871Ec8dd51B413ed093C].minServe = 864000; poolPayout[0x9a9AEF66624C3fa77DaACcA9B51DE307FA09bd50].amount = 1500; poolPayout[0x9a9AEF66624C3fa77DaACcA9B51DE307FA09bd50].minServe = 2592000; poolPayout[0x1F8a5D98f1e2F10e93331D27CF22eD7985EF6a12].amount = 2500; poolPayout[0x1F8a5D98f1e2F10e93331D27CF22eD7985EF6a12].minServe = 5184000; poolPayout[0x30019481FC501aFa449781ac671103Feb0d6363C].amount = 5000; poolPayout[0x30019481FC501aFa449781ac671103Feb0d6363C].minServe = 8640000; poolPayout[0x8c96105ea574727e94d9C199c632128f1cA584cF].amount = 7000; poolPayout[0x8c96105ea574727e94d9C199c632128f1cA584cF].minServe = 20736000; poolPayout[0x605c5AA14BdBf0d50a99836e7909C631cf3C8d46].amount = 10000; poolPayout[0x605c5AA14BdBf0d50a99836e7909C631cf3C8d46].minServe = 31536000; } /** * @notice Checks if the msg.sender is the admin */ modifier adminOnly() { require(msg.sender == admin, "admin: wut?"); _; } /** * Creates a NEW stake * allocationContract is the proxy * _allocationContract input is the actual contract containing the allocation data */ function deposit(address _tokenAddress, uint256 _tokenID, address _allocationContract) external nonReentrant { uint256 _allocationAmount = INFTallocation(allocationContract).getAllocation(_tokenAddress, _tokenID, _allocationContract); require(_allocationAmount > 0, "Invalid NFT, no allocation"); harvest(); uint256 pool = balanceOf(); IERC721(_tokenAddress).safeTransferFrom(msg.sender, address(this), _tokenID); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_allocationAmount * totalShares) / (pool); } else { require(_allocationAmount > MINIMUM_ALLOCATION, "Minimum allocation not reached"); currentShares = _allocationAmount; currentShares = currentShares - MINIMUM_ALLOCATION; totalShares = MINIMUM_ALLOCATION; userInfo[address(0)].push( UserInfo(address(0), 0, MINIMUM_ALLOCATION, 0, address(0)) ); emit Deposit(address(0), 0, address(0), MINIMUM_ALLOCATION, 0, address(0)); } totalShares = totalShares + currentShares; tokenDebt = tokenDebt + _allocationAmount; userInfo[msg.sender].push( UserInfo(_tokenAddress, _tokenID, currentShares, _allocationAmount, _allocationContract) ); emit Deposit(_tokenAddress, _tokenID, msg.sender, currentShares, _allocationAmount, _allocationContract); } /** * Harvests into pool */ function harvest() public { IMasterChef(masterchef).withdraw(poolID, 0); } /** * */ function setAdmin() external { admin = IMasterChef(masterchef).owner(); treasury = IMasterChef(masterchef).feeAddress(); } function updateAllocationContract() external { allocationContract = IGovernance(admin).nftAllocationContract(); poolID = IGovernance(admin).nftStakingPoolID(); } /** * @notice Withdraws the NFT and harvests earnings */ function withdraw(uint256 _stakeID, address _harvestInto) public nonReentrant { harvest(); require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; uint256 currentAmount = (balanceOf() * (maxHarvest(user))) / (totalShares); totalShares = totalShares - user.shares; tokenDebt = tokenDebt - user.debt; uint256 _tokenID = user.tokenID; address _tokenAddress = user.tokenAddress; emit Withdraw(msg.sender, _stakeID, user.tokenAddress, _tokenID, user.shares, currentAmount); _removeStake(msg.sender, _stakeID); //delete the stake uint256 _toWithdraw; if(_harvestInto == msg.sender) { _toWithdraw = currentAmount * defaultDirectPayout / 10000; currentAmount = currentAmount - _toWithdraw; token.safeTransfer(msg.sender, _toWithdraw); } else { require(poolPayout[_harvestInto].amount != 0, "incorrect pool!"); _toWithdraw = currentAmount * poolPayout[_harvestInto].amount / 10000; currentAmount = currentAmount - _toWithdraw; IacPool(_harvestInto).giftDeposit(_toWithdraw, msg.sender, poolPayout[_harvestInto].minServe); } token.safeTransfer(treasury, currentAmount); //penalty goes to governing contract IERC721(_tokenAddress).safeTransferFrom(address(this), msg.sender, _tokenID); //withdraw NFT } function setUserSettings(address _poolAddress, uint256 _harvestThreshold, uint256 _feeToPay, address _harvestInto) external { require(_feeToPay <= 3000, "max 30%"); if(_harvestInto != msg.sender) { require(poolPayout[_harvestInto].amount != 0, "incorrect pool!"); } UserSettings storage _setting = userSettings[msg.sender]; _setting.harvestThreshold = _harvestThreshold; _setting.feeToPay = _feeToPay; _setting.pool = _harvestInto; //default pool to harvest into(or payout directly) emit UserSettingUpdate(msg.sender, _poolAddress, _harvestThreshold, _feeToPay); } //harvest own earnings //shares left MUST cover the user debt //_harvestInto are only trusted pools, no need for nonReentrant function selfHarvest(address _harvestInto) external { UserInfo[] storage user = userInfo[msg.sender]; require(user.length > 0, "user has no stakes"); harvest(); uint256 _totalWithdraw = 0; uint256 _toWithdraw = 0; uint256 _payout = 0; for(uint256 i = 0; i<user.length; i++) { _toWithdraw = maxHarvest(user[i]); //SHARES user[i].shares = user[i].shares - _toWithdraw; _totalWithdraw+= _toWithdraw; } if(_harvestInto == msg.sender) { _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * defaultDirectPayout / 10000; token.safeTransfer(msg.sender, _payout); } else { require(poolPayout[_harvestInto].amount != 0, "incorrect pool!"); _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * poolPayout[_harvestInto].amount / 10000; IacPool(_harvestInto).giftDeposit(_payout, msg.sender, poolPayout[_harvestInto].minServe); } totalShares = totalShares - _totalWithdraw; uint256 _penalty = _toWithdraw - _payout; token.safeTransfer(treasury, _penalty); //penalty to treasury emit SelfHarvest(msg.sender, _harvestInto, _payout, _penalty); } //copy+paste of the previous function, can harvest custom stake ID //In case user has too many stakes, or if some are not worth harvesting function selfHarvestCustom(uint256[] calldata _stakeID, address _harvestInto) external { require(_stakeID.length <= userInfo[msg.sender].length, "incorrect Stake list"); UserInfo[] storage user = userInfo[msg.sender]; harvest(); uint256 _totalWithdraw = 0; uint256 _toWithdraw = 0; uint256 _payout = 0; for(uint256 i = 0; i<_stakeID.length; i++) { _toWithdraw = maxHarvest(user[_stakeID[i]]); //SHARES user[_stakeID[i]].shares = user[_stakeID[i]].shares - _toWithdraw; _totalWithdraw+= _toWithdraw; } if(_harvestInto == msg.sender) { _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * defaultDirectPayout / 10000; token.safeTransfer(msg.sender, _payout); } else { require(poolPayout[_harvestInto].amount != 0, "incorrect pool!"); _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * poolPayout[_harvestInto].amount / 10000; IacPool(_harvestInto).giftDeposit(_payout, msg.sender, poolPayout[_harvestInto].minServe); } totalShares = totalShares - _totalWithdraw; uint256 _penalty = _toWithdraw - _payout; token.safeTransfer(treasury, _penalty); //penalty to treasury emit SelfHarvest(msg.sender, _harvestInto, _payout, _penalty); } //harvest earnings of another user(receive fees) function proxyHarvest(address _beneficiary) external { UserInfo[] storage user = userInfo[_beneficiary]; require(user.length > 0, "user has no stakes"); harvest(); uint256 _totalWithdraw = 0; uint256 _toWithdraw = 0; uint256 _payout = 0; UserSettings storage _userSetting = userSettings[_beneficiary]; address _harvestInto = _userSetting.pool; uint256 _minThreshold = _userSetting.harvestThreshold; uint256 _callFee = _userSetting.feeToPay; if(_minThreshold == 0) { _minThreshold = defaultHarvestThreshold; } if(_callFee == 0) { _callFee = defaultFeeToPay; } for(uint256 i = 0; i<user.length; i++) { _toWithdraw = maxHarvest(user[i]); //SHARES user[i].shares = user[i].shares - _toWithdraw; _totalWithdraw+= _toWithdraw; } if(_harvestInto == _beneficiary) { //fee paid to harvester _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * defaultDirectPayout / 10000; _callFee = _payout * _callFee / 10000; token.safeTransfer(msg.sender, _callFee); token.safeTransfer(_beneficiary, (_payout - _callFee)); } else { if(_harvestInto == address(0)) { _harvestInto = defaultHarvest; //default pool } //harvest Into is correct(checks if valid when user initiates the setting) _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * poolPayout[_harvestInto].amount / 10000; require(_payout > _minThreshold, "minimum threshold not met"); _callFee = _payout * _callFee / 10000; token.safeTransfer(msg.sender, _callFee); IacPool(_harvestInto).giftDeposit((_payout - _callFee), _beneficiary, poolPayout[_harvestInto].minServe); } totalShares = totalShares - _totalWithdraw; uint256 _penalty = _toWithdraw - _payout; token.safeTransfer(treasury, _penalty); //penalty to treasury emit Harvest(msg.sender, _beneficiary, _harvestInto, _payout, _penalty, _callFee); } //copy+paste of the previous function, can harvest custom stake ID //In case user has too many stakes, or if some are not worth harvesting function proxyHarvestCustom(address _beneficiary, uint256[] calldata _stakeID) external { require(_stakeID.length <= userInfo[_beneficiary].length, "incorrect Stake list"); UserInfo[] storage user = userInfo[_beneficiary]; harvest(); uint256 _totalWithdraw = 0; uint256 _toWithdraw = 0; uint256 _payout = 0; UserSettings storage _userSetting = userSettings[_beneficiary]; address _harvestInto = _userSetting.pool; uint256 _minThreshold = _userSetting.harvestThreshold; uint256 _callFee = _userSetting.feeToPay; if(_minThreshold == 0) { _minThreshold = defaultHarvestThreshold; } if(_callFee == 0) { _callFee = defaultFeeToPay; } for(uint256 i = 0; i<_stakeID.length; i++) { _toWithdraw = maxHarvest(user[_stakeID[i]]); //SHARES user[_stakeID[i]].shares = user[_stakeID[i]].shares - _toWithdraw; _totalWithdraw+= _toWithdraw; } if(_harvestInto == _beneficiary) { //fee paid to harvester _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * defaultDirectPayout / 10000; _callFee = _payout * _callFee / 10000; token.safeTransfer(msg.sender, _callFee); token.safeTransfer(_beneficiary, (_payout - _callFee)); } else { if(_harvestInto == address(0)) { _harvestInto = defaultHarvest; //default pool } //harvest Into is correct(checks if valid when user initiates the setting) _toWithdraw = (balanceOf() * _totalWithdraw) / totalShares; _payout = _toWithdraw * poolPayout[_harvestInto].amount / 10000; require(_payout > _minThreshold, "minimum threshold not met"); _callFee = _payout * _callFee / 10000; token.safeTransfer(msg.sender, _callFee); IacPool(_harvestInto).giftDeposit((_payout - _callFee), _beneficiary, poolPayout[_harvestInto].minServe); } totalShares = totalShares - _totalWithdraw; uint256 _penalty = _toWithdraw - _payout; token.safeTransfer(treasury, _penalty); //penalty to treasury emit Harvest(msg.sender, _beneficiary, _harvestInto, _payout, _penalty, _callFee); } //NOT COUNTING IN min withdraw, just based on shares //calculates amount of shares that cover the debt. Subtract from total to get maximum harvest amount function maxHarvest(UserInfo memory _user) internal view returns (uint256) { uint256 _maximum = (_user.debt * totalShares) / balanceOf(); return (_user.shares - _maximum - 1); } function maxHarvestPublic(address _staker, uint256 _stakeID) external view returns (uint256) { UserInfo storage _user = userInfo[_staker][_stakeID]; uint256 _maximum = (_user.debt * totalShares) / publicBalanceOf(); return (_user.shares - _maximum - 1); } function viewStakeEarnings(address _user, uint256 _stakeID) external view returns (uint256) { uint256 _tokens = (balanceOf() * userInfo[_user][_stakeID].shares) / totalShares; return(_tokens - userInfo[_user][_stakeID].debt); } function viewUserTotalEarnings(address _user) external view returns (uint256) { (uint256 _userShares, uint256 _userDebt) = getUserTotals(_user); //convert shares into tokens and deduct debt uint256 _tokens = (balanceOf() * _userShares) / totalShares; return (_tokens - _userDebt); } /** * Ability to withdraw tokens from the stake, and add voting credit * At the time of launch there is no option(voting with credit), but can be added later on */ function votingCredit(uint256 _shares, uint256 _stakeID) public { require(votingCreditAddress != address(0), "disabled"); require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); harvest(); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares < maxHarvest(user), "insufficient shares"); uint256 currentAmount = (balanceOf() * (_shares)) / (totalShares); user.shares = user.shares - _shares; totalShares = totalShares - _shares; token.safeTransfer(votingCreditAddress, currentAmount); IVoting(votingCreditAddress).addCredit(currentAmount, msg.sender); //in the votingCreditAddress regulate how much is credited, depending on where it's coming from (msg.sender) emit AddVotingCredit(msg.sender, currentAmount); } function cashoutAllToCredit() external { require(votingCreditAddress != address(0), "disabled"); require(userInfo[msg.sender].length > 0, "no active stakes"); harvest(); uint256 _toWithdraw = 0; uint256 _totalWithdraw = 0; UserInfo[] storage user = userInfo[msg.sender]; for(uint256 i=0; i<user.length; i++) { _toWithdraw = maxHarvest(user[i]); //SHARES user[i].shares = user[i].shares - _toWithdraw; _totalWithdraw+= _toWithdraw; } uint256 currentAmount = (balanceOf() * (_totalWithdraw)) / (totalShares); totalShares = totalShares - _totalWithdraw; token.safeTransfer(votingCreditAddress, currentAmount); IVoting(votingCreditAddress).addCredit(currentAmount, msg.sender); //in the votingCreditAddress regulate how much is credited, depending on where it's coming from (msg.sender) emit AddVotingCredit(msg.sender, currentAmount); } // if allocation for the NFT changes, anyone can rebalance // if allocation contract is replaced(rare event), an "evil" third party can push the NFT out of the staking // responsibility of the owner to re-deposit (or rebalance first) function rebalanceNFT(address _staker, uint256 _stakeID, bool isAllocationContractReplaced, address _allocationContract) external { require(_stakeID < userInfo[_staker].length, "invalid stake ID"); harvest(); UserInfo storage user = userInfo[_staker][_stakeID]; uint256 _alloc; if(isAllocationContractReplaced) { require(user.allocContract != _allocationContract, "must set allocation replaced setting as FALSE"); _alloc = INFTallocation(allocationContract).getAllocation(user.tokenAddress, user.tokenID, _allocationContract); require(_alloc != 0, "incorrect _allocationContract"); } else { _alloc = INFTallocation(allocationContract).getAllocation(user.tokenAddress, user.tokenID, user.allocContract); } if(_alloc == 0) { //no longer valid, anyone can push out and withdraw NFT to the owner (copy+paste withdraw option) uint256 currentAmount = (balanceOf() * (maxHarvest(user))) / (totalShares); totalShares = totalShares - user.shares; tokenDebt = tokenDebt - user.debt; uint256 _tokenID = user.tokenID; address _tokenAddress = user.tokenAddress; emit Withdraw(_staker, _stakeID, user.tokenAddress, _tokenID, user.shares, currentAmount); _removeStake(_staker, _stakeID); //delete the stake address _harvestInto = userSettings[_staker].pool; if(_harvestInto == address(0)) { _harvestInto = defaultHarvest; } uint256 _toWithdraw; if(_harvestInto == _staker) { _toWithdraw = currentAmount * defaultDirectPayout / 10000; currentAmount = currentAmount - _toWithdraw; token.safeTransfer(_staker, _toWithdraw); } else { _toWithdraw = currentAmount * poolPayout[_harvestInto].amount / 10000; currentAmount = currentAmount - _toWithdraw; IacPool(_harvestInto).giftDeposit(_toWithdraw, _staker, poolPayout[_harvestInto].minServe); } token.safeTransfer(treasury, currentAmount); //penalty goes to governing contract IERC721(_tokenAddress).safeTransferFrom(address(this), _staker, _tokenID); //withdraw NFT } else if(_alloc != user.debt) { //change allocation uint256 _profitShares = maxHarvest(user); uint256 _profitTokens = (balanceOf() * _profitShares) / totalShares; //artificial withdraw, then re-deposit with new allocaiton, along with profited tokens totalShares = totalShares - user.shares; //as if ALL shares and ALL DEBT was withdrawn (actual profit tokens remain inside!) tokenDebt = tokenDebt - user.debt; user.shares = ((_alloc+_profitTokens) * totalShares) / (balanceOf() - _profitTokens); tokenDebt = tokenDebt + _alloc; user.debt = _alloc; totalShares = totalShares + user.shares; } } // emergency withdraw, without caring about rewards function emergencyWithdraw(uint256 _stakeID) public { require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; totalShares-= user.shares; tokenDebt-= user.debt; address _token = user.tokenAddress; uint256 _tokenID = user.tokenID; _removeStake(msg.sender, _stakeID); //delete the stake emit EmergencyWithdraw(msg.sender, _stakeID, _token, _tokenID); IERC721(_token).safeTransferFrom(address(this), msg.sender, _tokenID); //withdraw NFT } // withdraw all without caring about rewards // self-harvest to harvest rewards, then emergency withdraw all(easiest to withdraw all+earnings) // (non-rentrant in regular withdraw) function emergencyWithdrawAll() external { uint256 _stakeID = userInfo[msg.sender].length; while(_stakeID > 0) { _stakeID--; emergencyWithdraw(_stakeID); } } //need to set pools before launch or perhaps during contract launch //determines the payout depending on the pool. could set a governance process for it(determining amounts for pools) //allocation contract contains the decentralized proccess for updating setting, but so does the admin(governor) function setPoolPayout(address _poolAddress, uint256 _amount, uint256 _minServe) external { require(msg.sender == allocationContract || msg.sender == admin, "must be set by allocation contract or admin"); if(_poolAddress == address(0)) { require(_amount <= 10000, "out of range"); defaultDirectPayout = _amount; } else if (_poolAddress == address(1)) { defaultHarvestThreshold = _amount; } else if (_poolAddress == address(2)) { require(_amount <= 1000, "out of range"); //max 10% defaultFeeToPay = _amount; } else { require(_amount <= 10000, "out of range"); poolPayout[_poolAddress].amount = _amount; poolPayout[_poolAddress].minServe = _minServe; //mandatory lockup(else stake for 5yr, withdraw with 82% penalty and receive 18%) } } function updateSettings(address _defaultHarvest, uint256 _threshold, uint256 _defaultFee, uint256 _defaultDirectHarvest) external adminOnly { defaultHarvest = _defaultHarvest; //longest pool should be the default defaultHarvestThreshold = _threshold; defaultFeeToPay = _defaultFee; defaultDirectPayout = _defaultDirectHarvest; } function updateVotingCreditAddress(address _newAddress) external adminOnly { votingCreditAddress = _newAddress; } /** * Returns number of stakes for a user */ function getNrOfStakes(address _user) public view returns (uint256) { return userInfo[_user].length; } /** * Returns all shares and debt for a user */ function getUserTotals(address _user) public view returns (uint256, uint256) { UserInfo[] storage _stake = userInfo[_user]; uint256 nrOfUserStakes = _stake.length; uint256 countShares = 0; uint256 countDebt = 0; for(uint256 i=0; i < nrOfUserStakes; i++) { countShares += _stake[i].shares; countDebt += _stake[i].debt; } return (countShares, countDebt); } /** * @return Returns total pending xvmc rewards */ function calculateTotalPendingXVMCRewards() external view returns (uint256) { return(IMasterChef(masterchef).pendingEgg(poolID, address(this))); } /** * @notice Calculates the price per share */ function getPricePerFullShare() external view returns (uint256) { return totalShares == 0 ? 1e18 : balanceOf() * (1e18) / (totalShares); } /** * @notice returns number of shares for a certain stake of an user */ function getUserShares(address _wallet, uint256 _stakeID) public view returns (uint256) { return userInfo[_wallet][_stakeID].shares; } /** * calculates pending rewards + balance of tokens in this address + artificial token debt(how much each NFT is worth) * we harvest before every action, pending rewards not needed */ function balanceOf() internal view returns (uint256) { return token.balanceOf(address(this)) + tokenDebt; } //public lookup for UI function publicBalanceOf() public view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return token.balanceOf(address(this)) + amount + tokenDebt; } /* * Unlikely, but Masterchef can be changed if needed to be used without changing pools * masterchef = IMasterChef(token.owner()); * Must stop earning first(withdraw tokens from old chef) */ function setMasterChefAddress(IMasterChef _masterchef, uint256 _newPoolID) external adminOnly { masterchef = _masterchef; poolID = _newPoolID; //in case pool ID changes uint256 _dummyAllowance = IERC20(dummyToken).allowance(address(this), address(masterchef)); if(_dummyAllowance == 0) { IERC20(dummyToken).safeApprove(address(_masterchef), type(uint256).max); } } /** * When contract is launched, dummyToken shall be deposited to start earning rewards */ function startEarning() external adminOnly { IMasterChef(masterchef).deposit(poolID, dummyToken.balanceOf(address(this))); } /** * Dummy token can be withdrawn if ever needed(allows for flexibility) */ function stopEarning(uint256 _withdrawAmount) external adminOnly { if(_withdrawAmount == 0) { IMasterChef(masterchef).withdraw(poolID, dummyToken.balanceOf(address(masterchef))); } else { IMasterChef(masterchef).withdraw(poolID, _withdrawAmount); } } /** * Withdraws dummyToken to owner(who can burn it if needed) */ function withdrawDummy(uint256 _amount) external adminOnly { if(_amount == 0) { dummyToken.safeTransfer(admin, dummyToken.balanceOf(address(this))); } else { dummyToken.safeTransfer(admin, _amount); } } /** * option to withdraw wrongfully sent tokens(but requires change of the governing contract to do so) * If you send wrong tokens to the contract address, consider them lost. Though there is possibility of recovery */ function withdrawStuckTokens(address _tokenAddress) external adminOnly { require(_tokenAddress != address(token), "wrong token"); require(_tokenAddress != address(dummyToken), "wrong token"); IERC20(_tokenAddress).safeTransfer(IGovernance(admin).treasuryWallet(), IERC20(_tokenAddress).balanceOf(address(this))); } /** * removes the stake */ function _removeStake(address _staker, uint256 _stakeID) private { UserInfo[] storage stakes = userInfo[_staker]; uint256 lastStakeID = stakes.length - 1; if(_stakeID != lastStakeID) { stakes[_stakeID] = stakes[lastStakeID]; } stakes.pop(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"contract IERC20","name":"_dummyToken","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_poolID","type":"uint256"},{"internalType":"address","name":"_allocationContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddVotingCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftAllocation","type":"uint256"},{"indexed":false,"internalType":"address","name":"allocContract","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_stakeID","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":true,"internalType":"address","name":"benficiary","type":"address"},{"indexed":false,"internalType":"address","name":"harvestInto","type":"address"},{"indexed":false,"internalType":"uint256","name":"harvestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callFee","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"harvestInto","type":"address"},{"indexed":false,"internalType":"uint256","name":"harvestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"SelfHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"poolAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeToPay","type":"uint256"}],"name":"UserSettingUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MINIMUM_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allocationContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashoutAllToCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultFeeToPay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultHarvest","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultHarvestThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"address","name":"_allocationContract","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dummyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"getUserShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotals","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"maxHarvestPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolPayout","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"proxyHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256[]","name":"_stakeID","type":"uint256[]"}],"name":"proxyHarvestCustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"bool","name":"isAllocationContractReplaced","type":"bool"},{"internalType":"address","name":"_allocationContract","type":"address"}],"name":"rebalanceNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_harvestInto","type":"address"}],"name":"selfHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakeID","type":"uint256[]"},{"internalType":"address","name":"_harvestInto","type":"address"}],"name":"selfHarvestCustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minServe","type":"uint256"}],"name":"setPoolPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"uint256","name":"_harvestThreshold","type":"uint256"},{"internalType":"uint256","name":"_feeToPay","type":"uint256"},{"internalType":"address","name":"_harvestInto","type":"address"}],"name":"setUserSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"stopEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAllocationContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_defaultHarvest","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_defaultFee","type":"uint256"},{"internalType":"uint256","name":"_defaultDirectHarvest","type":"uint256"}],"name":"updateSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updateVotingCreditAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"address","name":"allocContract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userSettings","outputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"harvestThreshold","type":"uint256"},{"internalType":"uint256","name":"feeToPay","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"viewStakeEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewUserTotalEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"votingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingCreditAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_harvestInto","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040527f6d0c966c8a09e354df9c48b446a474ce3343d91200000000000000000000000060a052600c80546001600160a01b03191673605c5aa14bdbf0d50a99836e7909c631cf3c8d4617905569d3c21bcecceda1000000600d5560fa600e556101f4600f553480156200007457600080fd5b50604051620056fd380380620056fd83398101604081905262000097916200061b565b60016000819055606088811b6001600160601b03199081166080529088901b1660c05280546001600160a01b03199081166001600160a01b038881169190911790925560078054821687841617905560088054821686841617905560058490556009805490911683831617905562000121908716866000196200030f602090811b62003c7e17901c565b5050600460205250506102ee7f8de62b2ef66bf804a95783d2e95aac9c0f8a9808be4c9579b4b0e9433fb5d5b9555050620d2f007f8de62b2ef66bf804a95783d2e95aac9c0f8a9808be4c9579b4b0e9433fb5d5ba55506105dc7fb9574aaa1f8e0cba66f785c16581304e1ca3bbba7d7b6d8bdccae966c4aa43135562278d007fb9574aaa1f8e0cba66f785c16581304e1ca3bbba7d7b6d8bdccae966c4aa4314556109c47f65672ce2e35800de5e90c9d8c582d761d62f56bcfd7fac9a290ffaf16e2ab62055624f1a007f65672ce2e35800de5e90c9d8c582d761d62f56bcfd7fac9a290ffaf16e2ab621556113887fdb424271dddfc34906d67c84d3863a03683967e978f204517e38b8a4fd581f0b556283d6007fdb424271dddfc34906d67c84d3863a03683967e978f204517e38b8a4fd581f0c55611b587fabcd86562c999cf91fbb9e4b5c94dbcf0e4d71dd79e42bcf0814ffbf0bf817165563013c68007fabcd86562c999cf91fbb9e4b5c94dbcf0e4d71dd79e42bcf0814ffbf0bf817175573605c5aa14bdbf0d50a99836e7909c631cf3c8d466000526127107f36d53083fe22808b93ef3b68bb2074ae35f8188b153c73fd60db57a612ac0bbc556301e133807f36d53083fe22808b93ef3b68bb2074ae35f8188b153c73fd60db57a612ac0bbd55620008c8565b8015806200039e5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90620003489030908690600401620006f0565b60206040518083038186803b1580156200036157600080fd5b505afa15801562000376573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039c9190620006b9565b155b620003c65760405162461bcd60e51b8152600401620003bd906200081f565b60405180910390fd5b620004218363095ea7b360e01b8484604051602401620003e89291906200070a565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200042616565b505050565b600062000482826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620004c260201b62003d78179092919060201c565b805190915015620004215780806020019051810190620004a39190620005f9565b620004215760405162461bcd60e51b8152600401620003bd90620007d5565b6060620004d38484600085620004dd565b90505b9392505050565b606082471015620005025760405162461bcd60e51b8152600401620003bd9062000758565b6200050d85620005ac565b6200052c5760405162461bcd60e51b8152600401620003bd906200079e565b600080866001600160a01b031685876040516200054a9190620006d2565b60006040518083038185875af1925050503d806000811462000589576040519150601f19603f3d011682016040523d82523d6000602084013e6200058e565b606091505b509092509050620005a1828286620005bb565b979650505050505050565b6001600160a01b03163b151590565b60608315620005cc575081620004d6565b825115620005dd5782518084602001fd5b8160405162461bcd60e51b8152600401620003bd919062000723565b6000602082840312156200060b578081fd5b81518015158114620004d6578182fd5b600080600080600080600060e0888a03121562000636578283fd5b87516200064381620008af565b60208901519097506200065681620008af565b60408901519096506200066981620008af565b60608901519095506200067c81620008af565b60808901519094506200068f81620008af565b60a089015160c08a01519194509250620006a981620008af565b8091505092959891949750929550565b600060208284031215620006cb578081fd5b5051919050565b60008251620006e68184602087016200087c565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6000602082528251806020840152620007448160408501602087016200087c565b601f01601f19169190910160400192915050565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60005b83811015620008995781810151838201526020016200087f565b83811115620008a9576000848401525b50505050565b6001600160a01b0381168114620008c557600080fd5b50565b60805160601c60a05160601c60c05160601c614d3f620009be60003960008181610c3d01528181610cce01528181610d0b01528181611c080152818161235c0152818161252c015281816125c80152818161279e0152612bb001526000612a8b0152600081816108080152818161092f01528181610feb0152818161102a0152818161110e015281816111fa0152818161152701528181611a3001528181611b8e0152818161204b01528181612152015281816129b501528181612b5e0152818161310c015281816131fe015281816132ea015281816135dd0152818161373b01528181613c5c0152613ddd0152614d3f6000f3fe608060405234801561001057600080fd5b50600436106102f05760003560e01c80637eb3f0841161019d578063d8e9476f116100e9578063ea466aa1116100a2578063f51041151161007c578063f5104115146105eb578063f851a440146105fe578063fb1db27814610606578063fc0c546a1461060e576102f0565b8063ea466aa1146105bd578063f2fcc5fa146105c5578063f45346dc146105d8576102f0565b8063d8e9476f14610561578063dd19171914610574578063ddd9d0451461057c578063ded6275e1461058f578063e5ea69ff14610597578063e8640b4d146105aa576102f0565b8063a36e40fc11610156578063bbb224f011610130578063bbb224f014610520578063cb96372814610528578063d6d3774b1461053b578063d745cdcf1461054e576102f0565b8063a36e40fc14610508578063af2d387514610510578063b31c710a14610518576102f0565b80637eb3f084146104925780637ef8513a146104a55780638482b202146104c75780638d934485146104da5780638df4f717146104e257806399044f7c146104f5576102f0565b806341891d0e1161025c578063646c4176116102155780636d675029116101ef5780636d6750291461045c57806373369df81461046f57806377c7b8fc146104775780637883c3691461047f576102f0565b8063646c41761461042e5780636519c6af1461044157806367479ec514610454576102f0565b806341891d0e146103e65780634641257d146103fb5780634a6f3b54146104035780634b9bc1971461040b5780635312ea8e1461041357806361d027b314610426576102f0565b8063159ad8cd116102ae578063159ad8cd146103845780631cf4b86a146103975780631ffa743d1461039f57806321ce919d146103b25780632cae2096146103d65780633a98ef39146103de576102f0565b8062f714ce146102f557806307fe2b771461030a5780630f51d02c14610312578063102d89901461033b578063150b7a021461035c578063158cb2741461037c575b600080fd5b610308610303366004614534565b610616565b005b6103086109c8565b610325610320366004614334565b610ae4565b6040516103329190614b6c565b60405180910390f35b61034e6103493660046141d0565b610bbd565b604051610332929190614bab565b61036f61036a366004614208565b610bd6565b60405161033291906146a5565b610325610be6565b610308610392366004614504565b610bec565b610325610d37565b6103086103ad3660046142e1565b610d3d565b6103c56103c0366004614334565b611282565b604051610332959493929190614675565b6103086112db565b610325611414565b6103ee61141a565b60405161033291906145a0565b610308611429565b610325611491565b610325611497565b610308610421366004614504565b6115db565b6103ee611751565b61030861043c3660046143f2565b611760565b61030861044f36600461449e565b61187c565b6103ee611c06565b61032561046a3660046141d0565b611c2a565b610325611c73565b610325611c79565b61030861048d3660046143a0565b611cc0565b6103086104a0366004614504565b612305565b6104b86104b33660046141d0565b61249f565b6040516103329392919061462e565b6103086104d5366004614334565b6124ca565b6103256125f1565b6103256104f0366004614334565b6125f7565b61034e6105033660046141d0565b612686565b61030861274c565b610308612842565b6103ee612a89565b610325612aad565b6103086105363660046141d0565b612b32565b610308610549366004614563565b612d0b565b61030861055c366004614426565b612e64565b61030861056f3660046141d0565b612f48565b610308613370565b61032561058a366004614334565b6133a2565b6103ee6133f4565b6103256105a53660046141d0565b613403565b6103086105b8366004614464565b61341e565b6103ee613477565b6103086105d33660046141d0565b613486565b6103086105e636600461435f565b6137b1565b6103086105f93660046141d0565b613bf0565b6103ee613c3c565b6103ee613c4b565b6103ee613c5a565b600260005414156106425760405162461bcd60e51b815260040161063990614adf565b60405180910390fd5b600260005561064f611429565b33600090815260026020526040902054821061067d5760405162461bcd60e51b8152600401610639906148d0565b3360009081526002602052604081208054849081106106ac57634e487b7160e01b600052603260045260246000fd5b600091825260208083206006546040805160a081018252600590950290920180546001600160a01b039081168652600182015494860194909452600281015492850192909252600382015460608501526004820154909216608084015293509061071590613d91565b61071d613dd6565b6107279190614c26565b6107319190614c06565b905081600201546006546107459190614c45565b6006556003820154600b5461075a9190614c45565b600b556001820154825460028401546040516001600160a01b03909216918391839133917f25993effddf3b74ffcc0e68e5440be3fba18b532cdf14462257fb11e7c22fb95916107ad918c918a90614bd8565b60405180910390a46107bf3387613e81565b60006001600160a01b03861633141561083457612710600f54856107e39190614c26565b6107ed9190614c06565b90506107f98185614c45565b935061082f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b61091e565b6001600160a01b0386166000908152600460205260409020546108695760405162461bcd60e51b8152600401610639906149e7565b6001600160a01b038616600090815260046020526040902054612710906108909086614c26565b61089a9190614c06565b90506108a68185614c45565b6001600160a01b03871660008181526004602081905260409182902060010154915163859f267f60e01b8152939750919263859f267f926108eb928692339201614b8c565b600060405180830381600087803b15801561090557600080fd5b505af1158015610919573d6000803e3d6000fd5b505050505b600854610958906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911686613fd1565b604051632142170760e11b81526001600160a01b038316906342842e0e90610988903090339088906004016145ce565b600060405180830381600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b50506001600055505050505050505050565b600760009054906101000a90046001600160a01b03166001600160a01b031663c4c57bad6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e91906141ec565b600980546001600160a01b0319166001600160a01b0392831617905560075460408051631cde0e4b60e01b815290519190921691631cde0e4b916004808301926020929190829003018186803b158015610aa757600080fd5b505afa158015610abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adf919061451c565b600555565b60008060065460026000866001600160a01b03166001600160a01b031681526020019081526020016000208481548110610b2e57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154610b48613dd6565b610b529190614c26565b610b5c9190614c06565b6001600160a01b038516600090815260026020526040902080549192509084908110610b9857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003015481610bb59190614c45565b949350505050565b6004602052600090815260409020805460019091015482565b630a85bd0160e11b949350505050565b600b5481565b6007546001600160a01b03163314610c165760405162461bcd60e51b81526004016106399061498b565b80610cfa576007546040516370a0823160e01b8152610cf5916001600160a01b03908116917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190610c749030906004016145a0565b60206040518083038186803b158015610c8c57600080fd5b505afa158015610ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc4919061451c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613fd1565b610d34565b600754610d34906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683613fd1565b50565b61271081565b6001600160a01b038316600090815260026020526040902054811115610d755760405162461bcd60e51b81526004016106399061495d565b6001600160a01b0383166000908152600260205260409020610d95611429565b6001600160a01b03808516600090815260036020526040812080546001820154600283015493948594859493909116919081610dd157600d5491505b80610ddb5750600e545b60005b89811015610f6b57610e8e898c8c84818110610e0a57634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610e2f57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a081018252600590930290910180546001600160a01b03908116845260018201549484019490945260028101549183019190915260038101546060830152600401549091166080820152613d91565b965086898c8c84818110610eb257634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610ed757634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154610ef39190614c45565b898c8c84818110610f1457634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610f3957634e487b7160e01b600052603260045260246000fd5b6000918252602090912060026005909202010155610f578789614bee565b975080610f6381614c9f565b915050610dde565b508a6001600160a01b0316836001600160a01b031614156110565760065487610f92613dd6565b610f9c9190614c26565b610fa69190614c06565b9550612710600f5487610fb99190614c26565b610fc39190614c06565b9450612710610fd28287614c26565b610fdc9190614c06565b90506110126001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b6110518b6110208388614c45565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613fd1565b6111c9565b6001600160a01b03831661107357600c546001600160a01b031692505b6006548761107f613dd6565b6110899190614c26565b6110939190614c06565b6001600160a01b038416600090815260046020526040902054909650612710906110bd9088614c26565b6110c79190614c06565b94508185116110e85760405162461bcd60e51b815260040161063990614793565b6127106110f58287614c26565b6110ff9190614c06565b90506111356001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b6001600160a01b03831663859f267f61114e8388614c45565b8d60046000886001600160a01b03166001600160a01b03168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161119693929190614b8c565b600060405180830381600087803b1580156111b057600080fd5b505af11580156111c4573d6000803e3d6000fd5b505050505b866006546111d79190614c45565b60065560006111e68688614c45565b600854909150611223906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683613fd1565b8b6001600160a01b0316336001600160a01b03167f282b9c6f6d6a6b0d9b4175a3af0be477af589c6cb2d91400d87972ef449876d78689858760405161126c949392919061464f565b60405180910390a3505050505050505050505050565b6002602052816000526040600020818154811061129e57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b03938416965091945092911685565b600160009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136191906141ec565b600780546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b8152905191909216916341275358916004808301926020929190829003018186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f291906141ec565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60065481565b6009546001600160a01b031681565b600154600554604051630441a3e760e41b81526001600160a01b039092169163441a3e709161145d91600090600401614bab565b600060405180830381600087803b15801561147757600080fd5b505af115801561148b573d6000803e3d6000fd5b50505050565b600e5481565b60015460055460405163f456426f60e01b815260009283926001600160a01b039091169163f456426f916114cf913090600401614b75565b60206040518083038186803b1580156114e757600080fd5b505afa1580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f919061451c565b9050600b54817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161157191906145a0565b60206040518083038186803b15801561158957600080fd5b505afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c1919061451c565b6115cb9190614bee565b6115d59190614bee565b91505090565b3360009081526002602052604090205481106116095760405162461bcd60e51b8152600401610639906148d0565b33600090815260026020526040812080548390811061163857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905080600201546006600082825461165e9190614c45565b90915550506003810154600b805460009061167a908490614c45565b9091555050805460018201546001600160a01b039091169061169c3385613e81565b816001600160a01b0316336001600160a01b03167fbbae553982d541d38dacb1ea468ac757f324d0e279b6e4a2958f9e894da575ff86846040516116e1929190614bab565b60405180910390a3604051632142170760e11b81526001600160a01b038316906342842e0e90611719903090339086906004016145ce565b600060405180830381600087803b15801561173357600080fd5b505af1158015611747573d6000803e3d6000fd5b5050505050505050565b6008546001600160a01b031681565b6009546001600160a01b031633148061178357506007546001600160a01b031633145b61179f5760405162461bcd60e51b8152600401610639906147f4565b6001600160a01b0383166117d9576127108211156117cf5760405162461bcd60e51b81526004016106399061483f565b600f829055611877565b6001600160a01b038316600114156117f557600d829055611877565b6001600160a01b03831660021415611833576103e88211156118295760405162461bcd60e51b81526004016106399061483f565b600e829055611877565b6127108211156118555760405162461bcd60e51b81526004016106399061483f565b6001600160a01b03831660009081526004602052604090208281556001018190555b505050565b336000908152600260205260409020548211156118ab5760405162461bcd60e51b81526004016106399061495d565b3360009081526002602052604090206118c2611429565b6000806000805b868110156119d2576118f585898984818110610e0a57634e487b7160e01b600052603260045260246000fd5b9250828589898481811061191957634e487b7160e01b600052603260045260246000fd5b905060200201358154811061193e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461195a9190614c45565b8589898481811061197b57634e487b7160e01b600052603260045260246000fd5b90506020020135815481106119a057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600260059092020101556119be8385614bee565b9350806119ca81614c9f565b9150506118c9565b506001600160a01b038516331415611a5c57600654836119f0613dd6565b6119fa9190614c26565b611a049190614c06565b9150612710600f5483611a179190614c26565b611a219190614c06565b9050611a576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b611b5d565b6001600160a01b038516600090815260046020526040902054611a915760405162461bcd60e51b8152600401610639906149e7565b60065483611a9d613dd6565b611aa79190614c26565b611ab19190614c06565b6001600160a01b03861660009081526004602052604090205490925061271090611adb9084614c26565b611ae59190614c06565b6001600160a01b03861660008181526004602081905260409182902060010154915163859f267f60e01b8152939450919263859f267f92611b2a928692339201614b8c565b600060405180830381600087803b158015611b4457600080fd5b505af1158015611b58573d6000803e3d6000fd5b505050505b82600654611b6b9190614c45565b6006556000611b7a8284614c45565b600854909150611bb7906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683613fd1565b336001600160a01b03167f3a4ec895250afc70eb7433d7adfd099a5e2eb6935363b1a862116485cea549ac878484604051611bf49392919061462e565b60405180910390a25050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611c3884612686565b91509150600060065483611c4a613dd6565b611c549190614c26565b611c5e9190614c06565b9050611c6a8282614c45565b95945050505050565b600d5481565b6000600654600014611cb157600654611c90613dd6565b611ca290670de0b6b3a7640000614c26565b611cac9190614c06565b611cbb565b670de0b6b3a76400005b905090565b6001600160a01b0384166000908152600260205260409020548310611cf75760405162461bcd60e51b8152600401610639906148d0565b611cff611429565b6001600160a01b0384166000908152600260205260408120805485908110611d3757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905060008315611e2d5760048201546001600160a01b0384811691161415611d7f5760405162461bcd60e51b8152600401610639906146ed565b60095482546001840154604051633863c48760e01b81526001600160a01b0393841693633863c48793611db993911691889060040161460b565b60206040518083038186803b158015611dd157600080fd5b505afa158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e09919061451c565b905080611e285760405162461bcd60e51b8152600401610639906148fa565b611ec3565b60095482546001840154600480860154604051633863c48760e01b81526001600160a01b0395861695633863c48795611e7095908216949093909116910161460b565b60206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec0919061451c565b90505b806121e7576006546040805160a08101825284546001600160a01b03908116825260018601546020830152600286015492820192909252600385015460608201526004850154909116608082015260009190611f1e90613d91565b611f26613dd6565b611f309190614c26565b611f3a9190614c06565b90508260020154600654611f4e9190614c45565b6006556003830154600b54611f639190614c45565b600b556001830154835460028501546040516001600160a01b039283169284928492918d16917f25993effddf3b74ffcc0e68e5440be3fba18b532cdf14462257fb11e7c22fb9591611fb9918e91908a90614bd8565b60405180910390a4611fcb8989613e81565b6001600160a01b03808a166000908152600360205260409020541680611ff95750600c546001600160a01b03165b60008a6001600160a01b0316826001600160a01b0316141561207757612710600f54866120269190614c26565b6120309190614c06565b905061203c8186614c45565b94506120726001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168c83613fd1565b612141565b6001600160a01b0382166000908152600460205260409020546127109061209e9087614c26565b6120a89190614c06565b90506120b48186614c45565b9450816001600160a01b031663859f267f828d60046000876001600160a01b03166001600160a01b03168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161210e93929190614b8c565b600060405180830381600087803b15801561212857600080fd5b505af115801561213c573d6000803e3d6000fd5b505050505b60085461217b906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911687613fd1565b604051632142170760e11b81526001600160a01b038416906342842e0e906121ab9030908f9089906004016145ce565b600060405180830381600087803b1580156121c557600080fd5b505af11580156121d9573d6000803e3d6000fd5b5050505050505050506122fd565b816003015481146122fd576040805160a08101825283546001600160a01b03908116825260018501546020830152600285015492820192909252600384015460608201526004840154909116608082015260009061224490613d91565b9050600060065482612254613dd6565b61225e9190614c26565b6122689190614c06565b9050836002015460065461227c9190614c45565b6006556003840154600b546122919190614c45565b600b558061229d613dd6565b6122a79190614c45565b6006546122b48386614bee565b6122be9190614c26565b6122c89190614c06565b6002850155600b546122db908490614bee565b600b556003840183905560028401546006546122f79190614bee565b60065550505b505050505050565b6007546001600160a01b0316331461232f5760405162461bcd60e51b81526004016106399061498b565b80612437576001546005546040516370a0823160e01b81526001600160a01b039283169263441a3e7092917f0000000000000000000000000000000000000000000000000000000000000000909116906370a08231906123939086906004016145a0565b60206040518083038186803b1580156123ab57600080fd5b505afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e3919061451c565b6040518363ffffffff1660e01b8152600401612400929190614bab565b600060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b50505050610d34565b600154600554604051630441a3e760e41b81526001600160a01b039092169163441a3e709161246a918590600401614bab565b600060405180830381600087803b15801561248457600080fd5b505af1158015612498573d6000803e3d6000fd5b5050505050565b6003602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b6007546001600160a01b031633146124f45760405162461bcd60e51b81526004016106399061498b565b600180546001600160a01b0319166001600160a01b0384811691909117918290556005839055604051636eb1769f60e11b81526000927f000000000000000000000000000000000000000000000000000000000000000083169263dd62ed3e9261256492309216906004016145b4565b60206040518083038186803b15801561257c57600080fd5b505afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b4919061451c565b905080611877576118776001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684600019613c7e565b60055481565b6001600160a01b038216600090815260026020526040812080548291908490811061263257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502019050600061264c611497565b600654836003015461265e9190614c26565b6126689190614c06565b9050600181836002015461267c9190614c45565b611c6a9190614c45565b6001600160a01b038116600090815260026020526040812080548291908280805b8381101561273f578481815481106126cf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154836126ec9190614bee565b925084818154811061270e57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600301548261272b9190614bee565b91508061273781614c9f565b9150506126a7565b5090945092505050915091565b6007546001600160a01b031633146127765760405162461bcd60e51b81526004016106399061498b565b6001546005546040516370a0823160e01b81526001600160a01b039283169263e2bbb15892917f0000000000000000000000000000000000000000000000000000000000000000909116906370a08231906127d59030906004016145a0565b60206040518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612825919061451c565b6040518363ffffffff1660e01b815260040161145d929190614bab565b600a546001600160a01b031661286a5760405162461bcd60e51b815260040161063990614771565b336000908152600260205260409020546128965760405162461bcd60e51b8152600401610639906147ca565b61289e611429565b3360009081526002602052604081208190815b815481101561296e576128dd828281548110610e2f57634e487b7160e01b600052603260045260246000fd5b93508382828154811061290057634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461291c9190614c45565b82828154811061293c57634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600590920201015561295a8484614bee565b92508061296681614c9f565b9150506128b1565b5060006006548361297d613dd6565b6129879190614c26565b6129919190614c06565b9050826006546129a19190614c45565b600655600a546129de906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683613fd1565b600a5460405163364c781560e01b81526001600160a01b039091169063364c781590612a109084903390600401614b75565b600060405180830381600087803b158015612a2a57600080fd5b505af1158015612a3e573d6000803e3d6000fd5b50505050336001600160a01b03167f6b41b7bc19c55fcc8c6cd42eb9f7203509484443802f71569f3fae7bf3a29d7682604051612a7b9190614b6c565b60405180910390a250505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015460055460405163f456426f60e01b81526000926001600160a01b03169163f456426f91612ae291903090600401614b75565b60206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb919061451c565b6007546001600160a01b03163314612b5c5760405162461bcd60e51b81526004016106399061498b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415612bae5760405162461bcd60e51b8152600401610639906148ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415612c005760405162461bcd60e51b8152600401610639906148ab565b60075460408051634626402b60e01b81529051610d34926001600160a01b031691634626402b916004808301926020929190829003018186803b158015612c4657600080fd5b505afa158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906141ec565b6040516370a0823160e01b81526001600160a01b038416906370a0823190612caa9030906004016145a0565b60206040518083038186803b158015612cc257600080fd5b505afa158015612cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfa919061451c565b6001600160a01b0384169190613fd1565b600a546001600160a01b0316612d335760405162461bcd60e51b815260040161063990614771565b336000908152600260205260409020548110612d615760405162461bcd60e51b8152600401610639906148d0565b612d69611429565b336000908152600260205260408120805483908110612d9857634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a081018252600590930290910180546001600160a01b0390811684526001820154948401949094526002810154918301919091526003810154606083015260048101549092166080820152909150612dff90613d91565b8310612e1d5760405162461bcd60e51b815260040161063990614a47565b600060065484612e2b613dd6565b612e359190614c26565b612e3f9190614c06565b9050838260020154612e519190614c45565b60028301556006546129a1908590614c45565b610bb8821115612e865760405162461bcd60e51b815260040161063990614a74565b6001600160a01b0381163314612ecb576001600160a01b038116600090815260046020526040902054612ecb5760405162461bcd60e51b8152600401610639906149e7565b3360008181526003602052604090819020600181018690556002810185905580546001600160a01b0319166001600160a01b03851617815590519091907f48d8c91e29a55a6b681bf88d91e6cf9519c09edf618e7fd9ceaa0b925811998290612f399088908890889061462e565b60405180910390a25050505050565b6001600160a01b03811660009081526002602052604090208054612f7e5760405162461bcd60e51b815260040161063990614931565b612f86611429565b6001600160a01b03808316600090815260036020526040812080546001820154600283015493948594859493909116919081612fc257600d5491505b80612fcc5750600e545b60005b885481101561308c57612ffb898281548110610e2f57634e487b7160e01b600052603260045260246000fd5b96508689828154811061301e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461303a9190614c45565b89828154811061305a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600260059092020101556130788789614bee565b97508061308481614c9f565b915050612fcf565b50886001600160a01b0316836001600160a01b0316141561314657600654876130b3613dd6565b6130bd9190614c26565b6130c79190614c06565b9550612710600f54876130da9190614c26565b6130e49190614c06565b94506127106130f38287614c26565b6130fd9190614c06565b90506131336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b613141896110208388614c45565b6132b9565b6001600160a01b03831661316357600c546001600160a01b031692505b6006548761316f613dd6565b6131799190614c26565b6131839190614c06565b6001600160a01b038416600090815260046020526040902054909650612710906131ad9088614c26565b6131b79190614c06565b94508185116131d85760405162461bcd60e51b815260040161063990614793565b6127106131e58287614c26565b6131ef9190614c06565b90506132256001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b6001600160a01b03831663859f267f61323e8388614c45565b8b60046000886001600160a01b03166001600160a01b03168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161328693929190614b8c565b600060405180830381600087803b1580156132a057600080fd5b505af11580156132b4573d6000803e3d6000fd5b505050505b866006546132c79190614c45565b60065560006132d68688614c45565b600854909150613313906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683613fd1565b896001600160a01b0316336001600160a01b03167f282b9c6f6d6a6b0d9b4175a3af0be477af589c6cb2d91400d87972ef449876d78689858760405161335c949392919061464f565b60405180910390a350505050505050505050565b336000908152600260205260409020545b8015610d34578061339181614c88565b91505061339d816115db565b613381565b6001600160a01b03821660009081526002602052604081208054839081106133da57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154905092915050565b600a546001600160a01b031681565b6001600160a01b031660009081526002602052604090205490565b6007546001600160a01b031633146134485760405162461bcd60e51b81526004016106399061498b565b600c80546001600160a01b0319166001600160a01b039590951694909417909355600d91909155600e55600f55565b600c546001600160a01b031681565b33600090815260026020526040902080546134b35760405162461bcd60e51b815260040161063990614931565b6134bb611429565b6000806000805b845481101561357f576134ee858281548110610e2f57634e487b7160e01b600052603260045260246000fd5b92508285828154811061351157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461352d9190614c45565b85828154811061354d57634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600590920201015561356b8385614bee565b93508061357781614c9f565b9150506134c2565b506001600160a01b038516331415613609576006548361359d613dd6565b6135a79190614c26565b6135b19190614c06565b9150612710600f54836135c49190614c26565b6135ce9190614c06565b90506136046001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383613fd1565b61370a565b6001600160a01b03851660009081526004602052604090205461363e5760405162461bcd60e51b8152600401610639906149e7565b6006548361364a613dd6565b6136549190614c26565b61365e9190614c06565b6001600160a01b038616600090815260046020526040902054909250612710906136889084614c26565b6136929190614c06565b6001600160a01b03861660008181526004602081905260409182902060010154915163859f267f60e01b8152939450919263859f267f926136d7928692339201614b8c565b600060405180830381600087803b1580156136f157600080fd5b505af1158015613705573d6000803e3d6000fd5b505050505b826006546137189190614c45565b60065560006137278284614c45565b600854909150613764906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683613fd1565b336001600160a01b03167f3a4ec895250afc70eb7433d7adfd099a5e2eb6935363b1a862116485cea549ac8784846040516137a19392919061462e565b60405180910390a2505050505050565b600260005414156137d45760405162461bcd60e51b815260040161063990614adf565b60026000908155600954604051633863c48760e01b81526001600160a01b0390911690633863c4879061380f9087908790879060040161460b565b60206040518083038186803b15801561382757600080fd5b505afa15801561383b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385f919061451c565b9050600081116138815760405162461bcd60e51b8152600401610639906149b0565b613889611429565b6000613893613dd6565b604051632142170760e11b81529091506001600160a01b038616906342842e0e906138c6903390309089906004016145ce565b600060405180830381600087803b1580156138e057600080fd5b505af11580156138f4573d6000803e3d6000fd5b5050505060006006546000146139245781600654846139139190614c26565b61391d9190614c06565b9050613ae1565b61271083116139455760405162461bcd60e51b81526004016106399061473a565b508161395361271082614c45565b6127106006819055600260209081526040805160a081018252600080825292810183815281830185815260608301858152608084018681527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b8054600181018255908852945160059095027f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c2f810180546001600160a01b039788166001600160a01b03199182161790915594517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c3082015592517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c3184015590517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c32830155517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c3390910180549190931691161790555192935091829182917f4be8b42d1c84a49a485c65366c0ef5cb71977b5c567a4ad37d8ed33e2776088291613ad89184908190614bb9565b60405180910390a45b80600654613aef9190614bee565b600655600b54613b00908490614bee565b600b55336000818152600260208181526040808420815160a0810183526001600160a01b038d81168083528286018e81528386018b8152606085018e81528f851660808701908152875460018181018a55988d5299909b209551600590990290950180549885166001600160a01b0319998a16178155915195820195909555935196840196909655905160038301559451600490910180549190951692169190911790925590518791907f4be8b42d1c84a49a485c65366c0ef5cb71977b5c567a4ad37d8ed33e2776088290613bdb90869089908b90614bb9565b60405180910390a45050600160005550505050565b6007546001600160a01b03163314613c1a5760405162461bcd60e51b81526004016106399061498b565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580613d065750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613cb490309086906004016145b4565b60206040518083038186803b158015613ccc57600080fd5b505afa158015613ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d04919061451c565b155b613d225760405162461bcd60e51b815260040161063990614b16565b6118778363095ea7b360e01b8484604051602401613d419291906145f2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ff0565b6060613d87848460008561407f565b90505b9392505050565b600080613d9c613dd6565b6006548460600151613dae9190614c26565b613db89190614c06565b90506001818460400151613dcc9190614c45565b613d8a9190614c45565b6000600b547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613e2791906145a0565b60206040518083038186803b158015613e3f57600080fd5b505afa158015613e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e77919061451c565b611cbb9190614bee565b6001600160a01b03821660009081526002602052604081208054909190613eaa90600190614c45565b9050808314613f6657818181548110613ed357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201828481548110613f0157634e487b7160e01b600052603260045260246000fd5b60009182526020909120825460059092020180546001600160a01b039283166001600160a01b03199182161782556001808501549083015560028085015490830155600380850154908301556004938401549390910180549390921692169190911790555b81805480613f8457634e487b7160e01b600052603160045260246000fd5b60008281526020812060056000199093019283020180546001600160a01b031990811682556001820183905560028201839055600382019290925560040180549091169055905550505050565b6118778363a9059cbb60e01b8484604051602401613d419291906145f2565b6000614045826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d789092919063ffffffff16565b805190915015611877578080602001905181019061406391906144e8565b6118775760405162461bcd60e51b815260040161063990614a95565b6060824710156140a15760405162461bcd60e51b815260040161063990614865565b6140aa8561413f565b6140c65760405162461bcd60e51b815260040161063990614a10565b600080866001600160a01b031685876040516140e29190614584565b60006040518083038185875af1925050503d806000811461411f576040519150601f19603f3d011682016040523d82523d6000602084013e614124565b606091505b509150915061413482828661414e565b979650505050505050565b6001600160a01b03163b151590565b6060831561415d575081613d8a565b82511561416d5782518084602001fd5b8160405162461bcd60e51b815260040161063991906146ba565b60008083601f840112614198578081fd5b50813567ffffffffffffffff8111156141af578182fd5b60208301915083602080830285010111156141c957600080fd5b9250929050565b6000602082840312156141e1578081fd5b8135613d8a81614ce6565b6000602082840312156141fd578081fd5b8151613d8a81614ce6565b6000806000806080858703121561421d578283fd5b843561422881614ce6565b9350602085013561423881614ce6565b925060408501359150606085013567ffffffffffffffff8082111561425b578283fd5b818701915087601f83011261426e578283fd5b81358181111561428057614280614cd0565b604051601f8201601f19908116603f011681019083821181831017156142a8576142a8614cd0565b816040528281528a60208487010111156142c0578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806000604084860312156142f5578283fd5b833561430081614ce6565b9250602084013567ffffffffffffffff81111561431b578283fd5b61432786828701614187565b9497909650939450505050565b60008060408385031215614346578182fd5b823561435181614ce6565b946020939093013593505050565b600080600060608486031215614373578283fd5b833561437e81614ce6565b925060208401359150604084013561439581614ce6565b809150509250925092565b600080600080608085870312156143b5578384fd5b84356143c081614ce6565b93506020850135925060408501356143d781614cfb565b915060608501356143e781614ce6565b939692955090935050565b600080600060608486031215614406578283fd5b833561441181614ce6565b95602085013595506040909401359392505050565b6000806000806080858703121561443b578384fd5b843561444681614ce6565b9350602085013592506040850135915060608501356143e781614ce6565b60008060008060808587031215614479578384fd5b843561448481614ce6565b966020860135965060408601359560600135945092505050565b6000806000604084860312156144b2578081fd5b833567ffffffffffffffff8111156144c8578182fd5b6144d486828701614187565b909450925050602084013561439581614ce6565b6000602082840312156144f9578081fd5b8151613d8a81614cfb565b600060208284031215614515578081fd5b5035919050565b60006020828403121561452d578081fd5b5051919050565b60008060408385031215614546578182fd5b82359150602083013561455881614ce6565b809150509250929050565b60008060408385031215614575578182fd5b50508035926020909101359150565b60008251614596818460208701614c5c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526146d9816040850160208701614c5c565b601f01601f19169190910160400192915050565b6020808252602d908201527f6d7573742073657420616c6c6f636174696f6e207265706c616365642073657460408201526c74696e672061732046414c534560981b606082015260800190565b6020808252601e908201527f4d696e696d756d20616c6c6f636174696f6e206e6f7420726561636865640000604082015260600190565b602080825260089082015267191a5cd8589b195960c21b604082015260600190565b60208082526019908201527f6d696e696d756d207468726573686f6c64206e6f74206d657400000000000000604082015260600190565b60208082526010908201526f6e6f20616374697665207374616b657360801b604082015260600190565b6020808252602b908201527f6d7573742062652073657420627920616c6c6f636174696f6e20636f6e74726160408201526a31ba1037b91030b236b4b760a91b606082015260800190565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600b908201526a3bb937b733903a37b5b2b760a91b604082015260600190565b60208082526010908201526f1a5b9d985b1a59081cdd185ad948125160821b604082015260600190565b6020808252601d908201527f696e636f7272656374205f616c6c6f636174696f6e436f6e7472616374000000604082015260600190565b6020808252601290820152717573657220686173206e6f207374616b657360701b604082015260600190565b6020808252601490820152731a5b98dbdc9c9958dd0814dd185ad9481b1a5cdd60621b604082015260600190565b6020808252600b908201526a61646d696e3a207775743f60a81b604082015260600190565b6020808252601a908201527f496e76616c6964204e46542c206e6f20616c6c6f636174696f6e000000000000604082015260600190565b6020808252600f908201526e696e636f727265637420706f6f6c2160881b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b602080825260139082015272696e73756666696369656e742073686172657360681b604082015260600190565b6020808252600790820152666d61782033302560c81b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03919091166020830152604082015260600190565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b9283526020830191909152604082015260600190565b60008219821115614c0157614c01614cba565b500190565b600082614c2157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614c4057614c40614cba565b500290565b600082821015614c5757614c57614cba565b500390565b60005b83811015614c77578181015183820152602001614c5f565b8381111561148b5750506000910152565b600081614c9757614c97614cba565b506000190190565b6000600019821415614cb357614cb3614cba565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d3457600080fd5b8015158114610d3457600080fdfea2646970667358221220348498fb171c64618821f45be7c112e8c3826f1557d5acc9a8f04112705cbfe564736f6c63430008010033000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b000000000000000000000000077447f2ca205d6405206d1af316f1f5954bc2bb500000000000000000000000077447f2ca205d6405206d1af316f1f5954bc2bb5000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000765a3045902b164da1a7619bec58de64cf7bdfe2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f05760003560e01c80637eb3f0841161019d578063d8e9476f116100e9578063ea466aa1116100a2578063f51041151161007c578063f5104115146105eb578063f851a440146105fe578063fb1db27814610606578063fc0c546a1461060e576102f0565b8063ea466aa1146105bd578063f2fcc5fa146105c5578063f45346dc146105d8576102f0565b8063d8e9476f14610561578063dd19171914610574578063ddd9d0451461057c578063ded6275e1461058f578063e5ea69ff14610597578063e8640b4d146105aa576102f0565b8063a36e40fc11610156578063bbb224f011610130578063bbb224f014610520578063cb96372814610528578063d6d3774b1461053b578063d745cdcf1461054e576102f0565b8063a36e40fc14610508578063af2d387514610510578063b31c710a14610518576102f0565b80637eb3f084146104925780637ef8513a146104a55780638482b202146104c75780638d934485146104da5780638df4f717146104e257806399044f7c146104f5576102f0565b806341891d0e1161025c578063646c4176116102155780636d675029116101ef5780636d6750291461045c57806373369df81461046f57806377c7b8fc146104775780637883c3691461047f576102f0565b8063646c41761461042e5780636519c6af1461044157806367479ec514610454576102f0565b806341891d0e146103e65780634641257d146103fb5780634a6f3b54146104035780634b9bc1971461040b5780635312ea8e1461041357806361d027b314610426576102f0565b8063159ad8cd116102ae578063159ad8cd146103845780631cf4b86a146103975780631ffa743d1461039f57806321ce919d146103b25780632cae2096146103d65780633a98ef39146103de576102f0565b8062f714ce146102f557806307fe2b771461030a5780630f51d02c14610312578063102d89901461033b578063150b7a021461035c578063158cb2741461037c575b600080fd5b610308610303366004614534565b610616565b005b6103086109c8565b610325610320366004614334565b610ae4565b6040516103329190614b6c565b60405180910390f35b61034e6103493660046141d0565b610bbd565b604051610332929190614bab565b61036f61036a366004614208565b610bd6565b60405161033291906146a5565b610325610be6565b610308610392366004614504565b610bec565b610325610d37565b6103086103ad3660046142e1565b610d3d565b6103c56103c0366004614334565b611282565b604051610332959493929190614675565b6103086112db565b610325611414565b6103ee61141a565b60405161033291906145a0565b610308611429565b610325611491565b610325611497565b610308610421366004614504565b6115db565b6103ee611751565b61030861043c3660046143f2565b611760565b61030861044f36600461449e565b61187c565b6103ee611c06565b61032561046a3660046141d0565b611c2a565b610325611c73565b610325611c79565b61030861048d3660046143a0565b611cc0565b6103086104a0366004614504565b612305565b6104b86104b33660046141d0565b61249f565b6040516103329392919061462e565b6103086104d5366004614334565b6124ca565b6103256125f1565b6103256104f0366004614334565b6125f7565b61034e6105033660046141d0565b612686565b61030861274c565b610308612842565b6103ee612a89565b610325612aad565b6103086105363660046141d0565b612b32565b610308610549366004614563565b612d0b565b61030861055c366004614426565b612e64565b61030861056f3660046141d0565b612f48565b610308613370565b61032561058a366004614334565b6133a2565b6103ee6133f4565b6103256105a53660046141d0565b613403565b6103086105b8366004614464565b61341e565b6103ee613477565b6103086105d33660046141d0565b613486565b6103086105e636600461435f565b6137b1565b6103086105f93660046141d0565b613bf0565b6103ee613c3c565b6103ee613c4b565b6103ee613c5a565b600260005414156106425760405162461bcd60e51b815260040161063990614adf565b60405180910390fd5b600260005561064f611429565b33600090815260026020526040902054821061067d5760405162461bcd60e51b8152600401610639906148d0565b3360009081526002602052604081208054849081106106ac57634e487b7160e01b600052603260045260246000fd5b600091825260208083206006546040805160a081018252600590950290920180546001600160a01b039081168652600182015494860194909452600281015492850192909252600382015460608501526004820154909216608084015293509061071590613d91565b61071d613dd6565b6107279190614c26565b6107319190614c06565b905081600201546006546107459190614c45565b6006556003820154600b5461075a9190614c45565b600b556001820154825460028401546040516001600160a01b03909216918391839133917f25993effddf3b74ffcc0e68e5440be3fba18b532cdf14462257fb11e7c22fb95916107ad918c918a90614bd8565b60405180910390a46107bf3387613e81565b60006001600160a01b03861633141561083457612710600f54856107e39190614c26565b6107ed9190614c06565b90506107f98185614c45565b935061082f6001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b61091e565b6001600160a01b0386166000908152600460205260409020546108695760405162461bcd60e51b8152600401610639906149e7565b6001600160a01b038616600090815260046020526040902054612710906108909086614c26565b61089a9190614c06565b90506108a68185614c45565b6001600160a01b03871660008181526004602081905260409182902060010154915163859f267f60e01b8152939750919263859f267f926108eb928692339201614b8c565b600060405180830381600087803b15801561090557600080fd5b505af1158015610919573d6000803e3d6000fd5b505050505b600854610958906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911686613fd1565b604051632142170760e11b81526001600160a01b038316906342842e0e90610988903090339088906004016145ce565b600060405180830381600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b50506001600055505050505050505050565b600760009054906101000a90046001600160a01b03166001600160a01b031663c4c57bad6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e91906141ec565b600980546001600160a01b0319166001600160a01b0392831617905560075460408051631cde0e4b60e01b815290519190921691631cde0e4b916004808301926020929190829003018186803b158015610aa757600080fd5b505afa158015610abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adf919061451c565b600555565b60008060065460026000866001600160a01b03166001600160a01b031681526020019081526020016000208481548110610b2e57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154610b48613dd6565b610b529190614c26565b610b5c9190614c06565b6001600160a01b038516600090815260026020526040902080549192509084908110610b9857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016003015481610bb59190614c45565b949350505050565b6004602052600090815260409020805460019091015482565b630a85bd0160e11b949350505050565b600b5481565b6007546001600160a01b03163314610c165760405162461bcd60e51b81526004016106399061498b565b80610cfa576007546040516370a0823160e01b8152610cf5916001600160a01b03908116917f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b909116906370a0823190610c749030906004016145a0565b60206040518083038186803b158015610c8c57600080fd5b505afa158015610ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc4919061451c565b6001600160a01b037f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b169190613fd1565b610d34565b600754610d34906001600160a01b037f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b8116911683613fd1565b50565b61271081565b6001600160a01b038316600090815260026020526040902054811115610d755760405162461bcd60e51b81526004016106399061495d565b6001600160a01b0383166000908152600260205260409020610d95611429565b6001600160a01b03808516600090815260036020526040812080546001820154600283015493948594859493909116919081610dd157600d5491505b80610ddb5750600e545b60005b89811015610f6b57610e8e898c8c84818110610e0a57634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610e2f57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a081018252600590930290910180546001600160a01b03908116845260018201549484019490945260028101549183019190915260038101546060830152600401549091166080820152613d91565b965086898c8c84818110610eb257634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610ed757634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154610ef39190614c45565b898c8c84818110610f1457634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610f3957634e487b7160e01b600052603260045260246000fd5b6000918252602090912060026005909202010155610f578789614bee565b975080610f6381614c9f565b915050610dde565b508a6001600160a01b0316836001600160a01b031614156110565760065487610f92613dd6565b610f9c9190614c26565b610fa69190614c06565b9550612710600f5487610fb99190614c26565b610fc39190614c06565b9450612710610fd28287614c26565b610fdc9190614c06565b90506110126001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b6110518b6110208388614c45565b6001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee169190613fd1565b6111c9565b6001600160a01b03831661107357600c546001600160a01b031692505b6006548761107f613dd6565b6110899190614c26565b6110939190614c06565b6001600160a01b038416600090815260046020526040902054909650612710906110bd9088614c26565b6110c79190614c06565b94508185116110e85760405162461bcd60e51b815260040161063990614793565b6127106110f58287614c26565b6110ff9190614c06565b90506111356001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b6001600160a01b03831663859f267f61114e8388614c45565b8d60046000886001600160a01b03166001600160a01b03168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161119693929190614b8c565b600060405180830381600087803b1580156111b057600080fd5b505af11580156111c4573d6000803e3d6000fd5b505050505b866006546111d79190614c45565b60065560006111e68688614c45565b600854909150611223906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911683613fd1565b8b6001600160a01b0316336001600160a01b03167f282b9c6f6d6a6b0d9b4175a3af0be477af589c6cb2d91400d87972ef449876d78689858760405161126c949392919061464f565b60405180910390a3505050505050505050505050565b6002602052816000526040600020818154811061129e57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b03938416965091945092911685565b600160009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136191906141ec565b600780546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b8152905191909216916341275358916004808301926020929190829003018186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f291906141ec565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60065481565b6009546001600160a01b031681565b600154600554604051630441a3e760e41b81526001600160a01b039092169163441a3e709161145d91600090600401614bab565b600060405180830381600087803b15801561147757600080fd5b505af115801561148b573d6000803e3d6000fd5b50505050565b600e5481565b60015460055460405163f456426f60e01b815260009283926001600160a01b039091169163f456426f916114cf913090600401614b75565b60206040518083038186803b1580156114e757600080fd5b505afa1580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f919061451c565b9050600b54817f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161157191906145a0565b60206040518083038186803b15801561158957600080fd5b505afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c1919061451c565b6115cb9190614bee565b6115d59190614bee565b91505090565b3360009081526002602052604090205481106116095760405162461bcd60e51b8152600401610639906148d0565b33600090815260026020526040812080548390811061163857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905080600201546006600082825461165e9190614c45565b90915550506003810154600b805460009061167a908490614c45565b9091555050805460018201546001600160a01b039091169061169c3385613e81565b816001600160a01b0316336001600160a01b03167fbbae553982d541d38dacb1ea468ac757f324d0e279b6e4a2958f9e894da575ff86846040516116e1929190614bab565b60405180910390a3604051632142170760e11b81526001600160a01b038316906342842e0e90611719903090339086906004016145ce565b600060405180830381600087803b15801561173357600080fd5b505af1158015611747573d6000803e3d6000fd5b5050505050505050565b6008546001600160a01b031681565b6009546001600160a01b031633148061178357506007546001600160a01b031633145b61179f5760405162461bcd60e51b8152600401610639906147f4565b6001600160a01b0383166117d9576127108211156117cf5760405162461bcd60e51b81526004016106399061483f565b600f829055611877565b6001600160a01b038316600114156117f557600d829055611877565b6001600160a01b03831660021415611833576103e88211156118295760405162461bcd60e51b81526004016106399061483f565b600e829055611877565b6127108211156118555760405162461bcd60e51b81526004016106399061483f565b6001600160a01b03831660009081526004602052604090208281556001018190555b505050565b336000908152600260205260409020548211156118ab5760405162461bcd60e51b81526004016106399061495d565b3360009081526002602052604090206118c2611429565b6000806000805b868110156119d2576118f585898984818110610e0a57634e487b7160e01b600052603260045260246000fd5b9250828589898481811061191957634e487b7160e01b600052603260045260246000fd5b905060200201358154811061193e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461195a9190614c45565b8589898481811061197b57634e487b7160e01b600052603260045260246000fd5b90506020020135815481106119a057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600260059092020101556119be8385614bee565b9350806119ca81614c9f565b9150506118c9565b506001600160a01b038516331415611a5c57600654836119f0613dd6565b6119fa9190614c26565b611a049190614c06565b9150612710600f5483611a179190614c26565b611a219190614c06565b9050611a576001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b611b5d565b6001600160a01b038516600090815260046020526040902054611a915760405162461bcd60e51b8152600401610639906149e7565b60065483611a9d613dd6565b611aa79190614c26565b611ab19190614c06565b6001600160a01b03861660009081526004602052604090205490925061271090611adb9084614c26565b611ae59190614c06565b6001600160a01b03861660008181526004602081905260409182902060010154915163859f267f60e01b8152939450919263859f267f92611b2a928692339201614b8c565b600060405180830381600087803b158015611b4457600080fd5b505af1158015611b58573d6000803e3d6000fd5b505050505b82600654611b6b9190614c45565b6006556000611b7a8284614c45565b600854909150611bb7906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911683613fd1565b336001600160a01b03167f3a4ec895250afc70eb7433d7adfd099a5e2eb6935363b1a862116485cea549ac878484604051611bf49392919061462e565b60405180910390a25050505050505050565b7f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b81565b6000806000611c3884612686565b91509150600060065483611c4a613dd6565b611c549190614c26565b611c5e9190614c06565b9050611c6a8282614c45565b95945050505050565b600d5481565b6000600654600014611cb157600654611c90613dd6565b611ca290670de0b6b3a7640000614c26565b611cac9190614c06565b611cbb565b670de0b6b3a76400005b905090565b6001600160a01b0384166000908152600260205260409020548310611cf75760405162461bcd60e51b8152600401610639906148d0565b611cff611429565b6001600160a01b0384166000908152600260205260408120805485908110611d3757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905060008315611e2d5760048201546001600160a01b0384811691161415611d7f5760405162461bcd60e51b8152600401610639906146ed565b60095482546001840154604051633863c48760e01b81526001600160a01b0393841693633863c48793611db993911691889060040161460b565b60206040518083038186803b158015611dd157600080fd5b505afa158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e09919061451c565b905080611e285760405162461bcd60e51b8152600401610639906148fa565b611ec3565b60095482546001840154600480860154604051633863c48760e01b81526001600160a01b0395861695633863c48795611e7095908216949093909116910161460b565b60206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec0919061451c565b90505b806121e7576006546040805160a08101825284546001600160a01b03908116825260018601546020830152600286015492820192909252600385015460608201526004850154909116608082015260009190611f1e90613d91565b611f26613dd6565b611f309190614c26565b611f3a9190614c06565b90508260020154600654611f4e9190614c45565b6006556003830154600b54611f639190614c45565b600b556001830154835460028501546040516001600160a01b039283169284928492918d16917f25993effddf3b74ffcc0e68e5440be3fba18b532cdf14462257fb11e7c22fb9591611fb9918e91908a90614bd8565b60405180910390a4611fcb8989613e81565b6001600160a01b03808a166000908152600360205260409020541680611ff95750600c546001600160a01b03165b60008a6001600160a01b0316826001600160a01b0316141561207757612710600f54866120269190614c26565b6120309190614c06565b905061203c8186614c45565b94506120726001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee168c83613fd1565b612141565b6001600160a01b0382166000908152600460205260409020546127109061209e9087614c26565b6120a89190614c06565b90506120b48186614c45565b9450816001600160a01b031663859f267f828d60046000876001600160a01b03166001600160a01b03168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161210e93929190614b8c565b600060405180830381600087803b15801561212857600080fd5b505af115801561213c573d6000803e3d6000fd5b505050505b60085461217b906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911687613fd1565b604051632142170760e11b81526001600160a01b038416906342842e0e906121ab9030908f9089906004016145ce565b600060405180830381600087803b1580156121c557600080fd5b505af11580156121d9573d6000803e3d6000fd5b5050505050505050506122fd565b816003015481146122fd576040805160a08101825283546001600160a01b03908116825260018501546020830152600285015492820192909252600384015460608201526004840154909116608082015260009061224490613d91565b9050600060065482612254613dd6565b61225e9190614c26565b6122689190614c06565b9050836002015460065461227c9190614c45565b6006556003840154600b546122919190614c45565b600b558061229d613dd6565b6122a79190614c45565b6006546122b48386614bee565b6122be9190614c26565b6122c89190614c06565b6002850155600b546122db908490614bee565b600b556003840183905560028401546006546122f79190614bee565b60065550505b505050505050565b6007546001600160a01b0316331461232f5760405162461bcd60e51b81526004016106399061498b565b80612437576001546005546040516370a0823160e01b81526001600160a01b039283169263441a3e7092917f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b909116906370a08231906123939086906004016145a0565b60206040518083038186803b1580156123ab57600080fd5b505afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e3919061451c565b6040518363ffffffff1660e01b8152600401612400929190614bab565b600060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b50505050610d34565b600154600554604051630441a3e760e41b81526001600160a01b039092169163441a3e709161246a918590600401614bab565b600060405180830381600087803b15801561248457600080fd5b505af1158015612498573d6000803e3d6000fd5b5050505050565b6003602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b6007546001600160a01b031633146124f45760405162461bcd60e51b81526004016106399061498b565b600180546001600160a01b0319166001600160a01b0384811691909117918290556005839055604051636eb1769f60e11b81526000927f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b83169263dd62ed3e9261256492309216906004016145b4565b60206040518083038186803b15801561257c57600080fd5b505afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b4919061451c565b905080611877576118776001600160a01b037f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b1684600019613c7e565b60055481565b6001600160a01b038216600090815260026020526040812080548291908490811061263257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502019050600061264c611497565b600654836003015461265e9190614c26565b6126689190614c06565b9050600181836002015461267c9190614c45565b611c6a9190614c45565b6001600160a01b038116600090815260026020526040812080548291908280805b8381101561273f578481815481106126cf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154836126ec9190614bee565b925084818154811061270e57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600301548261272b9190614bee565b91508061273781614c9f565b9150506126a7565b5090945092505050915091565b6007546001600160a01b031633146127765760405162461bcd60e51b81526004016106399061498b565b6001546005546040516370a0823160e01b81526001600160a01b039283169263e2bbb15892917f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b909116906370a08231906127d59030906004016145a0565b60206040518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612825919061451c565b6040518363ffffffff1660e01b815260040161145d929190614bab565b600a546001600160a01b031661286a5760405162461bcd60e51b815260040161063990614771565b336000908152600260205260409020546128965760405162461bcd60e51b8152600401610639906147ca565b61289e611429565b3360009081526002602052604081208190815b815481101561296e576128dd828281548110610e2f57634e487b7160e01b600052603260045260246000fd5b93508382828154811061290057634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461291c9190614c45565b82828154811061293c57634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600590920201015561295a8484614bee565b92508061296681614c9f565b9150506128b1565b5060006006548361297d613dd6565b6129879190614c26565b6129919190614c06565b9050826006546129a19190614c45565b600655600a546129de906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911683613fd1565b600a5460405163364c781560e01b81526001600160a01b039091169063364c781590612a109084903390600401614b75565b600060405180830381600087803b158015612a2a57600080fd5b505af1158015612a3e573d6000803e3d6000fd5b50505050336001600160a01b03167f6b41b7bc19c55fcc8c6cd42eb9f7203509484443802f71569f3fae7bf3a29d7682604051612a7b9190614b6c565b60405180910390a250505050565b7f0000000000000000000000006d0c966c8a09e354df9c48b446a474ce3343d91281565b60015460055460405163f456426f60e01b81526000926001600160a01b03169163f456426f91612ae291903090600401614b75565b60206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb919061451c565b6007546001600160a01b03163314612b5c5760405162461bcd60e51b81526004016106399061498b565b7f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee6001600160a01b0316816001600160a01b03161415612bae5760405162461bcd60e51b8152600401610639906148ab565b7f000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b6001600160a01b0316816001600160a01b03161415612c005760405162461bcd60e51b8152600401610639906148ab565b60075460408051634626402b60e01b81529051610d34926001600160a01b031691634626402b916004808301926020929190829003018186803b158015612c4657600080fd5b505afa158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906141ec565b6040516370a0823160e01b81526001600160a01b038416906370a0823190612caa9030906004016145a0565b60206040518083038186803b158015612cc257600080fd5b505afa158015612cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfa919061451c565b6001600160a01b0384169190613fd1565b600a546001600160a01b0316612d335760405162461bcd60e51b815260040161063990614771565b336000908152600260205260409020548110612d615760405162461bcd60e51b8152600401610639906148d0565b612d69611429565b336000908152600260205260408120805483908110612d9857634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a081018252600590930290910180546001600160a01b0390811684526001820154948401949094526002810154918301919091526003810154606083015260048101549092166080820152909150612dff90613d91565b8310612e1d5760405162461bcd60e51b815260040161063990614a47565b600060065484612e2b613dd6565b612e359190614c26565b612e3f9190614c06565b9050838260020154612e519190614c45565b60028301556006546129a1908590614c45565b610bb8821115612e865760405162461bcd60e51b815260040161063990614a74565b6001600160a01b0381163314612ecb576001600160a01b038116600090815260046020526040902054612ecb5760405162461bcd60e51b8152600401610639906149e7565b3360008181526003602052604090819020600181018690556002810185905580546001600160a01b0319166001600160a01b03851617815590519091907f48d8c91e29a55a6b681bf88d91e6cf9519c09edf618e7fd9ceaa0b925811998290612f399088908890889061462e565b60405180910390a25050505050565b6001600160a01b03811660009081526002602052604090208054612f7e5760405162461bcd60e51b815260040161063990614931565b612f86611429565b6001600160a01b03808316600090815260036020526040812080546001820154600283015493948594859493909116919081612fc257600d5491505b80612fcc5750600e545b60005b885481101561308c57612ffb898281548110610e2f57634e487b7160e01b600052603260045260246000fd5b96508689828154811061301e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461303a9190614c45565b89828154811061305a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600260059092020101556130788789614bee565b97508061308481614c9f565b915050612fcf565b50886001600160a01b0316836001600160a01b0316141561314657600654876130b3613dd6565b6130bd9190614c26565b6130c79190614c06565b9550612710600f54876130da9190614c26565b6130e49190614c06565b94506127106130f38287614c26565b6130fd9190614c06565b90506131336001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b613141896110208388614c45565b6132b9565b6001600160a01b03831661316357600c546001600160a01b031692505b6006548761316f613dd6565b6131799190614c26565b6131839190614c06565b6001600160a01b038416600090815260046020526040902054909650612710906131ad9088614c26565b6131b79190614c06565b94508185116131d85760405162461bcd60e51b815260040161063990614793565b6127106131e58287614c26565b6131ef9190614c06565b90506132256001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b6001600160a01b03831663859f267f61323e8388614c45565b8b60046000886001600160a01b03166001600160a01b03168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161328693929190614b8c565b600060405180830381600087803b1580156132a057600080fd5b505af11580156132b4573d6000803e3d6000fd5b505050505b866006546132c79190614c45565b60065560006132d68688614c45565b600854909150613313906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911683613fd1565b896001600160a01b0316336001600160a01b03167f282b9c6f6d6a6b0d9b4175a3af0be477af589c6cb2d91400d87972ef449876d78689858760405161335c949392919061464f565b60405180910390a350505050505050505050565b336000908152600260205260409020545b8015610d34578061339181614c88565b91505061339d816115db565b613381565b6001600160a01b03821660009081526002602052604081208054839081106133da57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160020154905092915050565b600a546001600160a01b031681565b6001600160a01b031660009081526002602052604090205490565b6007546001600160a01b031633146134485760405162461bcd60e51b81526004016106399061498b565b600c80546001600160a01b0319166001600160a01b039590951694909417909355600d91909155600e55600f55565b600c546001600160a01b031681565b33600090815260026020526040902080546134b35760405162461bcd60e51b815260040161063990614931565b6134bb611429565b6000806000805b845481101561357f576134ee858281548110610e2f57634e487b7160e01b600052603260045260246000fd5b92508285828154811061351157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016002015461352d9190614c45565b85828154811061354d57634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600590920201015561356b8385614bee565b93508061357781614c9f565b9150506134c2565b506001600160a01b038516331415613609576006548361359d613dd6565b6135a79190614c26565b6135b19190614c06565b9150612710600f54836135c49190614c26565b6135ce9190614c06565b90506136046001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee163383613fd1565b61370a565b6001600160a01b03851660009081526004602052604090205461363e5760405162461bcd60e51b8152600401610639906149e7565b6006548361364a613dd6565b6136549190614c26565b61365e9190614c06565b6001600160a01b038616600090815260046020526040902054909250612710906136889084614c26565b6136929190614c06565b6001600160a01b03861660008181526004602081905260409182902060010154915163859f267f60e01b8152939450919263859f267f926136d7928692339201614b8c565b600060405180830381600087803b1580156136f157600080fd5b505af1158015613705573d6000803e3d6000fd5b505050505b826006546137189190614c45565b60065560006137278284614c45565b600854909150613764906001600160a01b037f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee8116911683613fd1565b336001600160a01b03167f3a4ec895250afc70eb7433d7adfd099a5e2eb6935363b1a862116485cea549ac8784846040516137a19392919061462e565b60405180910390a2505050505050565b600260005414156137d45760405162461bcd60e51b815260040161063990614adf565b60026000908155600954604051633863c48760e01b81526001600160a01b0390911690633863c4879061380f9087908790879060040161460b565b60206040518083038186803b15801561382757600080fd5b505afa15801561383b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385f919061451c565b9050600081116138815760405162461bcd60e51b8152600401610639906149b0565b613889611429565b6000613893613dd6565b604051632142170760e11b81529091506001600160a01b038616906342842e0e906138c6903390309089906004016145ce565b600060405180830381600087803b1580156138e057600080fd5b505af11580156138f4573d6000803e3d6000fd5b5050505060006006546000146139245781600654846139139190614c26565b61391d9190614c06565b9050613ae1565b61271083116139455760405162461bcd60e51b81526004016106399061473a565b508161395361271082614c45565b6127106006819055600260209081526040805160a081018252600080825292810183815281830185815260608301858152608084018681527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b8054600181018255908852945160059095027f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c2f810180546001600160a01b039788166001600160a01b03199182161790915594517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c3082015592517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c3184015590517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c32830155517f7d2944a272ac5bae96b5bd2f67b6c13276d541dc09eb1cf414d96b19a09e1c3390910180549190931691161790555192935091829182917f4be8b42d1c84a49a485c65366c0ef5cb71977b5c567a4ad37d8ed33e2776088291613ad89184908190614bb9565b60405180910390a45b80600654613aef9190614bee565b600655600b54613b00908490614bee565b600b55336000818152600260208181526040808420815160a0810183526001600160a01b038d81168083528286018e81528386018b8152606085018e81528f851660808701908152875460018181018a55988d5299909b209551600590990290950180549885166001600160a01b0319998a16178155915195820195909555935196840196909655905160038301559451600490910180549190951692169190911790925590518791907f4be8b42d1c84a49a485c65366c0ef5cb71977b5c567a4ad37d8ed33e2776088290613bdb90869089908b90614bb9565b60405180910390a45050600160005550505050565b6007546001600160a01b03163314613c1a5760405162461bcd60e51b81526004016106399061498b565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6001546001600160a01b031681565b7f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee81565b801580613d065750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613cb490309086906004016145b4565b60206040518083038186803b158015613ccc57600080fd5b505afa158015613ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d04919061451c565b155b613d225760405162461bcd60e51b815260040161063990614b16565b6118778363095ea7b360e01b8484604051602401613d419291906145f2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ff0565b6060613d87848460008561407f565b90505b9392505050565b600080613d9c613dd6565b6006548460600151613dae9190614c26565b613db89190614c06565b90506001818460400151613dcc9190614c45565b613d8a9190614c45565b6000600b547f000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613e2791906145a0565b60206040518083038186803b158015613e3f57600080fd5b505afa158015613e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e77919061451c565b611cbb9190614bee565b6001600160a01b03821660009081526002602052604081208054909190613eaa90600190614c45565b9050808314613f6657818181548110613ed357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201828481548110613f0157634e487b7160e01b600052603260045260246000fd5b60009182526020909120825460059092020180546001600160a01b039283166001600160a01b03199182161782556001808501549083015560028085015490830155600380850154908301556004938401549390910180549390921692169190911790555b81805480613f8457634e487b7160e01b600052603160045260246000fd5b60008281526020812060056000199093019283020180546001600160a01b031990811682556001820183905560028201839055600382019290925560040180549091169055905550505050565b6118778363a9059cbb60e01b8484604051602401613d419291906145f2565b6000614045826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d789092919063ffffffff16565b805190915015611877578080602001905181019061406391906144e8565b6118775760405162461bcd60e51b815260040161063990614a95565b6060824710156140a15760405162461bcd60e51b815260040161063990614865565b6140aa8561413f565b6140c65760405162461bcd60e51b815260040161063990614a10565b600080866001600160a01b031685876040516140e29190614584565b60006040518083038185875af1925050503d806000811461411f576040519150601f19603f3d011682016040523d82523d6000602084013e614124565b606091505b509150915061413482828661414e565b979650505050505050565b6001600160a01b03163b151590565b6060831561415d575081613d8a565b82511561416d5782518084602001fd5b8160405162461bcd60e51b815260040161063991906146ba565b60008083601f840112614198578081fd5b50813567ffffffffffffffff8111156141af578182fd5b60208301915083602080830285010111156141c957600080fd5b9250929050565b6000602082840312156141e1578081fd5b8135613d8a81614ce6565b6000602082840312156141fd578081fd5b8151613d8a81614ce6565b6000806000806080858703121561421d578283fd5b843561422881614ce6565b9350602085013561423881614ce6565b925060408501359150606085013567ffffffffffffffff8082111561425b578283fd5b818701915087601f83011261426e578283fd5b81358181111561428057614280614cd0565b604051601f8201601f19908116603f011681019083821181831017156142a8576142a8614cd0565b816040528281528a60208487010111156142c0578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806000604084860312156142f5578283fd5b833561430081614ce6565b9250602084013567ffffffffffffffff81111561431b578283fd5b61432786828701614187565b9497909650939450505050565b60008060408385031215614346578182fd5b823561435181614ce6565b946020939093013593505050565b600080600060608486031215614373578283fd5b833561437e81614ce6565b925060208401359150604084013561439581614ce6565b809150509250925092565b600080600080608085870312156143b5578384fd5b84356143c081614ce6565b93506020850135925060408501356143d781614cfb565b915060608501356143e781614ce6565b939692955090935050565b600080600060608486031215614406578283fd5b833561441181614ce6565b95602085013595506040909401359392505050565b6000806000806080858703121561443b578384fd5b843561444681614ce6565b9350602085013592506040850135915060608501356143e781614ce6565b60008060008060808587031215614479578384fd5b843561448481614ce6565b966020860135965060408601359560600135945092505050565b6000806000604084860312156144b2578081fd5b833567ffffffffffffffff8111156144c8578182fd5b6144d486828701614187565b909450925050602084013561439581614ce6565b6000602082840312156144f9578081fd5b8151613d8a81614cfb565b600060208284031215614515578081fd5b5035919050565b60006020828403121561452d578081fd5b5051919050565b60008060408385031215614546578182fd5b82359150602083013561455881614ce6565b809150509250929050565b60008060408385031215614575578182fd5b50508035926020909101359150565b60008251614596818460208701614c5c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526146d9816040850160208701614c5c565b601f01601f19169190910160400192915050565b6020808252602d908201527f6d7573742073657420616c6c6f636174696f6e207265706c616365642073657460408201526c74696e672061732046414c534560981b606082015260800190565b6020808252601e908201527f4d696e696d756d20616c6c6f636174696f6e206e6f7420726561636865640000604082015260600190565b602080825260089082015267191a5cd8589b195960c21b604082015260600190565b60208082526019908201527f6d696e696d756d207468726573686f6c64206e6f74206d657400000000000000604082015260600190565b60208082526010908201526f6e6f20616374697665207374616b657360801b604082015260600190565b6020808252602b908201527f6d7573742062652073657420627920616c6c6f636174696f6e20636f6e74726160408201526a31ba1037b91030b236b4b760a91b606082015260800190565b6020808252600c908201526b6f7574206f662072616e676560a01b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600b908201526a3bb937b733903a37b5b2b760a91b604082015260600190565b60208082526010908201526f1a5b9d985b1a59081cdd185ad948125160821b604082015260600190565b6020808252601d908201527f696e636f7272656374205f616c6c6f636174696f6e436f6e7472616374000000604082015260600190565b6020808252601290820152717573657220686173206e6f207374616b657360701b604082015260600190565b6020808252601490820152731a5b98dbdc9c9958dd0814dd185ad9481b1a5cdd60621b604082015260600190565b6020808252600b908201526a61646d696e3a207775743f60a81b604082015260600190565b6020808252601a908201527f496e76616c6964204e46542c206e6f20616c6c6f636174696f6e000000000000604082015260600190565b6020808252600f908201526e696e636f727265637420706f6f6c2160881b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b602080825260139082015272696e73756666696369656e742073686172657360681b604082015260600190565b6020808252600790820152666d61782033302560c81b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03919091166020830152604082015260600190565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b9283526020830191909152604082015260600190565b60008219821115614c0157614c01614cba565b500190565b600082614c2157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614c4057614c40614cba565b500290565b600082821015614c5757614c57614cba565b500390565b60005b83811015614c77578181015183820152602001614c5f565b8381111561148b5750506000910152565b600081614c9757614c97614cba565b506000190190565b6000600019821415614cb357614cb3614cba565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d3457600080fd5b8015158114610d3457600080fdfea2646970667358221220348498fb171c64618821f45be7c112e8c3826f1557d5acc9a8f04112705cbfe564736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b000000000000000000000000077447f2ca205d6405206d1af316f1f5954bc2bb500000000000000000000000077447f2ca205d6405206d1af316f1f5954bc2bb5000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000765a3045902b164da1a7619bec58de64cf7bdfe2
-----Decoded View---------------
Arg [0] : _token (address): 0x970ccEe657Dd831e9C37511Aa3eb5302C1Eb5EEe
Arg [1] : _dummyToken (address): 0xB18058232d1f945c19CC6988ccD19498F5d2853B
Arg [2] : _masterchef (address): 0x6ff40a8a1fe16075bD6008A48befB768BE08b4b0
Arg [3] : _admin (address): 0x77447F2CA205D6405206d1aF316f1f5954bC2bB5
Arg [4] : _treasury (address): 0x77447F2CA205D6405206d1aF316f1f5954bC2bB5
Arg [5] : _poolID (uint256): 10
Arg [6] : _allocationContract (address): 0x765A3045902B164dA1a7619BEc58DE64cf7Bdfe2
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : 000000000000000000000000b18058232d1f945c19cc6988ccd19498f5d2853b
Arg [2] : 0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : 00000000000000000000000077447f2ca205d6405206d1af316f1f5954bc2bb5
Arg [4] : 00000000000000000000000077447f2ca205d6405206d1af316f1f5954bc2bb5
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 000000000000000000000000765a3045902b164da1a7619bec58de64cf7bdfe2
Deployed Bytecode Sourcemap
27651:31071:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34951:1510;;;;;;:::i;:::-;;:::i;:::-;;34691:178;;;:::i;45743:250::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28901:48;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1774:207::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29315:24::-;;;:::i;57536:232::-;;;;;;:::i;:::-;;:::i;28496:50::-;;;:::i;42702:2379::-;;;;;;:::i;:::-;;:::i;28788:46::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;34534:145::-;;;:::i;29053:26::-;;;:::i;29185:33::-;;;:::i;:::-;;;;;;;:::i;34412:88::-;;;:::i;29613:36::-;;;:::i;56004:221::-;;;:::i;51689:544::-;;;;;;:::i;:::-;;:::i;29143:23::-;;;:::i;52915:803::-;;;;;;:::i;:::-;;:::i;38760:1471::-;;;;;;:::i;:::-;;:::i;28704:34::-;;;:::i;46001:323::-;;;;;;:::i;:::-;;:::i;29539:55::-;;;:::i;55235:152::-;;;:::i;48625:3004::-;;;;;;:::i;:::-;;:::i;57174:270::-;;;;;;:::i;:::-;;:::i;28841:52::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;56436:389::-;;;;;;:::i;:::-;;:::i;29024:21::-;;;:::i;45459:272::-;;;;;;:::i;:::-;;:::i;54497:425::-;;;;;;:::i;:::-;;:::i;56942:132::-;;;:::i;47377:996::-;;;:::i;28606:85::-;;;:::i;55002:160::-;;;:::i;58007:329::-;;;;;;:::i;:::-;;:::i;46516:855::-;;;;;;:::i;:::-;;:::i;36470:632::-;;;;;;:::i;:::-;;:::i;40293:2261::-;;;;;;:::i;:::-;;:::i;52423:176::-;;;:::i;55489:148::-;;;;;;:::i;:::-;;:::i;29272:34::-;;;:::i;54304:116::-;;;;;;:::i;:::-;;:::i;53730:369::-;;;;;;:::i;:::-;;:::i;29436:74::-;;;:::i;37251:1363::-;;;;;;:::i;:::-;;:::i;32854:1502::-;;;;;;:::i;:::-;;:::i;54107:127::-;;;;;;:::i;:::-;;:::i;29086:20::-;;;:::i;28748:29::-;;;:::i;28556:::-;;;:::i;34951:1510::-;9750:1;10348:7;;:19;;10340:63;;;;-1:-1:-1;;;10340:63:0;;;;;;;:::i;:::-;;;;;;;;;9750:1;10481:7;:18;35040:9:::1;:7;:9::i;:::-;35088:10;35079:20;::::0;;;:8:::1;:20;::::0;;;;:27;35068:38;::::1;35060:67;;;;-1:-1:-1::0;;;35060:67:0::1;;;;;;;:::i;:::-;35171:10;35138:21;35162:20:::0;;;:8:::1;:20;::::0;;;;:30;;35183:8;;35162:30;::::1;;;-1:-1:-1::0;;;35162:30:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;35267:11:::1;::::0;35245:16:::1;::::0;;::::1;::::0;::::1;::::0;;35162:30:::1;::::0;;::::1;::::0;;::::1;35245:16:::0;;-1:-1:-1;;;;;35245:16:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;35162:30;-1:-1:-1;35267:11:0;35245:16:::1;::::0;:10:::1;:16::i;:::-;35230:11;:9;:11::i;:::-;:32;;;;:::i;:::-;35229:50;;;;:::i;:::-;35205:74;;35318:4;:11;;;35304;;:25;;;;:::i;:::-;35290:11;:39:::0;35364:9:::1;::::0;::::1;::::0;35352::::1;::::0;:21:::1;::::0;35364:9;35352:21:::1;:::i;:::-;35340:9;:33:::0;35405:12:::1;::::0;::::1;::::0;35446:17;;35535:11:::1;::::0;::::1;::::0;35475:87:::1;::::0;-1:-1:-1;;;;;35446:17:0;;::::1;::::0;35405:12;;35446:17;;35484:10:::1;::::0;35475:87:::1;::::0;::::1;::::0;35496:8;;35548:13;;35475:87:::1;:::i;:::-;;;;;;;;35577:34;35590:10;35602:8;35577:12;:34::i;:::-;35643:19;-1:-1:-1::0;;;;;35682:26:0;::::1;35698:10;35682:26;35679:580;;;35778:5;35756:19;;35740:13;:35;;;;:::i;:::-;:43;;;;:::i;:::-;35726:57:::0;-1:-1:-1;35814:27:0::1;35726:57:::0;35814:13;:27:::1;:::i;:::-;35798:43:::0;-1:-1:-1;35856:43:0::1;-1:-1:-1::0;;;;;35856:5:0::1;:18;35875:10;35887:11:::0;35856:18:::1;:43::i;:::-;35679:580;;;-1:-1:-1::0;;;;;35941:24:0;::::1;;::::0;;;:10:::1;:24;::::0;;;;:31;35933:64:::1;;;;-1:-1:-1::0;;;35933:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36042:24:0;::::1;;::::0;;;:10:::1;:24;::::0;;;;:31;36076:5:::1;::::0;36026:47:::1;::::0;:13;:47:::1;:::i;:::-;:55;;;;:::i;:::-;36012:69:::0;-1:-1:-1;36112:27:0::1;36012:69:::0;36112:13;:27:::1;:::i;:::-;-1:-1:-1::0;;;;;36154:33:0;::::1;36213:24;::::0;;;:10:::1;:24;::::0;;;;;;;;:33:::1;;::::0;36154:93;;-1:-1:-1;;;36154:93:0;;36096:43;;-1:-1:-1;36154:33:0;;::::1;::::0;:93:::1;::::0;36188:11;;36201:10:::1;::::0;36154:93:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35679:580;36288:8;::::0;36269:43:::1;::::0;-1:-1:-1;;;;;36269:5:0::1;:18:::0;::::1;::::0;36288:8:::1;36298:13:::0;36269:18:::1;:43::i;:::-;36362:76;::::0;-1:-1:-1;;;36362:76:0;;-1:-1:-1;;;;;36362:39:0;::::1;::::0;::::1;::::0;:76:::1;::::0;36410:4:::1;::::0;36417:10:::1;::::0;36429:8;;36362:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;9706:1:0;10660:7;:22;-1:-1:-1;;;;;;;;;34951:1510:0:o;34691:178::-;34780:5;;;;;;;;;-1:-1:-1;;;;;34780:5:0;-1:-1:-1;;;;;34768:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34747:18;:63;;-1:-1:-1;;;;;;34747:63:0;-1:-1:-1;;;;;34747:63:0;;;;;;34836:5;;34824:37;;;-1:-1:-1;;;34824:37:0;;;;34836:5;;;;;34824:35;;:37;;;;;;;;;;;;;;34836:5;34824:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34815:6;:46;34691:178::o;45743:250::-;45826:7;45846:15;45915:11;;45879:8;:15;45888:5;-1:-1:-1;;;;;45879:15:0;-1:-1:-1;;;;;45879:15:0;;;;;;;;;;;;45895:8;45879:25;;;;;;-1:-1:-1;;;45879:25:0;;;;;;;;;;;;;;;;;;;:32;;;45865:11;:9;:11::i;:::-;:46;;;;:::i;:::-;45864:62;;;;:::i;:::-;-1:-1:-1;;;;;45954:15:0;;;;;;:8;:15;;;;;:25;;45846:80;;-1:-1:-1;45954:15:0;45970:8;;45954:25;;;;-1:-1:-1;;;45954:25:0;;;;;;;;;;;;;;;;;;;:30;;;45944:7;:40;;;;:::i;:::-;45937:48;45743:250;-1:-1:-1;;;;45743:250:0:o;28901:48::-;;;;;;;;;;;;;;;;;;;:::o;1774:207::-;-1:-1:-1;;;1774:207:0;;;;;;:::o;29315:24::-;;;;:::o;57536:232::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;57610:12;57607:154:::1;;57655:5;::::0;57662:35:::1;::::0;-1:-1:-1;;;57662:35:0;;57631:67:::1;::::0;-1:-1:-1;;;;;57655:5:0;;::::1;::::0;57662:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35:::1;::::0;57691:4:::1;::::0;57662:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57631:10:0::1;:23;::::0;:67;:23:::1;:67::i;:::-;57607:154;;;57740:5;::::0;57716:39:::1;::::0;-1:-1:-1;;;;;57716:10:0::1;:23:::0;::::1;::::0;57740:5:::1;57747:7:::0;57716:23:::1;:39::i;:::-;57536:232:::0;:::o;28496:50::-;28541:5;28496:50;:::o;42702:2379::-;-1:-1:-1;;;;;42828:22:0;;;;;;:8;:22;;;;;:29;42809:48;;;42801:81;;;;-1:-1:-1;;;42801:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42919:22:0;;42893:23;42919:22;;;:8;:22;;;;;42952:9;:7;:9::i;:::-;-1:-1:-1;;;;;43111:26:0;;;42972:22;43111:26;;;:12;:26;;;;;43173:17;;;43225:29;;;43284:21;;;;42972:22;;;;;;43111:26;43173:17;;;;43225:29;43321:18;43318:67;;43359:23;;43343:39;;43318:67;43398:13;43395:49;;-1:-1:-1;43426:15:0;;43395:49;43460:9;43456:245;43475:17;;;43456:245;;;43528:29;43539:4;43544:8;;43553:1;43544:11;;;;;-1:-1:-1;;;43544:11:0;;;;;;;;;;;;;;;43539:17;;;;;;-1:-1:-1;;;43539:17:0;;;;;;;;;;;;;;;;;;43528:29;;;;;;;;43539:17;;;;;;;43528:29;;-1:-1:-1;;;;;43528:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:29::i;:::-;43514:43;;43635:11;43608:4;43613:8;;43622:1;43613:11;;;;;-1:-1:-1;;;43613:11:0;;;;;;;;;;;;;;;43608:17;;;;;;-1:-1:-1;;;43608:17:0;;;;;;;;;;;;;;;;;;;:24;;;:38;;;;:::i;:::-;43581:4;43586:8;;43595:1;43586:11;;;;;-1:-1:-1;;;43586:11:0;;;;;;;;;;;;;;;43581:17;;;;;;-1:-1:-1;;;43581:17:0;;;;;;;;;;;;;;;;;:24;:17;;;;;:24;:65;43661:28;43678:11;43661:28;;:::i;:::-;;-1:-1:-1;43494:3:0;;;;:::i;:::-;;;;43456:245;;;;43732:12;-1:-1:-1;;;;;43716:28:0;:12;-1:-1:-1;;;;;43716:28:0;;43713:1084;;;43845:11;;43827:14;43813:11;:9;:11::i;:::-;:28;;;;:::i;:::-;43812:44;;;;:::i;:::-;43798:58;;43917:5;43895:19;;43881:11;:33;;;;:::i;:::-;:41;;;;:::i;:::-;43871:51;-1:-1:-1;43969:5:0;43948:18;43958:8;43871:51;43948:18;:::i;:::-;:26;;;;:::i;:::-;43937:37;-1:-1:-1;43989:40:0;-1:-1:-1;;;;;43989:5:0;:18;44008:10;43937:37;43989:18;:40::i;:::-;44045:54;44064:12;44079:18;44089:8;44079:7;:18;:::i;:::-;-1:-1:-1;;;;;44045:5:0;:18;;:54;:18;:54::i;:::-;43713:1084;;;-1:-1:-1;;;;;44136:26:0;;44133:110;;44198:14;;-1:-1:-1;;;;;44198:14:0;;-1:-1:-1;44133:110:0;44393:11;;44375:14;44361:11;:9;:11::i;:::-;:28;;;;:::i;:::-;44360:44;;;;:::i;:::-;-1:-1:-1;;;;;44443:24:0;;;;;;:10;:24;;;;;:31;44346:58;;-1:-1:-1;44477:5:0;;44429:45;;44346:58;44429:45;:::i;:::-;:53;;;;:::i;:::-;44419:63;;44515:13;44505:7;:23;44497:61;;;;-1:-1:-1;;;44497:61:0;;;;;;;:::i;:::-;44605:5;44584:18;44594:8;44584:7;:18;:::i;:::-;:26;;;;:::i;:::-;44573:37;-1:-1:-1;44625:40:0;-1:-1:-1;;;;;44625:5:0;:18;44644:10;44573:37;44625:18;:40::i;:::-;-1:-1:-1;;;;;44681:33:0;;;44716:18;44726:8;44716:7;:18;:::i;:::-;44737:12;44751:10;:24;44762:12;-1:-1:-1;;;;;44751:24:0;-1:-1:-1;;;;;44751:24:0;;;;;;;;;;;;:33;;;44681:104;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43713:1084;44835:14;44821:11;;:28;;;;:::i;:::-;44807:11;:42;44860:16;44879:21;44893:7;44879:11;:21;:::i;:::-;44930:8;;44860:40;;-1:-1:-1;44911:38:0;;-1:-1:-1;;;;;44911:5:0;:18;;;44930:8;44860:40;44911:18;:38::i;:::-;45017:12;-1:-1:-1;;;;;44997:76:0;45005:10;-1:-1:-1;;;;;44997:76:0;;45031:12;45045:7;45054:8;45064;44997:76;;;;;;;;;:::i;:::-;;;;;;;;42702:2379;;;;;;;;;;;;:::o;28788:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28788:46:0;;;;-1:-1:-1;28788:46:0;;-1:-1:-1;28788:46:0;;;;:::o;34534:145::-;34594:10;;;;;;;;;-1:-1:-1;;;;;34594:10:0;-1:-1:-1;;;;;34582:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34574:5;:39;;-1:-1:-1;;;;;;34574:39:0;-1:-1:-1;;;;;34574:39:0;;;;;;-1:-1:-1;34647:10:0;34635:36;;;-1:-1:-1;;;34635:36:0;;;;34647:10;;;;;34635:34;;:36;;;;;;;;;;;;;;34647:10;34635:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34624:8;:47;;-1:-1:-1;;;;;;34624:47:0;-1:-1:-1;;;;;34624:47:0;;;;;;;;;;34534:145::o;29053:26::-;;;;:::o;29185:33::-;;;-1:-1:-1;;;;;29185:33:0;;:::o;34412:88::-;34461:10;;34482:6;;34449:43;;-1:-1:-1;;;34449:43:0;;-1:-1:-1;;;;;34461:10:0;;;;34449:32;;:43;;34461:10;;34449:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34412:88::o;29613:36::-;;;;:::o;56004:221::-;56101:10;;56124:6;;56089:57;;-1:-1:-1;;;56089:57:0;;56052:7;;;;-1:-1:-1;;;;;56101:10:0;;;;56089:34;;:57;;56140:4;;56089:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56072:74;;56207:9;;56198:6;56165:5;-1:-1:-1;;;;;56165:15:0;;56189:4;56165:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;:::i;:::-;:51;;;;:::i;:::-;56158:58;;;56004:221;:::o;51689:544::-;51774:10;51765:20;;;;:8;:20;;;;;:27;51754:38;;51746:67;;;;-1:-1:-1;;;51746:67:0;;;;;;;:::i;:::-;51851:10;51818:21;51842:20;;;:8;:20;;;;;:30;;51863:8;;51842:30;;;;-1:-1:-1;;;51842:30:0;;;;;;;;;;;;;;;;;;;51818:54;;51891:4;:11;;;51877;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;51919:9:0;;;;51907;:21;;:9;;:21;;51919:9;;51907:21;:::i;:::-;;;;-1:-1:-1;;51951:17:0;;;51992:12;;;-1:-1:-1;;;;;51951:17:0;;;;52013:34;52026:10;52038:8;52013:12;:34::i;:::-;52122:6;-1:-1:-1;;;;;52082:57:0;52100:10;-1:-1:-1;;;;;52082:57:0;;52112:8;52130;52082:57;;;;;;;:::i;:::-;;;;;;;;52144:69;;-1:-1:-1;;;52144:69:0;;-1:-1:-1;;;;;52144:32:0;;;;;:69;;52185:4;;52192:10;;52204:8;;52144:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51689:544;;;;:::o;29143:23::-;;;-1:-1:-1;;;;;29143:23:0;;:::o;52915:803::-;53038:18;;-1:-1:-1;;;;;53038:18:0;53024:10;:32;;:55;;-1:-1:-1;53074:5:0;;-1:-1:-1;;;;;53074:5:0;53060:10;:19;53024:55;53016:111;;;;-1:-1:-1;;;53016:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53135:26:0;;53132:579;;53188:5;53177:7;:16;;53169:41;;;;-1:-1:-1;;;53169:41:0;;;;;;;:::i;:::-;53216:19;:29;;;53132:579;;;-1:-1:-1;;;;;53261:26:0;;53285:1;53261:26;53257:454;;;53295:23;:33;;;53257:454;;;-1:-1:-1;;;;;53344:26:0;;53368:1;53344:26;53340:371;;;53397:4;53386:7;:15;;53378:40;;;;-1:-1:-1;;;53378:40:0;;;;;;;:::i;:::-;53434:15;:25;;;53340:371;;;53496:5;53485:7;:16;;53477:41;;;;-1:-1:-1;;;53477:41:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53525:24:0;;;;;;:10;:24;;;;;:41;;;53578:33;;:45;;;53340:371;52915:803;;;:::o;38760:1471::-;38894:10;38885:20;;;;:8;:20;;;;;:27;38866:46;;;38858:79;;;;-1:-1:-1;;;38858:79:0;;;;;;;:::i;:::-;38983:10;38948:23;38974:20;;;:8;:20;;;;;39005:9;:7;:9::i;:::-;39025:22;39062:19;39096:15;39133:9;39129:245;39148:17;;;39129:245;;;39201:29;39212:4;39217:8;;39226:1;39217:11;;;;;-1:-1:-1;;;39217:11:0;;;;;;;;39201:29;39187:43;;39308:11;39281:4;39286:8;;39295:1;39286:11;;;;;-1:-1:-1;;;39286:11:0;;;;;;;;;;;;;;;39281:17;;;;;;-1:-1:-1;;;39281:17:0;;;;;;;;;;;;;;;;;;;:24;;;:38;;;;:::i;:::-;39254:4;39259:8;;39268:1;39259:11;;;;;-1:-1:-1;;;39259:11:0;;;;;;;;;;;;;;;39254:17;;;;;;-1:-1:-1;;;39254:17:0;;;;;;;;;;;;;;;;;:24;:17;;;;;:24;:65;39334:28;39351:11;39334:28;;:::i;:::-;;-1:-1:-1;39167:3:0;;;;:::i;:::-;;;;39129:245;;;-1:-1:-1;;;;;;39389:26:0;;39405:10;39389:26;39386:589;;;39479:11;;39461:14;39447:11;:9;:11::i;:::-;:28;;;;:::i;:::-;39446:44;;;;:::i;:::-;39432:58;;39551:5;39529:19;;39515:11;:33;;;;:::i;:::-;:41;;;;:::i;:::-;39505:51;-1:-1:-1;39571:39:0;-1:-1:-1;;;;;39571:5:0;:18;39590:10;39505:51;39571:18;:39::i;:::-;39386:589;;;-1:-1:-1;;;;;39652:24:0;;;;;;:10;:24;;;;;:31;39644:64;;;;-1:-1:-1;;;39644:64:0;;;;;;;:::i;:::-;39770:11;;39752:14;39738:11;:9;:11::i;:::-;:28;;;;:::i;:::-;39737:44;;;;:::i;:::-;-1:-1:-1;;;;;39820:24:0;;;;;;:10;:24;;;;;:31;39723:58;;-1:-1:-1;39854:5:0;;39806:45;;39723:58;39806:45;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;39874:33:0;;39929:24;;;;:10;:24;;;;;;;;;:33;;;39874:89;;-1:-1:-1;;;39874:89:0;;39796:63;;-1:-1:-1;39874:33:0;;;;:89;;39796:63;;39917:10;;39874:89;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39386:589;40013:14;39999:11;;:28;;;;:::i;:::-;39985:11;:42;40038:16;40057:21;40071:7;40057:11;:21;:::i;:::-;40108:8;;40038:40;;-1:-1:-1;40089:38:0;;-1:-1:-1;;;;;40089:5:0;:18;;;40108:8;40038:40;40089:18;:38::i;:::-;40179:10;-1:-1:-1;;;;;40167:56:0;;40191:12;40205:7;40214:8;40167:56;;;;;;;;:::i;:::-;;;;;;;;38760:1471;;;;;;;;:::o;28704:34::-;;;:::o;46001:323::-;46070:7;46091:19;46112:17;46133:20;46147:5;46133:13;:20::i;:::-;46090:63;;;;46218:15;46266:11;;46251;46237;:9;:11::i;:::-;:25;;;;:::i;:::-;46236:41;;;;:::i;:::-;46218:59;-1:-1:-1;46296:19:0;46306:9;46218:59;46296:19;:::i;:::-;46288:28;46001:323;-1:-1:-1;;;;;46001:323:0:o;29539:55::-;;;;:::o;55235:152::-;55290:7;55317:11;;55332:1;55317:16;:62;;55367:11;;55343;:9;:11::i;:::-;:20;;55358:4;55343:20;:::i;:::-;:36;;;;:::i;:::-;55317:62;;;55336:4;55317:62;55310:69;;55235:152;:::o;48625:3004::-;-1:-1:-1;;;;;48779:17:0;;;;;;:8;:17;;;;;:24;48768:35;;48760:64;;;;-1:-1:-1;;;48760:64:0;;;;;;;:::i;:::-;48829:9;:7;:9::i;:::-;-1:-1:-1;;;;;48873:17:0;;48849:21;48873:17;;;:8;:17;;;;;:27;;48891:8;;48873:27;;;;-1:-1:-1;;;48873:27:0;;;;;;;;;;;;;;;;;;;48849:51;;48905:14;48927:28;48924:448;;;48971:18;;;;-1:-1:-1;;;;;48971:41:0;;;:18;;:41;;48963:99;;;;-1:-1:-1;;;48963:99:0;;;;;;;:::i;:::-;49092:18;;49126:17;;49092:18;49145:12;;;49077:102;;-1:-1:-1;;;49077:102:0;;-1:-1:-1;;;;;49092:18:0;;;;49077:48;;:102;;49126:17;;;49159:19;;49077:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49068:111;-1:-1:-1;49193:11:0;49185:53;;;;-1:-1:-1;;;49185:53:0;;;;;;;:::i;:::-;48924:448;;;49280:18;;49314:17;;49280:18;49333:12;;;49347:18;;;;;49265:101;;-1:-1:-1;;;49265:101:0;;-1:-1:-1;;;;;49280:18:0;;;;49265:48;;:101;;49314:17;;;;49333:12;;49347:18;;;;49265:101;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49256:110;;48924:448;49385:11;49382:2240;;49573:11;;49551:16;;;;;;;;;;-1:-1:-1;;;;;49551:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49511:21;;49573:11;49551:16;;:10;:16::i;:::-;49536:11;:9;:11::i;:::-;:32;;;;:::i;:::-;49535:50;;;;:::i;:::-;49511:74;;49628:4;:11;;;49614;;:25;;;;:::i;:::-;49600:11;:39;49678:9;;;;49666;;:21;;49678:9;49666:21;:::i;:::-;49654:9;:33;49723:12;;;;49765:17;;49861:11;;;;49804:84;;-1:-1:-1;;;;;49765:17:0;;;;49723:12;;49765:17;;49804:84;;;;;;;;49822:8;;49861:11;49874:13;;49804:84;:::i;:::-;;;;;;;;49917:31;49930:7;49939:8;49917:12;:31::i;:::-;-1:-1:-1;;;;;50007:21:0;;;49984:20;50007:21;;;:12;:21;;;;;:26;;50051;50048:65;;-1:-1:-1;50096:14:0;;-1:-1:-1;;;;;50096:14:0;50048:65;50130:19;50189:7;-1:-1:-1;;;;;50173:23:0;:12;-1:-1:-1;;;;;50173:23:0;;50170:523;;;50270:5;50248:19;;50232:13;:35;;;;:::i;:::-;:43;;;;:::i;:::-;50218:57;-1:-1:-1;50310:27:0;50218:57;50310:13;:27;:::i;:::-;50294:43;-1:-1:-1;50356:40:0;-1:-1:-1;;;;;50356:5:0;:18;50375:7;50384:11;50356:18;:40::i;:::-;50170:523;;;-1:-1:-1;;;;;50467:24:0;;;;;;:10;:24;;;;;:31;50501:5;;50451:47;;:13;:47;:::i;:::-;:55;;;;:::i;:::-;50437:69;-1:-1:-1;50541:27:0;50437:69;50541:13;:27;:::i;:::-;50525:43;;50595:12;-1:-1:-1;;;;;50587:33:0;;50621:11;50634:7;50643:10;:24;50654:12;-1:-1:-1;;;;;50643:24:0;-1:-1:-1;;;;;50643:24:0;;;;;;;;;;;;:33;;;50587:90;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50170:523;50726:8;;50707:43;;-1:-1:-1;;;;;50707:5:0;:18;;;50726:8;50736:13;50707:18;:43::i;:::-;50804:73;;-1:-1:-1;;;50804:73:0;;-1:-1:-1;;;;;50804:39:0;;;;;:73;;50852:4;;50859:7;;50868:8;;50804:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49382:2240;;;;;;;;50923:4;:9;;;50913:6;:19;50910:712;;50993:16;;;;;;;;;;-1:-1:-1;;;;;50993:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50969:21;;50993:16;;:10;:16::i;:::-;50969:40;;51025:21;51081:11;;51064:13;51050:11;:9;:11::i;:::-;:27;;;;:::i;:::-;51049:43;;;;:::i;:::-;51025:67;;51235:4;:11;;;51221;;:25;;;;:::i;:::-;51207:11;:39;51369:9;;;;51357;;:21;;51369:9;51357:21;:::i;:::-;51345:9;:33;51463:13;51449:11;:9;:11::i;:::-;:27;;;;:::i;:::-;51433:11;;51409:20;51416:13;51409:6;:20;:::i;:::-;51408:36;;;;:::i;:::-;51407:70;;;;:::i;:::-;51393:11;;;:84;51505:9;;:18;;51517:6;;51505:18;:::i;:::-;51493:9;:30;51538:9;;;:18;;;51599:11;;;;51585;;:25;;51599:11;51585:25;:::i;:::-;51571:11;:39;-1:-1:-1;;50910:712:0;48625:3004;;;;;;:::o;57174:270::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;57247:20;57244:196:::1;;57288:10;::::0;57309:6:::1;::::0;57317:41:::1;::::0;-1:-1:-1;;;57317:41:0;;-1:-1:-1;;;;;57288:10:0;;::::1;::::0;57276:32:::1;::::0;57309:6;57317:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:41:::1;::::0;57288:10;;57317:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57276:83;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57244:196;;;57389:10;::::0;57410:6:::1;::::0;57377:57:::1;::::0;-1:-1:-1;;;57377:57:0;;-1:-1:-1;;;;;57389:10:0;;::::1;::::0;57377:32:::1;::::0;:57:::1;::::0;57418:15;;57377:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57174:270:::0;:::o;28841:52::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28841:52:0;;;;;;:::o;56436:389::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;56535:10:::1;:24:::0;;-1:-1:-1;;;;;;56535:24:0::1;-1:-1:-1::0;;;;;56535:24:0;;::::1;::::0;;;::::1;::::0;;;;56564:6:::1;:19:::0;;;56644:64:::1;::::0;-1:-1:-1;;;56644:64:0;;-1:-1:-1;;56651:10:0::1;56644:28:::0;::::1;::::0;::::1;::::0;:64:::1;::::0;56681:4:::1;::::0;56696:10:::1;::::0;56644:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56618:90:::0;-1:-1:-1;56716:20:0;56713:108:::1;;56744:71;-1:-1:-1::0;;;;;56751:10:0::1;56744:30;56783:11:::0;-1:-1:-1;;56744:30:0::1;:71::i;29024:21::-:0;;;;:::o;45459:272::-;-1:-1:-1;;;;;45582:17:0;;45543:7;45582:17;;;:8;:17;;;;;:27;;45543:7;;45582:17;45600:8;;45582:27;;;;-1:-1:-1;;;45582:27:0;;;;;;;;;;;;;;;;;;;45557:52;;45614:16;45662:17;:15;:17::i;:::-;45647:11;;45634:5;:10;;;:24;;;;:::i;:::-;45633:46;;;;:::i;:::-;45614:65;;45724:1;45713:8;45698:5;:12;;;:23;;;;:::i;:::-;:27;;;;:::i;54497:425::-;-1:-1:-1;;;;;54613:15:0;;54556:7;54613:15;;;:8;:15;;;;;54664:13;;54556:7;;54613:15;54556:7;;;54748:127;54769:14;54765:1;:18;54748:127;;;54811:6;54818:1;54811:9;;;;;;-1:-1:-1;;;54811:9:0;;;;;;;;;;;;;;;;;;;:16;;;54796:31;;;;;:::i;:::-;;;54855:6;54862:1;54855:9;;;;;;-1:-1:-1;;;54855:9:0;;;;;;;;;;;;;;;;;;;:14;;;54842:27;;;;;:::i;:::-;;-1:-1:-1;54785:3:0;;;;:::i;:::-;;;;54748:127;;;-1:-1:-1;54891:11:0;;-1:-1:-1;54904:9:0;-1:-1:-1;;;54497:425:0;;;:::o;56942:132::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;57002:10:::1;::::0;57022:6:::1;::::0;57030:35:::1;::::0;-1:-1:-1;;;57030:35:0;;-1:-1:-1;;;;;57002:10:0;;::::1;::::0;56990:31:::1;::::0;57022:6;57030:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35:::1;::::0;57059:4:::1;::::0;57030:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56990:76;;;;;;;;;;;;;;;;:::i;47377:996::-:0;47435:19;;-1:-1:-1;;;;;47435:19:0;47427:54;;;;-1:-1:-1;;;47427:54:0;;;;;;;:::i;:::-;47509:10;47530:1;47500:20;;;:8;:20;;;;;:27;47492:60;;;;-1:-1:-1;;;47492:60:0;;;;;;;:::i;:::-;47561:9;:7;:9::i;:::-;47689:10;47583:19;47680:20;;;:8;:20;;;;;47583:19;;;47713:209;47732:11;;47730:13;;47713:209;;;47779:19;47790:4;47795:1;47790:7;;;;;;-1:-1:-1;;;47790:7:0;;;;;;;;47779:19;47765:33;;47856:11;47839:4;47844:1;47839:7;;;;;;-1:-1:-1;;;47839:7:0;;;;;;;;;;;;;;;;;;;:14;;;:28;;;;:::i;:::-;47822:4;47827:1;47822:7;;;;;;-1:-1:-1;;;47822:7:0;;;;;;;;;;;;;;;;;:14;:7;;;;;:14;:45;47882:28;47899:11;47882:28;;:::i;:::-;;-1:-1:-1;47745:3:0;;;;:::i;:::-;;;;47713:209;;;;47932:21;47992:11;;47972:14;47957:11;:9;:11::i;:::-;:30;;;;:::i;:::-;47956:48;;;;:::i;:::-;47932:72;;48043:14;48029:11;;:28;;;;:::i;:::-;48015:11;:42;48091:19;;48072:54;;-1:-1:-1;;;;;48072:5:0;:18;;;48091:19;48112:13;48072:18;:54::i;:::-;48139:19;;48131:65;;-1:-1:-1;;;48131:65:0;;-1:-1:-1;;;;;48139:19:0;;;;48131:38;;:65;;48170:13;;48185:10;;48131:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48339:10;-1:-1:-1;;;;;48323:42:0;;48351:13;48323:42;;;;;;:::i;:::-;;;;;;;;47377:996;;;;:::o;28606:85::-;;;:::o;55002:160::-;55108:10;;55131:6;;55096:57;;-1:-1:-1;;;55096:57:0;;55069:7;;-1:-1:-1;;;;;55108:10:0;;55096:34;;:57;;55131:6;55147:4;;55096:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58007:329::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;58116:5:::1;-1:-1:-1::0;;;;;58091:31:0::1;:13;-1:-1:-1::0;;;;;58091:31:0::1;;;58083:55;;;;-1:-1:-1::0;;;58083:55:0::1;;;;;;;:::i;:::-;58176:10;-1:-1:-1::0;;;;;58151:36:0::1;:13;-1:-1:-1::0;;;;;58151:36:0::1;;;58143:60;;;;-1:-1:-1::0;;;58143:60:0::1;;;;;;;:::i;:::-;58259:5;::::0;58247:35:::1;::::0;;-1:-1:-1;;;58247:35:0;;;;58212:119:::1;::::0;-1:-1:-1;;;;;58259:5:0::1;::::0;58247:33:::1;::::0;:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;58259:5;58247:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58284:46;::::0;-1:-1:-1;;;58284:46:0;;-1:-1:-1;;;;;58284:31:0;::::1;::::0;::::1;::::0;:46:::1;::::0;58324:4:::1;::::0;58284:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58212:34:0;::::1;::::0;:119;:34:::1;:119::i;46516:855::-:0;46599:19;;-1:-1:-1;;;;;46599:19:0;46591:54;;;;-1:-1:-1;;;46591:54:0;;;;;;;:::i;:::-;46684:10;46675:20;;;;:8;:20;;;;;:27;46664:38;;46656:67;;;;-1:-1:-1;;;46656:67:0;;;;;;;:::i;:::-;46732:9;:7;:9::i;:::-;46795:10;46762:21;46786:20;;;:8;:20;;;;;:30;;46807:8;;46786:30;;;;-1:-1:-1;;;46786:30:0;;;;;;;;;;;;;;;;;;46845:16;;;;;;;;46786:30;;;;;;;46845:16;;-1:-1:-1;;;;;46845:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46786:30;;-1:-1:-1;46845:16:0;;:10;:16::i;:::-;46835:7;:26;46827:58;;;;-1:-1:-1;;;46827:58:0;;;;;;;:::i;:::-;46898:21;46951:11;;46938:7;46923:11;:9;:11::i;:::-;:23;;;;:::i;:::-;46922:41;;;;:::i;:::-;46898:65;;47002:7;46988:4;:11;;;:21;;;;:::i;:::-;46974:11;;;:35;47034:11;;:21;;47048:7;;47034:21;:::i;36470:632::-;36626:4;36613:9;:17;;36605:37;;;;-1:-1:-1;;;36605:37:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36656:26:0;;36672:10;36656:26;36653:100;;-1:-1:-1;;;;;36694:24:0;;;;;;:10;:24;;;;;:31;36686:64;;;;-1:-1:-1;;;36686:64:0;;;;;;;:::i;:::-;36808:10;36763:29;36795:24;;;:12;:24;;;;;;;36830:25;;;:45;;;36886:17;;;:29;;;36926:28;;-1:-1:-1;;;;;;36926:28:0;-1:-1:-1;;;;;36926:28:0;;;;;37021:73;;36795:24;;36808:10;37021:73;;;;37051:12;;36830:45;;36886:29;;37021:73;:::i;:::-;;;;;;;;36470:632;;;;;:::o;40293:2261::-;-1:-1:-1;;;;;40383:22:0;;40357:23;40383:22;;;:8;:22;;;;;40418:11;;40410:46;;;;-1:-1:-1;;;40410:46:0;;;;;;;:::i;:::-;40467:9;:7;:9::i;:::-;-1:-1:-1;;;;;40626:26:0;;;40487:22;40626:26;;;:12;:26;;;;;40688:17;;;40740:29;;;40799:21;;;;40487:22;;;;;;40626:26;40688:17;;;;40740:29;40836:18;40833:67;;40874:23;;40858:39;;40833:67;40913:13;40910:49;;-1:-1:-1;40941:15:0;;40910:49;40975:9;40971:211;40992:11;;40990:13;;40971:211;;;41039:19;41050:4;41055:1;41050:7;;;;;;-1:-1:-1;;;41050:7:0;;;;;;;;41039:19;41025:33;;41116:11;41099:4;41104:1;41099:7;;;;;;-1:-1:-1;;;41099:7:0;;;;;;;;;;;;;;;;;;;:14;;;:28;;;;:::i;:::-;41082:4;41087:1;41082:7;;;;;;-1:-1:-1;;;41082:7:0;;;;;;;;;;;;;;;;;:14;:7;;;;;:14;:45;41142:28;41159:11;41142:28;;:::i;:::-;;-1:-1:-1;41005:3:0;;;;:::i;:::-;;;;40971:211;;;;41213:12;-1:-1:-1;;;;;41197:28:0;:12;-1:-1:-1;;;;;41197:28:0;;41194:1084;;;41326:11;;41308:14;41294:11;:9;:11::i;:::-;:28;;;;:::i;:::-;41293:44;;;;:::i;:::-;41279:58;;41398:5;41376:19;;41362:11;:33;;;;:::i;:::-;:41;;;;:::i;:::-;41352:51;-1:-1:-1;41450:5:0;41429:18;41439:8;41352:51;41429:18;:::i;:::-;:26;;;;:::i;:::-;41418:37;-1:-1:-1;41470:40:0;-1:-1:-1;;;;;41470:5:0;:18;41489:10;41418:37;41470:18;:40::i;:::-;41526:54;41545:12;41560:18;41570:8;41560:7;:18;:::i;41526:54::-;41194:1084;;;-1:-1:-1;;;;;41617:26:0;;41614:110;;41679:14;;-1:-1:-1;;;;;41679:14:0;;-1:-1:-1;41614:110:0;41874:11;;41856:14;41842:11;:9;:11::i;:::-;:28;;;;:::i;:::-;41841:44;;;;:::i;:::-;-1:-1:-1;;;;;41924:24:0;;;;;;:10;:24;;;;;:31;41827:58;;-1:-1:-1;41958:5:0;;41910:45;;41827:58;41910:45;:::i;:::-;:53;;;;:::i;:::-;41900:63;;41996:13;41986:7;:23;41978:61;;;;-1:-1:-1;;;41978:61:0;;;;;;;:::i;:::-;42086:5;42065:18;42075:8;42065:7;:18;:::i;:::-;:26;;;;:::i;:::-;42054:37;-1:-1:-1;42106:40:0;-1:-1:-1;;;;;42106:5:0;:18;42125:10;42054:37;42106:18;:40::i;:::-;-1:-1:-1;;;;;42162:33:0;;;42197:18;42207:8;42197:7;:18;:::i;:::-;42218:12;42232:10;:24;42243:12;-1:-1:-1;;;;;42232:24:0;-1:-1:-1;;;;;42232:24:0;;;;;;;;;;;;:33;;;42162:104;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41194:1084;42316:14;42302:11;;:28;;;;:::i;:::-;42288:11;:42;42341:16;42360:21;42374:7;42360:11;:21;:::i;:::-;42411:8;;42341:40;;-1:-1:-1;42392:38:0;;-1:-1:-1;;;;;42392:5:0;:18;;;42411:8;42341:40;42392:18;:38::i;:::-;42490:12;-1:-1:-1;;;;;42470:76:0;42478:10;-1:-1:-1;;;;;42470:76:0;;42504:12;42518:7;42527:8;42537;42470:76;;;;;;;;;:::i;:::-;;;;;;;;40293:2261;;;;;;;;;;:::o;52423:176::-;52497:10;52469:16;52488:20;;;:8;:20;;;;;:27;52520:75;52526:12;;52520:75;;52546:10;;;;:::i;:::-;;;;52562:27;52580:8;52562:17;:27::i;:::-;52520:75;;55489:148;-1:-1:-1;;;;;55595:17:0;;55568:7;55595:17;;;:8;:17;;;;;:27;;55613:8;;55595:27;;;;-1:-1:-1;;;55595:27:0;;;;;;;;;;;;;;;;;;;:34;;;55588:41;;55489:148;;;;:::o;29272:34::-;;;-1:-1:-1;;;;;29272:34:0;;:::o;54304:116::-;-1:-1:-1;;;;;54390:15:0;54363:7;54390:15;;;:8;:15;;;;;:22;;54304:116::o;53730:369::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;53881:14:::1;:32:::0;;-1:-1:-1;;;;;;53881:32:0::1;-1:-1:-1::0;;;;;53881:32:0;;;::::1;::::0;;;::::1;::::0;;;53961:23:::1;:36:::0;;;;54008:15:::1;:29:::0;54048:19:::1;:43:::0;53730:369::o;29436:74::-;;;-1:-1:-1;;;;;29436:74:0;;:::o;37251:1363::-;37349:10;37314:23;37340:20;;;:8;:20;;;;;37373:11;;37365:46;;;;-1:-1:-1;;;37365:46:0;;;;;;;:::i;:::-;37422:9;:7;:9::i;:::-;37442:22;37479:19;37513:15;37550:9;37546:211;37567:11;;37565:13;;37546:211;;;37614:19;37625:4;37630:1;37625:7;;;;;;-1:-1:-1;;;37625:7:0;;;;;;;;37614:19;37600:33;;37691:11;37674:4;37679:1;37674:7;;;;;;-1:-1:-1;;;37674:7:0;;;;;;;;;;;;;;;;;;;:14;;;:28;;;;:::i;:::-;37657:4;37662:1;37657:7;;;;;;-1:-1:-1;;;37657:7:0;;;;;;;;;;;;;;;;;:14;:7;;;;;:14;:45;37717:28;37734:11;37717:28;;:::i;:::-;;-1:-1:-1;37580:3:0;;;;:::i;:::-;;;;37546:211;;;-1:-1:-1;;;;;;37772:26:0;;37788:10;37772:26;37769:589;;;37862:11;;37844:14;37830:11;:9;:11::i;:::-;:28;;;;:::i;:::-;37829:44;;;;:::i;:::-;37815:58;;37934:5;37912:19;;37898:11;:33;;;;:::i;:::-;:41;;;;:::i;:::-;37888:51;-1:-1:-1;37954:39:0;-1:-1:-1;;;;;37954:5:0;:18;37973:10;37888:51;37954:18;:39::i;:::-;37769:589;;;-1:-1:-1;;;;;38035:24:0;;;;;;:10;:24;;;;;:31;38027:64;;;;-1:-1:-1;;;38027:64:0;;;;;;;:::i;:::-;38153:11;;38135:14;38121:11;:9;:11::i;:::-;:28;;;;:::i;:::-;38120:44;;;;:::i;:::-;-1:-1:-1;;;;;38203:24:0;;;;;;:10;:24;;;;;:31;38106:58;;-1:-1:-1;38237:5:0;;38189:45;;38106:58;38189:45;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;38257:33:0;;38312:24;;;;:10;:24;;;;;;;;;:33;;;38257:89;;-1:-1:-1;;;38257:89:0;;38179:63;;-1:-1:-1;38257:33:0;;;;:89;;38179:63;;38300:10;;38257:89;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37769:589;38396:14;38382:11;;:28;;;;:::i;:::-;38368:11;:42;38421:16;38440:21;38454:7;38440:11;:21;:::i;:::-;38491:8;;38421:40;;-1:-1:-1;38472:38:0;;-1:-1:-1;;;;;38472:5:0;:18;;;38491:8;38421:40;38472:18;:38::i;:::-;38562:10;-1:-1:-1;;;;;38550:56:0;;38574:12;38588:7;38597:8;38550:56;;;;;;;;:::i;:::-;;;;;;;;37251:1363;;;;;;:::o;32854:1502::-;9750:1;10348:7;;:19;;10340:63;;;;-1:-1:-1;;;10340:63:0;;;;;;;:::i;:::-;9750:1;10481:7;:18;;;33014::::1;::::0;32999:94:::1;::::0;-1:-1:-1;;;32999:94:0;;-1:-1:-1;;;;;33014:18:0;;::::1;::::0;32999:48:::1;::::0;:94:::1;::::0;33048:13;;33063:8;;33073:19;;32999:94:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32971:122;;33132:1;33112:17;:21;33104:60;;;;-1:-1:-1::0;;;33104:60:0::1;;;;;;;:::i;:::-;33175:9;:7;:9::i;:::-;33195:12;33210:11;:9;:11::i;:::-;33232:76;::::0;-1:-1:-1;;;33232:76:0;;33195:26;;-1:-1:-1;;;;;;33232:39:0;::::1;::::0;::::1;::::0;:76:::1;::::0;33272:10:::1;::::0;33292:4:::1;::::0;33299:8;;33232:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33319:21;33359:11;;33374:1;33359:16;33355:595;;33445:4;33429:11;;33409:17;:31;;;;:::i;:::-;33408:42;;;;:::i;:::-;33392:58;;33355:595;;;28541:5;33482:17;:38;33474:81;;;;-1:-1:-1::0;;;33474:81:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;33586:17:0;33634:34:::1;28541:5;33586:17:::0;33634:34:::1;:::i;:::-;28541:5;33683:11;:32:::0;;;33730:8:::1;:20;::::0;;;;33774:58;;::::1;::::0;::::1;::::0;;33730:20:::1;33774:58:::0;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;33730:20;:117;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;33730:117:0;;::::1;-1:-1:-1::0;;;;;;33730:117:0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;33869:69;33618:50;;-1:-1:-1;33730:20:0;;;;;33869:69:::1;::::0;::::1;::::0;33730:20;;;;33869:69:::1;:::i;:::-;;;;;;;;33355:595;33998:13;33984:11;;:27;;;;:::i;:::-;33970:11;:41:::0;34034:9:::1;::::0;:29:::1;::::0;34046:17;;34034:29:::1;:::i;:::-;34022:9;:41:::0;34093:10:::1;34084:20;::::0;;;:8:::1;:20;::::0;;;;;;;34128:88;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;34128:88:0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;34084:147;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;34084:147:0;;::::1;;::::0;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;34249:99;;34152:8;;34128:88;34249:99:::1;::::0;::::1;::::0;34162:13;;34177:17;;34196:19;;34249:99:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;9706:1:0;10660:7;:22;-1:-1:-1;;;;32854:1502:0:o;54107:127::-;32630:5;;-1:-1:-1;;;;;32630:5:0;32616:10;:19;32608:43;;;;-1:-1:-1;;;32608:43:0;;;;;;;:::i;:::-;54193:19:::1;:33:::0;;-1:-1:-1;;;;;;54193:33:0::1;-1:-1:-1::0;;;;;54193:33:0;;;::::1;::::0;;;::::1;::::0;;54107:127::o;29086:20::-;;;-1:-1:-1;;;;;29086:20:0;;:::o;28748:29::-;;;-1:-1:-1;;;;;28748:29:0;;:::o;28556:::-;;;:::o;23721:616::-;24085:10;;;24084:62;;-1:-1:-1;24101:39:0;;-1:-1:-1;;;24101:39:0;;-1:-1:-1;;;;;24101:15:0;;;;;:39;;24125:4;;24132:7;;24101:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;24084:62;24062:166;;;;-1:-1:-1;;;24062:166:0;;;;;;;:::i;:::-;24239:90;24259:5;24289:22;;;24313:7;24322:5;24266:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24266:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;24266:62:0;-1:-1:-1;;;;;;24266:62:0;;;;;;;;;;24239:19;:90::i;17660:229::-;17797:12;17829:52;17851:6;17859:4;17865:1;17868:12;17829:21;:52::i;:::-;17822:59;;17660:229;;;;;;:::o;45253:200::-;45319:7;45339:16;45387:11;:9;:11::i;:::-;45372;;45359:5;:10;;;:24;;;;:::i;:::-;45358:40;;;;:::i;:::-;45339:59;;45443:1;45432:8;45417:5;:12;;;:23;;;;:::i;:::-;:27;;;;:::i;55851:122::-;55895:7;55955:9;;55922:5;-1:-1:-1;;;;;55922:15:0;;55946:4;55922:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;58394:325::-;-1:-1:-1;;;;;58498:17:0;;58470:25;58498:17;;;:8;:17;;;;;58548:13;;58498:17;;58470:25;58548:17;;58564:1;;58548:17;:::i;:::-;58526:39;;58601:11;58589:8;:23;58586:93;;58648:6;58655:11;58648:19;;;;;;-1:-1:-1;;;58648:19:0;;;;;;;;;;;;;;;;;;;58629:6;58636:8;58629:16;;;;;;-1:-1:-1;;;58629:16:0;;;;;;;;;;;;;;;;;:38;;:16;;;;;:38;;-1:-1:-1;;;;;58629:38:0;;;-1:-1:-1;;;;;;58629:38:0;;;;;;-1:-1:-1;58629:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58586:93;58699:6;:12;;;;;-1:-1:-1;;;58699:12:0;;;;;;;;;;;;;;;;;-1:-1:-1;;58699:12:0;;;;;;;;;-1:-1:-1;;;;;;58699:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;58394:325:0:o;22985:211::-;23102:86;23122:5;23152:23;;;23177:2;23181:5;23129:58;;;;;;;;;:::i;25558:716::-;25982:23;26008:69;26036:4;26008:69;;;;;;;;;;;;;;;;;26016:5;-1:-1:-1;;;;;26008:27:0;;;:69;;;;;:::i;:::-;26092:17;;25982:95;;-1:-1:-1;26092:21:0;26088:179;;26189:10;26178:30;;;;;;;;;;;;:::i;:::-;26170:85;;;;-1:-1:-1;;;26170:85:0;;;;;;;:::i;18780:510::-;18950:12;19008:5;18983:21;:30;;18975:81;;;;-1:-1:-1;;;18975:81:0;;;;;;;:::i;:::-;19075:18;19086:6;19075:10;:18::i;:::-;19067:60;;;;-1:-1:-1;;;19067:60:0;;;;;;;:::i;:::-;19141:12;19155:23;19182:6;-1:-1:-1;;;;;19182:11:0;19201:5;19208:4;19182:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19140:73;;;;19231:51;19248:7;19257:10;19269:12;19231:16;:51::i;:::-;19224:58;18780:510;-1:-1:-1;;;;;;;18780:510:0:o;14915:326::-;-1:-1:-1;;;;;15210:19:0;;:23;;;14915:326::o;21466:762::-;21616:12;21645:7;21641:580;;;-1:-1:-1;21676:10:0;21669:17;;21641:580;21790:17;;:21;21786:424;;22038:10;22032:17;22099:15;22086:10;22082:2;22078:19;22071:44;21986:148;22181:12;22174:20;;-1:-1:-1;;;22174:20:0;;;;;;;;:::i;14:400:1:-;;;147:3;140:4;132:6;128:17;124:27;114:2;;170:6;162;155:22;114:2;-1:-1:-1;198:20:1;;241:18;230:30;;227:2;;;280:8;270;263:26;227:2;324:4;316:6;312:17;300:29;;387:3;380:4;372;364:6;360:17;352:6;348:30;344:41;341:50;338:2;;;404:1;401;394:12;338:2;104:310;;;;;:::o;419:259::-;;531:2;519:9;510:7;506:23;502:32;499:2;;;552:6;544;537:22;499:2;596:9;583:23;615:33;642:5;615:33;:::i;683:263::-;;806:2;794:9;785:7;781:23;777:32;774:2;;;827:6;819;812:22;774:2;864:9;858:16;883:33;910:5;883:33;:::i;951:1315::-;;;;;1123:3;1111:9;1102:7;1098:23;1094:33;1091:2;;;1145:6;1137;1130:22;1091:2;1189:9;1176:23;1208:33;1235:5;1208:33;:::i;:::-;1260:5;-1:-1:-1;1317:2:1;1302:18;;1289:32;1330:35;1289:32;1330:35;:::i;:::-;1384:7;-1:-1:-1;1438:2:1;1423:18;;1410:32;;-1:-1:-1;1493:2:1;1478:18;;1465:32;1516:18;1546:14;;;1543:2;;;1578:6;1570;1563:22;1543:2;1621:6;1610:9;1606:22;1596:32;;1666:7;1659:4;1655:2;1651:13;1647:27;1637:2;;1693:6;1685;1678:22;1637:2;1734;1721:16;1756:2;1752;1749:10;1746:2;;;1762:18;;:::i;:::-;1837:2;1831:9;1805:2;1891:13;;-1:-1:-1;;1887:22:1;;;1911:2;1883:31;1879:40;1867:53;;;1935:18;;;1955:22;;;1932:46;1929:2;;;1981:18;;:::i;:::-;2021:10;2017:2;2010:22;2056:2;2048:6;2041:18;2096:7;2091:2;2086;2082;2078:11;2074:20;2071:33;2068:2;;;2122:6;2114;2107:22;2068:2;2183;2178;2174;2170:11;2165:2;2157:6;2153:15;2140:46;2206:15;;;2223:2;2202:24;2195:40;;;;1081:1185;;;;-1:-1:-1;1081:1185:1;;-1:-1:-1;;;;1081:1185:1:o;2271:600::-;;;;2435:2;2423:9;2414:7;2410:23;2406:32;2403:2;;;2456:6;2448;2441:22;2403:2;2500:9;2487:23;2519:33;2546:5;2519:33;:::i;:::-;2571:5;-1:-1:-1;2627:2:1;2612:18;;2599:32;2654:18;2643:30;;2640:2;;;2691:6;2683;2676:22;2640:2;2735:76;2803:7;2794:6;2783:9;2779:22;2735:76;:::i;:::-;2393:478;;2830:8;;-1:-1:-1;2709:102:1;;-1:-1:-1;;;;2393:478:1:o;2876:327::-;;;3005:2;2993:9;2984:7;2980:23;2976:32;2973:2;;;3026:6;3018;3011:22;2973:2;3070:9;3057:23;3089:33;3116:5;3089:33;:::i;:::-;3141:5;3193:2;3178:18;;;;3165:32;;-1:-1:-1;;;2963:240:1:o;3208:470::-;;;;3354:2;3342:9;3333:7;3329:23;3325:32;3322:2;;;3375:6;3367;3360:22;3322:2;3419:9;3406:23;3438:33;3465:5;3438:33;:::i;:::-;3490:5;-1:-1:-1;3542:2:1;3527:18;;3514:32;;-1:-1:-1;3598:2:1;3583:18;;3570:32;3611:35;3570:32;3611:35;:::i;:::-;3665:7;3655:17;;;3312:366;;;;;:::o;3683:608::-;;;;;3843:3;3831:9;3822:7;3818:23;3814:33;3811:2;;;3865:6;3857;3850:22;3811:2;3909:9;3896:23;3928:33;3955:5;3928:33;:::i;:::-;3980:5;-1:-1:-1;4032:2:1;4017:18;;4004:32;;-1:-1:-1;4088:2:1;4073:18;;4060:32;4101;4060;4101;:::i;:::-;4152:7;-1:-1:-1;4211:2:1;4196:18;;4183:32;4224:35;4183:32;4224:35;:::i;:::-;3801:490;;;;-1:-1:-1;3801:490:1;;-1:-1:-1;;3801:490:1:o;4296:395::-;;;;4442:2;4430:9;4421:7;4417:23;4413:32;4410:2;;;4463:6;4455;4448:22;4410:2;4507:9;4494:23;4526:33;4553:5;4526:33;:::i;:::-;4578:5;4630:2;4615:18;;4602:32;;-1:-1:-1;4681:2:1;4666:18;;;4653:32;;4400:291;-1:-1:-1;;;4400:291:1:o;4696:539::-;;;;;4859:3;4847:9;4838:7;4834:23;4830:33;4827:2;;;4881:6;4873;4866:22;4827:2;4925:9;4912:23;4944:33;4971:5;4944:33;:::i;:::-;4996:5;-1:-1:-1;5048:2:1;5033:18;;5020:32;;-1:-1:-1;5099:2:1;5084:18;;5071:32;;-1:-1:-1;5155:2:1;5140:18;;5127:32;5168:35;5127:32;5168:35;:::i;5240:464::-;;;;;5403:3;5391:9;5382:7;5378:23;5374:33;5371:2;;;5425:6;5417;5410:22;5371:2;5469:9;5456:23;5488:33;5515:5;5488:33;:::i;:::-;5540:5;5592:2;5577:18;;5564:32;;-1:-1:-1;5643:2:1;5628:18;;5615:32;;5694:2;5679:18;5666:32;;-1:-1:-1;5361:343:1;-1:-1:-1;;;5361:343:1:o;5709:600::-;;;;5873:2;5861:9;5852:7;5848:23;5844:32;5841:2;;;5894:6;5886;5879:22;5841:2;5939:9;5926:23;5972:18;5964:6;5961:30;5958:2;;;6009:6;6001;5994:22;5958:2;6053:76;6121:7;6112:6;6101:9;6097:22;6053:76;:::i;:::-;6148:8;;-1:-1:-1;6027:102:1;-1:-1:-1;;6233:2:1;6218:18;;6205:32;6246:33;6205:32;6246:33;:::i;6314:257::-;;6434:2;6422:9;6413:7;6409:23;6405:32;6402:2;;;6455:6;6447;6440:22;6402:2;6492:9;6486:16;6511:30;6535:5;6511:30;:::i;6927:190::-;;7039:2;7027:9;7018:7;7014:23;7010:32;7007:2;;;7060:6;7052;7045:22;7007:2;-1:-1:-1;7088:23:1;;6997:120;-1:-1:-1;6997:120:1:o;7122:194::-;;7245:2;7233:9;7224:7;7220:23;7216:32;7213:2;;;7266:6;7258;7251:22;7213:2;-1:-1:-1;7294:16:1;;7203:113;-1:-1:-1;7203:113:1:o;7321:327::-;;;7450:2;7438:9;7429:7;7425:23;7421:32;7418:2;;;7471:6;7463;7456:22;7418:2;7512:9;7499:23;7489:33;;7572:2;7561:9;7557:18;7544:32;7585:33;7612:5;7585:33;:::i;:::-;7637:5;7627:15;;;7408:240;;;;;:::o;7653:258::-;;;7782:2;7770:9;7761:7;7757:23;7753:32;7750:2;;;7803:6;7795;7788:22;7750:2;-1:-1:-1;;7831:23:1;;;7901:2;7886:18;;;7873:32;;-1:-1:-1;7740:171:1:o;7916:274::-;;8083:6;8077:13;8099:53;8145:6;8140:3;8133:4;8125:6;8121:17;8099:53;:::i;:::-;8168:16;;;;;8053:137;-1:-1:-1;;8053:137:1:o;8195:203::-;-1:-1:-1;;;;;8359:32:1;;;;8341:51;;8329:2;8314:18;;8296:102::o;8403:304::-;-1:-1:-1;;;;;8633:15:1;;;8615:34;;8685:15;;8680:2;8665:18;;8658:43;8565:2;8550:18;;8532:175::o;8712:375::-;-1:-1:-1;;;;;8970:15:1;;;8952:34;;9022:15;;;;9017:2;9002:18;;8995:43;9069:2;9054:18;;9047:34;;;;8902:2;8887:18;;8869:218::o;9092:274::-;-1:-1:-1;;;;;9284:32:1;;;;9266:51;;9348:2;9333:18;;9326:34;9254:2;9239:18;;9221:145::o;9371:375::-;-1:-1:-1;;;;;9629:15:1;;;9611:34;;9676:2;9661:18;;9654:34;;;;9724:15;;;9719:2;9704:18;;9697:43;9561:2;9546:18;;9528:218::o;9751:345::-;-1:-1:-1;;;;;9971:32:1;;;;9953:51;;10035:2;10020:18;;10013:34;;;;10078:2;10063:18;;10056:34;9941:2;9926:18;;9908:188::o;10101:417::-;-1:-1:-1;;;;;10350:32:1;;;;10332:51;;10414:2;10399:18;;10392:34;;;;10457:2;10442:18;;10435:34;10500:2;10485:18;;10478:34;10319:3;10304:19;;10286:232::o;10523:519::-;-1:-1:-1;;;;;10838:15:1;;;10820:34;;10885:2;10870:18;;10863:34;;;;10928:2;10913:18;;10906:34;;;;10971:2;10956:18;;10949:34;11020:15;;;11014:3;10999:19;;10992:44;10769:3;10754:19;;10736:306::o;11047:202::-;-1:-1:-1;;;;;;11209:33:1;;;;11191:52;;11179:2;11164:18;;11146:103::o;11703:383::-;;11852:2;11841:9;11834:21;11884:6;11878:13;11927:6;11922:2;11911:9;11907:18;11900:34;11943:66;12002:6;11997:2;11986:9;11982:18;11977:2;11969:6;11965:15;11943:66;:::i;:::-;12070:2;12049:15;-1:-1:-1;;12045:29:1;12030:45;;;;12077:2;12026:54;;11824:262;-1:-1:-1;;11824:262:1:o;12091:409::-;12293:2;12275:21;;;12332:2;12312:18;;;12305:30;12371:34;12366:2;12351:18;;12344:62;-1:-1:-1;;;12437:2:1;12422:18;;12415:43;12490:3;12475:19;;12265:235::o;12505:354::-;12707:2;12689:21;;;12746:2;12726:18;;;12719:30;12785:32;12780:2;12765:18;;12758:60;12850:2;12835:18;;12679:180::o;12864:331::-;13066:2;13048:21;;;13105:1;13085:18;;;13078:29;-1:-1:-1;;;13138:2:1;13123:18;;13116:38;13186:2;13171:18;;13038:157::o;13200:349::-;13402:2;13384:21;;;13441:2;13421:18;;;13414:30;13480:27;13475:2;13460:18;;13453:55;13540:2;13525:18;;13374:175::o;13554:340::-;13756:2;13738:21;;;13795:2;13775:18;;;13768:30;-1:-1:-1;;;13829:2:1;13814:18;;13807:46;13885:2;13870:18;;13728:166::o;13899:407::-;14101:2;14083:21;;;14140:2;14120:18;;;14113:30;14179:34;14174:2;14159:18;;14152:62;-1:-1:-1;;;14245:2:1;14230:18;;14223:41;14296:3;14281:19;;14073:233::o;14311:336::-;14513:2;14495:21;;;14552:2;14532:18;;;14525:30;-1:-1:-1;;;14586:2:1;14571:18;;14564:42;14638:2;14623:18;;14485:162::o;14652:402::-;14854:2;14836:21;;;14893:2;14873:18;;;14866:30;14932:34;14927:2;14912:18;;14905:62;-1:-1:-1;;;14998:2:1;14983:18;;14976:36;15044:3;15029:19;;14826:228::o;15059:335::-;15261:2;15243:21;;;15300:2;15280:18;;;15273:30;-1:-1:-1;;;15334:2:1;15319:18;;15312:41;15385:2;15370:18;;15233:161::o;15399:340::-;15601:2;15583:21;;;15640:2;15620:18;;;15613:30;-1:-1:-1;;;15674:2:1;15659:18;;15652:46;15730:2;15715:18;;15573:166::o;15744:353::-;15946:2;15928:21;;;15985:2;15965:18;;;15958:30;16024:31;16019:2;16004:18;;15997:59;16088:2;16073:18;;15918:179::o;16102:342::-;16304:2;16286:21;;;16343:2;16323:18;;;16316:30;-1:-1:-1;;;16377:2:1;16362:18;;16355:48;16435:2;16420:18;;16276:168::o;16449:344::-;16651:2;16633:21;;;16690:2;16670:18;;;16663:30;-1:-1:-1;;;16724:2:1;16709:18;;16702:50;16784:2;16769:18;;16623:170::o;16798:335::-;17000:2;16982:21;;;17039:2;17019:18;;;17012:30;-1:-1:-1;;;17073:2:1;17058:18;;17051:41;17124:2;17109:18;;16972:161::o;17138:350::-;17340:2;17322:21;;;17379:2;17359:18;;;17352:30;17418:28;17413:2;17398:18;;17391:56;17479:2;17464:18;;17312:176::o;17493:339::-;17695:2;17677:21;;;17734:2;17714:18;;;17707:30;-1:-1:-1;;;17768:2:1;17753:18;;17746:45;17823:2;17808:18;;17667:165::o;17837:353::-;18039:2;18021:21;;;18078:2;18058:18;;;18051:30;18117:31;18112:2;18097:18;;18090:59;18181:2;18166:18;;18011:179::o;18195:343::-;18397:2;18379:21;;;18436:2;18416:18;;;18409:30;-1:-1:-1;;;18470:2:1;18455:18;;18448:49;18529:2;18514:18;;18369:169::o;18543:330::-;18745:2;18727:21;;;18784:1;18764:18;;;18757:29;-1:-1:-1;;;18817:2:1;18802:18;;18795:37;18864:2;18849:18;;18717:156::o;18878:406::-;19080:2;19062:21;;;19119:2;19099:18;;;19092:30;19158:34;19153:2;19138:18;;19131:62;-1:-1:-1;;;19224:2:1;19209:18;;19202:40;19274:3;19259:19;;19052:232::o;19289:355::-;19491:2;19473:21;;;19530:2;19510:18;;;19503:30;19569:33;19564:2;19549:18;;19542:61;19635:2;19620:18;;19463:181::o;19649:418::-;19851:2;19833:21;;;19890:2;19870:18;;;19863:30;19929:34;19924:2;19909:18;;19902:62;-1:-1:-1;;;19995:2:1;19980:18;;19973:52;20057:3;20042:19;;19823:244::o;20072:177::-;20218:25;;;20206:2;20191:18;;20173:76::o;20254:274::-;20428:25;;;-1:-1:-1;;;;;20489:32:1;20484:2;20469:18;;20462:60;20416:2;20401:18;;20383:145::o;20533:345::-;20735:25;;;-1:-1:-1;;;;;20796:32:1;;;;20791:2;20776:18;;20769:60;20860:2;20845:18;;20838:34;20723:2;20708:18;;20690:188::o;20883:256::-;21065:25;;;21121:2;21106:18;;21099:34;21053:2;21038:18;;21020:119::o;21144:353::-;21354:25;;;21410:2;21395:18;;21388:34;;;;-1:-1:-1;;;;;21458:32:1;21453:2;21438:18;;21431:60;21342:2;21327:18;;21309:188::o;22105:319::-;22307:25;;;22363:2;22348:18;;22341:34;;;;22406:2;22391:18;;22384:34;22295:2;22280:18;;22262:162::o;22429:128::-;;22500:1;22496:6;22493:1;22490:13;22487:2;;;22506:18;;:::i;:::-;-1:-1:-1;22542:9:1;;22477:80::o;22562:217::-;;22628:1;22618:2;;-1:-1:-1;;;22653:31:1;;22707:4;22704:1;22697:15;22735:4;22660:1;22725:15;22618:2;-1:-1:-1;22764:9:1;;22608:171::o;22784:168::-;;22890:1;22886;22882:6;22878:14;22875:1;22872:21;22867:1;22860:9;22853:17;22849:45;22846:2;;;22897:18;;:::i;:::-;-1:-1:-1;22937:9:1;;22836:116::o;22957:125::-;;23025:1;23022;23019:8;23016:2;;;23030:18;;:::i;:::-;-1:-1:-1;23067:9:1;;23006:76::o;23087:258::-;23159:1;23169:113;23183:6;23180:1;23177:13;23169:113;;;23259:11;;;23253:18;23240:11;;;23233:39;23205:2;23198:10;23169:113;;;23300:6;23297:1;23294:13;23291:2;;;-1:-1:-1;;23335:1:1;23317:16;;23310:27;23140:205::o;23350:136::-;;23417:5;23407:2;;23426:18;;:::i;:::-;-1:-1:-1;;;23462:18:1;;23397:89::o;23491:135::-;;-1:-1:-1;;23551:17:1;;23548:2;;;23571:18;;:::i;:::-;-1:-1:-1;23618:1:1;23607:13;;23538:88::o;23631:127::-;23692:10;23687:3;23683:20;23680:1;23673:31;23723:4;23720:1;23713:15;23747:4;23744:1;23737:15;23763:127;23824:10;23819:3;23815:20;23812:1;23805:31;23855:4;23852:1;23845:15;23879:4;23876:1;23869:15;23895:133;-1:-1:-1;;;;;23972:31:1;;23962:42;;23952:2;;24018:1;24015;24008:12;24033:120;24121:5;24114:13;24107:21;24100:5;24097:32;24087:2;;24143:1;24140;24133:12
Swarm Source
ipfs://348498fb171c64618821f45be7c112e8c3826f1557d5acc9a8f04112705cbfe5
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.