Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 18897540 | 240 days ago | IN | 0 ETH | 0.06353123 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiquidityProviders
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-30 */ // Sources flattened with hardhat v2.19.4 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] 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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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 make 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; } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/token/ERC20/utils/[email protected] 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 SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20Upgradeable 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( IERC20Upgradeable 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( IERC20Upgradeable 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( IERC20Upgradeable 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(IERC20Upgradeable 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 contracts/hyphen/structures/LpTokenMetadata.sol pragma solidity 0.8.0; struct LpTokenMetadata { address token; uint256 suppliedLiquidity; uint256 shares; } // File contracts/hyphen/interfaces/ILPToken.sol pragma solidity 0.8.0; interface ILPToken { function approve(address to, uint256 tokenId) external; function balanceOf(address _owner) external view returns (uint256); function exists(uint256 _tokenId) external view returns (bool); function getAllNftIdsByUser(address _owner) external view returns (uint256[] memory); function getApproved(uint256 tokenId) external view returns (address); function initialize( string memory _name, string memory _symbol, address _trustedForwarder ) external; function isApprovedForAll(address _owner, address operator) external view returns (bool); function isTrustedForwarder(address forwarder) external view returns (bool); function liquidityPoolAddress() external view returns (address); function mint(address _to) external returns (uint256); function name() external view returns (string memory); function owner() external view returns (address); function ownerOf(uint256 tokenId) external view returns (address); function paused() external view returns (bool); function renounceOwnership() external; function safeTransferFrom( address from, address to, uint256 tokenId ) external; function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) external; function setApprovalForAll(address operator, bool approved) external; function setLiquidityPool(address _lpm) external; function setWhiteListPeriodManager(address _whiteListPeriodManager) external; function supportsInterface(bytes4 interfaceId) external view returns (bool); function symbol() external view returns (string memory); function tokenByIndex(uint256 index) external view returns (uint256); function tokenMetadata(uint256) external view returns ( address token, uint256 totalSuppliedLiquidity, uint256 totalShares ); function tokenOfOwnerByIndex(address _owner, uint256 index) external view returns (uint256); function tokenURI(uint256 tokenId) external view returns (string memory); function totalSupply() external view returns (uint256); function transferFrom( address from, address to, uint256 tokenId ) external; function transferOwnership(address newOwner) external; function updateTokenMetadata(uint256 _tokenId, LpTokenMetadata memory _lpTokenMetadata) external; function whiteListPeriodManager() external view returns (address); } // File contracts/hyphen/structures/TokenConfig.sol pragma solidity 0.8.0; struct TokenInfo { uint256 transferOverhead; bool supportedToken; uint256 equilibriumFee; // Percentage fee Represented in basis points uint256 maxFee; // Percentage fee Represented in basis points TokenConfig tokenConfig; } struct TokenConfig { uint256 min; uint256 max; } // File contracts/hyphen/interfaces/ITokenManager.sol pragma solidity 0.8.0; interface ITokenManager { function getEquilibriumFee(address tokenAddress) external view returns (uint256); function getMaxFee(address tokenAddress) external view returns (uint256); function changeFee( address tokenAddress, uint256 _equilibriumFee, uint256 _maxFee ) external; function tokensInfo(address tokenAddress) external view returns ( uint256 transferOverhead, bool supportedToken, uint256 equilibriumFee, uint256 maxFee, TokenConfig memory config ); function excessStateTransferFeePerc(address tokenAddress) external view returns (uint256); function getTokensInfo(address tokenAddress) external view returns (TokenInfo memory); function getDepositConfig(uint256 toChainId, address tokenAddress) external view returns (TokenConfig memory); function getTransferConfig(address tokenAddress) external view returns (TokenConfig memory); function changeExcessStateFee(address _tokenAddress, uint256 _excessStateFeePer) external; } // File contracts/hyphen/interfaces/ILiquidityPool.sol pragma solidity 0.8.0; interface ILiquidityPool { function baseGas() external view returns (uint256); function changePauser(address newPauser) external; function checkHashStatus( address tokenAddress, uint256 amount, address receiver, bytes memory depositHash ) external view returns (bytes32 hashSendTransaction, bool status); function depositConfig(uint256, address) external view returns (uint256 min, uint256 max); function depositErc20( uint256 toChainId, address tokenAddress, address receiver, uint256 amount, string memory tag ) external; function depositNative( address receiver, uint256 toChainId, string memory tag ) external; function gasFeeAccumulated(address, address) external view returns (uint256); function gasFeeAccumulatedByToken(address) external view returns (uint256); function getCurrentLiquidity(address tokenAddress) external view returns (uint256 currentLiquidity); function getExecutorManager() external view returns (address); function getRewardAmount(uint256 amount, address tokenAddress) external view returns (uint256 rewardAmount); function getTransferFee(address tokenAddress, uint256 amount) external view returns (uint256 fee); function incentivePool(address) external view returns (uint256); function initialize( address _executorManagerAddress, address pauser, address _trustedForwarder, address _tokenManager, address _liquidityProviders ) external; function isPauser(address pauser) external view returns (bool); function isTrustedForwarder(address forwarder) external view returns (bool); function owner() external view returns (address); function paused() external view returns (bool); function processedHash(bytes32) external view returns (bool); function renounceOwnership() external; function renouncePauser() external; function transfer(address _tokenAddress, address receiver, uint256 _tokenAmount) external; function sendFundsToUser( address tokenAddress, uint256 amount, address receiver, bytes memory depositHash, uint256 tokenGasPrice, uint256 fromChainId ) external; function setBaseGas(uint128 gas) external; function setExecutorManager(address _executorManagerAddress) external; function setLiquidityProviders(address _liquidityProviders) external; function setTrustedForwarder(address trustedForwarder) external; function transferConfig(address) external view returns (uint256 min, uint256 max); function transferOwnership(address newOwner) external; function withdrawErc20GasFee(address tokenAddress) external; function withdrawNativeGasFee() external; } // File contracts/hyphen/interfaces/IWhiteListPeriodManager.sol pragma solidity 0.8.0; interface IWhiteListPeriodManager { function areWhiteListRestrictionsEnabled() external view returns (bool); function beforeLiquidityAddition( address _lp, address _token, uint256 _amount ) external; function beforeLiquidityRemoval( address _lp, address _token, uint256 _amount ) external; function beforeLiquidityTransfer( address _from, address _to, address _token, uint256 _amount ) external; function getMaxCommunityLpPositon(address _token) external view returns (uint256); function initialize( address _trustedForwarder, address _liquidityProviders, address _tokenManager ) external; function isExcludedAddress(address) external view returns (bool); function isTrustedForwarder(address forwarder) external view returns (bool); function owner() external view returns (address); function paused() external view returns (bool); function perTokenTotalCap(address) external view returns (uint256); function perTokenWalletCap(address) external view returns (uint256); function renounceOwnership() external; function setAreWhiteListRestrictionsEnabled(bool _status) external; function setCap( address _token, uint256 _totalCap, uint256 _perTokenWalletCap ) external; function setCaps( address[] memory _tokens, uint256[] memory _totalCaps, uint256[] memory _perTokenWalletCaps ) external; function setIsExcludedAddressStatus(address[] memory _addresses, bool[] memory _status) external; function setLiquidityProviders(address _liquidityProviders) external; function setPerTokenWalletCap(address _token, uint256 _perTokenWalletCap) external; function setTokenManager(address _tokenManager) external; function setTotalCap(address _token, uint256 _totalCap) external; function transferOwnership(address newOwner) external; } // File contracts/hyphen/metatx/ERC2771ContextUpgradeable.sol pragma solidity 0.8.0; /** * @dev Context variant with ERC2771 support. * Here _trustedForwarder is made internal instead of private * so it can be changed via Child contracts with a setter method. */ abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable { event TrustedForwarderChanged(address indexed _tf); address internal _trustedForwarder; function __ERC2771Context_init(address trustedForwarder) internal initializer { __Context_init_unchained(); __ERC2771Context_init_unchained(trustedForwarder); } function __ERC2771Context_init_unchained(address trustedForwarder) internal initializer { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } function _setTrustedForwarder(address _tf) internal virtual { require(_tf != address(0), "TrustedForwarder can't be 0"); _trustedForwarder = _tf; emit TrustedForwarderChanged(_tf); } uint256[49] private __gap; } // File contracts/security/Pausable.sol pragma solidity 0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Initializable, PausableUpgradeable { address private _pauser; event PauserChanged(address indexed previousPauser, address indexed newPauser); /** * @dev The pausable constructor sets the original `pauser` of the contract to the sender * account & Initializes the contract in unpaused state.. */ function __Pausable_init(address pauser) internal initializer { require(pauser != address(0), "Pauser Address cannot be 0"); __Pausable_init(); _pauser = pauser; } /** * @return true if `msg.sender` is the owner of the contract. */ function isPauser(address pauser) public view returns (bool) { return pauser == _pauser; } /** * @dev Throws if called by any account other than the pauser. */ modifier onlyPauser() { require(isPauser(msg.sender), "Only pauser is allowed to perform this operation"); _; } /** * @dev Allows the current pauser to transfer control of the contract to a newPauser. * @param newPauser The address to transfer pauserShip to. */ function changePauser(address newPauser) public onlyPauser whenNotPaused { _changePauser(newPauser); } /** * @dev Transfers control of the contract to a newPauser. * @param newPauser The address to transfer ownership to. */ function _changePauser(address newPauser) internal { require(newPauser != address(0)); emit PauserChanged(_pauser, newPauser); _pauser = newPauser; } function renouncePauser() external virtual onlyPauser whenNotPaused { emit PauserChanged(_pauser, address(0)); _pauser = address(0); } function pause() public onlyPauser { _pause(); } function unpause() public onlyPauser { _unpause(); } } // File contracts/hyphen/LiquidityProviders.sol // $$\ $$\ $$\ $$\ $$\ $$\ $$$$$$$\ $$\ $$\ // $$ | \__| \__| $$ |\__| $$ | $$ __$$\ \__| $$ | // $$ | $$\ $$$$$$\ $$\ $$\ $$\ $$$$$$$ |$$\ $$$$$$\ $$\ $$\ $$ | $$ | $$$$$$\ $$$$$$\ $$\ $$\ $$\ $$$$$$$ | $$$$$$\ $$$$$$\ $$$$$$$\ // $$ | $$ |$$ __$$\ $$ | $$ |$$ |$$ __$$ |$$ |\_$$ _| $$ | $$ | $$$$$$$ |$$ __$$\ $$ __$$\\$$\ $$ |$$ |$$ __$$ |$$ __$$\ $$ __$$\ $$ _____| // $$ | $$ |$$ / $$ |$$ | $$ |$$ |$$ / $$ |$$ | $$ | $$ | $$ | $$ ____/ $$ | \__|$$ / $$ |\$$\$$ / $$ |$$ / $$ |$$$$$$$$ |$$ | \__|\$$$$$$\ // $$ | $$ |$$ | $$ |$$ | $$ |$$ |$$ | $$ |$$ | $$ |$$\ $$ | $$ | $$ | $$ | $$ | $$ | \$$$ / $$ |$$ | $$ |$$ ____|$$ | \____$$\ // $$$$$$$$\ $$ |\$$$$$$$ |\$$$$$$ |$$ |\$$$$$$$ |$$ | \$$$$ |\$$$$$$$ | $$ | $$ | \$$$$$$ | \$ / $$ |\$$$$$$$ |\$$$$$$$\ $$ | $$$$$$$ | // \________|\__| \____$$ | \______/ \__| \_______|\__| \____/ \____$$ | \__| \__| \______/ \_/ \__| \_______| \_______|\__| \_______/ // $$ | $$\ $$ | // $$ | \$$$$$$ | // \__| \______/ pragma solidity 0.8.0; contract LiquidityProviders is Initializable, ReentrancyGuardUpgradeable, ERC2771ContextUpgradeable, OwnableUpgradeable, Pausable { using SafeERC20Upgradeable for IERC20Upgradeable; address internal constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint256 public constant BASE_DIVISOR = 10**18; ILPToken internal lpToken; ILiquidityPool internal liquidityPool; ITokenManager internal tokenManager; IWhiteListPeriodManager internal whiteListPeriodManager; event LiquidityAdded(address indexed tokenAddress, uint256 indexed amount, address indexed lp); event LiquidityRemoved(address indexed tokenAddress, uint256 indexed amount, address indexed lp); event FeeClaimed(address indexed tokenAddress, uint256 indexed fee, address indexed lp, uint256 sharesBurnt); event FeeAdded(address indexed tokenAddress, uint256 indexed fee); event EthReceived(address indexed sender, uint256 value); event CurrentLiquidityChanged(address indexed token, uint256 indexed newValue); // LP Fee Distribution mapping(address => uint256) public totalReserve; // Include Liquidity + Fee accumulated mapping(address => uint256) public totalLiquidity; // Include Liquidity only mapping(address => uint256) public currentLiquidity; // Include current liquidity, updated on every in and out transfer mapping(address => uint256) public totalLPFees; mapping(address => uint256) public totalSharesMinted; /** * @dev Modifier for checking to validate a NFTId and it's ownership * @param _tokenId token id to validate * @param _transactor typically msgSender(), passed to verify against owner of _tokenId */ modifier onlyValidLpToken(uint256 _tokenId, address _transactor) { (address token, , ) = lpToken.tokenMetadata(_tokenId); require(lpToken.exists(_tokenId), "ERR__TOKEN_DOES_NOT_EXIST"); require(lpToken.ownerOf(_tokenId) == _transactor, "ERR__TRANSACTOR_DOES_NOT_OWN_NFT"); _; } /** * @dev Modifier for checking if msg.sender in liquiditypool */ modifier onlyLiquidityPool() { require(_msgSender() == address(liquidityPool), "ERR__UNAUTHORIZED"); _; } modifier tokenChecks(address tokenAddress) { require(tokenAddress != address(0), "Token address cannot be 0"); require(_isSupportedToken(tokenAddress), "Token not supported"); _; } /** * @dev initalizes the contract, acts as constructor * @param _trustedForwarder address of trusted forwarder */ function initialize( address _trustedForwarder, address _lpToken, address _tokenManager, address _pauser ) public initializer { __ERC2771Context_init(_trustedForwarder); __Ownable_init(); __Pausable_init(_pauser); __ReentrancyGuard_init(); _setLPToken(_lpToken); _setTokenManager(_tokenManager); } function _isSupportedToken(address _token) internal view returns (bool) { return tokenManager.getTokensInfo(_token).supportedToken; } function getTotalReserveByToken(address tokenAddress) public view returns (uint256) { return totalReserve[tokenAddress]; } function getSuppliedLiquidityByToken(address tokenAddress) public view returns (uint256) { return totalLiquidity[tokenAddress]; } function getTotalLPFeeByToken(address tokenAddress) public view returns (uint256) { return totalLPFees[tokenAddress]; } function getCurrentLiquidity(address tokenAddress) public view returns (uint256) { return currentLiquidity[tokenAddress]; } /** * @dev To be called post initialization, used to set address of NFT Contract * @param _lpToken address of lpToken */ function setLpToken(address _lpToken) external onlyOwner { _setLPToken(_lpToken); } /** * Internal method to set LP token contract. */ function _setLPToken(address _lpToken) internal { lpToken = ILPToken(_lpToken); } function increaseCurrentLiquidity(address tokenAddress, uint256 amount) public onlyLiquidityPool { _increaseCurrentLiquidity(tokenAddress, amount); } function decreaseCurrentLiquidity(address tokenAddress, uint256 amount) public onlyLiquidityPool { _decreaseCurrentLiquidity(tokenAddress, amount); } function _increaseCurrentLiquidity(address tokenAddress, uint256 amount) private { currentLiquidity[tokenAddress] += amount; emit CurrentLiquidityChanged(tokenAddress, currentLiquidity[tokenAddress]); } function _decreaseCurrentLiquidity(address tokenAddress, uint256 amount) private { currentLiquidity[tokenAddress] -= amount; emit CurrentLiquidityChanged(tokenAddress, currentLiquidity[tokenAddress]); } /** * Public method to set TokenManager contract. */ function setTokenManager(address _tokenManager) external onlyOwner { _setTokenManager(_tokenManager); } /** * Internal method to set TokenManager contract. */ function _setTokenManager(address _tokenManager) internal { tokenManager = ITokenManager(_tokenManager); } function setTrustedForwarder(address _tf) external onlyOwner { _setTrustedForwarder(_tf); } /** * @dev To be called post initialization, used to set address of WhiteListPeriodManager Contract * @param _whiteListPeriodManager address of WhiteListPeriodManager */ function setWhiteListPeriodManager(address _whiteListPeriodManager) external onlyOwner { whiteListPeriodManager = IWhiteListPeriodManager(_whiteListPeriodManager); } /** * @dev To be called post initialization, used to set address of LiquidityPool Contract * @param _liquidityPool address of LiquidityPool */ function setLiquidityPool(address _liquidityPool) external onlyOwner { liquidityPool = ILiquidityPool(_liquidityPool); } /** * @dev Returns price of Base token in terms of LP Shares * @param _baseToken address of baseToken * @return Price of Base token in terms of LP Shares */ function getTokenPriceInLPShares(address _baseToken) public view returns (uint256) { uint256 reserve = totalReserve[_baseToken]; if (reserve > 0) { return totalSharesMinted[_baseToken] / totalReserve[_baseToken]; } return BASE_DIVISOR; } /** * @dev Converts shares to token amount */ function sharesToTokenAmount(uint256 _shares, address _tokenAddress) public view returns (uint256) { return (_shares * totalReserve[_tokenAddress]) / totalSharesMinted[_tokenAddress]; } /** * @dev Returns the fee accumulated on a given NFT * @param _nftId Id of NFT * @return accumulated fee */ function getFeeAccumulatedOnNft(uint256 _nftId) public view returns (uint256) { require(lpToken.exists(_nftId), "ERR__INVALID_NFT"); (address _tokenAddress, uint256 nftSuppliedLiquidity, uint256 totalNFTShares) = lpToken.tokenMetadata(_nftId); if (totalNFTShares == 0) { return 0; } // Calculate rewards accumulated uint256 eligibleLiquidity = sharesToTokenAmount(totalNFTShares, _tokenAddress); uint256 lpFeeAccumulated; // Handle edge cases where eligibleLiquidity is less than what was supplied by very small amount if (nftSuppliedLiquidity > eligibleLiquidity) { lpFeeAccumulated = 0; } else { unchecked { lpFeeAccumulated = eligibleLiquidity - nftSuppliedLiquidity; } } return lpFeeAccumulated; } /** * @dev Records fee being added to total reserve * @param _token Address of Token for which LP fee is being added * @param _amount Amount being added */ function addLPFee(address _token, uint256 _amount) external onlyLiquidityPool tokenChecks(_token) whenNotPaused { totalReserve[_token] += _amount; totalLPFees[_token] += _amount; emit FeeAdded(_token, _amount); } /** * @dev Internal function to add liquidity to a new NFT */ function _addLiquidity(address _token, uint256 _amount) internal { require(_amount > 0, "ERR__AMOUNT_IS_0"); uint256 nftId = lpToken.mint(_msgSender()); LpTokenMetadata memory data = LpTokenMetadata(_token, 0, 0); lpToken.updateTokenMetadata(nftId, data); _increaseLiquidity(nftId, _amount); } /** * @dev Function to mint a new NFT for a user, add native liquidity and store the * record in the newly minted NFT */ function addNativeLiquidity() external payable nonReentrant tokenChecks(NATIVE) whenNotPaused { require(address(liquidityPool) != address(0), "ERR__LIQUIDITY_POOL_NOT_SET"); (bool success, ) = address(liquidityPool).call{value: msg.value}(""); require(success, "ERR__NATIVE_TRANSFER_FAILED"); _addLiquidity(NATIVE, msg.value); } /** * @dev Function to mint a new NFT for a user, add token liquidity and store the * record in the newly minted NFT * @param _token Address of token for which liquidity is to be added * @param _amount Amount of liquidity added */ function addTokenLiquidity(address _token, uint256 _amount) external nonReentrant tokenChecks(_token) whenNotPaused { require(_token != NATIVE, "ERR__WRONG_FUNCTION"); require( IERC20Upgradeable(_token).allowance(_msgSender(), address(this)) >= _amount, "ERR__INSUFFICIENT_ALLOWANCE" ); SafeERC20Upgradeable.safeTransferFrom(IERC20Upgradeable(_token), _msgSender(), address(liquidityPool), _amount); _addLiquidity(_token, _amount); } /** * @dev Internal helper function to increase liquidity in a given NFT */ function _increaseLiquidity(uint256 _nftId, uint256 _amount) internal onlyValidLpToken(_nftId, _msgSender()) { (address token, uint256 totalSuppliedLiquidity, uint256 totalShares) = lpToken.tokenMetadata(_nftId); require(_amount != 0, "ERR__AMOUNT_IS_0"); whiteListPeriodManager.beforeLiquidityAddition(_msgSender(), token, _amount); uint256 mintedSharesAmount; // Adding liquidity in the pool for the first time if (totalReserve[token] == 0 || totalSharesMinted[token] == 0) { mintedSharesAmount = BASE_DIVISOR * _amount; } else { mintedSharesAmount = (_amount * totalSharesMinted[token]) / totalReserve[token]; } require(mintedSharesAmount >= BASE_DIVISOR, "ERR__AMOUNT_BELOW_MIN_LIQUIDITY"); totalLiquidity[token] += _amount; totalReserve[token] += _amount; totalSharesMinted[token] += mintedSharesAmount; LpTokenMetadata memory data = LpTokenMetadata( token, totalSuppliedLiquidity + _amount, totalShares + mintedSharesAmount ); lpToken.updateTokenMetadata(_nftId, data); // Increase the current liquidity _increaseCurrentLiquidity(token, _amount); emit LiquidityAdded(token, _amount, _msgSender()); } /** * @dev Function to allow LPs to add ERC20 token liquidity to existing NFT * @param _nftId ID of NFT for updating the balances * @param _amount Token amount to be added */ function increaseTokenLiquidity(uint256 _nftId, uint256 _amount) external nonReentrant whenNotPaused { (address token, , ) = lpToken.tokenMetadata(_nftId); require(_isSupportedToken(token), "ERR__TOKEN_NOT_SUPPORTED"); require(token != NATIVE, "ERR__WRONG_FUNCTION"); require( IERC20Upgradeable(token).allowance(_msgSender(), address(this)) >= _amount, "ERR__INSUFFICIENT_ALLOWANCE" ); SafeERC20Upgradeable.safeTransferFrom(IERC20Upgradeable(token), _msgSender(), address(liquidityPool), _amount); _increaseLiquidity(_nftId, _amount); } /** * @dev Function to allow LPs to add native token liquidity to existing NFT */ function increaseNativeLiquidity(uint256 _nftId) external payable nonReentrant whenNotPaused { (address token, , ) = lpToken.tokenMetadata(_nftId); require(_isSupportedToken(NATIVE), "ERR__TOKEN_NOT_SUPPORTED"); require(token == NATIVE, "ERR__WRONG_FUNCTION"); require(address(liquidityPool) != address(0), "ERR__LIQUIDITY_POOL_NOT_SET"); (bool success, ) = address(liquidityPool).call{value: msg.value}(""); require(success, "ERR__NATIVE_TRANSFER_FAILED"); _increaseLiquidity(_nftId, msg.value); } /** * @dev Function to allow LPs to remove their liquidity from an existing NFT * Also automatically redeems any earned fee */ function removeLiquidity(uint256 _nftId, uint256 _amount) external nonReentrant onlyValidLpToken(_nftId, _msgSender()) whenNotPaused { (address _tokenAddress, uint256 nftSuppliedLiquidity, uint256 totalNFTShares) = lpToken.tokenMetadata(_nftId); require(_isSupportedToken(_tokenAddress), "ERR__TOKEN_NOT_SUPPORTED"); require(_amount != 0, "ERR__INVALID_AMOUNT"); require(nftSuppliedLiquidity >= _amount, "ERR__INSUFFICIENT_LIQUIDITY"); whiteListPeriodManager.beforeLiquidityRemoval(_msgSender(), _tokenAddress, _amount); // Calculate how much shares represent input amount uint256 lpSharesForInputAmount = _amount * getTokenPriceInLPShares(_tokenAddress); // Calculate rewards accumulated uint256 eligibleLiquidity = sharesToTokenAmount(totalNFTShares, _tokenAddress); uint256 lpFeeAccumulated; // Handle edge cases where eligibleLiquidity is less than what was supplied by very small amount if (nftSuppliedLiquidity > eligibleLiquidity) { lpFeeAccumulated = 0; } else { unchecked { lpFeeAccumulated = eligibleLiquidity - nftSuppliedLiquidity; } } // Calculate amount of lp shares that represent accumulated Fee uint256 lpSharesRepresentingFee = lpFeeAccumulated * getTokenPriceInLPShares(_tokenAddress); totalLPFees[_tokenAddress] -= lpFeeAccumulated; uint256 amountToWithdraw = _amount + lpFeeAccumulated; uint256 lpSharesToBurn = lpSharesForInputAmount + lpSharesRepresentingFee; // Handle round off errors to avoid dust lp token in contract if (totalNFTShares - lpSharesToBurn < BASE_DIVISOR) { lpSharesToBurn = totalNFTShares; } totalReserve[_tokenAddress] -= amountToWithdraw; totalLiquidity[_tokenAddress] -= _amount; totalSharesMinted[_tokenAddress] -= lpSharesToBurn; _decreaseCurrentLiquidity(_tokenAddress, _amount); _burnSharesFromNft(_nftId, lpSharesToBurn, _amount, _tokenAddress); _transferFromLiquidityPool(_tokenAddress, _msgSender(), amountToWithdraw); emit LiquidityRemoved(_tokenAddress, amountToWithdraw, _msgSender()); } /** * @dev Function to allow LPs to claim the fee earned on their NFT * @param _nftId ID of NFT where liquidity is recorded */ function claimFee(uint256 _nftId) external onlyValidLpToken(_nftId, _msgSender()) whenNotPaused nonReentrant { (address _tokenAddress, uint256 nftSuppliedLiquidity, uint256 totalNFTShares) = lpToken.tokenMetadata(_nftId); require(_isSupportedToken(_tokenAddress), "ERR__TOKEN_NOT_SUPPORTED"); uint256 lpSharesForSuppliedLiquidity = nftSuppliedLiquidity * getTokenPriceInLPShares(_tokenAddress); // Calculate rewards accumulated uint256 eligibleLiquidity = sharesToTokenAmount(totalNFTShares, _tokenAddress); uint256 lpFeeAccumulated = eligibleLiquidity - nftSuppliedLiquidity; require(lpFeeAccumulated > 0, "ERR__NO_REWARDS_TO_CLAIM"); // Calculate amount of lp shares that represent accumulated Fee uint256 lpSharesRepresentingFee = totalNFTShares - lpSharesForSuppliedLiquidity; totalReserve[_tokenAddress] -= lpFeeAccumulated; totalSharesMinted[_tokenAddress] -= lpSharesRepresentingFee; totalLPFees[_tokenAddress] -= lpFeeAccumulated; _burnSharesFromNft(_nftId, lpSharesRepresentingFee, 0, _tokenAddress); _transferFromLiquidityPool(_tokenAddress, _msgSender(), lpFeeAccumulated); emit FeeClaimed(_tokenAddress, lpFeeAccumulated, _msgSender(), lpSharesRepresentingFee); } /** * @dev Internal Function to burn LP shares and remove liquidity from existing NFT */ function _burnSharesFromNft( uint256 _nftId, uint256 _shares, uint256 _tokenAmount, address _tokenAddress ) internal { (, uint256 nftSuppliedLiquidity, uint256 nftShares) = lpToken.tokenMetadata(_nftId); nftShares -= _shares; nftSuppliedLiquidity -= _tokenAmount; lpToken.updateTokenMetadata(_nftId, LpTokenMetadata(_tokenAddress, nftSuppliedLiquidity, nftShares)); } function _transferFromLiquidityPool( address _tokenAddress, address _receiver, uint256 _tokenAmount ) internal { liquidityPool.transfer(_tokenAddress, _receiver, _tokenAmount); } function getSuppliedLiquidity(uint256 _nftId) external view returns (uint256) { (, uint256 totalSuppliedLiquidity, ) = lpToken.tokenMetadata(_nftId); return totalSuppliedLiquidity; } function setCurrentLiquidity(address tokenAddress, uint256 amount) external onlyLiquidityPool { currentLiquidity[tokenAddress] = amount; } function _msgSender() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (address sender) { return ERC2771ContextUpgradeable._msgSender(); } function _msgData() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (bytes calldata) { return ERC2771ContextUpgradeable._msgData(); } receive() external payable { emit EthReceived(_msgSender(), msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"CurrentLiquidityChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"EthReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"FeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesBurnt","type":"uint256"}],"name":"FeeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lp","type":"address"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"lp","type":"address"}],"name":"LiquidityRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousPauser","type":"address"},{"indexed":true,"internalType":"address","name":"newPauser","type":"address"}],"name":"PauserChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tf","type":"address"}],"name":"TrustedForwarderChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLPFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addNativeLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addTokenLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPauser","type":"address"}],"name":"changePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decreaseCurrentLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getCurrentLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getFeeAccumulatedOnNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getSuppliedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getSuppliedLiquidityByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"}],"name":"getTokenPriceInLPShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTotalLPFeeByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTotalReserveByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseCurrentLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"increaseNativeLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseTokenLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedForwarder","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_tokenManager","type":"address"},{"internalType":"address","name":"_pauser","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauser","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"removeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setCurrentLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityPool","type":"address"}],"name":"setLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"setLpToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenManager","type":"address"}],"name":"setTokenManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tf","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whiteListPeriodManager","type":"address"}],"name":"setWhiteListPeriodManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"sharesToTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalLPFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalSharesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50613ee1806100206000396000f3fe60806040526004361061023f5760003560e01c80639326b08a1161012e578063d1b4f192116100ab578063f0ff372e1161006f578063f0ff372e146106b3578063f2fde38b146106d3578063f667526a146106f3578063f8c8765e14610713578063febb5407146107335761028e565b8063d1b4f19214610613578063d7ac683c14610633578063da74222814610653578063dd8b992314610673578063e479b099146106935761028e565b8063b238b533116100f2578063b238b5331461058b578063b3524e3014610593578063c47296bd146105b3578063c56326de146105d3578063ca2ba943146105f35761028e565b80639326b08a146104f85780639500fefc146105185780639d7de6b31461052b5780639ee933b51461054b578063b0261e531461056b5761028e565b806352a30127116101bc5780636ef8d66d116101805780636ef8d66d14610477578063715018a61461048c5780637cb2b79c146104a15780638456cb59146104c15780638da5cb5b146104d65761028e565b806352a30127146103e257806353403fb514610402578063572b6c05146104225780635c975abb1461044257806364aa1ad2146104575761028e565b80633ed77114116102035780633ed771141461034b5780633f4ba83a1461036057806346fbf68e146103755780634e7e36e2146103a25780634f20f840146103c25761028e565b80630102c1541461029357806301877020146102c957806314fe72aa146102eb5780632cd271e71461030b57806339db7d0e1461032b5761028e565b3661028e5761024c610753565b6001600160a01b03167f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f86695346040516102849190613d75565b60405180910390a2005b600080fd5b34801561029f57600080fd5b506102b36102ae3660046134b2565b610763565b6040516102c09190613d75565b60405180910390f35b3480156102d557600080fd5b506102e96102e43660046134b2565b610783565b005b3480156102f757600080fd5b506102e9610306366004613545565b6107ed565b34801561031757600080fd5b506102e96103263660046134b2565b610998565b34801561033757600080fd5b506102e96103463660046136a1565b6109ee565b34801561035757600080fd5b506102b3610bdc565b34801561036c57600080fd5b506102e9610be8565b34801561038157600080fd5b506103956103903660046134b2565b610c17565b6040516102c09190613730565b3480156103ae57600080fd5b506102b36103bd3660046134b2565b610c2b565b3480156103ce57600080fd5b506102b36103dd366004613672565b610c3e565b3480156103ee57600080fd5b506102b36103fd3660046134b2565b610c7f565b34801561040e57600080fd5b506102e961041d366004613545565b610ce8565b34801561042e57600080fd5b5061039561043d3660046134b2565b610d30565b34801561044e57600080fd5b50610395610d44565b34801561046357600080fd5b506102e9610472366004613545565b610d4d565b34801561048357600080fd5b506102e9610da4565b34801561049857600080fd5b506102e9610e38565b3480156104ad57600080fd5b506102e96104bc3660046134b2565b610e81565b3480156104cd57600080fd5b506102e9610ec9565b3480156104e257600080fd5b506104eb610ef6565b6040516102c091906136de565b34801561050457600080fd5b506102e9610513366004613545565b610f05565b6102e9610526366004613642565b611047565b34801561053757600080fd5b506102e96105463660046136a1565b611241565b34801561055757600080fd5b506102e96105663660046134b2565b611783565b34801561057757600080fd5b506102b36105863660046134b2565b6117cb565b6102e96117de565b34801561059f57600080fd5b506102b36105ae3660046134b2565b611934565b3480156105bf57600080fd5b506102b36105ce366004613642565b611950565b3480156105df57600080fd5b506102b36105ee3660046134b2565b611abc565b3480156105ff57600080fd5b506102b361060e3660046134b2565b611acf565b34801561061f57600080fd5b506102b361062e3660046134b2565b611aeb565b34801561063f57600080fd5b506102b361064e366004613642565b611afe565b34801561065f57600080fd5b506102e961066e3660046134b2565b611b8c565b34801561067f57600080fd5b506102e961068e366004613545565b611bd4565b34801561069f57600080fd5b506102e96106ae3660046134b2565b611c18565b3480156106bf57600080fd5b506102b36106ce3660046134b2565b611c79565b3480156106df57600080fd5b506102e96106ee3660046134b2565b611c95565b3480156106ff57600080fd5b506102e961070e366004613642565b611d03565b34801561071f57600080fd5b506102e961072e3660046134ea565b61213d565b34801561073f57600080fd5b506102b361074e3660046134b2565b6121ea565b600061075d6121fd565b90505b90565b6001600160a01b038116600090815261010060205260409020545b919050565b61078b610753565b6001600160a01b031661079c610ef6565b6001600160a01b0316146107cb5760405162461bcd60e51b81526004016107c2906139ea565b60405180910390fd5b60fd80546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156108105760405162461bcd60e51b81526004016107c290613c8a565b6002600155816001600160a01b03811661083c5760405162461bcd60e51b81526004016107c290613850565b6108458161222b565b6108615760405162461bcd60e51b81526004016107c290613a8d565b610869610d44565b156108865760405162461bcd60e51b81526004016107c290613972565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156108c35760405162461bcd60e51b81526004016107c290613cc1565b81836001600160a01b031663dd62ed3e6108db610753565b306040518363ffffffff1660e01b81526004016108f99291906136f2565b60206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610949919061365a565b10156109675760405162461bcd60e51b81526004016107c290613904565b61098583610973610753565b60fd546001600160a01b0316856122b6565b61098f8383612314565b50506001805550565b6109a133610c17565b6109bd5760405162461bcd60e51b81526004016107c290613cee565b6109c5610d44565b156109e25760405162461bcd60e51b81526004016107c290613972565b6109eb8161244b565b50565b60026001541415610a115760405162461bcd60e51b81526004016107c290613c8a565b6002600155610a1e610d44565b15610a3b5760405162461bcd60e51b81526004016107c290613972565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db6090610a6c908690600401613d75565b60606040518083038186803b158015610a8457600080fd5b505afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190613570565b50509050610ac98161222b565b610ae55760405162461bcd60e51b81526004016107c290613d3e565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610b225760405162461bcd60e51b81526004016107c290613cc1565b81816001600160a01b031663dd62ed3e610b3a610753565b306040518363ffffffff1660e01b8152600401610b589291906136f2565b60206040518083038186803b158015610b7057600080fd5b505afa158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba8919061365a565b1015610bc65760405162461bcd60e51b81526004016107c290613904565b610bd281610973610753565b61098f83836124ba565b670de0b6b3a764000081565b610bf133610c17565b610c0d5760405162461bcd60e51b81526004016107c290613cee565b610c156129e9565b565b60fb546001600160a01b0390811691161490565b6101006020526000908152604090205481565b6001600160a01b03811660009081526101046020908152604080832054610100909252822054610c6e9085613e1e565b610c789190613dfe565b9392505050565b6001600160a01b038116600090815261010060205260408120548015610cd8576001600160a01b0383166000908152610100602090815260408083205461010490925290912054610cd09190613dfe565b91505061077e565b50670de0b6b3a764000092915050565b60fd546001600160a01b0316610cfc610753565b6001600160a01b031614610d225760405162461bcd60e51b81526004016107c290613b7f565b610d2c8282612a57565b5050565b6065546001600160a01b0390811691161490565b60c95460ff1690565b60fd546001600160a01b0316610d61610753565b6001600160a01b031614610d875760405162461bcd60e51b81526004016107c290613b7f565b6001600160a01b0390911660009081526101026020526040902055565b610dad33610c17565b610dc95760405162461bcd60e51b81526004016107c290613cee565b610dd1610d44565b15610dee5760405162461bcd60e51b81526004016107c290613972565b60fb546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a360fb80546001600160a01b0319169055565b610e40610753565b6001600160a01b0316610e51610ef6565b6001600160a01b031614610e775760405162461bcd60e51b81526004016107c2906139ea565b610c156000612acc565b610e89610753565b6001600160a01b0316610e9a610ef6565b6001600160a01b031614610ec05760405162461bcd60e51b81526004016107c2906139ea565b6109eb81612b1e565b610ed233610c17565b610eee5760405162461bcd60e51b81526004016107c290613cee565b610c15612b40565b6097546001600160a01b031690565b60fd546001600160a01b0316610f19610753565b6001600160a01b031614610f3f5760405162461bcd60e51b81526004016107c290613b7f565b816001600160a01b038116610f665760405162461bcd60e51b81526004016107c290613850565b610f6f8161222b565b610f8b5760405162461bcd60e51b81526004016107c290613a8d565b610f93610d44565b15610fb05760405162461bcd60e51b81526004016107c290613972565b6001600160a01b0383166000908152610100602052604081208054849290610fd9908490613de6565b90915550506001600160a01b0383166000908152610103602052604081208054849290611007908490613de6565b909155505060405182906001600160a01b038516907fbf2b46285c2ba2766660d9f8cfafdb8abd51bbba1f29c584b7dd34ecf853dd4c90600090a3505050565b6002600154141561106a5760405162461bcd60e51b81526004016107c290613c8a565b6002600155611077610d44565b156110945760405162461bcd60e51b81526004016107c290613972565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db60906110c5908590600401613d75565b60606040518083038186803b1580156110dd57600080fd5b505afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111159190613570565b5050905061113673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61222b565b6111525760405162461bcd60e51b81526004016107c290613d3e565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461118e5760405162461bcd60e51b81526004016107c290613cc1565b60fd546001600160a01b03166111b65760405162461bcd60e51b81526004016107c290613aba565b60fd546040516000916001600160a01b03169034906111d490610760565b60006040518083038185875af1925050503d8060008114611211576040519150601f19603f3d011682016040523d82523d6000602084013e611216565b606091505b50509050806112375760405162461bcd60e51b81526004016107c2906137d3565b61098f83346124ba565b600260015414156112645760405162461bcd60e51b81526004016107c290613c8a565b600260015581611272610753565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db60906112a3908690600401613d75565b60606040518083038186803b1580156112bb57600080fd5b505afa1580156112cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f39190613570565b505060fc54604051634f558e7960e01b81529192506001600160a01b031690634f558e7990611326908690600401613d75565b60206040518083038186803b15801561133e57600080fd5b505afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137691906135a6565b6113925760405162461bcd60e51b81526004016107c29061379c565b60fc546040516331a9108f60e11b81526001600160a01b03808516921690636352211e906113c4908790600401613d75565b60206040518083038186803b1580156113dc57600080fd5b505afa1580156113f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141491906134ce565b6001600160a01b03161461143a5760405162461bcd60e51b81526004016107c290613be1565b611442610d44565b1561145f5760405162461bcd60e51b81526004016107c290613972565b60fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db6090611494908b90600401613d75565b60606040518083038186803b1580156114ac57600080fd5b505afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e49190613570565b9250925092506114f38361222b565b61150f5760405162461bcd60e51b81526004016107c290613d3e565b8661152c5760405162461bcd60e51b81526004016107c290613b52565b8682101561154c5760405162461bcd60e51b81526004016107c29061393b565b60ff546001600160a01b031663e23fec91611565610753565b858a6040518463ffffffff1660e01b81526004016115859392919061370c565b600060405180830381600087803b15801561159f57600080fd5b505af11580156115b3573d6000803e3d6000fd5b5050505060006115c284610c7f565b6115cc9089613e1e565b905060006115da8386610c3e565b90506000818511156115ee575060006115f3565b508381035b60006115fe87610c7f565b6116089083613e1e565b6001600160a01b03881660009081526101036020526040812080549293508492909190611636908490613e3d565b9091555060009050611648838d613de6565b905060006116568387613de6565b9050670de0b6b3a764000061166b8289613e3d565b10156116745750855b6001600160a01b038916600090815261010060205260408120805484929061169d908490613e3d565b90915550506001600160a01b03891660009081526101016020526040812080548f92906116cb908490613e3d565b90915550506001600160a01b03891660009081526101046020526040812080548392906116f9908490613e3d565b909155506117099050898e612b9b565b6117158e828f8c612bc4565b61172789611721610753565b84612cee565b61172f610753565b6001600160a01b0316828a6001600160a01b03167f70516e69d9b3069ff3184583d867f7a832772e850ba89b554ae06ff752474f9e60405160405180910390a4505060018055505050505050505050505050565b61178b610753565b6001600160a01b031661179c610ef6565b6001600160a01b0316146117c25760405162461bcd60e51b81526004016107c2906139ea565b6109eb81612d59565b6101046020526000908152604090205481565b600260015414156118015760405162461bcd60e51b81526004016107c290613c8a565b600260015573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6118248161222b565b6118405760405162461bcd60e51b81526004016107c290613a8d565b611848610d44565b156118655760405162461bcd60e51b81526004016107c290613972565b60fd546001600160a01b031661188d5760405162461bcd60e51b81526004016107c290613aba565b60fd546040516000916001600160a01b03169034906118ab90610760565b60006040518083038185875af1925050503d80600081146118e8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ed565b606091505b505090508061190e5760405162461bcd60e51b81526004016107c2906137d3565b61192c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee34612314565b505060018055565b6001600160a01b03166000908152610101602052604090205490565b60fc54604051634f558e7960e01b81526000916001600160a01b031690634f558e7990611981908590600401613d75565b60206040518083038186803b15801561199957600080fd5b505afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d191906135a6565b6119ed5760405162461bcd60e51b81526004016107c290613c60565b60fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db6090611a22908890600401613d75565b60606040518083038186803b158015611a3a57600080fd5b505afa158015611a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a729190613570565b9250925092508060001415611a8d576000935050505061077e565b6000611a998285610c3e565b9050600081841115611aad57506000611ab2565b508281035b9695505050505050565b6101016020526000908152604090205481565b6001600160a01b03166000908152610102602052604090205490565b6101036020526000908152604090205481565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090611b33908690600401613d75565b60606040518083038186803b158015611b4b57600080fd5b505afa158015611b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b839190613570565b50949350505050565b611b94610753565b6001600160a01b0316611ba5610ef6565b6001600160a01b031614611bcb5760405162461bcd60e51b81526004016107c2906139ea565b6109eb81612d7b565b60fd546001600160a01b0316611be8610753565b6001600160a01b031614611c0e5760405162461bcd60e51b81526004016107c290613b7f565b610d2c8282612b9b565b611c20610753565b6001600160a01b0316611c31610ef6565b6001600160a01b031614611c575760405162461bcd60e51b81526004016107c2906139ea565b60ff80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03166000908152610103602052604090205490565b611c9d610753565b6001600160a01b0316611cae610ef6565b6001600160a01b031614611cd45760405162461bcd60e51b81526004016107c2906139ea565b6001600160a01b038116611cfa5760405162461bcd60e51b81526004016107c29061380a565b6109eb81612acc565b80611d0c610753565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db6090611d3d908690600401613d75565b60606040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d9190613570565b505060fc54604051634f558e7960e01b81529192506001600160a01b031690634f558e7990611dc0908690600401613d75565b60206040518083038186803b158015611dd857600080fd5b505afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1091906135a6565b611e2c5760405162461bcd60e51b81526004016107c29061379c565b60fc546040516331a9108f60e11b81526001600160a01b03808516921690636352211e90611e5e908790600401613d75565b60206040518083038186803b158015611e7657600080fd5b505afa158015611e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eae91906134ce565b6001600160a01b031614611ed45760405162461bcd60e51b81526004016107c290613be1565b611edc610d44565b15611ef95760405162461bcd60e51b81526004016107c290613972565b60026001541415611f1c5760405162461bcd60e51b81526004016107c290613c8a565b600260015560fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db6090611f56908a90600401613d75565b60606040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa69190613570565b925092509250611fb58361222b565b611fd15760405162461bcd60e51b81526004016107c290613d3e565b6000611fdc84610c7f565b611fe69084613e1e565b90506000611ff48386610c3e565b905060006120028583613e3d565b9050600081116120245760405162461bcd60e51b81526004016107c290613a56565b60006120308486613e3d565b6001600160a01b0388166000908152610100602052604081208054929350849290919061205e908490613e3d565b90915550506001600160a01b038716600090815261010460205260408120805483929061208c908490613e3d565b90915550506001600160a01b03871660009081526101036020526040812080548492906120ba908490613e3d565b909155506120cd90508b8260008a612bc4565b6120d987611721610753565b6120e1610753565b6001600160a01b031682886001600160a01b03167f8e7bf3ba9a828655d38a8746fe5f122e5b02ada0764a356944630cff7eff35e2846040516121249190613d75565b60405180910390a4505060018055505050505050505050565b600054610100900460ff1680612156575060005460ff16155b6121725760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff1615801561219d576000805460ff1961ff0019909116610100171660011790555b6121a685612deb565b6121ae612e71565b6121b782612ef5565b6121bf612fb3565b6121c884612d59565b6121d183612b1e565b80156121e3576000805461ff00191690555b5050505050565b6101026020526000908152604090205481565b600061220833610d30565b1561221c575060131936013560601c610760565b61222461301b565b9050610760565b60fe54604051633e978aaf60e21b81526000916001600160a01b03169063fa5e2abc9061225c9085906004016136de565b60c06040518083038186803b15801561227457600080fd5b505afa158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ac91906135c0565b6020015192915050565b61230e846323b872dd60e01b8585856040516024016122d79392919061370c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261301f565b50505050565b600081116123345760405162461bcd60e51b81526004016107c290613af1565b60fc546000906001600160a01b0316636a627842612350610753565b6040518263ffffffff1660e01b815260040161236c91906136de565b602060405180830381600087803b15801561238657600080fd5b505af115801561239a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123be919061365a565b604080516060810182526001600160a01b0380871682526000602083018190528284015260fc5492516324087a5760e11b81529394509092911690634810f4ae9061240f9085908590600401613d7e565b600060405180830381600087803b15801561242957600080fd5b505af115801561243d573d6000803e3d6000fd5b5050505061230e82846124ba565b6001600160a01b03811661245e57600080fd5b60fb546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a360fb80546001600160a01b0319166001600160a01b0392909216919091179055565b816124c3610753565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db60906124f4908690600401613d75565b60606040518083038186803b15801561250c57600080fd5b505afa158015612520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125449190613570565b505060fc54604051634f558e7960e01b81529192506001600160a01b031690634f558e7990612577908690600401613d75565b60206040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c791906135a6565b6125e35760405162461bcd60e51b81526004016107c29061379c565b60fc546040516331a9108f60e11b81526001600160a01b03808516921690636352211e90612615908790600401613d75565b60206040518083038186803b15801561262d57600080fd5b505afa158015612641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266591906134ce565b6001600160a01b03161461268b5760405162461bcd60e51b81526004016107c290613be1565b60fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db60906126c0908b90600401613d75565b60606040518083038186803b1580156126d857600080fd5b505afa1580156126ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127109190613570565b92509250925086600014156127375760405162461bcd60e51b81526004016107c290613af1565b60ff546001600160a01b031663645625f3612750610753565b858a6040518463ffffffff1660e01b81526004016127709392919061370c565b600060405180830381600087803b15801561278a57600080fd5b505af115801561279e573d6000803e3d6000fd5b505050506001600160a01b0383166000908152610100602052604081205415806127df57506001600160a01b03841660009081526101046020526040902054155b156127fd576127f688670de0b6b3a7640000613e1e565b905061283b565b6001600160a01b038416600090815261010060209081526040808320546101049092529091205461282e908a613e1e565b6128389190613dfe565b90505b670de0b6b3a76400008110156128635760405162461bcd60e51b81526004016107c290613b1b565b6001600160a01b03841660009081526101016020526040812080548a929061288c908490613de6565b90915550506001600160a01b03841660009081526101006020526040812080548a92906128ba908490613de6565b90915550506001600160a01b03841660009081526101046020526040812080548392906128e8908490613de6565b909155505060408051606081019091526001600160a01b0385168152600090602081016129158b87613de6565b81526020016129248486613de6565b905260fc546040516324087a5760e11b81529192506001600160a01b031690634810f4ae90612959908d908590600401613d7e565b600060405180830381600087803b15801561297357600080fd5b505af1158015612987573d6000803e3d6000fd5b50505050612995858a612a57565b61299d610753565b6001600160a01b031689866001600160a01b03167fa21288bdd948f634bcd5a8bfc9825db1b01914f370ef82149e123b7c8dc3b65b60405160405180910390a450505050505050505050565b6129f1610d44565b612a0d5760405162461bcd60e51b81526004016107c29061376e565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a40610753565b604051612a4d91906136de565b60405180910390a1565b6001600160a01b0382166000908152610102602052604081208054839290612a80908490613de6565b90915550506001600160a01b038216600081815261010260205260408082205490519092917ff28044030a28cf7d3fb8e8f7bbaa42aee92214081fd522b3a38afb279577db8991a35050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b612b48610d44565b15612b655760405162461bcd60e51b81526004016107c290613972565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a40610753565b6001600160a01b0382166000908152610102602052604081208054839290612a80908490613e3d565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090612bf9908990600401613d75565b60606040518083038186803b158015612c1157600080fd5b505afa158015612c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c499190613570565b92509250508481612c5a9190613e3d565b9050612c668483613e3d565b60fc54604080516060810182526001600160a01b0387811682526020820185905281830186905291516324087a5760e11b8152939550911691634810f4ae91612cb4918a9190600401613d7e565b600060405180830381600087803b158015612cce57600080fd5b505af1158015612ce2573d6000803e3d6000fd5b50505050505050505050565b60fd546040516317d5759960e31b81526001600160a01b039091169063beabacc890612d229086908690869060040161370c565b600060405180830381600087803b158015612d3c57600080fd5b505af1158015612d50573d6000803e3d6000fd5b50505050505050565b60fc80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116612da15760405162461bcd60e51b81526004016107c290613887565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f871264f4293af7d2865ae7eae628b228f4991c57cb45b39c99f0b774ebe2901890600090a250565b600054610100900460ff1680612e04575060005460ff16155b612e205760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612e4b576000805460ff1961ff0019909116610100171660011790555b612e536130b3565b612e5c82613126565b8015610d2c576000805461ff00191690555050565b600054610100900460ff1680612e8a575060005460ff16155b612ea65760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612ed1576000805460ff1961ff0019909116610100171660011790555b612ed96130b3565b612ee16131b6565b80156109eb576000805461ff001916905550565b600054610100900460ff1680612f0e575060005460ff16155b612f2a5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612f55576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216612f7b5760405162461bcd60e51b81526004016107c290613a1f565b612f83613226565b60fb80546001600160a01b0319166001600160a01b0384161790558015610d2c576000805461ff00191690555050565b600054610100900460ff1680612fcc575060005460ff16155b612fe85760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613013576000805460ff1961ff0019909116610100171660011790555b612ee1613296565b3390565b6000613074826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661330e9092919063ffffffff16565b8051909150156130ae578080602001905181019061309291906135a6565b6130ae5760405162461bcd60e51b81526004016107c290613c16565b505050565b600054610100900460ff16806130cc575060005460ff16155b6130e85760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612ee1576000805460ff1961ff00199091166101001716600117905580156109eb576000805461ff001916905550565b600054610100900460ff168061313f575060005460ff16155b61315b5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613186576000805460ff1961ff0019909116610100171660011790555b606580546001600160a01b0319166001600160a01b0384161790558015610d2c576000805461ff00191690555050565b600054610100900460ff16806131cf575060005460ff16155b6131eb5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613216576000805460ff1961ff0019909116610100171660011790555b612ee1613221610753565b612acc565b600054610100900460ff168061323f575060005460ff16155b61325b5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613286576000805460ff1961ff0019909116610100171660011790555b61328e6130b3565b612ee1613325565b600054610100900460ff16806132af575060005460ff16155b6132cb5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff161580156132f6576000805460ff1961ff0019909116610100171660011790555b6001805580156109eb576000805461ff001916905550565b606061331d84846000856133a3565b949350505050565b600054610100900460ff168061333e575060005460ff16155b61335a5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613385576000805460ff1961ff0019909116610100171660011790555b60c9805460ff1916905580156109eb576000805461ff001916905550565b6060824710156133c55760405162461bcd60e51b81526004016107c2906138be565b6133ce85613463565b6133ea5760405162461bcd60e51b81526004016107c290613baa565b600080866001600160a01b0316858760405161340691906136c2565b60006040518083038185875af1925050503d8060008114613443576040519150601f19603f3d011682016040523d82523d6000602084013e613448565b606091505b5091509150613458828286613469565b979650505050505050565b3b151590565b60608315613478575081610c78565b8251156134885782518084602001fd5b8160405162461bcd60e51b81526004016107c2919061373b565b8051801515811461077e57600080fd5b6000602082840312156134c3578081fd5b8135610c7881613e96565b6000602082840312156134df578081fd5b8151610c7881613e96565b600080600080608085870312156134ff578283fd5b843561350a81613e96565b9350602085013561351a81613e96565b9250604085013561352a81613e96565b9150606085013561353a81613e96565b939692955090935050565b60008060408385031215613557578182fd5b823561356281613e96565b946020939093013593505050565b600080600060608486031215613584578283fd5b835161358f81613e96565b602085015160409095015190969495509392505050565b6000602082840312156135b7578081fd5b610c78826134a2565b600081830360c08112156135d2578182fd5b6135dc60a0613dae565b835181526135ec602085016134a2565b602082015260408401516040820152606084015160608201526040607f1983011215613616578283fd5b6136206040613dae565b608085810151825260a090950151602082015293810193909352509092915050565b600060208284031215613653578081fd5b5035919050565b60006020828403121561366b578081fd5b5051919050565b60008060408385031215613684578182fd5b82359150602083013561369681613e96565b809150509250929050565b600080604083850312156136b3578182fd5b50508035926020909101359150565b600082516136d4818460208701613e54565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b600060208252825180602084015261375a816040850160208701613e54565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526019908201527f4552525f5f544f4b454e5f444f45535f4e4f545f455849535400000000000000604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f546f6b656e20616464726573732063616e6e6f74206265203000000000000000604082015260600190565b6020808252601b908201527f54727573746564466f727761726465722063616e277420626520300000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601b908201527f4552525f5f494e53554646494349454e545f414c4c4f57414e43450000000000604082015260600190565b6020808252601b908201527f4552525f5f494e53554646494349454e545f4c49515549444954590000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b60208082526018908201527f4552525f5f4e4f5f524557415244535f544f5f434c41494d0000000000000000604082015260600190565b602080825260139082015272151bdad95b881b9bdd081cdd5c1c1bdc9d1959606a1b604082015260600190565b6020808252601b908201527f4552525f5f4c49515549444954595f504f4f4c5f4e4f545f5345540000000000604082015260600190565b60208082526010908201526f04552525f5f414d4f554e545f49535f360841b604082015260600190565b6020808252601f908201527f4552525f5f414d4f554e545f42454c4f575f4d494e5f4c495155494449545900604082015260600190565b60208082526013908201527211549497d7d253959053125117d05353d55395606a1b604082015260600190565b60208082526011908201527011549497d7d5539055551213d492569151607a1b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252818101527f4552525f5f5452414e534143544f525f444f45535f4e4f545f4f574e5f4e4654604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526010908201526f11549497d7d253959053125117d3919560821b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526013908201527222a9292fafaba927a723afa32aa721aa24a7a760691b604082015260600190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b60208082526018908201527f4552525f5f544f4b454e5f4e4f545f535550504f525445440000000000000000604082015260600190565b90815260200190565b91825280516001600160a01b03166020808401919091528101516040808401919091520151606082015260800190565b60405181810167ffffffffffffffff81118282101715613dde57634e487b7160e01b600052604160045260246000fd5b604052919050565b60008219821115613df957613df9613e80565b500190565b600082613e1957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613e3857613e38613e80565b500290565b600082821015613e4f57613e4f613e80565b500390565b60005b83811015613e6f578181015183820152602001613e57565b8381111561230e5750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146109eb57600080fdfea26469706673582212200694930dff4a04862ed4f5d0fa1abd0b3a19a4f070cccd2fd78bfed6de085b1c64736f6c63430008000033
Deployed Bytecode
0x60806040526004361061023f5760003560e01c80639326b08a1161012e578063d1b4f192116100ab578063f0ff372e1161006f578063f0ff372e146106b3578063f2fde38b146106d3578063f667526a146106f3578063f8c8765e14610713578063febb5407146107335761028e565b8063d1b4f19214610613578063d7ac683c14610633578063da74222814610653578063dd8b992314610673578063e479b099146106935761028e565b8063b238b533116100f2578063b238b5331461058b578063b3524e3014610593578063c47296bd146105b3578063c56326de146105d3578063ca2ba943146105f35761028e565b80639326b08a146104f85780639500fefc146105185780639d7de6b31461052b5780639ee933b51461054b578063b0261e531461056b5761028e565b806352a30127116101bc5780636ef8d66d116101805780636ef8d66d14610477578063715018a61461048c5780637cb2b79c146104a15780638456cb59146104c15780638da5cb5b146104d65761028e565b806352a30127146103e257806353403fb514610402578063572b6c05146104225780635c975abb1461044257806364aa1ad2146104575761028e565b80633ed77114116102035780633ed771141461034b5780633f4ba83a1461036057806346fbf68e146103755780634e7e36e2146103a25780634f20f840146103c25761028e565b80630102c1541461029357806301877020146102c957806314fe72aa146102eb5780632cd271e71461030b57806339db7d0e1461032b5761028e565b3661028e5761024c610753565b6001600160a01b03167f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f86695346040516102849190613d75565b60405180910390a2005b600080fd5b34801561029f57600080fd5b506102b36102ae3660046134b2565b610763565b6040516102c09190613d75565b60405180910390f35b3480156102d557600080fd5b506102e96102e43660046134b2565b610783565b005b3480156102f757600080fd5b506102e9610306366004613545565b6107ed565b34801561031757600080fd5b506102e96103263660046134b2565b610998565b34801561033757600080fd5b506102e96103463660046136a1565b6109ee565b34801561035757600080fd5b506102b3610bdc565b34801561036c57600080fd5b506102e9610be8565b34801561038157600080fd5b506103956103903660046134b2565b610c17565b6040516102c09190613730565b3480156103ae57600080fd5b506102b36103bd3660046134b2565b610c2b565b3480156103ce57600080fd5b506102b36103dd366004613672565b610c3e565b3480156103ee57600080fd5b506102b36103fd3660046134b2565b610c7f565b34801561040e57600080fd5b506102e961041d366004613545565b610ce8565b34801561042e57600080fd5b5061039561043d3660046134b2565b610d30565b34801561044e57600080fd5b50610395610d44565b34801561046357600080fd5b506102e9610472366004613545565b610d4d565b34801561048357600080fd5b506102e9610da4565b34801561049857600080fd5b506102e9610e38565b3480156104ad57600080fd5b506102e96104bc3660046134b2565b610e81565b3480156104cd57600080fd5b506102e9610ec9565b3480156104e257600080fd5b506104eb610ef6565b6040516102c091906136de565b34801561050457600080fd5b506102e9610513366004613545565b610f05565b6102e9610526366004613642565b611047565b34801561053757600080fd5b506102e96105463660046136a1565b611241565b34801561055757600080fd5b506102e96105663660046134b2565b611783565b34801561057757600080fd5b506102b36105863660046134b2565b6117cb565b6102e96117de565b34801561059f57600080fd5b506102b36105ae3660046134b2565b611934565b3480156105bf57600080fd5b506102b36105ce366004613642565b611950565b3480156105df57600080fd5b506102b36105ee3660046134b2565b611abc565b3480156105ff57600080fd5b506102b361060e3660046134b2565b611acf565b34801561061f57600080fd5b506102b361062e3660046134b2565b611aeb565b34801561063f57600080fd5b506102b361064e366004613642565b611afe565b34801561065f57600080fd5b506102e961066e3660046134b2565b611b8c565b34801561067f57600080fd5b506102e961068e366004613545565b611bd4565b34801561069f57600080fd5b506102e96106ae3660046134b2565b611c18565b3480156106bf57600080fd5b506102b36106ce3660046134b2565b611c79565b3480156106df57600080fd5b506102e96106ee3660046134b2565b611c95565b3480156106ff57600080fd5b506102e961070e366004613642565b611d03565b34801561071f57600080fd5b506102e961072e3660046134ea565b61213d565b34801561073f57600080fd5b506102b361074e3660046134b2565b6121ea565b600061075d6121fd565b90505b90565b6001600160a01b038116600090815261010060205260409020545b919050565b61078b610753565b6001600160a01b031661079c610ef6565b6001600160a01b0316146107cb5760405162461bcd60e51b81526004016107c2906139ea565b60405180910390fd5b60fd80546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156108105760405162461bcd60e51b81526004016107c290613c8a565b6002600155816001600160a01b03811661083c5760405162461bcd60e51b81526004016107c290613850565b6108458161222b565b6108615760405162461bcd60e51b81526004016107c290613a8d565b610869610d44565b156108865760405162461bcd60e51b81526004016107c290613972565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156108c35760405162461bcd60e51b81526004016107c290613cc1565b81836001600160a01b031663dd62ed3e6108db610753565b306040518363ffffffff1660e01b81526004016108f99291906136f2565b60206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610949919061365a565b10156109675760405162461bcd60e51b81526004016107c290613904565b61098583610973610753565b60fd546001600160a01b0316856122b6565b61098f8383612314565b50506001805550565b6109a133610c17565b6109bd5760405162461bcd60e51b81526004016107c290613cee565b6109c5610d44565b156109e25760405162461bcd60e51b81526004016107c290613972565b6109eb8161244b565b50565b60026001541415610a115760405162461bcd60e51b81526004016107c290613c8a565b6002600155610a1e610d44565b15610a3b5760405162461bcd60e51b81526004016107c290613972565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db6090610a6c908690600401613d75565b60606040518083038186803b158015610a8457600080fd5b505afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190613570565b50509050610ac98161222b565b610ae55760405162461bcd60e51b81526004016107c290613d3e565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610b225760405162461bcd60e51b81526004016107c290613cc1565b81816001600160a01b031663dd62ed3e610b3a610753565b306040518363ffffffff1660e01b8152600401610b589291906136f2565b60206040518083038186803b158015610b7057600080fd5b505afa158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba8919061365a565b1015610bc65760405162461bcd60e51b81526004016107c290613904565b610bd281610973610753565b61098f83836124ba565b670de0b6b3a764000081565b610bf133610c17565b610c0d5760405162461bcd60e51b81526004016107c290613cee565b610c156129e9565b565b60fb546001600160a01b0390811691161490565b6101006020526000908152604090205481565b6001600160a01b03811660009081526101046020908152604080832054610100909252822054610c6e9085613e1e565b610c789190613dfe565b9392505050565b6001600160a01b038116600090815261010060205260408120548015610cd8576001600160a01b0383166000908152610100602090815260408083205461010490925290912054610cd09190613dfe565b91505061077e565b50670de0b6b3a764000092915050565b60fd546001600160a01b0316610cfc610753565b6001600160a01b031614610d225760405162461bcd60e51b81526004016107c290613b7f565b610d2c8282612a57565b5050565b6065546001600160a01b0390811691161490565b60c95460ff1690565b60fd546001600160a01b0316610d61610753565b6001600160a01b031614610d875760405162461bcd60e51b81526004016107c290613b7f565b6001600160a01b0390911660009081526101026020526040902055565b610dad33610c17565b610dc95760405162461bcd60e51b81526004016107c290613cee565b610dd1610d44565b15610dee5760405162461bcd60e51b81526004016107c290613972565b60fb546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a360fb80546001600160a01b0319169055565b610e40610753565b6001600160a01b0316610e51610ef6565b6001600160a01b031614610e775760405162461bcd60e51b81526004016107c2906139ea565b610c156000612acc565b610e89610753565b6001600160a01b0316610e9a610ef6565b6001600160a01b031614610ec05760405162461bcd60e51b81526004016107c2906139ea565b6109eb81612b1e565b610ed233610c17565b610eee5760405162461bcd60e51b81526004016107c290613cee565b610c15612b40565b6097546001600160a01b031690565b60fd546001600160a01b0316610f19610753565b6001600160a01b031614610f3f5760405162461bcd60e51b81526004016107c290613b7f565b816001600160a01b038116610f665760405162461bcd60e51b81526004016107c290613850565b610f6f8161222b565b610f8b5760405162461bcd60e51b81526004016107c290613a8d565b610f93610d44565b15610fb05760405162461bcd60e51b81526004016107c290613972565b6001600160a01b0383166000908152610100602052604081208054849290610fd9908490613de6565b90915550506001600160a01b0383166000908152610103602052604081208054849290611007908490613de6565b909155505060405182906001600160a01b038516907fbf2b46285c2ba2766660d9f8cfafdb8abd51bbba1f29c584b7dd34ecf853dd4c90600090a3505050565b6002600154141561106a5760405162461bcd60e51b81526004016107c290613c8a565b6002600155611077610d44565b156110945760405162461bcd60e51b81526004016107c290613972565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db60906110c5908590600401613d75565b60606040518083038186803b1580156110dd57600080fd5b505afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111159190613570565b5050905061113673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61222b565b6111525760405162461bcd60e51b81526004016107c290613d3e565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461118e5760405162461bcd60e51b81526004016107c290613cc1565b60fd546001600160a01b03166111b65760405162461bcd60e51b81526004016107c290613aba565b60fd546040516000916001600160a01b03169034906111d490610760565b60006040518083038185875af1925050503d8060008114611211576040519150601f19603f3d011682016040523d82523d6000602084013e611216565b606091505b50509050806112375760405162461bcd60e51b81526004016107c2906137d3565b61098f83346124ba565b600260015414156112645760405162461bcd60e51b81526004016107c290613c8a565b600260015581611272610753565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db60906112a3908690600401613d75565b60606040518083038186803b1580156112bb57600080fd5b505afa1580156112cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f39190613570565b505060fc54604051634f558e7960e01b81529192506001600160a01b031690634f558e7990611326908690600401613d75565b60206040518083038186803b15801561133e57600080fd5b505afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137691906135a6565b6113925760405162461bcd60e51b81526004016107c29061379c565b60fc546040516331a9108f60e11b81526001600160a01b03808516921690636352211e906113c4908790600401613d75565b60206040518083038186803b1580156113dc57600080fd5b505afa1580156113f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141491906134ce565b6001600160a01b03161461143a5760405162461bcd60e51b81526004016107c290613be1565b611442610d44565b1561145f5760405162461bcd60e51b81526004016107c290613972565b60fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db6090611494908b90600401613d75565b60606040518083038186803b1580156114ac57600080fd5b505afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e49190613570565b9250925092506114f38361222b565b61150f5760405162461bcd60e51b81526004016107c290613d3e565b8661152c5760405162461bcd60e51b81526004016107c290613b52565b8682101561154c5760405162461bcd60e51b81526004016107c29061393b565b60ff546001600160a01b031663e23fec91611565610753565b858a6040518463ffffffff1660e01b81526004016115859392919061370c565b600060405180830381600087803b15801561159f57600080fd5b505af11580156115b3573d6000803e3d6000fd5b5050505060006115c284610c7f565b6115cc9089613e1e565b905060006115da8386610c3e565b90506000818511156115ee575060006115f3565b508381035b60006115fe87610c7f565b6116089083613e1e565b6001600160a01b03881660009081526101036020526040812080549293508492909190611636908490613e3d565b9091555060009050611648838d613de6565b905060006116568387613de6565b9050670de0b6b3a764000061166b8289613e3d565b10156116745750855b6001600160a01b038916600090815261010060205260408120805484929061169d908490613e3d565b90915550506001600160a01b03891660009081526101016020526040812080548f92906116cb908490613e3d565b90915550506001600160a01b03891660009081526101046020526040812080548392906116f9908490613e3d565b909155506117099050898e612b9b565b6117158e828f8c612bc4565b61172789611721610753565b84612cee565b61172f610753565b6001600160a01b0316828a6001600160a01b03167f70516e69d9b3069ff3184583d867f7a832772e850ba89b554ae06ff752474f9e60405160405180910390a4505060018055505050505050505050505050565b61178b610753565b6001600160a01b031661179c610ef6565b6001600160a01b0316146117c25760405162461bcd60e51b81526004016107c2906139ea565b6109eb81612d59565b6101046020526000908152604090205481565b600260015414156118015760405162461bcd60e51b81526004016107c290613c8a565b600260015573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6118248161222b565b6118405760405162461bcd60e51b81526004016107c290613a8d565b611848610d44565b156118655760405162461bcd60e51b81526004016107c290613972565b60fd546001600160a01b031661188d5760405162461bcd60e51b81526004016107c290613aba565b60fd546040516000916001600160a01b03169034906118ab90610760565b60006040518083038185875af1925050503d80600081146118e8576040519150601f19603f3d011682016040523d82523d6000602084013e6118ed565b606091505b505090508061190e5760405162461bcd60e51b81526004016107c2906137d3565b61192c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee34612314565b505060018055565b6001600160a01b03166000908152610101602052604090205490565b60fc54604051634f558e7960e01b81526000916001600160a01b031690634f558e7990611981908590600401613d75565b60206040518083038186803b15801561199957600080fd5b505afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d191906135a6565b6119ed5760405162461bcd60e51b81526004016107c290613c60565b60fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db6090611a22908890600401613d75565b60606040518083038186803b158015611a3a57600080fd5b505afa158015611a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a729190613570565b9250925092508060001415611a8d576000935050505061077e565b6000611a998285610c3e565b9050600081841115611aad57506000611ab2565b508281035b9695505050505050565b6101016020526000908152604090205481565b6001600160a01b03166000908152610102602052604090205490565b6101036020526000908152604090205481565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090611b33908690600401613d75565b60606040518083038186803b158015611b4b57600080fd5b505afa158015611b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b839190613570565b50949350505050565b611b94610753565b6001600160a01b0316611ba5610ef6565b6001600160a01b031614611bcb5760405162461bcd60e51b81526004016107c2906139ea565b6109eb81612d7b565b60fd546001600160a01b0316611be8610753565b6001600160a01b031614611c0e5760405162461bcd60e51b81526004016107c290613b7f565b610d2c8282612b9b565b611c20610753565b6001600160a01b0316611c31610ef6565b6001600160a01b031614611c575760405162461bcd60e51b81526004016107c2906139ea565b60ff80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03166000908152610103602052604090205490565b611c9d610753565b6001600160a01b0316611cae610ef6565b6001600160a01b031614611cd45760405162461bcd60e51b81526004016107c2906139ea565b6001600160a01b038116611cfa5760405162461bcd60e51b81526004016107c29061380a565b6109eb81612acc565b80611d0c610753565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db6090611d3d908690600401613d75565b60606040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d9190613570565b505060fc54604051634f558e7960e01b81529192506001600160a01b031690634f558e7990611dc0908690600401613d75565b60206040518083038186803b158015611dd857600080fd5b505afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1091906135a6565b611e2c5760405162461bcd60e51b81526004016107c29061379c565b60fc546040516331a9108f60e11b81526001600160a01b03808516921690636352211e90611e5e908790600401613d75565b60206040518083038186803b158015611e7657600080fd5b505afa158015611e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eae91906134ce565b6001600160a01b031614611ed45760405162461bcd60e51b81526004016107c290613be1565b611edc610d44565b15611ef95760405162461bcd60e51b81526004016107c290613972565b60026001541415611f1c5760405162461bcd60e51b81526004016107c290613c8a565b600260015560fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db6090611f56908a90600401613d75565b60606040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa69190613570565b925092509250611fb58361222b565b611fd15760405162461bcd60e51b81526004016107c290613d3e565b6000611fdc84610c7f565b611fe69084613e1e565b90506000611ff48386610c3e565b905060006120028583613e3d565b9050600081116120245760405162461bcd60e51b81526004016107c290613a56565b60006120308486613e3d565b6001600160a01b0388166000908152610100602052604081208054929350849290919061205e908490613e3d565b90915550506001600160a01b038716600090815261010460205260408120805483929061208c908490613e3d565b90915550506001600160a01b03871660009081526101036020526040812080548492906120ba908490613e3d565b909155506120cd90508b8260008a612bc4565b6120d987611721610753565b6120e1610753565b6001600160a01b031682886001600160a01b03167f8e7bf3ba9a828655d38a8746fe5f122e5b02ada0764a356944630cff7eff35e2846040516121249190613d75565b60405180910390a4505060018055505050505050505050565b600054610100900460ff1680612156575060005460ff16155b6121725760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff1615801561219d576000805460ff1961ff0019909116610100171660011790555b6121a685612deb565b6121ae612e71565b6121b782612ef5565b6121bf612fb3565b6121c884612d59565b6121d183612b1e565b80156121e3576000805461ff00191690555b5050505050565b6101026020526000908152604090205481565b600061220833610d30565b1561221c575060131936013560601c610760565b61222461301b565b9050610760565b60fe54604051633e978aaf60e21b81526000916001600160a01b03169063fa5e2abc9061225c9085906004016136de565b60c06040518083038186803b15801561227457600080fd5b505afa158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ac91906135c0565b6020015192915050565b61230e846323b872dd60e01b8585856040516024016122d79392919061370c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261301f565b50505050565b600081116123345760405162461bcd60e51b81526004016107c290613af1565b60fc546000906001600160a01b0316636a627842612350610753565b6040518263ffffffff1660e01b815260040161236c91906136de565b602060405180830381600087803b15801561238657600080fd5b505af115801561239a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123be919061365a565b604080516060810182526001600160a01b0380871682526000602083018190528284015260fc5492516324087a5760e11b81529394509092911690634810f4ae9061240f9085908590600401613d7e565b600060405180830381600087803b15801561242957600080fd5b505af115801561243d573d6000803e3d6000fd5b5050505061230e82846124ba565b6001600160a01b03811661245e57600080fd5b60fb546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a360fb80546001600160a01b0319166001600160a01b0392909216919091179055565b816124c3610753565b60fc54604051630348a6db60e51b81526000916001600160a01b031690636914db60906124f4908690600401613d75565b60606040518083038186803b15801561250c57600080fd5b505afa158015612520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125449190613570565b505060fc54604051634f558e7960e01b81529192506001600160a01b031690634f558e7990612577908690600401613d75565b60206040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c791906135a6565b6125e35760405162461bcd60e51b81526004016107c29061379c565b60fc546040516331a9108f60e11b81526001600160a01b03808516921690636352211e90612615908790600401613d75565b60206040518083038186803b15801561262d57600080fd5b505afa158015612641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266591906134ce565b6001600160a01b03161461268b5760405162461bcd60e51b81526004016107c290613be1565b60fc54604051630348a6db60e51b8152600091829182916001600160a01b031690636914db60906126c0908b90600401613d75565b60606040518083038186803b1580156126d857600080fd5b505afa1580156126ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127109190613570565b92509250925086600014156127375760405162461bcd60e51b81526004016107c290613af1565b60ff546001600160a01b031663645625f3612750610753565b858a6040518463ffffffff1660e01b81526004016127709392919061370c565b600060405180830381600087803b15801561278a57600080fd5b505af115801561279e573d6000803e3d6000fd5b505050506001600160a01b0383166000908152610100602052604081205415806127df57506001600160a01b03841660009081526101046020526040902054155b156127fd576127f688670de0b6b3a7640000613e1e565b905061283b565b6001600160a01b038416600090815261010060209081526040808320546101049092529091205461282e908a613e1e565b6128389190613dfe565b90505b670de0b6b3a76400008110156128635760405162461bcd60e51b81526004016107c290613b1b565b6001600160a01b03841660009081526101016020526040812080548a929061288c908490613de6565b90915550506001600160a01b03841660009081526101006020526040812080548a92906128ba908490613de6565b90915550506001600160a01b03841660009081526101046020526040812080548392906128e8908490613de6565b909155505060408051606081019091526001600160a01b0385168152600090602081016129158b87613de6565b81526020016129248486613de6565b905260fc546040516324087a5760e11b81529192506001600160a01b031690634810f4ae90612959908d908590600401613d7e565b600060405180830381600087803b15801561297357600080fd5b505af1158015612987573d6000803e3d6000fd5b50505050612995858a612a57565b61299d610753565b6001600160a01b031689866001600160a01b03167fa21288bdd948f634bcd5a8bfc9825db1b01914f370ef82149e123b7c8dc3b65b60405160405180910390a450505050505050505050565b6129f1610d44565b612a0d5760405162461bcd60e51b81526004016107c29061376e565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a40610753565b604051612a4d91906136de565b60405180910390a1565b6001600160a01b0382166000908152610102602052604081208054839290612a80908490613de6565b90915550506001600160a01b038216600081815261010260205260408082205490519092917ff28044030a28cf7d3fb8e8f7bbaa42aee92214081fd522b3a38afb279577db8991a35050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b612b48610d44565b15612b655760405162461bcd60e51b81526004016107c290613972565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a40610753565b6001600160a01b0382166000908152610102602052604081208054839290612a80908490613e3d565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090612bf9908990600401613d75565b60606040518083038186803b158015612c1157600080fd5b505afa158015612c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c499190613570565b92509250508481612c5a9190613e3d565b9050612c668483613e3d565b60fc54604080516060810182526001600160a01b0387811682526020820185905281830186905291516324087a5760e11b8152939550911691634810f4ae91612cb4918a9190600401613d7e565b600060405180830381600087803b158015612cce57600080fd5b505af1158015612ce2573d6000803e3d6000fd5b50505050505050505050565b60fd546040516317d5759960e31b81526001600160a01b039091169063beabacc890612d229086908690869060040161370c565b600060405180830381600087803b158015612d3c57600080fd5b505af1158015612d50573d6000803e3d6000fd5b50505050505050565b60fc80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116612da15760405162461bcd60e51b81526004016107c290613887565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f871264f4293af7d2865ae7eae628b228f4991c57cb45b39c99f0b774ebe2901890600090a250565b600054610100900460ff1680612e04575060005460ff16155b612e205760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612e4b576000805460ff1961ff0019909116610100171660011790555b612e536130b3565b612e5c82613126565b8015610d2c576000805461ff00191690555050565b600054610100900460ff1680612e8a575060005460ff16155b612ea65760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612ed1576000805460ff1961ff0019909116610100171660011790555b612ed96130b3565b612ee16131b6565b80156109eb576000805461ff001916905550565b600054610100900460ff1680612f0e575060005460ff16155b612f2a5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612f55576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216612f7b5760405162461bcd60e51b81526004016107c290613a1f565b612f83613226565b60fb80546001600160a01b0319166001600160a01b0384161790558015610d2c576000805461ff00191690555050565b600054610100900460ff1680612fcc575060005460ff16155b612fe85760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613013576000805460ff1961ff0019909116610100171660011790555b612ee1613296565b3390565b6000613074826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661330e9092919063ffffffff16565b8051909150156130ae578080602001905181019061309291906135a6565b6130ae5760405162461bcd60e51b81526004016107c290613c16565b505050565b600054610100900460ff16806130cc575060005460ff16155b6130e85760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015612ee1576000805460ff1961ff00199091166101001716600117905580156109eb576000805461ff001916905550565b600054610100900460ff168061313f575060005460ff16155b61315b5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613186576000805460ff1961ff0019909116610100171660011790555b606580546001600160a01b0319166001600160a01b0384161790558015610d2c576000805461ff00191690555050565b600054610100900460ff16806131cf575060005460ff16155b6131eb5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613216576000805460ff1961ff0019909116610100171660011790555b612ee1613221610753565b612acc565b600054610100900460ff168061323f575060005460ff16155b61325b5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613286576000805460ff1961ff0019909116610100171660011790555b61328e6130b3565b612ee1613325565b600054610100900460ff16806132af575060005460ff16155b6132cb5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff161580156132f6576000805460ff1961ff0019909116610100171660011790555b6001805580156109eb576000805461ff001916905550565b606061331d84846000856133a3565b949350505050565b600054610100900460ff168061333e575060005460ff16155b61335a5760405162461bcd60e51b81526004016107c29061399c565b600054610100900460ff16158015613385576000805460ff1961ff0019909116610100171660011790555b60c9805460ff1916905580156109eb576000805461ff001916905550565b6060824710156133c55760405162461bcd60e51b81526004016107c2906138be565b6133ce85613463565b6133ea5760405162461bcd60e51b81526004016107c290613baa565b600080866001600160a01b0316858760405161340691906136c2565b60006040518083038185875af1925050503d8060008114613443576040519150601f19603f3d011682016040523d82523d6000602084013e613448565b606091505b5091509150613458828286613469565b979650505050505050565b3b151590565b60608315613478575081610c78565b8251156134885782518084602001fd5b8160405162461bcd60e51b81526004016107c2919061373b565b8051801515811461077e57600080fd5b6000602082840312156134c3578081fd5b8135610c7881613e96565b6000602082840312156134df578081fd5b8151610c7881613e96565b600080600080608085870312156134ff578283fd5b843561350a81613e96565b9350602085013561351a81613e96565b9250604085013561352a81613e96565b9150606085013561353a81613e96565b939692955090935050565b60008060408385031215613557578182fd5b823561356281613e96565b946020939093013593505050565b600080600060608486031215613584578283fd5b835161358f81613e96565b602085015160409095015190969495509392505050565b6000602082840312156135b7578081fd5b610c78826134a2565b600081830360c08112156135d2578182fd5b6135dc60a0613dae565b835181526135ec602085016134a2565b602082015260408401516040820152606084015160608201526040607f1983011215613616578283fd5b6136206040613dae565b608085810151825260a090950151602082015293810193909352509092915050565b600060208284031215613653578081fd5b5035919050565b60006020828403121561366b578081fd5b5051919050565b60008060408385031215613684578182fd5b82359150602083013561369681613e96565b809150509250929050565b600080604083850312156136b3578182fd5b50508035926020909101359150565b600082516136d4818460208701613e54565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b600060208252825180602084015261375a816040850160208701613e54565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526019908201527f4552525f5f544f4b454e5f444f45535f4e4f545f455849535400000000000000604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f546f6b656e20616464726573732063616e6e6f74206265203000000000000000604082015260600190565b6020808252601b908201527f54727573746564466f727761726465722063616e277420626520300000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601b908201527f4552525f5f494e53554646494349454e545f414c4c4f57414e43450000000000604082015260600190565b6020808252601b908201527f4552525f5f494e53554646494349454e545f4c49515549444954590000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b60208082526018908201527f4552525f5f4e4f5f524557415244535f544f5f434c41494d0000000000000000604082015260600190565b602080825260139082015272151bdad95b881b9bdd081cdd5c1c1bdc9d1959606a1b604082015260600190565b6020808252601b908201527f4552525f5f4c49515549444954595f504f4f4c5f4e4f545f5345540000000000604082015260600190565b60208082526010908201526f04552525f5f414d4f554e545f49535f360841b604082015260600190565b6020808252601f908201527f4552525f5f414d4f554e545f42454c4f575f4d494e5f4c495155494449545900604082015260600190565b60208082526013908201527211549497d7d253959053125117d05353d55395606a1b604082015260600190565b60208082526011908201527011549497d7d5539055551213d492569151607a1b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252818101527f4552525f5f5452414e534143544f525f444f45535f4e4f545f4f574e5f4e4654604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526010908201526f11549497d7d253959053125117d3919560821b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526013908201527222a9292fafaba927a723afa32aa721aa24a7a760691b604082015260600190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b60208082526018908201527f4552525f5f544f4b454e5f4e4f545f535550504f525445440000000000000000604082015260600190565b90815260200190565b91825280516001600160a01b03166020808401919091528101516040808401919091520151606082015260800190565b60405181810167ffffffffffffffff81118282101715613dde57634e487b7160e01b600052604160045260246000fd5b604052919050565b60008219821115613df957613df9613e80565b500190565b600082613e1957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613e3857613e38613e80565b500290565b600082821015613e4f57613e4f613e80565b500390565b60005b83811015613e6f578181015183820152602001613e57565b8381111561230e5750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146109eb57600080fdfea26469706673582212200694930dff4a04862ed4f5d0fa1abd0b3a19a4f070cccd2fd78bfed6de085b1c64736f6c63430008000033
Deployed Bytecode Sourcemap
40957:18933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59855:12;:10;:12::i;:::-;-1:-1:-1;;;;;59843:36:0;;59869:9;59843:36;;;;;;:::i;:::-;;;;;;;;40957:18933;;;;;44174:136;;;;;;;;;;-1:-1:-1;44174:136:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47037:134;;;;;;;;;;-1:-1:-1;47037:134:0;;;;;:::i;:::-;;:::i;:::-;;50635:550;;;;;;;;;;-1:-1:-1;50635:550:0;;;;;:::i;:::-;;:::i;38593:116::-;;;;;;;;;;-1:-1:-1;38593:116:0;;;;;:::i;:::-;;:::i;52847:630::-;;;;;;;;;;-1:-1:-1;52847:630:0;;;;;:::i;:::-;;:::i;41261:45::-;;;;;;;;;;;;;:::i;39285:66::-;;;;;;;;;;;;;:::i;38080:104::-;;;;;;;;;;-1:-1:-1;38080:104:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42066:47::-;;;;;;;;;;-1:-1:-1;42066:47:0;;;;;:::i;:::-;;:::i;47729:199::-;;;;;;;;;;-1:-1:-1;47729:199:0;;;;;:::i;:::-;;:::i;47365:291::-;;;;;;;;;;-1:-1:-1;47365:291:0;;;;;:::i;:::-;;:::i;45175:163::-;;;;;;;;;;-1:-1:-1;45175:163:0;;;;;:::i;:::-;;:::i;35821:138::-;;;;;;;;;;-1:-1:-1;35821:138:0;;;;;:::i;:::-;;:::i;6976:86::-;;;;;;;;;;;;;:::i;59150:152::-;;;;;;;;;;-1:-1:-1;59150:152:0;;;;;:::i;:::-;;:::i;39050:157::-;;;;;;;;;;;;;:::i;4990:94::-;;;;;;;;;;;;;:::i;46053:117::-;;;;;;;;;;-1:-1:-1;46053:117:0;;;;;:::i;:::-;;:::i;39215:62::-;;;;;;;;;;;;;:::i;4339:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49156:244::-;;;;;;;;;;-1:-1:-1;49156:244:0;;;;;:::i;:::-;;:::i;53584:566::-;;;;;;:::i;:::-;;:::i;54313:2338::-;;;;;;;;;;-1:-1:-1;54313:2338:0;;;;;:::i;:::-;;:::i;44899:97::-;;;;;;;;;;-1:-1:-1;44899:97:0;;;;;:::i;:::-;;:::i;42419:52::-;;;;;;;;;;-1:-1:-1;42419:52:0;;;;;:::i;:::-;;:::i;49987:369::-;;;:::i;44318:143::-;;;;;;;;;;-1:-1:-1;44318:143:0;;;;;:::i;:::-;;:::i;48074:889::-;;;;;;;;;;-1:-1:-1;48074:889:0;;;;;:::i;:::-;;:::i;42159:49::-;;;;;;;;;;-1:-1:-1;42159:49:0;;;;;:::i;:::-;;:::i;44610:137::-;;;;;;;;;;-1:-1:-1;44610:137:0;;;;;:::i;:::-;;:::i;42366:46::-;;;;;;;;;;-1:-1:-1;42366:46:0;;;;;:::i;:::-;;:::i;58937:205::-;;;;;;;;;;-1:-1:-1;58937:205:0;;;;;:::i;:::-;;:::i;46378:105::-;;;;;;;;;;-1:-1:-1;46378:105:0;;;;;:::i;:::-;;:::i;45346:163::-;;;;;;;;;;-1:-1:-1;45346:163:0;;;;;:::i;:::-;;:::i;46684:179::-;;;;;;;;;;-1:-1:-1;46684:179:0;;;;;:::i;:::-;;:::i;44469:133::-;;;;;;;;;;-1:-1:-1;44469:133:0;;;;;:::i;:::-;;:::i;5239:192::-;;;;;;;;;;-1:-1:-1;5239:192:0;;;;;:::i;:::-;;:::i;56809:1323::-;;;;;;;;;;-1:-1:-1;56809:1323:0;;;;;:::i;:::-;;:::i;43614:397::-;;;;;;;;;;-1:-1:-1;43614:397:0;;;;;:::i;:::-;;:::i;42241:51::-;;;;;;;;;;-1:-1:-1;42241:51:0;;;;;:::i;:::-;;:::i;59310:239::-;59464:14;59503:38;:36;:38::i;:::-;59496:45;;59310:239;;:::o;44174:136::-;-1:-1:-1;;;;;44276:26:0;;44249:7;44276:26;;;:12;:26;;;;;;44174:136;;;;:::o;47037:134::-;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;;;;;;;;;47117:13:::1;:46:::0;;-1:-1:-1;;;;;;47117:46:0::1;-1:-1:-1::0;;;;;47117:46:0;;;::::1;::::0;;;::::1;::::0;;47037:134::o;50635:550::-;10000:1;10763:7;;:19;;10755:63;;;;-1:-1:-1;;;10755:63:0;;;;;;;:::i;:::-;10000:1;10896:7;:18;50756:6;-1:-1:-1;;;;;43318:26:0;::::1;43310:64;;;;-1:-1:-1::0;;;43310:64:0::1;;;;;;;:::i;:::-;43393:31;43411:12;43393:17;:31::i;:::-;43385:63;;;;-1:-1:-1::0;;;43385:63:0::1;;;;;;;:::i;:::-;7302:8:::2;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50811:16:0;::::3;41212:42;50811:16;;50803:48;;;;-1:-1:-1::0;;;50803:48:0::3;;;;;;;:::i;:::-;50952:7;50902:6;-1:-1:-1::0;;;;;50884:35:0::3;;50920:12;:10;:12::i;:::-;50942:4;50884:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;50862:152;;;;-1:-1:-1::0;;;50862:152:0::3;;;;;;;:::i;:::-;51025:111;51081:6;51090:12;:10;:12::i;:::-;51112:13;::::0;-1:-1:-1;;;;;51112:13:0::3;51128:7:::0;51025:37:::3;:111::i;:::-;51147:30;51161:6;51169:7;51147:13;:30::i;:::-;-1:-1:-1::0;;9956:1:0;11075:22;;-1:-1:-1;50635:550:0:o;38593:116::-;38319:20;38328:10;38319:8;:20::i;:::-;38311:81;;;;-1:-1:-1;;;38311:81:0;;;;;;;:::i;:::-;7302:8:::1;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::1;;;;;;;:::i;:::-;38677:24:::2;38691:9;38677:13;:24::i;:::-;38593:116:::0;:::o;52847:630::-;10000:1;10763:7;;:19;;10755:63;;;;-1:-1:-1;;;10755:63:0;;;;;;;:::i;:::-;10000:1;10896:7;:18;7302:8:::1;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::1;;;;;;;:::i;:::-;52981:7:::2;::::0;:29:::2;::::0;-1:-1:-1;;;52981:29:0;;52960:13:::2;::::0;-1:-1:-1;;;;;52981:7:0::2;::::0;:21:::2;::::0;:29:::2;::::0;53003:6;;52981:29:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52959:51;;;;53029:24;53047:5;53029:17;:24::i;:::-;53021:61;;;;-1:-1:-1::0;;;53021:61:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53101:15:0;::::2;41212:42;53101:15;;53093:47;;;;-1:-1:-1::0;;;53093:47:0::2;;;;;;;:::i;:::-;53240:7;53191:5;-1:-1:-1::0;;;;;53173:34:0::2;;53208:12;:10;:12::i;:::-;53230:4;53173:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;53151:151;;;;-1:-1:-1::0;;;53151:151:0::2;;;;;;;:::i;:::-;53313:110;53369:5;53377:12;:10;:12::i;53313:110::-;53434:35;53453:6;53461:7;53434:18;:35::i;41261:45::-:0;41300:6;41261:45;:::o;39285:66::-;38319:20;38328:10;38319:8;:20::i;:::-;38311:81;;;;-1:-1:-1;;;38311:81:0;;;;;;;:::i;:::-;39333:10:::1;:8;:10::i;:::-;39285:66::o:0;38080:104::-;38169:7;;-1:-1:-1;;;;;38169:7:0;;;38159:17;;;;38080:104::o;42066:47::-;;;;;;;;;;;;;:::o;47729:199::-;-1:-1:-1;;;;;47888:32:0;;47819:7;47888:32;;;:17;:32;;;;;;;;;47857:12;:27;;;;;;47847:37;;:7;:37;:::i;:::-;47846:74;;;;:::i;:::-;47839:81;47729:199;-1:-1:-1;;;47729:199:0:o;47365:291::-;-1:-1:-1;;;;;47477:24:0;;47439:7;47477:24;;;:12;:24;;;;;;47516:11;;47512:107;;-1:-1:-1;;;;;47583:24:0;;;;;;:12;:24;;;;;;;;;47551:17;:29;;;;;;;:56;;47583:24;47551:56;:::i;:::-;47544:63;;;;;47512:107;-1:-1:-1;41300:6:0;;47365:291;-1:-1:-1;;47365:291:0:o;45175:163::-;43192:13;;-1:-1:-1;;;;;43192:13:0;43168:12;:10;:12::i;:::-;-1:-1:-1;;;;;43168:38:0;;43160:68;;;;-1:-1:-1;;;43160:68:0;;;;;;;:::i;:::-;45283:47:::1;45309:12;45323:6;45283:25;:47::i;:::-;45175:163:::0;;:::o;35821:138::-;35934:17;;-1:-1:-1;;;;;35934:17:0;;;35921:30;;;;35821:138::o;6976:86::-;7047:7;;;;6976:86;:::o;59150:152::-;43192:13;;-1:-1:-1;;;;;43192:13:0;43168:12;:10;:12::i;:::-;-1:-1:-1;;;;;43168:38:0;;43160:68;;;;-1:-1:-1;;;43160:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59255:30:0;;::::1;;::::0;;;:16:::1;:30;::::0;;;;:39;59150:152::o;39050:157::-;38319:20;38328:10;38319:8;:20::i;:::-;38311:81;;;;-1:-1:-1;;;38311:81:0;;;;;;;:::i;:::-;7302:8:::1;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::1;;;;;;;:::i;:::-;39148:7:::2;::::0;39134:34:::2;::::0;39165:1:::2;::::0;-1:-1:-1;;;;;39148:7:0::2;::::0;39134:34:::2;::::0;39165:1;;39134:34:::2;39179:7;:20:::0;;-1:-1:-1;;;;;;39179:20:0::2;::::0;;39050:157::o;4990:94::-;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;5055:21:::1;5073:1;5055:9;:21::i;46053:117::-:0;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;46131:31:::1;46148:13;46131:16;:31::i;39215:62::-:0;38319:20;38328:10;38319:8;:20::i;:::-;38311:81;;;;-1:-1:-1;;;38311:81:0;;;;;;;:::i;:::-;39261:8:::1;:6;:8::i;4339:87::-:0;4412:6;;-1:-1:-1;;;;;4412:6:0;4339:87;:::o;49156:244::-;43192:13;;-1:-1:-1;;;;;43192:13:0;43168:12;:10;:12::i;:::-;-1:-1:-1;;;;;43168:38:0;;43160:68;;;;-1:-1:-1;;;43160:68:0;;;;;;;:::i;:::-;49246:6;-1:-1:-1;;;;;43318:26:0;::::1;43310:64;;;;-1:-1:-1::0;;;43310:64:0::1;;;;;;;:::i;:::-;43393:31;43411:12;43393:17;:31::i;:::-;43385:63;;;;-1:-1:-1::0;;;43385:63:0::1;;;;;;;:::i;:::-;7302:8:::2;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49279:20:0;::::3;;::::0;;;:12:::3;:20;::::0;;;;:31;;49303:7;;49279:20;:31:::3;::::0;49303:7;;49279:31:::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;49321:19:0;::::3;;::::0;;;:11:::3;:19;::::0;;;;:30;;49344:7;;49321:19;:30:::3;::::0;49344:7;;49321:30:::3;:::i;:::-;::::0;;;-1:-1:-1;;49367:25:0::3;::::0;49384:7;;-1:-1:-1;;;;;49367:25:0;::::3;::::0;::::3;::::0;;;::::3;43239:1:::1;49156:244:::0;;:::o;53584:566::-;10000:1;10763:7;;:19;;10755:63;;;;-1:-1:-1;;;10755:63:0;;;;;;;:::i;:::-;10000:1;10896:7;:18;7302:8:::1;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::1;;;;;;;:::i;:::-;53710:7:::2;::::0;:29:::2;::::0;-1:-1:-1;;;53710:29:0;;53689:13:::2;::::0;-1:-1:-1;;;;;53710:7:0::2;::::0;:21:::2;::::0;:29:::2;::::0;53732:6;;53710:29:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53688:51;;;;53758:25;41212:42;53758:17;:25::i;:::-;53750:62;;;;-1:-1:-1::0;;;53750:62:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53831:15:0;::::2;41212:42;53831:15;53823:47;;;;-1:-1:-1::0;;;53823:47:0::2;;;;;;;:::i;:::-;53897:13;::::0;-1:-1:-1;;;;;53897:13:0::2;53881:76;;;;-1:-1:-1::0;;;53881:76:0::2;;;;;;;:::i;:::-;53995:13;::::0;53987:49:::2;::::0;53969:12:::2;::::0;-1:-1:-1;;;;;53995:13:0::2;::::0;54022:9:::2;::::0;53987:49:::2;::::0;::::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53968:68;;;54055:7;54047:47;;;;-1:-1:-1::0;;;54047:47:0::2;;;;;;;:::i;:::-;54105:37;54124:6;54132:9;54105:18;:37::i;54313:2338::-:0;10000:1;10763:7;;:19;;10755:63;;;;-1:-1:-1;;;10755:63:0;;;;;;;:::i;:::-;10000:1;10896:7;:18;54437:6;54445:12:::1;:10;:12::i;:::-;42808:7;::::0;:31:::1;::::0;-1:-1:-1;;;42808:31:0;;42787:13:::1;::::0;-1:-1:-1;;;;;42808:7:0::1;::::0;:21:::1;::::0;:31:::1;::::0;42830:8;;42808:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;42858:7:0::1;::::0;:24:::1;::::0;-1:-1:-1;;;42858:24:0;;42786:53;;-1:-1:-1;;;;;;42858:7:0::1;::::0;:14:::1;::::0;:24:::1;::::0;42873:8;;42858:24:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42850:62;;;;-1:-1:-1::0;;;42850:62:0::1;;;;;;;:::i;:::-;42931:7;::::0;:25:::1;::::0;-1:-1:-1;;;42931:25:0;;-1:-1:-1;;;;;42931:40:0;;::::1;::::0;:7:::1;::::0;:15:::1;::::0;:25:::1;::::0;42947:8;;42931:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42931:40:0::1;;42923:85;;;;-1:-1:-1::0;;;42923:85:0::1;;;;;;;:::i;:::-;7302:8:::2;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::2;;;;;;;:::i;:::-;54578:7:::3;::::0;:29:::3;::::0;-1:-1:-1;;;54578:29:0;;54499:21:::3;::::0;;;;;-1:-1:-1;;;;;54578:7:0::3;::::0;:21:::3;::::0;:29:::3;::::0;54600:6;;54578:29:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54498:109;;;;;;54626:32;54644:13;54626:17;:32::i;:::-;54618:69;;;;-1:-1:-1::0;;;54618:69:0::3;;;;;;;:::i;:::-;54708:12:::0;54700:44:::3;;;;-1:-1:-1::0;;;54700:44:0::3;;;;;;;:::i;:::-;54787:7;54763:20;:31;;54755:71;;;;-1:-1:-1::0;;;54755:71:0::3;;;;;;;:::i;:::-;54837:22;::::0;-1:-1:-1;;;;;54837:22:0::3;:45;54883:12;:10;:12::i;:::-;54897:13;54912:7;54837:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;54992:30;55035:38;55059:13;55035:23;:38::i;:::-;55025:48;::::0;:7;:48:::3;:::i;:::-;54992:81;;55128:25;55156:50;55176:14;55192:13;55156:19;:50::i;:::-;55128:78;;55219:24;55389:17;55366:20;:40;55362:229;;;-1:-1:-1::0;55442:1:0::3;55362:229;;;-1:-1:-1::0;55524:40:0;;::::3;55362:229;55674:31;55727:38;55751:13;55727:23;:38::i;:::-;55708:57;::::0;:16;:57:::3;:::i;:::-;-1:-1:-1::0;;;;;55778:26:0;::::3;;::::0;;;:11:::3;:26;::::0;;;;:46;;55674:91;;-1:-1:-1;55808:16:0;;55778:26;;;:46:::3;::::0;55808:16;;55778:46:::3;:::i;:::-;::::0;;;-1:-1:-1;55835:24:0::3;::::0;-1:-1:-1;55862:26:0::3;55872:16:::0;55862:7;:26:::3;:::i;:::-;55835:53:::0;-1:-1:-1;55899:22:0::3;55924:48;55949:23:::0;55924:22;:48:::3;:::i;:::-;55899:73:::0;-1:-1:-1;41300:6:0::3;56060:31;55899:73:::0;56060:14;:31:::3;:::i;:::-;:46;56056:110;;;-1:-1:-1::0;56140:14:0;56056:110:::3;-1:-1:-1::0;;;;;56176:27:0;::::3;;::::0;;;:12:::3;:27;::::0;;;;:47;;56207:16;;56176:27;:47:::3;::::0;56207:16;;56176:47:::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;56234:29:0;::::3;;::::0;;;:14:::3;:29;::::0;;;;:40;;56267:7;;56234:29;:40:::3;::::0;56267:7;;56234:40:::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;56285:32:0;::::3;;::::0;;;:17:::3;:32;::::0;;;;:50;;56321:14;;56285:32;:50:::3;::::0;56321:14;;56285:50:::3;:::i;:::-;::::0;;;-1:-1:-1;56348:49:0::3;::::0;-1:-1:-1;56374:13:0;56389:7;56348:25:::3;:49::i;:::-;56410:66;56429:6;56437:14;56453:7;56462:13;56410:18;:66::i;:::-;56489:73;56516:13;56531:12;:10;:12::i;:::-;56545:16;56489:26;:73::i;:::-;56630:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;56580:63:0::3;56612:16;56597:13;-1:-1:-1::0;;;;;56580:63:0::3;;;;;;;;;;;-1:-1:-1::0;;9956:1:0;11075:22;;-1:-1:-1;;;;;;;;;;;;54313:2338:0:o;44899:97::-;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;44967:21:::1;44979:8;44967:11;:21::i;42419:52::-:0;;;;;;;;;;;;;:::o;49987:369::-;10000:1;10763:7;;:19;;10755:63;;;;-1:-1:-1;;;10755:63:0;;;;;;;:::i;:::-;10000:1;10896:7;:18;41212:42:::1;43393:31;43411:12;43393:17;:31::i;:::-;43385:63;;;;-1:-1:-1::0;;;43385:63:0::1;;;;;;;:::i;:::-;7302:8:::2;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::2;;;;;;;:::i;:::-;50108:13:::3;::::0;-1:-1:-1;;;;;50108:13:0::3;50092:76;;;;-1:-1:-1::0;;;50092:76:0::3;;;;;;;:::i;:::-;50206:13;::::0;50198:49:::3;::::0;50180:12:::3;::::0;-1:-1:-1;;;;;50206:13:0::3;::::0;50233:9:::3;::::0;50198:49:::3;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50179:68;;;50266:7;50258:47;;;;-1:-1:-1::0;;;50258:47:0::3;;;;;;;:::i;:::-;50316:32;41212:42;50338:9;50316:13;:32::i;:::-;-1:-1:-1::0;;9956:1:0;11075:22;;49987:369::o;44318:143::-;-1:-1:-1;;;;;44425:28:0;44398:7;44425:28;;;:14;:28;;;;;;;44318:143::o;48074:889::-;48171:7;;:22;;-1:-1:-1;;;48171:22:0;;48143:7;;-1:-1:-1;;;;;48171:7:0;;:14;;:22;;48186:6;;48171:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48163:51;;;;-1:-1:-1;;;48163:51:0;;;;;;;:::i;:::-;48307:7;;:29;;-1:-1:-1;;;48307:29:0;;48228:21;;;;;;-1:-1:-1;;;;;48307:7:0;;:21;;:29;;48329:6;;48307:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48227:109;;;;;;48353:14;48371:1;48353:19;48349:60;;;48396:1;48389:8;;;;;;;48349:60;48461:25;48489:50;48509:14;48525:13;48489:19;:50::i;:::-;48461:78;;48550:24;48720:17;48697:20;:40;48693:229;;;-1:-1:-1;48773:1:0;48693:229;;;-1:-1:-1;48855:40:0;;;48693:229;48939:16;48074:889;-1:-1:-1;;;;;;48074:889:0:o;42159:49::-;;;;;;;;;;;;;:::o;44610:137::-;-1:-1:-1;;;;;44709:30:0;44682:7;44709:30;;;:16;:30;;;;;;;44610:137::o;42366:46::-;;;;;;;;;;;;;:::o;58937:205::-;59065:7;;:29;;-1:-1:-1;;;59065:29:0;;59006:7;;;;-1:-1:-1;;;;;59065:7:0;;;;:21;;:29;;59087:6;;59065:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59026:68:0;58937:205;-1:-1:-1;;;;58937:205:0:o;46378:105::-;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;46450:25:::1;46471:3;46450:20;:25::i;45346:163::-:0;43192:13;;-1:-1:-1;;;;;43192:13:0;43168:12;:10;:12::i;:::-;-1:-1:-1;;;;;43168:38:0;;43160:68;;;;-1:-1:-1;;;43160:68:0;;;;;;;:::i;:::-;45454:47:::1;45480:12;45494:6;45454:25;:47::i;46684:179::-:0;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;46782:22:::1;:73:::0;;-1:-1:-1;;;;;;46782:73:0::1;-1:-1:-1::0;;;;;46782:73:0;;;::::1;::::0;;;::::1;::::0;;46684:179::o;44469:133::-;-1:-1:-1;;;;;44569:25:0;44542:7;44569:25;;;:11;:25;;;;;;;44469:133::o;5239:192::-;4570:12;:10;:12::i;:::-;-1:-1:-1;;;;;4559:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4559:23:0;;4551:68;;;;-1:-1:-1;;;4551:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5328:22:0;::::1;5320:73;;;;-1:-1:-1::0;;;5320:73:0::1;;;;;;;:::i;:::-;5404:19;5414:8;5404:9;:19::i;56809:1323::-:0;56869:6;56877:12;:10;:12::i;:::-;42808:7;;:31;;-1:-1:-1;;;42808:31:0;;42787:13;;-1:-1:-1;;;;;42808:7:0;;:21;;:31;;42830:8;;42808:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;42858:7:0;;:24;;-1:-1:-1;;;42858:24:0;;42786:53;;-1:-1:-1;;;;;;42858:7:0;;:14;;:24;;42873:8;;42858:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42850:62;;;;-1:-1:-1;;;42850:62:0;;;;;;;:::i;:::-;42931:7;;:25;;-1:-1:-1;;;42931:25:0;;-1:-1:-1;;;;;42931:40:0;;;;:7;;:15;;:25;;42947:8;;42931:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42931:40:0;;42923:85;;;;-1:-1:-1;;;42923:85:0;;;;;;;:::i;:::-;7302:8:::1;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1::0;;;7293:38:0::1;;;;;;;:::i;:::-;10000:1:::2;10763:7;;:19;;10755:63;;;;-1:-1:-1::0;;;10755:63:0::2;;;;;;;:::i;:::-;10000:1;10896:7;:18:::0;57009:7:::3;::::0;:29:::3;::::0;-1:-1:-1;;;57009:29:0;;56930:21:::3;::::0;;;;;-1:-1:-1;;;;;57009:7:0::3;::::0;:21:::3;::::0;:29:::3;::::0;57031:6;;57009:29:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56929:109;;;;;;57057:32;57075:13;57057:17;:32::i;:::-;57049:69;;;;-1:-1:-1::0;;;57049:69:0::3;;;;;;;:::i;:::-;57131:36;57193:38;57217:13;57193:23;:38::i;:::-;57170:61;::::0;:20;:61:::3;:::i;:::-;57131:100;;57286:25;57314:50;57334:14;57350:13;57314:19;:50::i;:::-;57286:78:::0;-1:-1:-1;57375:24:0::3;57402:40;57422:20:::0;57286:78;57402:40:::3;:::i;:::-;57375:67;;57480:1;57461:16;:20;57453:57;;;;-1:-1:-1::0;;;57453:57:0::3;;;;;;;:::i;:::-;57594:31;57628:45;57645:28:::0;57628:14;:45:::3;:::i;:::-;-1:-1:-1::0;;;;;57686:27:0;::::3;;::::0;;;:12:::3;:27;::::0;;;;:47;;57594:79;;-1:-1:-1;57717:16:0;;57686:27;;;:47:::3;::::0;57717:16;;57686:47:::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;57744:32:0;::::3;;::::0;;;:17:::3;:32;::::0;;;;:59;;57780:23;;57744:32;:59:::3;::::0;57780:23;;57744:59:::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;57814:26:0;::::3;;::::0;;;:11:::3;:26;::::0;;;;:46;;57844:16;;57814:26;:46:::3;::::0;57844:16;;57814:46:::3;:::i;:::-;::::0;;;-1:-1:-1;57873:69:0::3;::::0;-1:-1:-1;57892:6:0;57900:23;57925:1:::3;57928:13:::0;57873:18:::3;:69::i;:::-;57953:73;57980:13;57995:12;:10;:12::i;57953:73::-;58086:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;58042:82:0::3;58068:16;58053:13;-1:-1:-1::0;;;;;58042:82:0::3;;58100:23;58042:82;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;9956:1:0::2;11075:22:::0;;-1:-1:-1;;;;;;;;;56809:1323:0:o;43614:397::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;43792:40:::1;43814:17;43792:21;:40::i;:::-;43843:16;:14;:16::i;:::-;43870:24;43886:7;43870:15;:24::i;:::-;43905;:22;:24::i;:::-;43940:21;43952:8;43940:11;:21::i;:::-;43972:31;43989:13;43972:16;:31::i;:::-;1914:14:::0;1910:68;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;1910:68;43614:397;;;;;:::o;42241:51::-;;;;;;;;;;;;;:::o;35967:410::-;36029:14;36060:30;36079:10;36060:18;:30::i;:::-;36056:314;;;-1:-1:-1;;;36265:14:0;36261:23;36248:37;36244:2;36240:46;36211:90;;;36340:18;:16;:18::i;:::-;36333:25;;;;44019:147;44109:12;;:34;;-1:-1:-1;;;44109:34:0;;44085:4;;-1:-1:-1;;;;;44109:12:0;;:26;;:34;;44136:6;;44109:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;;44019:147;-1:-1:-1;;44019:147:0:o;22095:259::-;22250:96;22270:5;22300:27;;;22329:4;22335:2;22339:5;22277:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22277:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22277:68:0;-1:-1:-1;;;;;;22277:68:0;;;;;;;;;;22250:19;:96::i;:::-;22095:259;;;;:::o;49487:343::-;49581:1;49571:7;:11;49563:40;;;;-1:-1:-1;;;49563:40:0;;;;;;;:::i;:::-;49630:7;;49614:13;;-1:-1:-1;;;;;49630:7:0;:12;49643;:10;:12::i;:::-;49630:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49697:29;;;;;;;;-1:-1:-1;;;;;49697:29:0;;;;;49667:27;49697:29;;;;;;;;;;49737:7;;:40;;-1:-1:-1;;;49737:40:0;;49614:42;;-1:-1:-1;49697:29:0;;49737:7;;;:27;;:40;;49614:42;;49697:29;;49737:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49788:34;49807:5;49814:7;49788:18;:34::i;38861:181::-;-1:-1:-1;;;;;38931:23:0;;38923:32;;;;;;38985:7;;38971:33;;-1:-1:-1;;;;;38971:33:0;;;;38985:7;;38971:33;;38985:7;;38971:33;39015:7;:19;;-1:-1:-1;;;;;;39015:19:0;-1:-1:-1;;;;;39015:19:0;;;;;;;;;;38861:181::o;51286:1349::-;51373:6;51381:12;:10;:12::i;:::-;42808:7;;:31;;-1:-1:-1;;;42808:31:0;;42787:13;;-1:-1:-1;;;;;42808:7:0;;:21;;:31;;42830:8;;42808:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;42858:7:0;;:24;;-1:-1:-1;;;42858:24:0;;42786:53;;-1:-1:-1;;;;;;42858:7:0;;:14;;:24;;42873:8;;42858:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42850:62;;;;-1:-1:-1;;;42850:62:0;;;;;;;:::i;:::-;42931:7;;:25;;-1:-1:-1;;;42931:25:0;;-1:-1:-1;;;;;42931:40:0;;;;:7;;:15;;:25;;42947:8;;42931:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42931:40:0;;42923:85;;;;-1:-1:-1;;;42923:85:0;;;;;;;:::i;:::-;51477:7:::1;::::0;:29:::1;::::0;-1:-1:-1;;;51477:29:0;;51407:13:::1;::::0;;;;;-1:-1:-1;;;;;51477:7:0::1;::::0;:21:::1;::::0;:29:::1;::::0;51499:6;;51477:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51406:100;;;;;;51527:7;51538:1;51527:12;;51519:41;;;;-1:-1:-1::0;;;51519:41:0::1;;;;;;;:::i;:::-;51571:22;::::0;-1:-1:-1;;;;;51571:22:0::1;:46;51618:12;:10;:12::i;:::-;51632:5;51639:7;51571:76;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;51761:19:0;::::1;51660:26;51761:19:::0;;;:12:::1;:19;::::0;;;;;:24;;:57:::1;;-1:-1:-1::0;;;;;;51789:24:0;::::1;;::::0;;;:17:::1;:24;::::0;;;;;:29;51761:57:::1;51757:245;;;51856:22;51871:7:::0;41300:6:::1;51856:22;:::i;:::-;51835:43;;51757:245;;;-1:-1:-1::0;;;;;51971:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;;51943:17:::1;:24:::0;;;;;;;51933:34:::1;::::0;:7;:34:::1;:::i;:::-;51932:58;;;;:::i;:::-;51911:79;;51757:245;41300:6;52022:18;:34;;52014:78;;;;-1:-1:-1::0;;;52014:78:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52105:21:0;::::1;;::::0;;;:14:::1;:21;::::0;;;;:32;;52130:7;;52105:21;:32:::1;::::0;52130:7;;52105:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;52148:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;:30;;52171:7;;52148:19;:30:::1;::::0;52171:7;;52148:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;52189:24:0;::::1;;::::0;;;:17:::1;:24;::::0;;;;:46;;52217:18;;52189:24;:46:::1;::::0;52217:18;;52189:46:::1;:::i;:::-;::::0;;;-1:-1:-1;;52278:140:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;52278:140:0;::::1;::::0;;52248:27:::1;::::0;52278:140:::1;::::0;::::1;52328:32;52353:7:::0;52328:22;:32:::1;:::i;:::-;52278:140:::0;;::::1;;52375:32;52389:18:::0;52375:11;:32:::1;:::i;:::-;52278:140:::0;;52429:7:::1;::::0;:41:::1;::::0;-1:-1:-1;;;52429:41:0;;52248:170;;-1:-1:-1;;;;;;52429:7:0::1;::::0;:27:::1;::::0;:41:::1;::::0;52457:6;;52248:170;;52429:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52526;52552:5;52559:7;52526:25;:41::i;:::-;52614:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;52583:44:0::1;52605:7;52598:5;-1:-1:-1::0;;;;;52583:44:0::1;;;;;;;;;;;43019:1;;;;;51286:1349:::0;;;;;:::o;8035:120::-;7579:8;:6;:8::i;:::-;7571:41;;;;-1:-1:-1;;;7571:41:0;;;;;;;:::i;:::-;8094:7:::1;:15:::0;;-1:-1:-1;;8094:15:0::1;::::0;;8125:22:::1;8134:12;:10;:12::i;:::-;8125:22;;;;;;:::i;:::-;;;;;;;;8035:120::o:0;45517:225::-;-1:-1:-1;;;;;45609:30:0;;;;;;:16;:30;;;;;:40;;45643:6;;45609:30;:40;;45643:6;;45609:40;:::i;:::-;;;;-1:-1:-1;;;;;;;45703:30:0;;;;;;:16;:30;;;;;;;45665:69;;45703:30;;;45665:69;;;45517:225;;:::o;5439:173::-;5514:6;;;-1:-1:-1;;;;;5531:17:0;;;-1:-1:-1;;;;;;5531:17:0;;;;;;;5564:40;;5514:6;;;5531:17;5514:6;;5564:40;;5495:16;;5564:40;5439:173;;:::o;46250:120::-;46319:12;:43;;-1:-1:-1;;;;;;46319:43:0;-1:-1:-1;;;;;46319:43:0;;;;;;;;;;46250:120::o;7776:118::-;7302:8;:6;:8::i;:::-;7301:9;7293:38;;;;-1:-1:-1;;;7293:38:0;;;;;;;:::i;:::-;7836:7:::1;:14:::0;;-1:-1:-1;;7836:14:0::1;7846:4;7836:14;::::0;;7866:20:::1;7873:12;:10;:12::i;45750:225::-:0;-1:-1:-1;;;;;45842:30:0;;;;;;:16;:30;;;;;:40;;45876:6;;45842:30;:40;;45876:6;;45842:40;:::i;58246:451::-;58469:7;;:29;;-1:-1:-1;;;58469:29:0;;58418:28;;;;-1:-1:-1;;;;;58469:7:0;;;;:21;;:29;;58491:6;;58469:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58415:83;;;;;58522:7;58509:20;;;;;:::i;:::-;;-1:-1:-1;58540:36:0;58564:12;58540:36;;:::i;:::-;58589:7;;58625:63;;;;;;;;-1:-1:-1;;;;;58625:63:0;;;;;;;;;;;;;;;;;58589:100;;-1:-1:-1;;;58589:100:0;;58540:36;;-1:-1:-1;58589:7:0;;;:27;;:100;;58617:6;;58625:63;58589:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58246:451;;;;;;:::o;58705:224::-;58859:13;;:62;;-1:-1:-1;;;58859:62:0;;-1:-1:-1;;;;;58859:13:0;;;;:22;;:62;;58882:13;;58897:9;;58908:12;;58859:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58705:224;;;:::o;45072:95::-;45131:7;:28;;-1:-1:-1;;;;;;45131:28:0;-1:-1:-1;;;;;45131:28:0;;;;;;;;;;45072:95::o;36644:214::-;-1:-1:-1;;;;;36723:17:0;;36715:57;;;;-1:-1:-1;;;36715:57:0;;;;;;;:::i;:::-;36783:17;:23;;-1:-1:-1;;;;;;36783:23:0;-1:-1:-1;;;;;36783:23:0;;;;;;;;36822:28;;;;-1:-1:-1;;36822:28:0;36644:214;:::o;35479:183::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;35568:26:::1;:24;:26::i;:::-;35605:49;35637:16;35605:31;:49::i;:::-;1914:14:::0;1910:68;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;35479:183;;:::o;4022:129::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;4080:26:::1;:24;:26::i;:::-;4117;:24;:26::i;:::-;1914:14:::0;1910:68;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;4022:129;:::o;37792:195::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;-1:-1:-1;;;;;37873:20:0;::::1;37865:59;;;;-1:-1:-1::0;;;37865:59:0::1;;;;;;;:::i;:::-;37935:17;:15;:17::i;:::-;37963:7;:16:::0;;-1:-1:-1;;;;;;37963:16:0::1;-1:-1:-1::0;;;;;37963:16:0;::::1;;::::0;;1910:68;;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;37792:195;;:::o;10042:108::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;10108:34:::1;:32;:34::i;2847:98::-:0;2927:10;2847:98;:::o;24493:727::-;24928:23;24954:69;24982:4;24954:69;;;;;;;;;;;;;;;;;24962:5;-1:-1:-1;;;;;24954:27:0;;;:69;;;;;:::i;:::-;25038:17;;24928:95;;-1:-1:-1;25038:21:0;25034:179;;25135:10;25124:30;;;;;;;;;;;;:::i;:::-;25116:85;;;;-1:-1:-1;;;25116:85:0;;;;;;;:::i;:::-;24493:727;;;:::o;2776:65::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1914:14;1910:68;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;2776:65;:::o;35670:143::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;35769:17:::1;:36:::0;;-1:-1:-1;;;;;;35769:36:0::1;-1:-1:-1::0;;;;;35769:36:0;::::1;;::::0;;1910:68;;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;35670:143;;:::o;4159:99::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;4227:23:::1;4237:12;:10;:12::i;:::-;4227:9;:23::i;6645:131::-:0;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;6704:26:::1;:24;:26::i;:::-;6741:27;:25;:27::i;10158:106::-:0;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;9956:1:::1;10234:22:::0;;1910:68;;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;10158:106;:::o;17637:229::-;17774:12;17806:52;17828:6;17836:4;17842:1;17845:12;17806:21;:52::i;:::-;17799:59;17637:229;-1:-1:-1;;;;17637:229:0:o;6784:92::-;1642:13;;;;;;;;:30;;-1:-1:-1;1660:12:0;;;;1659:13;1642:30;1634:89;;;;-1:-1:-1;;;1634:89:0;;;;;;;:::i;:::-;1736:19;1759:13;;;;;;1758:14;1783:101;;;;1818:13;:20;;-1:-1:-1;;;;1818:20:0;;;;;1853:19;1834:4;1853:19;;;1783:101;6853:7:::1;:15:::0;;-1:-1:-1;;6853:15:0::1;::::0;;1910:68;;;;1961:5;1945:21;;-1:-1:-1;;1945:21:0;;;6784:92;:::o;18757:510::-;18927:12;18985:5;18960:21;:30;;18952:81;;;;-1:-1:-1;;;18952:81:0;;;;;;;:::i;:::-;19052:18;19063:6;19052:10;:18::i;:::-;19044:60;;;;-1:-1:-1;;;19044:60:0;;;;;;;:::i;:::-;19118:12;19132:23;19159:6;-1:-1:-1;;;;;19159:11:0;19178:5;19185:4;19159:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19117:73;;;;19208:51;19225:7;19234:10;19246:12;19208:16;:51::i;:::-;19201:58;18757:510;-1:-1:-1;;;;;;;18757:510:0:o;14831:387::-;15154:20;15202:8;;;14831:387::o;20466:712::-;20616:12;20645:7;20641:530;;;-1:-1:-1;20676:10:0;20669:17;;20641:530;20790:17;;:21;20786:374;;20988:10;20982:17;21049:15;21036:10;21032:2;21028:19;21021:44;20936:148;21131:12;21124:20;;-1:-1:-1;;;21124:20:0;;;;;;;;:::i;14:166:1:-;92:13;;141;;134:21;124:32;;114:2;;170:1;167;160:12;185:259;;297:2;285:9;276:7;272:23;268:32;265:2;;;318:6;310;303:22;265:2;362:9;349:23;381:33;408:5;381:33;:::i;449:263::-;;572:2;560:9;551:7;547:23;543:32;540:2;;;593:6;585;578:22;540:2;630:9;624:16;649:33;676:5;649:33;:::i;717:689::-;;;;;880:3;868:9;859:7;855:23;851:33;848:2;;;902:6;894;887:22;848:2;946:9;933:23;965:33;992:5;965:33;:::i;:::-;1017:5;-1:-1:-1;1074:2:1;1059:18;;1046:32;1087:35;1046:32;1087:35;:::i;:::-;1141:7;-1:-1:-1;1200:2:1;1185:18;;1172:32;1213:35;1172:32;1213:35;:::i;:::-;1267:7;-1:-1:-1;1326:2:1;1311:18;;1298:32;1339:35;1298:32;1339:35;:::i;:::-;838:568;;;;-1:-1:-1;838:568:1;;-1:-1:-1;;838:568:1:o;1411:327::-;;;1540:2;1528:9;1519:7;1515:23;1511:32;1508:2;;;1561:6;1553;1546:22;1508:2;1605:9;1592:23;1624:33;1651:5;1624:33;:::i;:::-;1676:5;1728:2;1713:18;;;;1700:32;;-1:-1:-1;;;1498:240:1:o;1743:385::-;;;;1900:2;1888:9;1879:7;1875:23;1871:32;1868:2;;;1921:6;1913;1906:22;1868:2;1958:9;1952:16;1977:33;2004:5;1977:33;:::i;:::-;2074:2;2059:18;;2053:25;2118:2;2103:18;;;2097:25;2029:5;;2053:25;;-1:-1:-1;2097:25:1;1858:270;-1:-1:-1;;;1858:270:1:o;2133:214::-;;2253:2;2241:9;2232:7;2228:23;2224:32;2221:2;;;2274:6;2266;2259:22;2221:2;2302:39;2331:9;2302:39;:::i;2352:773::-;;2493:9;2484:7;2480:23;2523:3;2519:2;2515:12;2512:2;;;2545:6;2537;2530:22;2512:2;2576:20;2591:4;2576:20;:::i;:::-;2625:9;2619:16;2612:5;2605:31;2668:48;2712:2;2701:9;2697:18;2668:48;:::i;:::-;2663:2;2656:5;2652:14;2645:72;2770:2;2759:9;2755:18;2749:25;2744:2;2737:5;2733:14;2726:49;2828:2;2817:9;2813:18;2807:25;2802:2;2795:5;2791:14;2784:49;2868:2;2861:3;2857:8;2853:2;2849:17;2845:26;2842:2;;;2889:6;2881;2874:22;2842:2;2922:18;2937:2;2922:18;:::i;:::-;2986:3;2971:19;;;2965:26;2949:43;;3047:4;3032:20;;;3026:27;3021:2;3008:16;;3001:53;3070:15;;;3063:32;;;;-1:-1:-1;3074:5:1;;2460:665;-1:-1:-1;;2460:665:1:o;3130:190::-;;3242:2;3230:9;3221:7;3217:23;3213:32;3210:2;;;3263:6;3255;3248:22;3210:2;-1:-1:-1;3291:23:1;;3200:120;-1:-1:-1;3200:120:1:o;3325:194::-;;3448:2;3436:9;3427:7;3423:23;3419:32;3416:2;;;3469:6;3461;3454:22;3416:2;-1:-1:-1;3497:16:1;;3406:113;-1:-1:-1;3406:113:1:o;3524:327::-;;;3653:2;3641:9;3632:7;3628:23;3624:32;3621:2;;;3674:6;3666;3659:22;3621:2;3715:9;3702:23;3692:33;;3775:2;3764:9;3760:18;3747:32;3788:33;3815:5;3788:33;:::i;:::-;3840:5;3830:15;;;3611:240;;;;;:::o;3856:258::-;;;3985:2;3973:9;3964:7;3960:23;3956:32;3953:2;;;4006:6;3998;3991:22;3953:2;-1:-1:-1;;4034:23:1;;;4104:2;4089:18;;;4076:32;;-1:-1:-1;3943:171:1:o;4119:274::-;;4286:6;4280:13;4302:53;4348:6;4343:3;4336:4;4328:6;4324:17;4302:53;:::i;:::-;4371:16;;;;;4256:137;-1:-1:-1;;4256:137:1:o;4608:203::-;-1:-1:-1;;;;;4772:32:1;;;;4754:51;;4742:2;4727:18;;4709:102::o;4816:304::-;-1:-1:-1;;;;;5046:15:1;;;5028:34;;5098:15;;5093:2;5078:18;;5071:43;4978:2;4963:18;;4945:175::o;5125:375::-;-1:-1:-1;;;;;5383:15:1;;;5365:34;;5435:15;;;;5430:2;5415:18;;5408:43;5482:2;5467:18;;5460:34;;;;5315:2;5300:18;;5282:218::o;5505:187::-;5670:14;;5663:22;5645:41;;5633:2;5618:18;;5600:92::o;5697:383::-;;5846:2;5835:9;5828:21;5878:6;5872:13;5921:6;5916:2;5905:9;5901:18;5894:34;5937:66;5996:6;5991:2;5980:9;5976:18;5971:2;5963:6;5959:15;5937:66;:::i;:::-;6064:2;6043:15;-1:-1:-1;;6039:29:1;6024:45;;;;6071:2;6020:54;;5818:262;-1:-1:-1;;5818:262:1:o;6085:344::-;6287:2;6269:21;;;6326:2;6306:18;;;6299:30;-1:-1:-1;;;6360:2:1;6345:18;;6338:50;6420:2;6405:18;;6259:170::o;6434:349::-;6636:2;6618:21;;;6675:2;6655:18;;;6648:30;6714:27;6709:2;6694:18;;6687:55;6774:2;6759:18;;6608:175::o;6788:351::-;6990:2;6972:21;;;7029:2;7009:18;;;7002:30;7068:29;7063:2;7048:18;;7041:57;7130:2;7115:18;;6962:177::o;7144:402::-;7346:2;7328:21;;;7385:2;7365:18;;;7358:30;7424:34;7419:2;7404:18;;7397:62;-1:-1:-1;;;7490:2:1;7475:18;;7468:36;7536:3;7521:19;;7318:228::o;7551:349::-;7753:2;7735:21;;;7792:2;7772:18;;;7765:30;7831:27;7826:2;7811:18;;7804:55;7891:2;7876:18;;7725:175::o;7905:351::-;8107:2;8089:21;;;8146:2;8126:18;;;8119:30;8185:29;8180:2;8165:18;;8158:57;8247:2;8232:18;;8079:177::o;8261:402::-;8463:2;8445:21;;;8502:2;8482:18;;;8475:30;8541:34;8536:2;8521:18;;8514:62;-1:-1:-1;;;8607:2:1;8592:18;;8585:36;8653:3;8638:19;;8435:228::o;8668:351::-;8870:2;8852:21;;;8909:2;8889:18;;;8882:30;8948:29;8943:2;8928:18;;8921:57;9010:2;8995:18;;8842:177::o;9024:351::-;9226:2;9208:21;;;9265:2;9245:18;;;9238:30;9304:29;9299:2;9284:18;;9277:57;9366:2;9351:18;;9198:177::o;9380:340::-;9582:2;9564:21;;;9621:2;9601:18;;;9594:30;-1:-1:-1;;;9655:2:1;9640:18;;9633:46;9711:2;9696:18;;9554:166::o;9725:410::-;9927:2;9909:21;;;9966:2;9946:18;;;9939:30;10005:34;10000:2;9985:18;;9978:62;-1:-1:-1;;;10071:2:1;10056:18;;10049:44;10125:3;10110:19;;9899:236::o;10140:356::-;10342:2;10324:21;;;10361:18;;;10354:30;10420:34;10415:2;10400:18;;10393:62;10487:2;10472:18;;10314:182::o;10501:350::-;10703:2;10685:21;;;10742:2;10722:18;;;10715:30;10781:28;10776:2;10761:18;;10754:56;10842:2;10827:18;;10675:176::o;10856:348::-;11058:2;11040:21;;;11097:2;11077:18;;;11070:30;11136:26;11131:2;11116:18;;11109:54;11195:2;11180:18;;11030:174::o;11209:343::-;11411:2;11393:21;;;11450:2;11430:18;;;11423:30;-1:-1:-1;;;11484:2:1;11469:18;;11462:49;11543:2;11528:18;;11383:169::o;11557:351::-;11759:2;11741:21;;;11798:2;11778:18;;;11771:30;11837:29;11832:2;11817:18;;11810:57;11899:2;11884:18;;11731:177::o;11913:340::-;12115:2;12097:21;;;12154:2;12134:18;;;12127:30;-1:-1:-1;;;12188:2:1;12173:18;;12166:46;12244:2;12229:18;;12087:166::o;12258:355::-;12460:2;12442:21;;;12499:2;12479:18;;;12472:30;12538:33;12533:2;12518:18;;12511:61;12604:2;12589:18;;12432:181::o;12618:343::-;12820:2;12802:21;;;12859:2;12839:18;;;12832:30;-1:-1:-1;;;12893:2:1;12878:18;;12871:49;12952:2;12937:18;;12792:169::o;12966:341::-;13168:2;13150:21;;;13207:2;13187:18;;;13180:30;-1:-1:-1;;;13241:2:1;13226:18;;13219:47;13298:2;13283:18;;13140:167::o;13312:353::-;13514:2;13496:21;;;13553:2;13533:18;;;13526:30;13592:31;13587:2;13572:18;;13565:59;13656:2;13641:18;;13486:179::o;13670:356::-;13872:2;13854:21;;;13891:18;;;13884:30;13950:34;13945:2;13930:18;;13923:62;14017:2;14002:18;;13844:182::o;14031:406::-;14233:2;14215:21;;;14272:2;14252:18;;;14245:30;14311:34;14306:2;14291:18;;14284:62;-1:-1:-1;;;14377:2:1;14362:18;;14355:40;14427:3;14412:19;;14205:232::o;14442:340::-;14644:2;14626:21;;;14683:2;14663:18;;;14656:30;-1:-1:-1;;;14717:2:1;14702:18;;14695:46;14773:2;14758:18;;14616:166::o;14787:355::-;14989:2;14971:21;;;15028:2;15008:18;;;15001:30;15067:33;15062:2;15047:18;;15040:61;15133:2;15118:18;;14961:181::o;15147:343::-;15349:2;15331:21;;;15388:2;15368:18;;;15361:30;-1:-1:-1;;;15422:2:1;15407:18;;15400:49;15481:2;15466:18;;15321:169::o;15495:412::-;15697:2;15679:21;;;15736:2;15716:18;;;15709:30;15775:34;15770:2;15755:18;;15748:62;-1:-1:-1;;;15841:2:1;15826:18;;15819:46;15897:3;15882:19;;15669:238::o;15912:348::-;16114:2;16096:21;;;16153:2;16133:18;;;16126:30;16192:26;16187:2;16172:18;;16165:54;16251:2;16236:18;;16086:174::o;16265:177::-;16411:25;;;16399:2;16384:18;;16366:76::o;16447:464::-;16686:25;;;16751:13;;-1:-1:-1;;;;;16747:39:1;16742:2;16727:18;;;16720:67;;;;16829:15;;16823:22;16818:2;16803:18;;;16796:50;;;;16888:15;16882:22;16877:2;16862:18;;16855:50;16673:3;16658:19;;16640:271::o;16916:348::-;16986:2;16980:9;17016:17;;;17063:18;17048:34;;17084:22;;;17045:62;17042:2;;;17149:10;17144:3;17140:20;17137:1;17130:31;17184:4;17181:1;17174:15;17212:4;17209:1;17202:15;17042:2;17243;17236:22;16960:304;;-1:-1:-1;16960:304:1:o;17269:128::-;;17340:1;17336:6;17333:1;17330:13;17327:2;;;17346:18;;:::i;:::-;-1:-1:-1;17382:9:1;;17317:80::o;17402:217::-;;17468:1;17458:2;;-1:-1:-1;;;17493:31:1;;17547:4;17544:1;17537:15;17575:4;17500:1;17565:15;17458:2;-1:-1:-1;17604:9:1;;17448:171::o;17624:168::-;;17730:1;17726;17722:6;17718:14;17715:1;17712:21;17707:1;17700:9;17693:17;17689:45;17686:2;;;17737:18;;:::i;:::-;-1:-1:-1;17777:9:1;;17676:116::o;17797:125::-;;17865:1;17862;17859:8;17856:2;;;17870:18;;:::i;:::-;-1:-1:-1;17907:9:1;;17846:76::o;17927:258::-;17999:1;18009:113;18023:6;18020:1;18017:13;18009:113;;;18099:11;;;18093:18;18080:11;;;18073:39;18045:2;18038:10;18009:113;;;18140:6;18137:1;18134:13;18131:2;;;-1:-1:-1;;18175:1:1;18157:16;;18150:27;17980:205::o;18190:127::-;18251:10;18246:3;18242:20;18239:1;18232:31;18282:4;18279:1;18272:15;18306:4;18303:1;18296:15;18322:133;-1:-1:-1;;;;;18399:31:1;;18389:42;;18379:2;;18445:1;18442;18435:12
Swarm Source
ipfs://0694930dff4a04862ed4f5d0fa1abd0b3a19a4f070cccd2fd78bfed6de085b1c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.