Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
311,719.486525 EUV-1
Holders
320
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
UVPool
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-14 */ // File: contracts/interfaces/IUVReserveFactory.sol pragma solidity ^0.8.12; interface IUVReserveFactory { function createReserve( address _fundWallet, address _pool, address _manager ) external; function addPoolRole(uint8 _orderNumber, address _manager) external; function removePoolRole(uint8 _orderNumber, address _manager) external; function addRole(address _addr) external; function removeRole(address _addr) external; function getPoolsLength() external view returns (uint256); function getPoolInfo(uint8 _orderNumber) external view returns ( address _poolReserve, address _poolTP, address _manager, address _fundWallet ); } // File: contracts/interfaces/IUVPool.sol pragma solidity ^0.8.12; interface IUVPool { function deposit(uint256 amount) external; function initialize( uint8 _orderNumber, uint256 _amountLimited, uint256 _minimumDeposit, address _fundWallet, address _factoryReserve, uint64 _poolOpenTime ) external; function transferForInvestment( address _tokenAddress, uint256 _amount, address _receiver ) external; function getReserve() external returns (address); function buyToken( uint256 _amountIn, uint256 _amountOutMin, address _tokenIn, bytes calldata _path, uint256 _deadline ) external; function setFundWallet(address _fundWallet) external; function setMinimumDeposit(uint256 _minimumDeposit) external; function openPool() external; function closePool() external; function setFeeCreator(uint256 _feeCreator) external; function addManager(address _manager) external; function removeManager(address _manager) external; function addInvestmentAddress(address _investmentAddress) external; function removeInvestmentAddress(address _investmentAddress) external; function createVote( uint8 _orderNumber, uint64 _startTimestamp, uint64 _endTimestamp ) external payable; function closeVote(uint8 _orderNumber) external; function voting(uint8 _orderNumber, uint8 _optionId) external; event Deposit(address indexed sender, uint256 amount); event BuyToken(address indexed tokenAddress, uint256 amount); event BuyBNB(uint256 amount); event CreateVote(uint8 voteId, uint64 startTimestamp, uint64 endTimestamp); event Voting( address indexed voter, uint256 amount, uint64 timestamp, uint8 optionId, uint64 voteCount ); event CloseVote(uint8 voteId); } // File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol pragma solidity >=0.5.0; /// @title Callback for IUniswapV3PoolActions#swap /// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface interface IUniswapV3SwapCallback { /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. /// @dev In the implementation you must pay the pool tokens owed for the swap. /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; } // File: @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol pragma solidity >=0.7.5; pragma abicoder v2; /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface ISwapRouter is IUniswapV3SwapCallback { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) 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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) 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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @uniswap/v3-periphery/contracts/libraries/TransferHelper.sol pragma solidity >=0.6.0; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: contracts/UVPool.sol pragma solidity ^0.8.12; contract UVPool is ERC20, ERC20Burnable, Ownable, AccessControl, IUVPool { using SafeMath for uint256; struct WhiteList { uint256 limitDeposit; uint64 startTimeDeposit; uint64 closeTimeDeposit; } struct Vote { string name; uint64 startTimestamp; uint64 endTimestamp; bool isActive; uint64 voteCount; } struct VoteInfo { uint64 timestamp; uint256 amount; uint8 optionId; address voter; } uint256 public feeCreator = 1 ether; mapping(uint8 => Vote) public allVotes; mapping(uint8 => mapping(address => VoteInfo)) public allVoters; mapping(uint8 => mapping(uint64 => VoteInfo)) public allVotersIndex; uint8 private constant PERCENT_FEE = 250; bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); address public constant SWAP_ROUTER_ADDRESS = 0xE592427A0AEce92De3Edee1F18E0157C05861564; address public constant stableCoin = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; uint64 public poolOpenTime; mapping(address => WhiteList) public whiteList; mapping(address => uint256) private _balances; mapping(address => bool) public investmentAddreses; ISwapRouter public swapRouter; address public factory; address public factoryReserve; address public fundWallet; uint256 public currentSizePool = 0; uint256 public maxSizePool; uint8 public orderNumber; uint256 public minimumDeposit; bool public isClose = false; bool public pausedTransfer = false; bool public voteCreateable = true; constructor(uint8 _orderNumber) ERC20( string.concat("EUV - ", Strings.toString(_orderNumber)), string.concat("EUV-", Strings.toString(_orderNumber)) ) { factory = msg.sender; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(MANAGER_ROLE, msg.sender); } // called once by the factory at time of deployment function initialize( uint8 _orderNumber, uint256 _amountLimited, uint256 _minimumDeposit, address _fundWallet, address _factoryReserve, uint64 _poolOpenTime ) external { require(msg.sender == factory, "FORBIDDEN"); // sufficient check minimumDeposit = _minimumDeposit; maxSizePool = _amountLimited; orderNumber = _orderNumber; swapRouter = ISwapRouter(SWAP_ROUTER_ADDRESS); poolOpenTime = _poolOpenTime; fundWallet = _fundWallet; factoryReserve = _factoryReserve; } receive() external payable {} fallback() external payable {} // Transfer tokens to fund wallet process projects vesting function transferForInvestment( address _tokenAddress, uint256 _amount, address _receiver ) external onlyRole(MANAGER_ROLE) { require(_receiver != address(0), "receiver address is zero"); require( investmentAddreses[_receiver], "receiver is not investment address" ); if (_tokenAddress == address(0)) { TransferHelper.safeTransferETH(_receiver, _amount); } else { TransferHelper.safeTransfer(_tokenAddress, _receiver, _amount); } } // Add white list for user function addsWhiteList( address[] memory _users, uint256 _limitDeposit, uint64 _startTimeDeposit, uint64 _closeTimeDeposit ) external onlyRole(MANAGER_ROLE) { require(_users.length > 0, "users is empty"); require(_limitDeposit > 0, "limit deposit is zero"); require(_startTimeDeposit > 0, "start time deposit is zero"); require(_closeTimeDeposit > 0, "close time deposit is zero"); require( _closeTimeDeposit > _startTimeDeposit, "close time deposit must be greater than start time deposit" ); for (uint256 index = 0; index < _users.length; index++) { whiteList[_users[index]] = WhiteList({ limitDeposit: _limitDeposit, startTimeDeposit: _startTimeDeposit, closeTimeDeposit: _closeTimeDeposit }); } } // user in white list can deposit before pool open function wlDeposit(uint256 _amount) external { require(!isClose, "Pool is closed"); require(_amount > 0, "Amount must be greater than zero"); require( block.timestamp <= whiteList[msg.sender].closeTimeDeposit, "Deposit time is over" ); require( block.timestamp >= whiteList[msg.sender].startTimeDeposit, "Deposit time is not start" ); require( whiteList[msg.sender].limitDeposit >= _amount, "Deposit amount is over limit" ); require( currentSizePool.add(_amount) <= maxSizePool, "Deposit amount is over limit" ); require(_amount >= minimumDeposit, "Not enough"); uint256 amount6Decimals = _amount.div(10**12); IERC20(stableCoin).transferFrom(msg.sender, address(this), amount6Decimals); _mint(msg.sender, _amount); _balances[msg.sender] = _balances[msg.sender].add(_amount); _mint(fundWallet, _amount.mul(PERCENT_FEE).div(1000)); _balances[fundWallet] = _balances[fundWallet].add( _amount.mul(PERCENT_FEE).div(1000) ); currentSizePool = currentSizePool.add(_amount); whiteList[msg.sender].limitDeposit = whiteList[msg.sender] .limitDeposit .sub(_amount); emit Deposit(msg.sender, _amount); } // Deposit stable coin to the pool function deposit(uint256 _amount) public { require(!isClose, "Pool is closed"); require(maxSizePool >= currentSizePool.add(_amount), "Pool is full"); require(_amount >= minimumDeposit, "Not enough"); require( block.timestamp >= poolOpenTime, "Pool is not open yet, please wait" ); uint256 amount6Decimals = _amount.div(10**12); IERC20(stableCoin).transferFrom(msg.sender, address(this), amount6Decimals); _mint(msg.sender, _amount); _balances[msg.sender] = _balances[msg.sender].add(_amount); _mint(fundWallet, _amount.mul(PERCENT_FEE).div(1000)); _balances[fundWallet] = _balances[fundWallet].add( _amount.mul(PERCENT_FEE).div(1000) ); currentSizePool += _amount; emit Deposit(msg.sender, _amount); } // Get pool reserved function getReserve() public view returns (address) { (address _poolReserved, , , ) = IUVReserveFactory(factoryReserve) .getPoolInfo(orderNumber); return _poolReserved; } // swap any token on uniswap function buyToken( uint256 _amountIn, uint256 _amountOutMin, address _tokenIn, bytes calldata _path, uint256 _deadline ) public onlyRole(MANAGER_ROLE) { require(isClose, "Pool is not closed"); address _poolReserved = getReserve(); TransferHelper.safeApprove(_tokenIn, address(swapRouter), _amountIn); ISwapRouter.ExactInputParams memory params = ISwapRouter .ExactInputParams({ path: _path, recipient: _poolReserved, deadline: _deadline, amountIn: _amountIn, amountOutMinimum: _amountOutMin }); // Executes the swap. uint256 realAmount = swapRouter.exactInput(params); emit BuyToken(_tokenIn, realAmount); } // toggles the paused state of the transfer function function togglePausedTransfer() public onlyRole(MANAGER_ROLE) { pausedTransfer = !pausedTransfer; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual override { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(pausedTransfer == false, "ERC20: transfer is paused"); require(amount > 0, "Transfer amount must be greater than zero"); require( amount <= _balances[sender], "ERC20: amount must be less or equal to balance" ); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function balanceOf(address owner) public view override returns (uint256) { return _balances[owner]; } // Add investment address function addInvestmentAddress(address _investmentAddress) public onlyOwner { investmentAddreses[_investmentAddress] = true; } // Remove investment address function removeInvestmentAddress(address _investmentAddress) public onlyOwner { investmentAddreses[_investmentAddress] = false; } // Set the fund wallet function setFundWallet(address _fundWallet) public onlyOwner { fundWallet = _fundWallet; } // Set the factory Reserve function setFactoryReserve(address _factoryReserve) public onlyRole(MANAGER_ROLE) { factoryReserve = _factoryReserve; } // Set minimum deposit amount function setMinimumDeposit(uint256 _minimumDeposit) public onlyRole(MANAGER_ROLE) { minimumDeposit = _minimumDeposit; } // open the pool function openPool() public onlyRole(MANAGER_ROLE) { isClose = false; } // close the pool function closePool() public onlyRole(MANAGER_ROLE) { isClose = true; } // get detail Vote function getVote(uint8 _orderNumber) public view returns (Vote memory) { return allVotes[_orderNumber]; } // Set fee creator function setFeeCreator(uint256 _feeCreator) public onlyRole(MANAGER_ROLE) { feeCreator = _feeCreator; } // Add wallet to manager role function addManager(address _manager) public onlyOwner { _setupRole(MANAGER_ROLE, _manager); } // Remove wallet from manager role function removeManager(address _manager) public onlyOwner { revokeRole(MANAGER_ROLE, _manager); } // get detail VoteInfo by orderNumber function getVoteInfo(uint8 _orderNumber, address _user) public view returns (VoteInfo memory) { return allVoters[_orderNumber][_user]; } // create a new vote function createVote( uint8 _orderNumber, uint64 _startTimestamp, uint64 _endTimestamp ) public payable { require(voteCreateable, "Vote is not createable"); require(isClose, "Pool is not closed"); if (hasRole(MANAGER_ROLE, msg.sender)) {} else { require( msg.value >= feeCreator, "You need to pay fee to create vote" ); uint256 balance = balanceOf(msg.sender); require( balance >= totalSupply().div(10) || hasRole(MANAGER_ROLE, msg.sender), "You need to have 10% of total supply" ); } allVotes[_orderNumber].startTimestamp = _startTimestamp; allVotes[_orderNumber].endTimestamp = _endTimestamp; allVotes[_orderNumber].isActive = true; voteCreateable = false; emit CreateVote(_orderNumber, _startTimestamp, _endTimestamp); } // close a vote function closeVote(uint8 _orderNumber) public onlyRole(MANAGER_ROLE) { allVotes[_orderNumber].isActive = false; voteCreateable = true; emit CloseVote(_orderNumber); } // voting for a option function voting(uint8 _orderNumber, uint8 _optionId) public { require(isClose, "This Pool is closed"); require(allVotes[_orderNumber].isActive, "This Vote is closed"); require( allVoters[_orderNumber][msg.sender].timestamp == 0, "You have voted" ); require( allVoters[_orderNumber][msg.sender].amount == 0, "You have voted" ); uint256 _amountBalance = balanceOf(msg.sender); transferFrom(msg.sender, address(this), _amountBalance); allVotes[_orderNumber].voteCount += 1; allVoters[_orderNumber][msg.sender] = VoteInfo({ amount: _amountBalance, timestamp: uint64(block.timestamp), optionId: _optionId, voter: msg.sender }); allVotersIndex[_orderNumber][ allVotes[_orderNumber].voteCount ] = VoteInfo({ amount: _amountBalance, timestamp: uint64(block.timestamp), optionId: _optionId, voter: msg.sender }); emit Voting( msg.sender, _amountBalance, uint64(block.timestamp), _optionId, allVotes[_orderNumber].voteCount ); } // internal release token after vote closed function releaseTokenAfterVote( uint8 _orderNumber, uint64 _from, uint64 _to ) external onlyRole(MANAGER_ROLE) { require(!allVotes[_orderNumber].isActive, "This Vote is still active"); for (uint64 i = _from; i < _to; i++) { _transfer( address(this), allVotersIndex[_orderNumber][i].voter, allVotersIndex[_orderNumber][i].amount ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBNB","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"}],"name":"CloseVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimestamp","type":"uint64"}],"name":"CreateVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","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":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"},{"indexed":false,"internalType":"uint8","name":"optionId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"voteCount","type":"uint64"}],"name":"Voting","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_ROUTER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"addInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_limitDeposit","type":"uint256"},{"internalType":"uint64","name":"_startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"_closeTimeDeposit","type":"uint64"}],"name":"addsWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"allVoters","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"allVotersIndex","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"allVotes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"bytes","name":"_path","type":"bytes"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"name":"closeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_startTimestamp","type":"uint64"},{"internalType":"uint64","name":"_endTimestamp","type":"uint64"}],"name":"createVote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"name":"getVote","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"internalType":"struct UVPool.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"address","name":"_user","type":"address"}],"name":"getVoteInfo","outputs":[{"components":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"internalType":"struct UVPool.VoteInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint256","name":"_amountLimited","type":"uint256"},{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"},{"internalType":"address","name":"_fundWallet","type":"address"},{"internalType":"address","name":"_factoryReserve","type":"address"},{"internalType":"uint64","name":"_poolOpenTime","type":"uint64"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investmentAddreses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClose","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orderNumber","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolOpenTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_from","type":"uint64"},{"internalType":"uint64","name":"_to","type":"uint64"}],"name":"releaseTokenAfterVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"removeInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factoryReserve","type":"address"}],"name":"setFactoryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeCreator","type":"uint256"}],"name":"setFeeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundWallet","type":"address"}],"name":"setFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"}],"name":"setMinimumDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePausedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"transferForInvestment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteCreateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint8","name":"_optionId","type":"uint8"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"uint256","name":"limitDeposit","type":"uint256"},{"internalType":"uint64","name":"startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"closeTimeDeposit","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"wlDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052670de0b6b3a764000060075560006013556017805462ffffff1916620100001790553480156200003357600080fd5b506040516200485c3803806200485c833981016040819052620000569162000436565b6200006f8160ff166200016960201b62002b771760201c565b604051602001620000819190620004a0565b604051602081830303815290604052620000a98260ff166200016960201b62002b771760201c565b604051602001620000bb9190620004bd565b60408051601f198184030181529190528151620000e090600390602085019062000390565b508051620000f690600490602084019062000390565b505050620001136200010d6200028660201b60201c565b6200028a565b601080546001600160a01b031916339081179091556200013690600090620002dc565b620001627f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0833620002dc565b50620005ee565b6060816200018e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115620001be5780620001a581620004ee565b9150620001b69050600a8362000522565b915062000192565b6000816001600160401b03811115620001db57620001db62000539565b6040519080825280601f01601f19166020018201604052801562000206576020820181803683370190505b5090505b84156200027e576200021e6001836200054f565b91506200022d600a8662000569565b6200023a90603062000580565b60f81b8183815181106200025257620002526200059b565b60200101906001600160f81b031916908160001a90535062000276600a8662000522565b94506200020a565b949350505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002e88282620002ec565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620002e85760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200034c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200039e90620005b1565b90600052602060002090601f016020900481019282620003c257600085556200040d565b82601f10620003dd57805160ff19168380011785556200040d565b828001600101855582156200040d579182015b828111156200040d578251825591602001919060010190620003f0565b506200041b9291506200041f565b5090565b5b808211156200041b576000815560010162000420565b6000602082840312156200044957600080fd5b815160ff811681146200045b57600080fd5b9392505050565b6000815160005b8181101562000485576020818501810151868301520162000469565b8181111562000495576000828601525b509290920192915050565b65022aaab1016960d51b815260006200045b600683018462000462565b634555562d60e01b815260006200045b600483018462000462565b634e487b7160e01b600052601160045260246000fd5b6000600019821415620005055762000505620004d8565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826200053457620005346200050c565b500490565b634e487b7160e01b600052604160045260246000fd5b600082821015620005645762000564620004d8565b500390565b6000826200057b576200057b6200050c565b500690565b60008219821115620005965762000596620004d8565b500190565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620005c657607f821691505b60208210811415620005e857634e487b7160e01b600052602260045260246000fd5b50919050565b61425e80620005fe6000396000f3fe6080604052600436106103c35760003560e01c806370a08231116101f0578063b6b55f251161010c578063de09ee24116100a5578063eb5797a411610077578063eb5797a414610db1578063ec87621c14610dc6578063f2fde38b14610de8578063fcf4850414610e08578063febc6c4d14610e2857005b8063de09ee2414610d2c578063df75254014610d4c578063e40366c814610d61578063e78ec42e14610d9157005b8063cdae1104116100de578063cdae110414610cad578063cfc9fc4514610ccc578063d547741f14610cec578063dd62ed3e14610d0c57005b8063b6b55f2514610c2d578063c31c9c0714610c4d578063c345cafd14610c6d578063c45a015514610c8d57005b806391d1485411610189578063a217fddf1161015b578063a217fddf14610b9e578063a457c2d714610bb3578063a9059cbb14610bd3578063ac18de4314610bf3578063b04dd81b14610c1357005b806391d1485414610b2157806395d89b4114610b41578063992642e514610b565780639e0b65a614610b7e57005b806387e49c15116101c257806387e49c1514610aa55780638da5cb5b14610ac55780639040d55314610ae35780639194da6314610af957005b806370a0823114610a09578063715018a614610a3f57806379cc679014610a545780638635a57014610a7457005b8063373b4979116102df578063589666f911610278578063664a1ad61161024a578063664a1ad6146108bb57806366805de5146108db5780636943ca2b146108f05780636ae17b1b1461098f5780636d2dd6ba146109f357005b8063589666f91461085a57806359bf5d391461087a578063636bfbab1461088f5780636376539f146108a557005b806342966c68116102b157806342966c68146107c25780634777dbfe146107e257806350885acc1461081a57806355ce3b9a1461083a57005b8063373b49791461072a5780633805ab831461074a57806339509351146107825780633fa8ffa6146107a257005b806319157eaa1161035c5780632d06177a1161032e5780632d06177a1461063b5780632f2ff15d1461065b578063313ce5671461067b57806336568abe1461069d578063372c12b1146106bd57005b806319157eaa146104e95780631c52d6b6146104fc57806323b872dd146105eb578063248a9ca31461060b57005b80630d54538c116103955780630d54538c14610463578063124474a7146104835780631338f493146104b057806318160ddd146104ca57005b806301ffc9a7146103cc57806306fdde0314610401578063095ea7b3146104235780630bd541241461044357005b366103ca57005b005b3480156103d857600080fd5b506103ec6103e736600461395b565b610e48565b60405190151581526020015b60405180910390f35b34801561040d57600080fd5b50610416610e7f565b6040516103f891906139dd565b34801561042f57600080fd5b506103ec61043e366004613a15565b610f11565b34801561044f57600080fd5b506103ca61045e366004613a41565b610f29565b34801561046f57600080fd5b506103ca61047e366004613a86565b610f55565b34801561048f57600080fd5b506104a361049e366004613ac9565b61105f565b6040516103f89190613ae4565b3480156104bc57600080fd5b506017546103ec9060ff1681565b3480156104d657600080fd5b506002545b6040519081526020016103f8565b6103ca6104f7366004613a86565b611182565b34801561050857600080fd5b506105a3610517366004613b47565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b6040516103f8919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b3480156105f757600080fd5b506103ec610606366004613b7e565b6113d4565b34801561061757600080fd5b506104db610626366004613bbf565b60009081526006602052604090206001015490565b34801561064757600080fd5b506103ca610656366004613a41565b6113e1565b34801561066757600080fd5b506103ca610676366004613bd8565b611404565b34801561068757600080fd5b5060125b60405160ff90911681526020016103f8565b3480156106a957600080fd5b506103ca6106b8366004613bd8565b61142e565b3480156106c957600080fd5b506107056106d8366004613a41565b600c60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103f8565b34801561073657600080fd5b506103ca610745366004613c13565b6114ac565b34801561075657600080fd5b5060115461076a906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b34801561078e57600080fd5b506103ec61079d366004613a15565b611753565b3480156107ae57600080fd5b506103ca6107bd366004613bbf565b611775565b3480156107ce57600080fd5b506103ca6107dd366004613bbf565b611b96565b3480156107ee57600080fd5b50600b54610802906001600160401b031681565b6040516001600160401b0390911681526020016103f8565b34801561082657600080fd5b506103ca610835366004613bbf565b611ba0565b34801561084657600080fd5b506103ca610855366004613a41565b611bbe565b34801561086657600080fd5b506103ca610875366004613d02565b611be8565b34801561088657600080fd5b5061076a611d92565b34801561089b57600080fd5b506104db60165481565b3480156108b157600080fd5b506104db60145481565b3480156108c757600080fd5b5060125461076a906001600160a01b031681565b3480156108e757600080fd5b506103ca611e14565b3480156108fc57600080fd5b5061095461090b366004613b47565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b031660608201526080016103f8565b34801561099b57600080fd5b506109546109aa366004613da2565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b3480156109ff57600080fd5b506104db60135481565b348015610a1557600080fd5b506104db610a24366004613a41565b6001600160a01b03166000908152600d602052604090205490565b348015610a4b57600080fd5b506103ca611e3c565b348015610a6057600080fd5b506103ca610a6f366004613a15565b611e50565b348015610a8057600080fd5b50610a94610a8f366004613ac9565b611e65565b6040516103f8959493929190613dd5565b348015610ab157600080fd5b506103ca610ac0366004613a41565b611f32565b348015610ad157600080fd5b506005546001600160a01b031661076a565b348015610aef57600080fd5b506104db60075481565b348015610b0557600080fd5b5061076a73e592427a0aece92de3edee1f18e0157c0586156481565b348015610b2d57600080fd5b506103ec610b3c366004613bd8565b611f6d565b348015610b4d57600080fd5b50610416611f98565b348015610b6257600080fd5b5061076a73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b348015610b8a57600080fd5b506103ca610b99366004613e1a565b611fa7565b348015610baa57600080fd5b506104db600081565b348015610bbf57600080fd5b506103ec610bce366004613a15565b6120b6565b348015610bdf57600080fd5b506103ec610bee366004613a15565b61213c565b348015610bff57600080fd5b506103ca610c0e366004613a41565b612152565b348015610c1f57600080fd5b5060155461068b9060ff1681565b348015610c3957600080fd5b506103ca610c48366004613bbf565b612172565b348015610c5957600080fd5b50600f5461076a906001600160a01b031681565b348015610c7957600080fd5b506103ca610c88366004613e5c565b61240e565b348015610c9957600080fd5b5060105461076a906001600160a01b031681565b348015610cb957600080fd5b506017546103ec90610100900460ff1681565b348015610cd857600080fd5b506103ca610ce7366004613e86565b6128b6565b348015610cf857600080fd5b506103ca610d07366004613bd8565b61298e565b348015610d1857600080fd5b506104db610d27366004613ef0565b6129b3565b348015610d3857600080fd5b506103ca610d47366004613a41565b6129de565b348015610d5857600080fd5b506103ca612a07565b348015610d6d57600080fd5b506103ec610d7c366004613a41565b600e6020526000908152604090205460ff1681565b348015610d9d57600080fd5b506103ca610dac366004613bbf565b612a3d565b348015610dbd57600080fd5b506103ca612a5b565b348015610dd257600080fd5b506104db60008051602061420983398151915281565b348015610df457600080fd5b506103ca610e03366004613a41565b612a80565b348015610e1457600080fd5b506103ca610e23366004613ac9565b612af6565b348015610e3457600080fd5b506017546103ec9062010000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610e7957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610e8e90613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90613f0e565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b600033610f1f818585612c7c565b5060019392505050565b610f31612da1565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b600080516020614209833981519152610f6d81612dfb565b60ff808516600090815260086020526040902060010154600160801b90041615610fde5760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b031610156110585760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110469130916101009091046001600160a01b031690612e05565b8061105081613f5f565b915050610fe0565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a081019092528054829082906110b690613f0e565b80601f01602080910402602001604051908101604052809291908181526020018280546110e290613f0e565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b60175462010000900460ff166111d35760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b6044820152606401610fd5565b60175460ff1661121a5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b61123260008051602061420983398151915233611f6d565b1561123c57611335565b6007543410156112995760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b6064820152608401610fd5565b336000908152600d60205260409020546002546112ba90600a905b906130aa565b811015806112db57506112db60008051602061420983398151915233611f6d565b6113335760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b6064820152608401610fd5565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556017805462ff00001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b6000610f1f848484612e05565b6113e9612da1565b611401600080516020614209833981519152826130bd565b50565b60008281526006602052604090206001015461141f81612dfb565b61142983836130c3565b505050565b6001600160a01b038116331461149e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610fd5565b6114a88282613149565b5050565b6000805160206142098339815191526114c481612dfb565b60008551116115065760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b6044820152606401610fd5565b6000841161154e5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b6044820152606401610fd5565b6000836001600160401b0316116115a75760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b6000826001600160401b0316116116005760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b826001600160401b0316826001600160401b0316116116875760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f7369740000000000006064820152608401610fd5565b60005b855181101561174b576040518060600160405280868152602001856001600160401b03168152602001846001600160401b0316815250600c60008884815181106116d6576116d6613f86565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b03199094169216919091179190911790558061174381613f9c565b91505061168a565b505050505050565b600033610f1f81858561176683836129b3565b6117709190613fb7565b612c7c565b60175460ff16156117b95760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b600081116118095760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610fd5565b336000908152600c6020526040902060010154600160401b90046001600160401b03164211156118725760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b6044820152606401610fd5565b336000908152600c60205260409020600101546001600160401b03164210156118dd5760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f74207374617274000000000000006044820152606401610fd5565b336000908152600c602052604090205481111561193c5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b60145460135461194c90836131b0565b111561199a5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b6016548110156119d95760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b60006119ea8264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190613fcf565b50611a7a33836131bc565b336000908152600d6020526040902054611a9490836131b0565b336000908152600d6020526040902055601254611aca906001600160a01b0316611ac56103e86112b48660fa61329b565b6131bc565b611aff611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040902054906131b0565b6012546001600160a01b03166000908152600d6020526040902055601354611b2790836131b0565b601355336000908152600c6020526040902054611b4490836132a7565b336000818152600c6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90611b8a9085815260200190565b60405180910390a25050565b61140133826132b3565b600080516020614209833981519152611bb881612dfb565b50600755565b611bc6612da1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020614209833981519152611c0081612dfb565b60175460ff16611c475760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b6000611c51611d92565b600f54909150611c6c9087906001600160a01b03168a613401565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052600f54925163c04b8d5960e01b8152939450909291169063c04b8d5990611cfe908590600401613ff1565b6020604051808303816000875af1158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d419190614049565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611d7e91815260200190565b60405180910390a250505050505050505050565b6011546015546040516375ed572560e11b815260ff909116600482015260009182916001600160a01b039091169063ebdaae4a90602401608060405180830381865afa158015611de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0a9190614062565b5091949350505050565b600080516020614209833981519152611e2c81612dfb565b506017805460ff19166001179055565b611e44612da1565b611e4e60006134fa565b565b611e5b82338361354c565b6114a882826132b3565b600860205260009081526040902080548190611e8090613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eac90613f0e565b8015611ef95780601f10611ece57610100808354040283529160200191611ef9565b820191906000526020600020905b815481529060010190602001808311611edc57829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b600080516020614209833981519152611f4a81612dfb565b50601180546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610e8e90613f0e565b600080516020614209833981519152611fbf81612dfb565b6001600160a01b0382166120155760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f00000000000000006044820152606401610fd5565b6001600160a01b0382166000908152600e602052604090205460ff166120885760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0384166120a5576120a082846135c0565b6120b0565b6120b0848385613663565b50505050565b600033816120c482866129b3565b9050838110156121245760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fd5565b6121318286868403612c7c565b506001949350505050565b6000612149338484612e05565b50600192915050565b61215a612da1565b6114016000805160206142098339815191528261298e565b60175460ff16156121b65760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b6013546121c390826131b0565b60145410156122035760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b6044820152606401610fd5565b6016548110156122425760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b600b546001600160401b03164210156122a75760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b6064820152608401610fd5565b60006122b88264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015612319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233d9190613fcf565b5061234833836131bc565b336000908152600d602052604090205461236290836131b0565b336000908152600d6020526040902055601254612393906001600160a01b0316611ac56103e86112b48660fa61329b565b6123a7611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040812091909155601380548492906123d7908490613fb7565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b8a565b60175460ff166124565760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff808316600090815260086020526040902060010154600160801b9004166124b75760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020546001600160401b03161561251c5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020600101541561257b5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b336000818152600d6020526040902054906125979030836113d4565b5060ff83166000908152600860205260409020600190810180546011906125cf908490600160881b90046001600160401b03166140c1565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166040516128a994939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b6010546001600160a01b031633146128fc5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610fd5565b6016939093556014939093556015805460ff90951660ff1990951694909417909355600f80546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600b80546001600160401b0390931667ffffffffffffffff1990931692909217909155601280546001600160a01b0394851690831617905560118054929093169116179055565b6000828152600660205260409020600101546129a981612dfb565b6114298383613149565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6129e6612da1565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b600080516020614209833981519152612a1f81612dfb565b506017805461ff001981166101009182900460ff1615909102179055565b600080516020614209833981519152612a5581612dfb565b50601655565b600080516020614209833981519152612a7381612dfb565b506017805460ff19169055565b612a88612da1565b6001600160a01b038116612aed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fd5565b611401816134fa565b600080516020614209833981519152612b0e81612dfb565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556017805462ff000019166201000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b606081612b9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612bc55780612baf81613f9c565b9150612bbe9050600a83614102565b9150612b9f565b6000816001600160401b03811115612bdf57612bdf613bfd565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b5090505b8415612c7457612c1e600183614116565b9150612c2b600a8661412d565b612c36906030613fb7565b60f81b818381518110612c4b57612c4b613f86565b60200101906001600160f81b031916908160001a905350612c6d600a86614102565b9450612c0d565b949350505050565b6001600160a01b038316612cde5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fd5565b6001600160a01b038216612d3f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611e4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fd5565b611401813361375c565b6001600160a01b038316612e695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610fd5565b6001600160a01b038216612ecb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610fd5565b601754610100900460ff1615612f235760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e7366657220697320706175736564000000000000006044820152606401610fd5565b60008111612f855760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610fd5565b6001600160a01b0383166000908152600d60205260409020548111156130045760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b6064820152608401610fd5565b6001600160a01b0383166000908152600d602052604090205461302790826132a7565b6001600160a01b038085166000908152600d6020526040808220939093559084168152205461305690826131b0565b6001600160a01b038084166000818152600d602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d949085815260200190565b60006130b68284614102565b9392505050565b6114a882825b6130cd8282611f6d565b6114a85760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556131053390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6131538282611f6d565b156114a85760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130b68284613fb7565b6001600160a01b0382166132125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610fd5565b80600260008282546132249190613fb7565b90915550506001600160a01b03821660009081526020819052604081208054839290613251908490613fb7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006130b68284614141565b60006130b68284614116565b6001600160a01b0382166133135760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610fd5565b6001600160a01b038216600090815260208190526040902054818110156133875760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610fd5565b6001600160a01b03831660009081526020819052604081208383039055600280548492906133b6908490614116565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161345d9190614160565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b50915091508180156134c95750805115806134c95750808060200190518101906134c99190613fcf565b6110585760405162461bcd60e51b8152602060048201526002602482015261534160f01b6044820152606401610fd5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061355884846129b3565b905060001981146120b057818110156135b35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610fd5565b6120b08484848403612c7c565b604080516000808252602082019092526001600160a01b0384169083906040516135ea9190614160565b60006040518083038185875af1925050503d8060008114613627576040519150601f19603f3d011682016040523d82523d6000602084013e61362c565b606091505b50509050806114295760405162461bcd60e51b815260206004820152600360248201526253544560e81b6044820152606401610fd5565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916136bf9190614160565b6000604051808303816000865af19150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081801561372b57508051158061372b57508080602001905181019061372b9190613fcf565b6110585760405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606401610fd5565b6137668282611f6d565b6114a85761377e816001600160a01b031660146137c0565b6137898360206137c0565b60405160200161379a92919061417c565b60408051601f198184030181529082905262461bcd60e51b8252610fd5916004016139dd565b606060006137cf836002614141565b6137da906002613fb7565b6001600160401b038111156137f1576137f1613bfd565b6040519080825280601f01601f19166020018201604052801561381b576020820181803683370190505b509050600360fc1b8160008151811061383657613836613f86565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061386557613865613f86565b60200101906001600160f81b031916908160001a9053506000613889846002614141565b613894906001613fb7565b90505b600181111561390c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106138c8576138c8613f86565b1a60f81b8282815181106138de576138de613f86565b60200101906001600160f81b031916908160001a90535060049490941c93613905816141f1565b9050613897565b5083156130b65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610fd5565b60006020828403121561396d57600080fd5b81356001600160e01b0319811681146130b657600080fd5b60005b838110156139a0578181015183820152602001613988565b838111156120b05750506000910152565b600081518084526139c9816020860160208601613985565b601f01601f19169290920160200192915050565b6020815260006130b660208301846139b1565b6001600160a01b038116811461140157600080fd5b8035613a10816139f0565b919050565b60008060408385031215613a2857600080fd5b8235613a33816139f0565b946020939093013593505050565b600060208284031215613a5357600080fd5b81356130b6816139f0565b803560ff81168114613a1057600080fd5b80356001600160401b0381168114613a1057600080fd5b600080600060608486031215613a9b57600080fd5b613aa484613a5e565b9250613ab260208501613a6f565b9150613ac060408501613a6f565b90509250925092565b600060208284031215613adb57600080fd5b6130b682613a5e565b602081526000825160a06020840152613b0060c08401826139b1565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613b5a57600080fd5b613b6383613a5e565b91506020830135613b73816139f0565b809150509250929050565b600080600060608486031215613b9357600080fd5b8335613b9e816139f0565b92506020840135613bae816139f0565b929592945050506040919091013590565b600060208284031215613bd157600080fd5b5035919050565b60008060408385031215613beb57600080fd5b823591506020830135613b73816139f0565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613c2957600080fd5b84356001600160401b0380821115613c4057600080fd5b818701915087601f830112613c5457600080fd5b8135602082821115613c6857613c68613bfd565b8160051b604051601f19603f83011681018181108682111715613c8d57613c8d613bfd565b60405292835281830193508481018201928b841115613cab57600080fd5b948201945b83861015613cd057613cc186613a05565b85529482019493820193613cb0565b9850508801359550613ce9925050604087019050613a6f565b9150613cf760608601613a6f565b905092959194509250565b60008060008060008060a08789031215613d1b57600080fd5b86359550602087013594506040870135613d34816139f0565b935060608701356001600160401b0380821115613d5057600080fd5b818901915089601f830112613d6457600080fd5b813581811115613d7357600080fd5b8a6020828501011115613d8557600080fd5b602083019550809450505050608087013590509295509295509295565b60008060408385031215613db557600080fd5b613dbe83613a5e565b9150613dcc60208401613a6f565b90509250929050565b60a081526000613de860a08301886139b1565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613e2f57600080fd5b8335613e3a816139f0565b9250602084013591506040840135613e51816139f0565b809150509250925092565b60008060408385031215613e6f57600080fd5b613e7883613a5e565b9150613dcc60208401613a5e565b60008060008060008060c08789031215613e9f57600080fd5b613ea887613a5e565b955060208701359450604087013593506060870135613ec6816139f0565b92506080870135613ed6816139f0565b9150613ee460a08801613a6f565b90509295509295509295565b60008060408385031215613f0357600080fd5b8235613b63816139f0565b600181811c90821680613f2257607f821691505b60208210811415613f4357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0380831681811415613f7c57613f7c613f49565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613fb057613fb0613f49565b5060010190565b60008219821115613fca57613fca613f49565b500190565b600060208284031215613fe157600080fd5b815180151581146130b657600080fd5b602081526000825160a0602084015261400d60c08401826139b1565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b60006020828403121561405b57600080fd5b5051919050565b6000806000806080858703121561407857600080fd5b8451614083816139f0565b6020860151909450614094816139f0565b60408601519093506140a5816139f0565b60608601519092506140b6816139f0565b939692955090935050565b60006001600160401b038083168185168083038211156140e3576140e3613f49565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082614111576141116140ec565b500490565b60008282101561412857614128613f49565b500390565b60008261413c5761413c6140ec565b500690565b600081600019048311821515161561415b5761415b613f49565b500290565b60008251614172818460208701613985565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516141b4816017850160208801613985565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516141e5816028840160208801613985565b01602801949350505050565b60008161420057614200613f49565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a26469706673582212205e7097b4f91470c91f0e29b95afab1d26949239c5e480fab23a3641b7c015caf64736f6c634300080c00330000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106103c35760003560e01c806370a08231116101f0578063b6b55f251161010c578063de09ee24116100a5578063eb5797a411610077578063eb5797a414610db1578063ec87621c14610dc6578063f2fde38b14610de8578063fcf4850414610e08578063febc6c4d14610e2857005b8063de09ee2414610d2c578063df75254014610d4c578063e40366c814610d61578063e78ec42e14610d9157005b8063cdae1104116100de578063cdae110414610cad578063cfc9fc4514610ccc578063d547741f14610cec578063dd62ed3e14610d0c57005b8063b6b55f2514610c2d578063c31c9c0714610c4d578063c345cafd14610c6d578063c45a015514610c8d57005b806391d1485411610189578063a217fddf1161015b578063a217fddf14610b9e578063a457c2d714610bb3578063a9059cbb14610bd3578063ac18de4314610bf3578063b04dd81b14610c1357005b806391d1485414610b2157806395d89b4114610b41578063992642e514610b565780639e0b65a614610b7e57005b806387e49c15116101c257806387e49c1514610aa55780638da5cb5b14610ac55780639040d55314610ae35780639194da6314610af957005b806370a0823114610a09578063715018a614610a3f57806379cc679014610a545780638635a57014610a7457005b8063373b4979116102df578063589666f911610278578063664a1ad61161024a578063664a1ad6146108bb57806366805de5146108db5780636943ca2b146108f05780636ae17b1b1461098f5780636d2dd6ba146109f357005b8063589666f91461085a57806359bf5d391461087a578063636bfbab1461088f5780636376539f146108a557005b806342966c68116102b157806342966c68146107c25780634777dbfe146107e257806350885acc1461081a57806355ce3b9a1461083a57005b8063373b49791461072a5780633805ab831461074a57806339509351146107825780633fa8ffa6146107a257005b806319157eaa1161035c5780632d06177a1161032e5780632d06177a1461063b5780632f2ff15d1461065b578063313ce5671461067b57806336568abe1461069d578063372c12b1146106bd57005b806319157eaa146104e95780631c52d6b6146104fc57806323b872dd146105eb578063248a9ca31461060b57005b80630d54538c116103955780630d54538c14610463578063124474a7146104835780631338f493146104b057806318160ddd146104ca57005b806301ffc9a7146103cc57806306fdde0314610401578063095ea7b3146104235780630bd541241461044357005b366103ca57005b005b3480156103d857600080fd5b506103ec6103e736600461395b565b610e48565b60405190151581526020015b60405180910390f35b34801561040d57600080fd5b50610416610e7f565b6040516103f891906139dd565b34801561042f57600080fd5b506103ec61043e366004613a15565b610f11565b34801561044f57600080fd5b506103ca61045e366004613a41565b610f29565b34801561046f57600080fd5b506103ca61047e366004613a86565b610f55565b34801561048f57600080fd5b506104a361049e366004613ac9565b61105f565b6040516103f89190613ae4565b3480156104bc57600080fd5b506017546103ec9060ff1681565b3480156104d657600080fd5b506002545b6040519081526020016103f8565b6103ca6104f7366004613a86565b611182565b34801561050857600080fd5b506105a3610517366004613b47565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b6040516103f8919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b3480156105f757600080fd5b506103ec610606366004613b7e565b6113d4565b34801561061757600080fd5b506104db610626366004613bbf565b60009081526006602052604090206001015490565b34801561064757600080fd5b506103ca610656366004613a41565b6113e1565b34801561066757600080fd5b506103ca610676366004613bd8565b611404565b34801561068757600080fd5b5060125b60405160ff90911681526020016103f8565b3480156106a957600080fd5b506103ca6106b8366004613bd8565b61142e565b3480156106c957600080fd5b506107056106d8366004613a41565b600c60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103f8565b34801561073657600080fd5b506103ca610745366004613c13565b6114ac565b34801561075657600080fd5b5060115461076a906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b34801561078e57600080fd5b506103ec61079d366004613a15565b611753565b3480156107ae57600080fd5b506103ca6107bd366004613bbf565b611775565b3480156107ce57600080fd5b506103ca6107dd366004613bbf565b611b96565b3480156107ee57600080fd5b50600b54610802906001600160401b031681565b6040516001600160401b0390911681526020016103f8565b34801561082657600080fd5b506103ca610835366004613bbf565b611ba0565b34801561084657600080fd5b506103ca610855366004613a41565b611bbe565b34801561086657600080fd5b506103ca610875366004613d02565b611be8565b34801561088657600080fd5b5061076a611d92565b34801561089b57600080fd5b506104db60165481565b3480156108b157600080fd5b506104db60145481565b3480156108c757600080fd5b5060125461076a906001600160a01b031681565b3480156108e757600080fd5b506103ca611e14565b3480156108fc57600080fd5b5061095461090b366004613b47565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b031660608201526080016103f8565b34801561099b57600080fd5b506109546109aa366004613da2565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b3480156109ff57600080fd5b506104db60135481565b348015610a1557600080fd5b506104db610a24366004613a41565b6001600160a01b03166000908152600d602052604090205490565b348015610a4b57600080fd5b506103ca611e3c565b348015610a6057600080fd5b506103ca610a6f366004613a15565b611e50565b348015610a8057600080fd5b50610a94610a8f366004613ac9565b611e65565b6040516103f8959493929190613dd5565b348015610ab157600080fd5b506103ca610ac0366004613a41565b611f32565b348015610ad157600080fd5b506005546001600160a01b031661076a565b348015610aef57600080fd5b506104db60075481565b348015610b0557600080fd5b5061076a73e592427a0aece92de3edee1f18e0157c0586156481565b348015610b2d57600080fd5b506103ec610b3c366004613bd8565b611f6d565b348015610b4d57600080fd5b50610416611f98565b348015610b6257600080fd5b5061076a73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b348015610b8a57600080fd5b506103ca610b99366004613e1a565b611fa7565b348015610baa57600080fd5b506104db600081565b348015610bbf57600080fd5b506103ec610bce366004613a15565b6120b6565b348015610bdf57600080fd5b506103ec610bee366004613a15565b61213c565b348015610bff57600080fd5b506103ca610c0e366004613a41565b612152565b348015610c1f57600080fd5b5060155461068b9060ff1681565b348015610c3957600080fd5b506103ca610c48366004613bbf565b612172565b348015610c5957600080fd5b50600f5461076a906001600160a01b031681565b348015610c7957600080fd5b506103ca610c88366004613e5c565b61240e565b348015610c9957600080fd5b5060105461076a906001600160a01b031681565b348015610cb957600080fd5b506017546103ec90610100900460ff1681565b348015610cd857600080fd5b506103ca610ce7366004613e86565b6128b6565b348015610cf857600080fd5b506103ca610d07366004613bd8565b61298e565b348015610d1857600080fd5b506104db610d27366004613ef0565b6129b3565b348015610d3857600080fd5b506103ca610d47366004613a41565b6129de565b348015610d5857600080fd5b506103ca612a07565b348015610d6d57600080fd5b506103ec610d7c366004613a41565b600e6020526000908152604090205460ff1681565b348015610d9d57600080fd5b506103ca610dac366004613bbf565b612a3d565b348015610dbd57600080fd5b506103ca612a5b565b348015610dd257600080fd5b506104db60008051602061420983398151915281565b348015610df457600080fd5b506103ca610e03366004613a41565b612a80565b348015610e1457600080fd5b506103ca610e23366004613ac9565b612af6565b348015610e3457600080fd5b506017546103ec9062010000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610e7957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610e8e90613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90613f0e565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b600033610f1f818585612c7c565b5060019392505050565b610f31612da1565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b600080516020614209833981519152610f6d81612dfb565b60ff808516600090815260086020526040902060010154600160801b90041615610fde5760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b031610156110585760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110469130916101009091046001600160a01b031690612e05565b8061105081613f5f565b915050610fe0565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a081019092528054829082906110b690613f0e565b80601f01602080910402602001604051908101604052809291908181526020018280546110e290613f0e565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b60175462010000900460ff166111d35760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b6044820152606401610fd5565b60175460ff1661121a5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b61123260008051602061420983398151915233611f6d565b1561123c57611335565b6007543410156112995760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b6064820152608401610fd5565b336000908152600d60205260409020546002546112ba90600a905b906130aa565b811015806112db57506112db60008051602061420983398151915233611f6d565b6113335760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b6064820152608401610fd5565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556017805462ff00001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b6000610f1f848484612e05565b6113e9612da1565b611401600080516020614209833981519152826130bd565b50565b60008281526006602052604090206001015461141f81612dfb565b61142983836130c3565b505050565b6001600160a01b038116331461149e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610fd5565b6114a88282613149565b5050565b6000805160206142098339815191526114c481612dfb565b60008551116115065760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b6044820152606401610fd5565b6000841161154e5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b6044820152606401610fd5565b6000836001600160401b0316116115a75760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b6000826001600160401b0316116116005760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b826001600160401b0316826001600160401b0316116116875760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f7369740000000000006064820152608401610fd5565b60005b855181101561174b576040518060600160405280868152602001856001600160401b03168152602001846001600160401b0316815250600c60008884815181106116d6576116d6613f86565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b03199094169216919091179190911790558061174381613f9c565b91505061168a565b505050505050565b600033610f1f81858561176683836129b3565b6117709190613fb7565b612c7c565b60175460ff16156117b95760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b600081116118095760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610fd5565b336000908152600c6020526040902060010154600160401b90046001600160401b03164211156118725760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b6044820152606401610fd5565b336000908152600c60205260409020600101546001600160401b03164210156118dd5760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f74207374617274000000000000006044820152606401610fd5565b336000908152600c602052604090205481111561193c5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b60145460135461194c90836131b0565b111561199a5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b6016548110156119d95760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b60006119ea8264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190613fcf565b50611a7a33836131bc565b336000908152600d6020526040902054611a9490836131b0565b336000908152600d6020526040902055601254611aca906001600160a01b0316611ac56103e86112b48660fa61329b565b6131bc565b611aff611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040902054906131b0565b6012546001600160a01b03166000908152600d6020526040902055601354611b2790836131b0565b601355336000908152600c6020526040902054611b4490836132a7565b336000818152600c6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90611b8a9085815260200190565b60405180910390a25050565b61140133826132b3565b600080516020614209833981519152611bb881612dfb565b50600755565b611bc6612da1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020614209833981519152611c0081612dfb565b60175460ff16611c475760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b6000611c51611d92565b600f54909150611c6c9087906001600160a01b03168a613401565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052600f54925163c04b8d5960e01b8152939450909291169063c04b8d5990611cfe908590600401613ff1565b6020604051808303816000875af1158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d419190614049565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611d7e91815260200190565b60405180910390a250505050505050505050565b6011546015546040516375ed572560e11b815260ff909116600482015260009182916001600160a01b039091169063ebdaae4a90602401608060405180830381865afa158015611de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0a9190614062565b5091949350505050565b600080516020614209833981519152611e2c81612dfb565b506017805460ff19166001179055565b611e44612da1565b611e4e60006134fa565b565b611e5b82338361354c565b6114a882826132b3565b600860205260009081526040902080548190611e8090613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eac90613f0e565b8015611ef95780601f10611ece57610100808354040283529160200191611ef9565b820191906000526020600020905b815481529060010190602001808311611edc57829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b600080516020614209833981519152611f4a81612dfb565b50601180546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610e8e90613f0e565b600080516020614209833981519152611fbf81612dfb565b6001600160a01b0382166120155760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f00000000000000006044820152606401610fd5565b6001600160a01b0382166000908152600e602052604090205460ff166120885760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0384166120a5576120a082846135c0565b6120b0565b6120b0848385613663565b50505050565b600033816120c482866129b3565b9050838110156121245760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fd5565b6121318286868403612c7c565b506001949350505050565b6000612149338484612e05565b50600192915050565b61215a612da1565b6114016000805160206142098339815191528261298e565b60175460ff16156121b65760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b6013546121c390826131b0565b60145410156122035760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b6044820152606401610fd5565b6016548110156122425760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b600b546001600160401b03164210156122a75760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b6064820152608401610fd5565b60006122b88264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015612319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233d9190613fcf565b5061234833836131bc565b336000908152600d602052604090205461236290836131b0565b336000908152600d6020526040902055601254612393906001600160a01b0316611ac56103e86112b48660fa61329b565b6123a7611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040812091909155601380548492906123d7908490613fb7565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b8a565b60175460ff166124565760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff808316600090815260086020526040902060010154600160801b9004166124b75760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020546001600160401b03161561251c5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020600101541561257b5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b336000818152600d6020526040902054906125979030836113d4565b5060ff83166000908152600860205260409020600190810180546011906125cf908490600160881b90046001600160401b03166140c1565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166040516128a994939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b6010546001600160a01b031633146128fc5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610fd5565b6016939093556014939093556015805460ff90951660ff1990951694909417909355600f80546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600b80546001600160401b0390931667ffffffffffffffff1990931692909217909155601280546001600160a01b0394851690831617905560118054929093169116179055565b6000828152600660205260409020600101546129a981612dfb565b6114298383613149565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6129e6612da1565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b600080516020614209833981519152612a1f81612dfb565b506017805461ff001981166101009182900460ff1615909102179055565b600080516020614209833981519152612a5581612dfb565b50601655565b600080516020614209833981519152612a7381612dfb565b506017805460ff19169055565b612a88612da1565b6001600160a01b038116612aed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fd5565b611401816134fa565b600080516020614209833981519152612b0e81612dfb565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556017805462ff000019166201000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b606081612b9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612bc55780612baf81613f9c565b9150612bbe9050600a83614102565b9150612b9f565b6000816001600160401b03811115612bdf57612bdf613bfd565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b5090505b8415612c7457612c1e600183614116565b9150612c2b600a8661412d565b612c36906030613fb7565b60f81b818381518110612c4b57612c4b613f86565b60200101906001600160f81b031916908160001a905350612c6d600a86614102565b9450612c0d565b949350505050565b6001600160a01b038316612cde5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fd5565b6001600160a01b038216612d3f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611e4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fd5565b611401813361375c565b6001600160a01b038316612e695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610fd5565b6001600160a01b038216612ecb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610fd5565b601754610100900460ff1615612f235760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e7366657220697320706175736564000000000000006044820152606401610fd5565b60008111612f855760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610fd5565b6001600160a01b0383166000908152600d60205260409020548111156130045760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b6064820152608401610fd5565b6001600160a01b0383166000908152600d602052604090205461302790826132a7565b6001600160a01b038085166000908152600d6020526040808220939093559084168152205461305690826131b0565b6001600160a01b038084166000818152600d602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d949085815260200190565b60006130b68284614102565b9392505050565b6114a882825b6130cd8282611f6d565b6114a85760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556131053390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6131538282611f6d565b156114a85760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130b68284613fb7565b6001600160a01b0382166132125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610fd5565b80600260008282546132249190613fb7565b90915550506001600160a01b03821660009081526020819052604081208054839290613251908490613fb7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006130b68284614141565b60006130b68284614116565b6001600160a01b0382166133135760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610fd5565b6001600160a01b038216600090815260208190526040902054818110156133875760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610fd5565b6001600160a01b03831660009081526020819052604081208383039055600280548492906133b6908490614116565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161345d9190614160565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b50915091508180156134c95750805115806134c95750808060200190518101906134c99190613fcf565b6110585760405162461bcd60e51b8152602060048201526002602482015261534160f01b6044820152606401610fd5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061355884846129b3565b905060001981146120b057818110156135b35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610fd5565b6120b08484848403612c7c565b604080516000808252602082019092526001600160a01b0384169083906040516135ea9190614160565b60006040518083038185875af1925050503d8060008114613627576040519150601f19603f3d011682016040523d82523d6000602084013e61362c565b606091505b50509050806114295760405162461bcd60e51b815260206004820152600360248201526253544560e81b6044820152606401610fd5565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916136bf9190614160565b6000604051808303816000865af19150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081801561372b57508051158061372b57508080602001905181019061372b9190613fcf565b6110585760405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606401610fd5565b6137668282611f6d565b6114a85761377e816001600160a01b031660146137c0565b6137898360206137c0565b60405160200161379a92919061417c565b60408051601f198184030181529082905262461bcd60e51b8252610fd5916004016139dd565b606060006137cf836002614141565b6137da906002613fb7565b6001600160401b038111156137f1576137f1613bfd565b6040519080825280601f01601f19166020018201604052801561381b576020820181803683370190505b509050600360fc1b8160008151811061383657613836613f86565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061386557613865613f86565b60200101906001600160f81b031916908160001a9053506000613889846002614141565b613894906001613fb7565b90505b600181111561390c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106138c8576138c8613f86565b1a60f81b8282815181106138de576138de613f86565b60200101906001600160f81b031916908160001a90535060049490941c93613905816141f1565b9050613897565b5083156130b65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610fd5565b60006020828403121561396d57600080fd5b81356001600160e01b0319811681146130b657600080fd5b60005b838110156139a0578181015183820152602001613988565b838111156120b05750506000910152565b600081518084526139c9816020860160208601613985565b601f01601f19169290920160200192915050565b6020815260006130b660208301846139b1565b6001600160a01b038116811461140157600080fd5b8035613a10816139f0565b919050565b60008060408385031215613a2857600080fd5b8235613a33816139f0565b946020939093013593505050565b600060208284031215613a5357600080fd5b81356130b6816139f0565b803560ff81168114613a1057600080fd5b80356001600160401b0381168114613a1057600080fd5b600080600060608486031215613a9b57600080fd5b613aa484613a5e565b9250613ab260208501613a6f565b9150613ac060408501613a6f565b90509250925092565b600060208284031215613adb57600080fd5b6130b682613a5e565b602081526000825160a06020840152613b0060c08401826139b1565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613b5a57600080fd5b613b6383613a5e565b91506020830135613b73816139f0565b809150509250929050565b600080600060608486031215613b9357600080fd5b8335613b9e816139f0565b92506020840135613bae816139f0565b929592945050506040919091013590565b600060208284031215613bd157600080fd5b5035919050565b60008060408385031215613beb57600080fd5b823591506020830135613b73816139f0565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613c2957600080fd5b84356001600160401b0380821115613c4057600080fd5b818701915087601f830112613c5457600080fd5b8135602082821115613c6857613c68613bfd565b8160051b604051601f19603f83011681018181108682111715613c8d57613c8d613bfd565b60405292835281830193508481018201928b841115613cab57600080fd5b948201945b83861015613cd057613cc186613a05565b85529482019493820193613cb0565b9850508801359550613ce9925050604087019050613a6f565b9150613cf760608601613a6f565b905092959194509250565b60008060008060008060a08789031215613d1b57600080fd5b86359550602087013594506040870135613d34816139f0565b935060608701356001600160401b0380821115613d5057600080fd5b818901915089601f830112613d6457600080fd5b813581811115613d7357600080fd5b8a6020828501011115613d8557600080fd5b602083019550809450505050608087013590509295509295509295565b60008060408385031215613db557600080fd5b613dbe83613a5e565b9150613dcc60208401613a6f565b90509250929050565b60a081526000613de860a08301886139b1565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613e2f57600080fd5b8335613e3a816139f0565b9250602084013591506040840135613e51816139f0565b809150509250925092565b60008060408385031215613e6f57600080fd5b613e7883613a5e565b9150613dcc60208401613a5e565b60008060008060008060c08789031215613e9f57600080fd5b613ea887613a5e565b955060208701359450604087013593506060870135613ec6816139f0565b92506080870135613ed6816139f0565b9150613ee460a08801613a6f565b90509295509295509295565b60008060408385031215613f0357600080fd5b8235613b63816139f0565b600181811c90821680613f2257607f821691505b60208210811415613f4357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0380831681811415613f7c57613f7c613f49565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613fb057613fb0613f49565b5060010190565b60008219821115613fca57613fca613f49565b500190565b600060208284031215613fe157600080fd5b815180151581146130b657600080fd5b602081526000825160a0602084015261400d60c08401826139b1565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b60006020828403121561405b57600080fd5b5051919050565b6000806000806080858703121561407857600080fd5b8451614083816139f0565b6020860151909450614094816139f0565b60408601519093506140a5816139f0565b60608601519092506140b6816139f0565b939692955090935050565b60006001600160401b038083168185168083038211156140e3576140e3613f49565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082614111576141116140ec565b500490565b60008282101561412857614128613f49565b500390565b60008261413c5761413c6140ec565b500690565b600081600019048311821515161561415b5761415b613f49565b500290565b60008251614172818460208701613985565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516141b4816017850160208801613985565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516141e5816028840160208801613985565b01602801949350505050565b60008161420057614200613f49565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a26469706673582212205e7097b4f91470c91f0e29b95afab1d26949239c5e480fab23a3641b7c015caf64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _orderNumber (uint8): 1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
53657:14575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24911:204;;;;;;;;;;-1:-1:-1;24911:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;24911:204:0;;;;;;;;41624:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43975:201::-;;;;;;;;;;-1:-1:-1;43975:201:0;;;;;:::i;:::-;;:::i;63141:139::-;;;;;;;;;;-1:-1:-1;63141:139:0;;;;;:::i;:::-;;:::i;67754:475::-;;;;;;;;;;-1:-1:-1;67754:475:0;;;;;:::i;:::-;;:::i;64284:119::-;;;;;;;;;;-1:-1:-1;64284:119:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55231:27::-;;;;;;;;;;-1:-1:-1;55231:27:0;;;;;;;;42744:108;;;;;;;;;;-1:-1:-1;42832:12:0;;42744:108;;;3829:25:1;;;3817:2;3802:18;42744:108:0;3683:177:1;65129:998:0;;;;;;:::i;:::-;;:::i;64913:182::-;;;;;;;;;;-1:-1:-1;64913:182:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65057:23:0;;;;;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;65057:30:0;;;;;;;;;;;65050:37;;;;;;;;;-1:-1:-1;;;;;65050:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64913:182;;;;;;;4408:13:1;;-1:-1:-1;;;;;4404:38:1;4386:57;;4499:4;4487:17;;;4481:24;4459:20;;;4452:54;4566:4;4554:17;;;4548:24;4574:4;4544:35;4522:20;;;4515:65;4640:4;4628:17;;;4622:24;-1:-1:-1;;;;;4618:50:1;4596:20;;;4589:80;;;;4373:3;4358:19;;4187:488;61985:225:0;;;;;;;;;;-1:-1:-1;61985:225:0;;;;;:::i;:::-;;:::i;26747:131::-;;;;;;;;;;-1:-1:-1;26747:131:0;;;;;:::i;:::-;26821:7;26848:12;;;:6;:12;;;;;:22;;;;26747:131;64595:108;;;;;;;;;;-1:-1:-1;64595:108:0;;;;;:::i;:::-;;:::i;27188:147::-;;;;;;;;;;-1:-1:-1;27188:147:0;;;;;:::i;:::-;;:::i;42586:93::-;;;;;;;;;;-1:-1:-1;42669:2:0;42586:93;;;6000:4:1;5988:17;;;5970:36;;5958:2;5943:18;42586:93:0;5828:184:1;28332:218:0;;;;;;;;;;-1:-1:-1;28332:218:0;;;;;:::i;:::-;;:::i;54793:46::-;;;;;;;;;;-1:-1:-1;54793:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54793:46:0;;;;-1:-1:-1;;;54793:46:0;;;;;;;;;6215:25:1;;;-1:-1:-1;;;;;6313:15:1;;;6308:2;6293:18;;6286:43;6365:15;;6345:18;;;6338:43;6203:2;6188:18;54793:46:0;6017:370:1;57115:921:0;;;;;;;;;;-1:-1:-1;57115:921:0;;;;;:::i;:::-;;:::i;55022:29::-;;;;;;;;;;-1:-1:-1;55022:29:0;;;;-1:-1:-1;;;;;55022:29:0;;;;;;-1:-1:-1;;;;;8029:32:1;;;8011:51;;7999:2;7984:18;55022:29:0;7865:203:1;45460:238:0;;;;;;;;;;-1:-1:-1;45460:238:0;;;;;:::i;:::-;;:::i;58100:1440::-;;;;;;;;;;-1:-1:-1;58100:1440:0;;;;;:::i;:::-;;:::i;52993:91::-;;;;;;;;;;-1:-1:-1;52993:91:0;;;;;:::i;:::-;;:::i;54760:26::-;;;;;;;;;;-1:-1:-1;54760:26:0;;;;-1:-1:-1;;;;;54760:26:0;;;;;;-1:-1:-1;;;;;8420:31:1;;;8402:50;;8390:2;8375:18;54760:26:0;8258:200:1;64435:117:0;;;;;;;;;;-1:-1:-1;64435:117:0;;;;;:::i;:::-;;:::i;63524:104::-;;;;;;;;;;-1:-1:-1;63524:104:0;;;;;:::i;:::-;;:::i;60747:844::-;;;;;;;;;;-1:-1:-1;60747:844:0;;;;;:::i;:::-;;:::i;60499:206::-;;;;;;;;;;;;;:::i;55195:29::-;;;;;;;;;;;;;;;;55131:26;;;;;;;;;;;;;;;;55058:25;;;;;;;;;;-1:-1:-1;55058:25:0;;;;-1:-1:-1;;;;;55058:25:0;;;64168:84;;;;;;;;;;;;;:::i;54287:63::-;;;;;;;;;;-1:-1:-1;54287:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54287:63:0;;;;;;;;;;;;-1:-1:-1;;;;;54287:63:0;;;;;;;-1:-1:-1;;;;;9643:31:1;;;9625:50;;9706:2;9691:18;;9684:34;;;;9766:4;9754:17;;;9734:18;;;9727:45;;;;-1:-1:-1;;;;;9808:32:1;9803:2;9788:18;;9781:60;9612:3;9597:19;54287:63:0;9400:447:1;54357:67:0;;;;;;;;;;-1:-1:-1;54357:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54357:67:0;;;;;;;;;;;;-1:-1:-1;;;;;54357:67:0;;;55090:34;;;;;;;;;;;;;;;;62987:115;;;;;;;;;;-1:-1:-1;62987:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;63078:16:0;63051:7;63078:16;;;:9;:16;;;;;;;62987:115;32476:103;;;;;;;;;;;;;:::i;53403:164::-;;;;;;;;;;-1:-1:-1;53403:164:0;;;;;:::i;:::-;;:::i;54242:38::-;;;;;;;;;;-1:-1:-1;54242:38:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;63668:156::-;;;;;;;;;;-1:-1:-1;63668:156:0;;;;;:::i;:::-;;:::i;31828:87::-;;;;;;;;;;-1:-1:-1;31901:6:0;;-1:-1:-1;;;;;31901:6:0;31828:87;;54200:35;;;;;;;;;;;;;;;;54559:97;;;;;;;;;;;;54614:42;54559:97;;25207:147;;;;;;;;;;-1:-1:-1;25207:147:0;;;;;:::i;:::-;;:::i;41843:104::-;;;;;;;;;;;;;:::i;54663:88::-;;;;;;;;;;;;54709:42;54663:88;;56501:574;;;;;;;;;;-1:-1:-1;56501:574:0;;;;;:::i;:::-;;:::i;24312:49::-;;;;;;;;;;-1:-1:-1;24312:49:0;24357:4;24312:49;;46201:436;;;;;;;;;;-1:-1:-1;46201:436:0;;;;;:::i;:::-;;:::i;61778:199::-;;;;;;;;;;-1:-1:-1;61778:199:0;;;;;:::i;:::-;;:::i;64751:111::-;;;;;;;;;;-1:-1:-1;64751:111:0;;;;;:::i;:::-;;:::i;55164:24::-;;;;;;;;;;-1:-1:-1;55164:24:0;;;;;;;;59588:877;;;;;;;;;;-1:-1:-1;59588:877:0;;;;;:::i;:::-;;:::i;54957:29::-;;;;;;;;;;-1:-1:-1;54957:29:0;;;;-1:-1:-1;;;;;54957:29:0;;;66390:1307;;;;;;;;;;-1:-1:-1;66390:1307:0;;;;;:::i;:::-;;:::i;54993:22::-;;;;;;;;;;-1:-1:-1;54993:22:0;;;;-1:-1:-1;;;;;54993:22:0;;;55265:34;;;;;;;;;;-1:-1:-1;55265:34:0;;;;;;;;;;;55753:601;;;;;;;;;;-1:-1:-1;55753:601:0;;;;;:::i;:::-;;:::i;27628:149::-;;;;;;;;;;-1:-1:-1;27628:149:0;;;;;:::i;:::-;;:::i;43504:151::-;;;;;;;;;;-1:-1:-1;43504:151:0;;;;;:::i;:::-;;:::i;63322:166::-;;;;;;;;;;-1:-1:-1;63322:166:0;;;;;:::i;:::-;;:::i;61657:113::-;;;;;;;;;;;;;:::i;54900:50::-;;;;;;;;;;-1:-1:-1;54900:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63867:156;;;;;;;;;;-1:-1:-1;63867:156:0;;;;;:::i;:::-;;:::i;64053:84::-;;;;;;;;;;;;;:::i;54482:64::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;54482:64:0;;32734:201;;;;;;;;;;-1:-1:-1;32734:201:0;;;;;:::i;:::-;;:::i;66156:198::-;;;;;;;;;;-1:-1:-1;66156:198:0;;;;;:::i;:::-;;:::i;55306:33::-;;;;;;;;;;-1:-1:-1;55306:33:0;;;;;;;;;;;24911:204;24996:4;-1:-1:-1;;;;;;25020:47:0;;-1:-1:-1;;;25020:47:0;;:87;;-1:-1:-1;;;;;;;;;;15848:40:0;;;25071:36;25013:94;24911:204;-1:-1:-1;;24911:204:0:o;41624:100::-;41678:13;41711:5;41704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41624:100;:::o;43975:201::-;44058:4;22200:10;44114:32;22200:10;44130:7;44139:6;44114:8;:32::i;:::-;-1:-1:-1;44164:4:0;;43975:201;-1:-1:-1;;;43975:201:0:o;63141:139::-;31714:13;:11;:13::i;:::-;-1:-1:-1;;;;;63227:38:0::1;;::::0;;;:18:::1;:38;::::0;;;;:45;;-1:-1:-1;;63227:45:0::1;63268:4;63227:45;::::0;;63141:139::o;67754:475::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;67917:22:::1;::::0;;::::1;;::::0;;;:8:::1;:22;::::0;;;;:31:::1;;::::0;-1:-1:-1;;;67917:31:0;::::1;;67916:32;67908:70;;;::::0;-1:-1:-1;;;67908:70:0;;13290:2:1;67908:70:0::1;::::0;::::1;13272:21:1::0;13329:2;13309:18;;;13302:30;13368:27;13348:18;;;13341:55;13413:18;;67908:70:0::1;;;;;;;;;68005:5:::0;67989:233:::1;68016:3;-1:-1:-1::0;;;;;68012:7:0::1;:1;-1:-1:-1::0;;;;;68012:7:0::1;;67989:233;;;68101:28;::::0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;68101:31:0;::::1;::::0;;;;;;;:37:::1;::::0;::::1;::::0;::::1;68157:38:::0;;::::1;::::0;68041:169:::1;::::0;68077:4:::1;::::0;68101:37:::1;::::0;;::::1;-1:-1:-1::0;;;;;68101:37:0::1;::::0;68041:9:::1;:169::i;:::-;68021:3:::0;::::1;::::0;::::1;:::i;:::-;;;;67989:233;;;;67754:475:::0;;;;:::o;64284:119::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64373:22:0;;;;;;;:8;:22;;;;;;;64366:29;;;;;;;;;;;;64373:22;;64366:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64366:29:0;;;-1:-1:-1;;64366:29:0;;;;;;-1:-1:-1;;;;;64366:29:0;;;;;;;-1:-1:-1;;;64366:29:0;;;;;;;;;-1:-1:-1;;;64366:29:0;;;;;;;;;-1:-1:-1;;;64366:29:0;;;;;;;;;;64284:119;-1:-1:-1;;64284:119:0:o;65129:998::-;65283:14;;;;;;;65275:49;;;;-1:-1:-1;;;65275:49:0;;13990:2:1;65275:49:0;;;13972:21:1;14029:2;14009:18;;;14002:30;-1:-1:-1;;;14048:18:1;;;14041:52;14110:18;;65275:49:0;13788:346:1;65275:49:0;65343:7;;;;65335:38;;;;-1:-1:-1;;;65335:38:0;;14341:2:1;65335:38:0;;;14323:21:1;14380:2;14360:18;;;14353:30;-1:-1:-1;;;14399:18:1;;;14392:48;14457:18;;65335:38:0;14139:342:1;65335:38:0;65388:33;-1:-1:-1;;;;;;;;;;;65410:10:0;65388:7;:33::i;:::-;65384:450;;;;;;65485:10;;65472:9;:23;;65446:119;;;;-1:-1:-1;;;65446:119:0;;14688:2:1;65446:119:0;;;14670:21:1;14727:2;14707:18;;;14700:30;14766:34;14746:18;;;14739:62;-1:-1:-1;;;14817:18:1;;;14810:32;14859:19;;65446:119:0;14486:398:1;65446:119:0;65608:10;65580:15;63078:16;;;:9;:16;;;;;;42832:12;;65671:21;;65689:2;;65671:13;:17;;:21::i;:::-;65660:7;:32;;:90;;;;65717:33;-1:-1:-1;;;;;;;;;;;65739:10:0;65717:7;:33::i;:::-;65634:188;;;;-1:-1:-1;;;65634:188:0;;15091:2:1;65634:188:0;;;15073:21:1;15130:2;15110:18;;;15103:30;15169:34;15149:18;;;15142:62;-1:-1:-1;;;15220:18:1;;;15213:34;15264:19;;65634:188:0;14889:400:1;65634:188:0;65431:403;65384:450;65846:22;;;;;;;:8;:22;;;;;;;;;:37;;:55;;-1:-1:-1;;;;;;;;;65912:51:0;;;-1:-1:-1;;;65912:51:0;;-1:-1:-1;;;;;;65912:51:0;;;65846:55;;;65912:51;;;;;;;65974:38;;;;-1:-1:-1;;;65974:38:0;;;;66023:14;:22;;-1:-1:-1;;66023:22:0;;;66063:56;;15488:36:1;;;15577:18;;;15570:43;15629:18;;;15622:43;66063:56:0;;;;;;15476:2:1;66063:56:0;;;65129:998;;;:::o;61985:225::-;62125:4;62142:36;62152:6;62160:9;62171:6;62142:9;:36::i;64595:108::-;31714:13;:11;:13::i;:::-;64661:34:::1;-1:-1:-1::0;;;;;;;;;;;64686:8:0::1;64661:10;:34::i;:::-;64595:108:::0;:::o;27188:147::-;26821:7;26848:12;;;:6;:12;;;;;:22;;;24803:16;24814:4;24803:10;:16::i;:::-;27302:25:::1;27313:4;27319:7;27302:10;:25::i;:::-;27188:147:::0;;;:::o;28332:218::-;-1:-1:-1;;;;;28428:23:0;;22200:10;28428:23;28420:83;;;;-1:-1:-1;;;28420:83:0;;15878:2:1;28420:83:0;;;15860:21:1;15917:2;15897:18;;;15890:30;15956:34;15936:18;;;15929:62;-1:-1:-1;;;16007:18:1;;;16000:45;16062:19;;28420:83:0;15676:411:1;28420:83:0;28516:26;28528:4;28534:7;28516:11;:26::i;:::-;28332:218;;:::o;57115:921::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;57348:1:::1;57332:6;:13;:17;57324:44;;;::::0;-1:-1:-1;;;57324:44:0;;16294:2:1;57324:44:0::1;::::0;::::1;16276:21:1::0;16333:2;16313:18;;;16306:30;-1:-1:-1;;;16352:18:1;;;16345:44;16406:18;;57324:44:0::1;16092:338:1::0;57324:44:0::1;57403:1;57387:13;:17;57379:51;;;::::0;-1:-1:-1;;;57379:51:0;;16637:2:1;57379:51:0::1;::::0;::::1;16619:21:1::0;16676:2;16656:18;;;16649:30;-1:-1:-1;;;16695:18:1;;;16688:51;16756:18;;57379:51:0::1;16435:345:1::0;57379:51:0::1;57469:1;57449:17;-1:-1:-1::0;;;;;57449:21:0::1;;57441:60;;;::::0;-1:-1:-1;;;57441:60:0;;16987:2:1;57441:60:0::1;::::0;::::1;16969:21:1::0;17026:2;17006:18;;;16999:30;17065:28;17045:18;;;17038:56;17111:18;;57441:60:0::1;16785:350:1::0;57441:60:0::1;57540:1;57520:17;-1:-1:-1::0;;;;;57520:21:0::1;;57512:60;;;::::0;-1:-1:-1;;;57512:60:0;;17342:2:1;57512:60:0::1;::::0;::::1;17324:21:1::0;17381:2;17361:18;;;17354:30;17420:28;17400:18;;;17393:56;17466:18;;57512:60:0::1;17140:350:1::0;57512:60:0::1;57625:17;-1:-1:-1::0;;;;;57605:37:0::1;:17;-1:-1:-1::0;;;;;57605:37:0::1;;57583:145;;;::::0;-1:-1:-1;;;57583:145:0;;17697:2:1;57583:145:0::1;::::0;::::1;17679:21:1::0;17736:2;17716:18;;;17709:30;17775:34;17755:18;;;17748:62;17846:28;17826:18;;;17819:56;17892:19;;57583:145:0::1;17495:422:1::0;57583:145:0::1;57744:13;57739:290;57771:6;:13;57763:5;:21;57739:290;;;57837:180;;;;;;;;57880:13;57837:180;;;;57930:17;-1:-1:-1::0;;;;;57837:180:0::1;;;;;57984:17;-1:-1:-1::0;;;;;57837:180:0::1;;;::::0;57810:9:::1;:24;57820:6;57827:5;57820:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;57810:24:0::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;57810:24:0;:207;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;57810:207:0;;::::1;-1:-1:-1::0;;;57810:207:0::1;-1:-1:-1::0;;;;;;57810:207:0;;;;::::1;::::0;;;;;;;::::1;::::0;;57786:7;::::1;::::0;::::1;:::i;:::-;;;;57739:290;;;;57115:921:::0;;;;;:::o;45460:238::-;45548:4;22200:10;45604:64;22200:10;45620:7;45657:10;45629:25;22200:10;45620:7;45629:9;:25::i;:::-;:38;;;;:::i;:::-;45604:8;:64::i;58100:1440::-;58165:7;;;;58164:8;58156:35;;;;-1:-1:-1;;;58156:35:0;;18529:2:1;58156:35:0;;;18511:21:1;18568:2;18548:18;;;18541:30;-1:-1:-1;;;18587:18:1;;;18580:44;18641:18;;58156:35:0;18327:338:1;58156:35:0;58220:1;58210:7;:11;58202:56;;;;-1:-1:-1;;;58202:56:0;;18872:2:1;58202:56:0;;;18854:21:1;;;18891:18;;;18884:30;18950:34;18930:18;;;18923:62;19002:18;;58202:56:0;18670:356:1;58202:56:0;58320:10;58310:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;58310:38:0;;-1:-1:-1;;;;;58310:38:0;58291:15;:57;;58269:127;;;;-1:-1:-1;;;58269:127:0;;19233:2:1;58269:127:0;;;19215:21:1;19272:2;19252:18;;;19245:30;-1:-1:-1;;;19291:18:1;;;19284:50;19351:18;;58269:127:0;19031:344:1;58269:127:0;58458:10;58448:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;;;58448:38:0;58429:15;:57;;58407:132;;;;-1:-1:-1;;;58407:132:0;;19582:2:1;58407:132:0;;;19564:21:1;19621:2;19601:18;;;19594:30;19660:27;19640:18;;;19633:55;19705:18;;58407:132:0;19380:349:1;58407:132:0;58582:10;58572:21;;;;:9;:21;;;;;:34;:45;-1:-1:-1;58572:45:0;58550:123;;;;-1:-1:-1;;;58550:123:0;;19936:2:1;58550:123:0;;;19918:21:1;19975:2;19955:18;;;19948:30;20014;19994:18;;;19987:58;20062:18;;58550:123:0;19734:352:1;58550:123:0;58738:11;;58706:15;;:28;;58726:7;58706:19;:28::i;:::-;:43;;58684:121;;;;-1:-1:-1;;;58684:121:0;;19936:2:1;58684:121:0;;;19918:21:1;19975:2;19955:18;;;19948:30;20014;19994:18;;;19987:58;20062:18;;58684:121:0;19734:352:1;58684:121:0;58835:14;;58824:7;:25;;58816:48;;;;-1:-1:-1;;;58816:48:0;;20293:2:1;58816:48:0;;;20275:21:1;20332:2;20312:18;;;20305:30;-1:-1:-1;;;20351:18:1;;;20344:40;20401:18;;58816:48:0;20091:334:1;58816:48:0;58885:23;58911:19;:7;58923:6;58911:11;:19::i;:::-;58941:75;;-1:-1:-1;;;58941:75:0;;58973:10;58941:75;;;20670:34:1;58993:4:0;20720:18:1;;;20713:43;20772:18;;;20765:34;;;58885:45:0;;-1:-1:-1;54709:42:0;;58941:31;;20605:18:1;;58941:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59027:26;59033:10;59045:7;59027:5;:26::i;:::-;59098:10;59088:21;;;;:9;:21;;;;;;:34;;59114:7;59088:25;:34::i;:::-;59074:10;59064:21;;;;:9;:21;;;;;:58;59139:10;;59133:53;;-1:-1:-1;;;;;59139:10:0;59151:34;59180:4;59151:24;:7;54470:3;59151:11;:24::i;:34::-;59133:5;:53::i;:::-;59221:85;59261:34;59290:4;59261:24;:7;54470:3;59261:11;:24::i;:34::-;59231:10;;-1:-1:-1;;;;;59231:10:0;59221:21;;;;:9;:21;;;;;;;:25;:85::i;:::-;59207:10;;-1:-1:-1;;;;;59207:10:0;59197:21;;;;:9;:21;;;;;:109;59335:15;;:28;;59355:7;59335:19;:28::i;:::-;59317:15;:46;59421:10;59411:21;;;;:9;:21;;;;;:48;:75;;59478:7;59411:66;:75::i;:::-;59384:10;59374:21;;;;:9;:21;;;;;;;:112;;;;59504:28;;;;;;59524:7;3829:25:1;;3817:2;3802:18;;3683:177;59504:28:0;;;;;;;;58145:1395;58100:1440;:::o;52993:91::-;53049:27;22200:10;53069:6;53049:5;:27::i;64435:117::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;64520:10:0::1;:24:::0;64435:117::o;63524:104::-;31714:13;:11;:13::i;:::-;63596:10:::1;:24:::0;;-1:-1:-1;;;;;;63596:24:0::1;-1:-1:-1::0;;;;;63596:24:0;;;::::1;::::0;;;::::1;::::0;;63524:104::o;60747:844::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;60967:7:::1;::::0;::::1;;60959:38;;;::::0;-1:-1:-1;;;60959:38:0;;14341:2:1;60959:38:0::1;::::0;::::1;14323:21:1::0;14380:2;14360:18;;;14353:30;-1:-1:-1;;;14399:18:1;;;14392:48;14457:18;;60959:38:0::1;14139:342:1::0;60959:38:0::1;61008:21;61032:12;:10;:12::i;:::-;61102:10;::::0;61008:36;;-1:-1:-1;61057:68:0::1;::::0;61084:8;;-1:-1:-1;;;;;61102:10:0::1;61115:9:::0;61057:26:::1;:68::i;:::-;61183:258;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;61138:42:::1;::::0;61183:258;;;61251:5;;;;;;61183:258;;61251:5;;;;61183:258;::::1;;::::0;::::1;::::0;;;-1:-1:-1;61183:258:0;;;-1:-1:-1;;;;;;;;61183:258:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;61506:10:::1;::::0;:29;;-1:-1:-1;;;61506:29:0;;61138:303;;-1:-1:-1;61183:258:0;;61506:10;::::1;::::0;:21:::1;::::0;:29:::1;::::0;61138:303;;61506:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61485:50;;61562:8;-1:-1:-1::0;;;;;61553:30:0::1;;61572:10;61553:30;;;;3829:25:1::0;;3817:2;3802:18;;3683:177;61553:30:0::1;;;;;;;;60948:643;;;60747:844:::0;;;;;;;:::o;60499:206::-;60612:14;;60654:11;;60594:72;;-1:-1:-1;;;60594:72:0;;60654:11;;;;60594:72;;;5970:36:1;60542:7:0;;;;-1:-1:-1;;;;;60612:14:0;;;;60594:59;;5943:18:1;;60594:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60562:104:0;;60499:206;-1:-1:-1;;;;60499:206:0:o;64168:84::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;64230:7:0::1;:14:::0;;-1:-1:-1;;64230:14:0::1;64240:4;64230:14;::::0;;64168:84::o;32476:103::-;31714:13;:11;:13::i;:::-;32541:30:::1;32568:1;32541:18;:30::i;:::-;32476:103::o:0;53403:164::-;53480:46;53496:7;22200:10;53519:6;53480:15;:46::i;:::-;53537:22;53543:7;53552:6;53537:5;:22::i;54242:38::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54242:38:0;;;;;;;-1:-1:-1;;;;;;;54242:38:0;;;;-1:-1:-1;;;54242:38:0;;;;;;-1:-1:-1;;;54242:38:0;;;;-1:-1:-1;;;54242:38:0;;;;:::o;63668:156::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;63784:14:0::1;:32:::0;;-1:-1:-1;;;;;;63784:32:0::1;-1:-1:-1::0;;;;;63784:32:0;;;::::1;::::0;;;::::1;::::0;;63668:156::o;25207:147::-;25293:4;25317:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;25317:29:0;;;;;;;;;;;;;;;25207:147::o;41843:104::-;41899:13;41932:7;41925:14;;;;;:::i;56501:574::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;;;;;56676:23:0;::::1;56668:60;;;::::0;-1:-1:-1;;;56668:60:0;;22798:2:1;56668:60:0::1;::::0;::::1;22780:21:1::0;22837:2;22817:18;;;22810:30;22876:26;22856:18;;;22849:54;22920:18;;56668:60:0::1;22596:348:1::0;56668:60:0::1;-1:-1:-1::0;;;;;56761:29:0;::::1;;::::0;;;:18:::1;:29;::::0;;;;;::::1;;56739:113;;;::::0;-1:-1:-1;;;56739:113:0;;23151:2:1;56739:113:0::1;::::0;::::1;23133:21:1::0;23190:2;23170:18;;;23163:30;23229:34;23209:18;;;23202:62;-1:-1:-1;;;23280:18:1;;;23273:32;23322:19;;56739:113:0::1;22949:398:1::0;56739:113:0::1;-1:-1:-1::0;;;;;56867:27:0;::::1;56863:205;;56911:50;56942:9;56953:7;56911:30;:50::i;:::-;56863:205;;;56994:62;57022:13;57037:9;57048:7;56994:27;:62::i;:::-;56501:574:::0;;;;:::o;46201:436::-;46294:4;22200:10;46294:4;46377:25;22200:10;46394:7;46377:9;:25::i;:::-;46350:52;;46441:15;46421:16;:35;;46413:85;;;;-1:-1:-1;;;46413:85:0;;23554:2:1;46413:85:0;;;23536:21:1;23593:2;23573:18;;;23566:30;23632:34;23612:18;;;23605:62;-1:-1:-1;;;23683:18:1;;;23676:35;23728:19;;46413:85:0;23352:401:1;46413:85:0;46534:60;46543:5;46550:7;46578:15;46559:16;:34;46534:8;:60::i;:::-;-1:-1:-1;46625:4:0;;46201:436;-1:-1:-1;;;;46201:436:0:o;61778:199::-;61883:4;61905:42;22200:10;61929:9;61940:6;61905:9;:42::i;:::-;-1:-1:-1;61965:4:0;61778:199;;;;:::o;64751:111::-;31714:13;:11;:13::i;:::-;64820:34:::1;-1:-1:-1::0;;;;;;;;;;;64845:8:0::1;64820:10;:34::i;59588:877::-:0;59649:7;;;;59648:8;59640:35;;;;-1:-1:-1;;;59640:35:0;;18529:2:1;59640:35:0;;;18511:21:1;18568:2;18548:18;;;18541:30;-1:-1:-1;;;18587:18:1;;;18580:44;18641:18;;59640:35:0;18327:338:1;59640:35:0;59709:15;;:28;;59729:7;59709:19;:28::i;:::-;59694:11;;:43;;59686:68;;;;-1:-1:-1;;;59686:68:0;;23960:2:1;59686:68:0;;;23942:21:1;23999:2;23979:18;;;23972:30;-1:-1:-1;;;24018:18:1;;;24011:42;24070:18;;59686:68:0;23758:336:1;59686:68:0;59784:14;;59773:7;:25;;59765:48;;;;-1:-1:-1;;;59765:48:0;;20293:2:1;59765:48:0;;;20275:21:1;20332:2;20312:18;;;20305:30;-1:-1:-1;;;20351:18:1;;;20344:40;20401:18;;59765:48:0;20091:334:1;59765:48:0;59865:12;;-1:-1:-1;;;;;59865:12:0;59846:15;:31;;59824:114;;;;-1:-1:-1;;;59824:114:0;;24301:2:1;59824:114:0;;;24283:21:1;24340:2;24320:18;;;24313:30;24379:34;24359:18;;;24352:62;-1:-1:-1;;;24430:18:1;;;24423:31;24471:19;;59824:114:0;24099:397:1;59824:114:0;59951:23;59977:19;:7;59989:6;59977:11;:19::i;:::-;60007:75;;-1:-1:-1;;;60007:75:0;;60039:10;60007:75;;;20670:34:1;60059:4:0;20720:18:1;;;20713:43;20772:18;;;20765:34;;;59951:45:0;;-1:-1:-1;54709:42:0;;60007:31;;20605:18:1;;60007:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60093:26;60099:10;60111:7;60093:5;:26::i;:::-;60164:10;60154:21;;;;:9;:21;;;;;;:34;;60180:7;60154:25;:34::i;:::-;60140:10;60130:21;;;;:9;:21;;;;;:58;60205:10;;60199:53;;-1:-1:-1;;;;;60205:10:0;60217:34;60246:4;60217:24;:7;54470:3;60217:11;:24::i;60199:53::-;60287:85;60327:34;60356:4;60327:24;:7;54470:3;60327:11;:24::i;60287:85::-;60273:10;;-1:-1:-1;;;;;60273:10:0;60263:21;;;;:9;:21;;;;;:109;;;;60385:15;:26;;60404:7;;60263:21;60385:26;;60404:7;;60385:26;:::i;:::-;;;;-1:-1:-1;;60429:28:0;;3829:25:1;;;60437:10:0;;60429:28;;3817:2:1;3802:18;60429:28:0;3683:177:1;66390:1307:0;66469:7;;;;66461:39;;;;-1:-1:-1;;;66461:39:0;;24703:2:1;66461:39:0;;;24685:21:1;24742:2;24722:18;;;24715:30;-1:-1:-1;;;24761:18:1;;;24754:49;24820:18;;66461:39:0;24501:343:1;66461:39:0;66519:22;;;;;;;;:8;:22;;;;;:31;;;-1:-1:-1;;;66519:31:0;;;66511:63;;;;-1:-1:-1;;;66511:63:0;;25051:2:1;66511:63:0;;;25033:21:1;25090:2;25070:18;;;25063:30;-1:-1:-1;;;25109:18:1;;;25102:49;25168:18;;66511:63:0;24849:343:1;66511:63:0;66607:23;;;;;;;:9;:23;;;;;;;;66631:10;66607:35;;;;;;;:45;-1:-1:-1;;;;;66607:45:0;:50;66585:114;;;;-1:-1:-1;;;66585:114:0;;25399:2:1;66585:114:0;;;25381:21:1;25438:2;25418:18;;;25411:30;-1:-1:-1;;;25457:18:1;;;25450:44;25511:18;;66585:114:0;25197:338:1;66585:114:0;66732:23;;;;;;;:9;:23;;;;;;;;66756:10;66732:35;;;;;;;:42;;;:47;66710:111;;;;-1:-1:-1;;;66710:111:0;;25399:2:1;66710:111:0;;;25381:21:1;25438:2;25418:18;;;25411:30;-1:-1:-1;;;25457:18:1;;;25450:44;25511:18;;66710:111:0;25197:338:1;66710:111:0;66867:10;66832:22;63078:16;;;:9;:16;;;;;;;66891:55;;66924:4;63078:16;66891:12;:55::i;:::-;-1:-1:-1;66957:22:0;;;;;;;:8;:22;;;;;66993:1;66957:32;;;:37;;:32;;:37;;66993:1;;-1:-1:-1;;;66957:37:0;;-1:-1:-1;;;;;66957:37:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;66957:37:0;;;;;-1:-1:-1;;;;;66957:37:0;;;;;;67045:173;;;;;;;;67124:15;-1:-1:-1;;;;;67045:173:0;;;;;67077:14;67045:173;;;;67165:9;67045:173;;;;;;67196:10;-1:-1:-1;;;;;67045:173:0;;;;67007:9;:23;67017:12;67007:23;;;;;;;;;;;;;;;:35;67031:10;-1:-1:-1;;;;;67007:35:0;-1:-1:-1;;;;;67007:35:0;;;;;;;;;;;;:211;;;;;;;;;;;;;-1:-1:-1;;;;;67007:211:0;;;;;-1:-1:-1;;;;;67007:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67007:211:0;;;;;-1:-1:-1;;;;;67007:211:0;;;;;;;;;67318:173;;;;;;;;67397:15;-1:-1:-1;;;;;67318:173:0;;;;;67350:14;67318:173;;;;67438:9;67318:173;;;;;;67469:10;-1:-1:-1;;;;;67318:173:0;;;;67229:14;:28;67244:12;67229:28;;;;;;;;;;;;;;;:86;67272:8;:22;67281:12;67272:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;67272:32:0;-1:-1:-1;;;;;67229:86:0;-1:-1:-1;;;;;67229:86:0;;;;;;;;;;;;:262;;;;;;;;;;;;;-1:-1:-1;;;;;67229:262:0;;;;;-1:-1:-1;;;;;67229:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67229:262:0;;;;;-1:-1:-1;;;;;67229:262:0;;;;;;;;;67530:10;-1:-1:-1;;;;;67509:180:0;;67555:14;67591:15;67622:9;67646:8;:22;67655:12;67646:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;67646:32:0;67509:180;;;;;;;;26004:25:1;;;-1:-1:-1;;;;;26102:15:1;;;26097:2;26082:18;;26075:43;26166:4;26154:17;;;;26149:2;26134:18;;26127:45;26208:15;26203:2;26188:18;;26181:43;25991:3;25976:19;;25781:449;67509:180:0;;;;;;;;66450:1247;66390:1307;;:::o;55753:601::-;56013:7;;-1:-1:-1;;;;;56013:7:0;55999:10;:21;55991:43;;;;-1:-1:-1;;;55991:43:0;;26437:2:1;55991:43:0;;;26419:21:1;26476:1;26456:18;;;26449:29;-1:-1:-1;;;26494:18:1;;;26487:39;26543:18;;55991:43:0;26235:332:1;55991:43:0;56065:14;:32;;;;56108:11;:28;;;;56147:11;:26;;;;;;-1:-1:-1;;56147:26:0;;;;;;;;;;56184:10;:45;;-1:-1:-1;;;;;;56184:45:0;;;54614:42;56184:45;;;;56240:12;:28;;-1:-1:-1;;;;;56240:28:0;;;-1:-1:-1;;56240:28:0;;;;;;;;;;56279:10;:24;;-1:-1:-1;;;;;56279:24:0;;;;;;;;;56314:14;:32;;;;;;;;;;;55753:601::o;27628:149::-;26821:7;26848:12;;;:6;:12;;;;;:22;;;24803:16;24814:4;24803:10;:16::i;:::-;27743:26:::1;27755:4;27761:7;27743:11;:26::i;43504:151::-:0;-1:-1:-1;;;;;43620:18:0;;;43593:7;43620:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;43504:151::o;63322:166::-;31714:13;:11;:13::i;:::-;-1:-1:-1;;;;;63434:38:0::1;63475:5;63434:38:::0;;;:18:::1;:38;::::0;;;;:46;;-1:-1:-1;;63434:46:0::1;::::0;;63322:166::o;61657:113::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;61748:14:0::1;::::0;;-1:-1:-1;;61730:32:0;::::1;61748:14;::::0;;;::::1;;;61747:15;61730:32:::0;;::::1;;::::0;;61657:113::o;63867:156::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;63983:14:0::1;:32:::0;63867:156::o;64053:84::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;64114:7:0::1;:15:::0;;-1:-1:-1;;64114:15:0::1;::::0;;64053:84::o;32734:201::-;31714:13;:11;:13::i;:::-;-1:-1:-1;;;;;32823:22:0;::::1;32815:73;;;::::0;-1:-1:-1;;;32815:73:0;;26774:2:1;32815:73:0::1;::::0;::::1;26756:21:1::0;26813:2;26793:18;;;26786:30;26852:34;26832:18;;;26825:62;-1:-1:-1;;;26903:18:1;;;26896:36;26949:19;;32815:73:0::1;26572:402:1::0;32815:73:0::1;32899:28;32918:8;32899:18;:28::i;66156:198::-:0;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;66236:22:::1;::::0;::::1;66270:5;66236:22:::0;;;:8:::1;:22;::::0;;;;;;;;:31:::1;;:39:::0;;-1:-1:-1;;;;66236:39:0::1;::::0;;66286:14:::1;:21:::0;;-1:-1:-1;;66286:21:0::1;::::0;::::1;::::0;;66323:23;;5970:36:1;;;66323:23:0::1;::::0;5943:18:1;66323:23:0::1;;;;;;;66156:198:::0;;:::o;16333:723::-;16389:13;16610:10;16606:53;;-1:-1:-1;;16637:10:0;;;;;;;;;;;;-1:-1:-1;;;16637:10:0;;;;;16333:723::o;16606:53::-;16684:5;16669:12;16725:78;16732:9;;16725:78;;16758:8;;;;:::i;:::-;;-1:-1:-1;16781:10:0;;-1:-1:-1;16789:2:0;16781:10;;:::i;:::-;;;16725:78;;;16813:19;16845:6;-1:-1:-1;;;;;16835:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16835:17:0;;16813:39;;16863:154;16870:10;;16863:154;;16897:11;16907:1;16897:11;;:::i;:::-;;-1:-1:-1;16966:10:0;16974:2;16966:5;:10;:::i;:::-;16953:24;;:2;:24;:::i;:::-;16940:39;;16923:6;16930;16923:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16923:56:0;;;;;;;;-1:-1:-1;16994:11:0;17003:2;16994:11;;:::i;:::-;;;16863:154;;;17041:6;16333:723;-1:-1:-1;;;;16333:723:0:o;49826:380::-;-1:-1:-1;;;;;49962:19:0;;49954:68;;;;-1:-1:-1;;;49954:68:0;;27685:2:1;49954:68:0;;;27667:21:1;27724:2;27704:18;;;27697:30;27763:34;27743:18;;;27736:62;-1:-1:-1;;;27814:18:1;;;27807:34;27858:19;;49954:68:0;27483:400:1;49954:68:0;-1:-1:-1;;;;;50041:21:0;;50033:68;;;;-1:-1:-1;;;50033:68:0;;28090:2:1;50033:68:0;;;28072:21:1;28129:2;28109:18;;;28102:30;28168:34;28148:18;;;28141:62;-1:-1:-1;;;28219:18:1;;;28212:32;28261:19;;50033:68:0;27888:398:1;50033:68:0;-1:-1:-1;;;;;50114:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;50166:32;;3829:25:1;;;50166:32:0;;3802:18:1;50166:32:0;;;;;;;;49826:380;;;:::o;31993:132::-;31901:6;;-1:-1:-1;;;;;31901:6:0;22200:10;32057:23;32049:68;;;;-1:-1:-1;;;32049:68:0;;28493:2:1;32049:68:0;;;28475:21:1;;;28512:18;;;28505:30;28571:34;28551:18;;;28544:62;28623:18;;32049:68:0;28291:356:1;25658:105:0;25725:30;25736:4;22200:10;25725;:30::i;62218:761::-;-1:-1:-1;;;;;62367:20:0;;62359:70;;;;-1:-1:-1;;;62359:70:0;;28854:2:1;62359:70:0;;;28836:21:1;28893:2;28873:18;;;28866:30;28932:34;28912:18;;;28905:62;-1:-1:-1;;;28983:18:1;;;28976:35;29028:19;;62359:70:0;28652:401:1;62359:70:0;-1:-1:-1;;;;;62448:23:0;;62440:71;;;;-1:-1:-1;;;62440:71:0;;29260:2:1;62440:71:0;;;29242:21:1;29299:2;29279:18;;;29272:30;29338:34;29318:18;;;29311:62;-1:-1:-1;;;29389:18:1;;;29382:33;29432:19;;62440:71:0;29058:399:1;62440:71:0;62530:14;;;;;;;:23;62522:61;;;;-1:-1:-1;;;62522:61:0;;29664:2:1;62522:61:0;;;29646:21:1;29703:2;29683:18;;;29676:30;29742:27;29722:18;;;29715:55;29787:18;;62522:61:0;29462:349:1;62522:61:0;62611:1;62602:6;:10;62594:64;;;;-1:-1:-1;;;62594:64:0;;30018:2:1;62594:64:0;;;30000:21:1;30057:2;30037:18;;;30030:30;30096:34;30076:18;;;30069:62;-1:-1:-1;;;30147:18:1;;;30140:39;30196:19;;62594:64:0;29816:405:1;62594:64:0;-1:-1:-1;;;;;62701:17:0;;;;;;:9;:17;;;;;;62691:27;;;62669:123;;;;-1:-1:-1;;;62669:123:0;;30428:2:1;62669:123:0;;;30410:21:1;30467:2;30447:18;;;30440:30;30506:34;30486:18;;;30479:62;-1:-1:-1;;;30557:18:1;;;30550:44;30611:19;;62669:123:0;30226:410:1;62669:123:0;-1:-1:-1;;;;;62825:17:0;;;;;;:9;:17;;;;;;:29;;62847:6;62825:21;:29::i;:::-;-1:-1:-1;;;;;62805:17:0;;;;;;;:9;:17;;;;;;:49;;;;62888:20;;;;;;;:32;;62913:6;62888:24;:32::i;:::-;-1:-1:-1;;;;;62865:20:0;;;;;;;:9;:20;;;;;;;:55;;;;62936:35;;;;;;;;;;62964:6;3829:25:1;;3817:2;3802:18;;3683:177;10929:98:0;10987:7;11014:5;11018:1;11014;:5;:::i;:::-;11007:12;10929:98;-1:-1:-1;;;10929:98:0:o;29257:112::-;29336:25;29347:4;29353:7;29929:238;30013:22;30021:4;30027:7;30013;:22::i;:::-;30008:152;;30052:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;30052:29:0;;;;;;;;;:36;;-1:-1:-1;;30052:36:0;30084:4;30052:36;;;30135:12;22200:10;;22120:98;30135:12;-1:-1:-1;;;;;30108:40:0;30126:7;-1:-1:-1;;;;;30108:40:0;30120:4;30108:40;;;;;;;;;;29929:238;;:::o;30347:239::-;30431:22;30439:4;30445:7;30431;:22::i;:::-;30427:152;;;30502:5;30470:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;30470:29:0;;;;;;;;;;:37;;-1:-1:-1;;30470:37:0;;;30527:40;22200:10;;30470:12;;30527:40;;30502:5;30527:40;30347:239;;:::o;9792:98::-;9850:7;9877:5;9881:1;9877;:5;:::i;48065:399::-;-1:-1:-1;;;;;48149:21:0;;48141:65;;;;-1:-1:-1;;;48141:65:0;;30843:2:1;48141:65:0;;;30825:21:1;30882:2;30862:18;;;30855:30;30921:33;30901:18;;;30894:61;30972:18;;48141:65:0;30641:355:1;48141:65:0;48297:6;48281:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;48314:18:0;;:9;:18;;;;;;;;;;:28;;48336:6;;48314:9;:28;;48336:6;;48314:28;:::i;:::-;;;;-1:-1:-1;;48358:37:0;;3829:25:1;;;-1:-1:-1;;;;;48358:37:0;;;48375:1;;48358:37;;3817:2:1;3802:18;48358:37:0;;;;;;;28332:218;;:::o;10530:98::-;10588:7;10615:5;10619:1;10615;:5;:::i;10173:98::-;10231:7;10258:5;10262:1;10258;:5;:::i;48797:591::-;-1:-1:-1;;;;;48881:21:0;;48873:67;;;;-1:-1:-1;;;48873:67:0;;31376:2:1;48873:67:0;;;31358:21:1;31415:2;31395:18;;;31388:30;31454:34;31434:18;;;31427:62;-1:-1:-1;;;31505:18:1;;;31498:31;31546:19;;48873:67:0;31174:397:1;48873:67:0;-1:-1:-1;;;;;49040:18:0;;49015:22;49040:18;;;;;;;;;;;49077:24;;;;49069:71;;;;-1:-1:-1;;;49069:71:0;;31778:2:1;49069:71:0;;;31760:21:1;31817:2;31797:18;;;31790:30;31856:34;31836:18;;;31829:62;-1:-1:-1;;;31907:18:1;;;31900:32;31949:19;;49069:71:0;31576:398:1;49069:71:0;-1:-1:-1;;;;;49176:18:0;;:9;:18;;;;;;;;;;49197:23;;;49176:44;;49242:12;:22;;49214:6;;49176:9;49242:22;;49214:6;;49242:22;:::i;:::-;;;;-1:-1:-1;;49282:37:0;;3829:25:1;;;49308:1:0;;-1:-1:-1;;;;;49282:37:0;;;;;3817:2:1;3802:18;49282:37:0;;;;;;;27188:147;;;:::o;38058:314::-;38222:58;;;-1:-1:-1;;;;;32171:32:1;;;38222:58:0;;;32153:51:1;32220:18;;;;32213:34;;;38222:58:0;;;;;;;;;;32126:18:1;;;;38222:58:0;;;;;;;-1:-1:-1;;;;;38222:58:0;-1:-1:-1;;;38222:58:0;;;38211:70;;-1:-1:-1;;;;38211:10:0;;;;:70;;38222:58;38211:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38175:106;;;;38300:7;:57;;;;-1:-1:-1;38312:11:0;;:16;;:44;;;38343:4;38332:24;;;;;;;;;;;;:::i;:::-;38292:72;;;;-1:-1:-1;;;38292:72:0;;32739:2:1;38292:72:0;;;32721:21:1;32778:1;32758:18;;;32751:29;-1:-1:-1;;;32796:18:1;;;32789:32;32838:18;;38292:72:0;32537:325:1;33095:191:0;33188:6;;;-1:-1:-1;;;;;33205:17:0;;;-1:-1:-1;;;;;;33205:17:0;;;;;;;33238:40;;33188:6;;;33205:17;33188:6;;33238:40;;33169:16;;33238:40;33158:128;33095:191;:::o;50497:453::-;50632:24;50659:25;50669:5;50676:7;50659:9;:25::i;:::-;50632:52;;-1:-1:-1;;50699:16:0;:37;50695:248;;50781:6;50761:16;:26;;50753:68;;;;-1:-1:-1;;;50753:68:0;;33069:2:1;50753:68:0;;;33051:21:1;33108:2;33088:18;;;33081:30;33147:31;33127:18;;;33120:59;33196:18;;50753:68:0;32867:353:1;50753:68:0;50865:51;50874:5;50881:7;50909:6;50890:16;:25;50865:8;:51::i;38568:168::-;38681:12;;;38641;38681;;;;;;;;;-1:-1:-1;;;;;38659:7:0;;;38674:5;;38659:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38640:54;;;38713:7;38705:23;;;;-1:-1:-1;;;38705:23:0;;33427:2:1;38705:23:0;;;33409:21:1;33466:1;33446:18;;;33439:29;-1:-1:-1;;;33484:18:1;;;33477:33;33527:18;;38705:23:0;33225:326:1;37382:316:0;37547:59;;;-1:-1:-1;;;;;32171:32:1;;;37547:59:0;;;32153:51:1;32220:18;;;;32213:34;;;37547:59:0;;;;;;;;;;32126:18:1;;;;37547:59:0;;;;;;;-1:-1:-1;;;;;37547:59:0;-1:-1:-1;;;37547:59:0;;;37536:71;;-1:-1:-1;;;;37536:10:0;;;;:71;;37547:59;37536:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37500:107;;;;37626:7;:57;;;;-1:-1:-1;37638:11:0;;:16;;:44;;;37669:4;37658:24;;;;;;;;;;;;:::i;:::-;37618:72;;;;-1:-1:-1;;;37618:72:0;;33758:2:1;37618:72:0;;;33740:21:1;33797:1;33777:18;;;33770:29;-1:-1:-1;;;33815:18:1;;;33808:32;33857:18;;37618:72:0;33556:325:1;26053:505:0;26142:22;26150:4;26156:7;26142;:22::i;:::-;26137:414;;26330:41;26358:7;-1:-1:-1;;;;;26330:41:0;26368:2;26330:19;:41::i;:::-;26444:38;26472:4;26479:2;26444:19;:38::i;:::-;26235:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26235:270:0;;;;;;;;;;-1:-1:-1;;;26181:358:0;;;;;;;:::i;17634:451::-;17709:13;17735:19;17767:10;17771:6;17767:1;:10;:::i;:::-;:14;;17780:1;17767:14;:::i;:::-;-1:-1:-1;;;;;17757:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17757:25:0;;17735:47;;-1:-1:-1;;;17793:6:0;17800:1;17793:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17793:15:0;;;;;;;;;-1:-1:-1;;;17819:6:0;17826:1;17819:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17819:15:0;;;;;;;;-1:-1:-1;17850:9:0;17862:10;17866:6;17862:1;:10;:::i;:::-;:14;;17875:1;17862:14;:::i;:::-;17850:26;;17845:135;17882:1;17878;:5;17845:135;;;-1:-1:-1;;;17930:5:0;17938:3;17930:11;17917:25;;;;;;;:::i;:::-;;;;17905:6;17912:1;17905:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;17905:37:0;;;;;;;;-1:-1:-1;17967:1:0;17957:11;;;;;17885:3;;;:::i;:::-;;;17845:135;;;-1:-1:-1;17998:10:0;;17990:55;;;;-1:-1:-1;;;17990:55:0;;35020:2:1;17990:55:0;;;35002:21:1;;;35039:18;;;35032:30;35098:34;35078:18;;;35071:62;35150:18;;17990:55:0;34818:356:1;14:286;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:258;569:1;579:113;593:6;590:1;587:13;579:113;;;669:11;;;663:18;650:11;;;643:39;615:2;608:10;579:113;;;710:6;707:1;704:13;701:48;;;-1:-1:-1;;745:1:1;727:16;;720:27;497:258::o;760:::-;802:3;840:5;834:12;867:6;862:3;855:19;883:63;939:6;932:4;927:3;923:14;916:4;909:5;905:16;883:63;:::i;:::-;1000:2;979:15;-1:-1:-1;;975:29:1;966:39;;;;1007:4;962:50;;760:258;-1:-1:-1;;760:258:1:o;1023:220::-;1172:2;1161:9;1154:21;1135:4;1192:45;1233:2;1222:9;1218:18;1210:6;1192:45;:::i;1248:131::-;-1:-1:-1;;;;;1323:31:1;;1313:42;;1303:70;;1369:1;1366;1359:12;1384:134;1452:20;;1481:31;1452:20;1481:31;:::i;:::-;1384:134;;;:::o;1523:315::-;1591:6;1599;1652:2;1640:9;1631:7;1627:23;1623:32;1620:52;;;1668:1;1665;1658:12;1620:52;1707:9;1694:23;1726:31;1751:5;1726:31;:::i;:::-;1776:5;1828:2;1813:18;;;;1800:32;;-1:-1:-1;;;1523:315:1:o;1843:247::-;1902:6;1955:2;1943:9;1934:7;1930:23;1926:32;1923:52;;;1971:1;1968;1961:12;1923:52;2010:9;1997:23;2029:31;2054:5;2029:31;:::i;2095:156::-;2161:20;;2221:4;2210:16;;2200:27;;2190:55;;2241:1;2238;2231:12;2256:171;2323:20;;-1:-1:-1;;;;;2372:30:1;;2362:41;;2352:69;;2417:1;2414;2407:12;2432:326;2505:6;2513;2521;2574:2;2562:9;2553:7;2549:23;2545:32;2542:52;;;2590:1;2587;2580:12;2542:52;2613:27;2630:9;2613:27;:::i;:::-;2603:37;;2659;2692:2;2681:9;2677:18;2659:37;:::i;:::-;2649:47;;2715:37;2748:2;2737:9;2733:18;2715:37;:::i;:::-;2705:47;;2432:326;;;;;:::o;2763:182::-;2820:6;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2912:27;2929:9;2912:27;:::i;2950:728::-;3123:2;3112:9;3105:21;3086:4;3161:6;3155:13;3204:4;3199:2;3188:9;3184:18;3177:32;3232:52;3279:3;3268:9;3264:19;3250:12;3232:52;:::i;:::-;3218:66;;3333:2;3325:6;3321:15;3315:22;-1:-1:-1;;;;;3430:2:1;3414:14;3410:23;3405:2;3394:9;3390:18;3383:51;3498:2;3492;3484:6;3480:15;3474:22;3470:31;3465:2;3454:9;3450:18;3443:59;3571:2;3563:6;3559:15;3553:22;3546:30;3539:38;3533:3;3522:9;3518:19;3511:67;3645:2;3638:3;3630:6;3626:16;3620:23;3616:32;3609:4;3598:9;3594:20;3587:62;;;3666:6;3658:14;;;2950:728;;;;:::o;3865:317::-;3931:6;3939;3992:2;3980:9;3971:7;3967:23;3963:32;3960:52;;;4008:1;4005;3998:12;3960:52;4031:27;4048:9;4031:27;:::i;:::-;4021:37;;4108:2;4097:9;4093:18;4080:32;4121:31;4146:5;4121:31;:::i;:::-;4171:5;4161:15;;;3865:317;;;;;:::o;4680:456::-;4757:6;4765;4773;4826:2;4814:9;4805:7;4801:23;4797:32;4794:52;;;4842:1;4839;4832:12;4794:52;4881:9;4868:23;4900:31;4925:5;4900:31;:::i;:::-;4950:5;-1:-1:-1;5007:2:1;4992:18;;4979:32;5020:33;4979:32;5020:33;:::i;:::-;4680:456;;5072:7;;-1:-1:-1;;;5126:2:1;5111:18;;;;5098:32;;4680:456::o;5141:180::-;5200:6;5253:2;5241:9;5232:7;5228:23;5224:32;5221:52;;;5269:1;5266;5259:12;5221:52;-1:-1:-1;5292:23:1;;5141:180;-1:-1:-1;5141:180:1:o;5508:315::-;5576:6;5584;5637:2;5625:9;5616:7;5612:23;5608:32;5605:52;;;5653:1;5650;5643:12;5605:52;5689:9;5676:23;5666:33;;5749:2;5738:9;5734:18;5721:32;5762:31;5787:5;5762:31;:::i;6392:127::-;6453:10;6448:3;6444:20;6441:1;6434:31;6484:4;6481:1;6474:15;6508:4;6505:1;6498:15;6524:1336;6633:6;6641;6649;6657;6710:3;6698:9;6689:7;6685:23;6681:33;6678:53;;;6727:1;6724;6717:12;6678:53;6767:9;6754:23;-1:-1:-1;;;;;6837:2:1;6829:6;6826:14;6823:34;;;6853:1;6850;6843:12;6823:34;6891:6;6880:9;6876:22;6866:32;;6936:7;6929:4;6925:2;6921:13;6917:27;6907:55;;6958:1;6955;6948:12;6907:55;6994:2;6981:16;7016:4;7039:2;7035;7032:10;7029:36;;;7045:18;;:::i;:::-;7091:2;7088:1;7084:10;7123:2;7117:9;7186:2;7182:7;7177:2;7173;7169:11;7165:25;7157:6;7153:38;7241:6;7229:10;7226:22;7221:2;7209:10;7206:18;7203:46;7200:72;;;7252:18;;:::i;:::-;7288:2;7281:22;7338:18;;;7372:15;;;;-1:-1:-1;7414:11:1;;;7410:20;;;7442:19;;;7439:39;;;7474:1;7471;7464:12;7439:39;7498:11;;;;7518:148;7534:6;7529:3;7526:15;7518:148;;;7600:23;7619:3;7600:23;:::i;:::-;7588:36;;7551:12;;;;7644;;;;7518:148;;;7685:6;-1:-1:-1;;7723:18:1;;7710:32;;-1:-1:-1;7761:37:1;;-1:-1:-1;;7794:2:1;7779:18;;;-1:-1:-1;7761:37:1;:::i;:::-;7751:47;;7817:37;7850:2;7839:9;7835:18;7817:37;:::i;:::-;7807:47;;6524:1336;;;;;;;:::o;8463:932::-;8569:6;8577;8585;8593;8601;8609;8662:3;8650:9;8641:7;8637:23;8633:33;8630:53;;;8679:1;8676;8669:12;8630:53;8715:9;8702:23;8692:33;;8772:2;8761:9;8757:18;8744:32;8734:42;;8826:2;8815:9;8811:18;8798:32;8839:31;8864:5;8839:31;:::i;:::-;8889:5;-1:-1:-1;8945:2:1;8930:18;;8917:32;-1:-1:-1;;;;;8998:14:1;;;8995:34;;;9025:1;9022;9015:12;8995:34;9063:6;9052:9;9048:22;9038:32;;9108:7;9101:4;9097:2;9093:13;9089:27;9079:55;;9130:1;9127;9120:12;9079:55;9170:2;9157:16;9196:2;9188:6;9185:14;9182:34;;;9212:1;9209;9202:12;9182:34;9257:7;9252:2;9243:6;9239:2;9235:15;9231:24;9228:37;9225:57;;;9278:1;9275;9268:12;9225:57;9309:2;9305;9301:11;9291:21;;9331:6;9321:16;;;;;9384:3;9373:9;9369:19;9356:33;9346:43;;8463:932;;;;;;;;:::o;9852:254::-;9917:6;9925;9978:2;9966:9;9957:7;9953:23;9949:32;9946:52;;;9994:1;9991;9984:12;9946:52;10017:27;10034:9;10017:27;:::i;:::-;10007:37;;10063;10096:2;10085:9;10081:18;10063:37;:::i;:::-;10053:47;;9852:254;;;;;:::o;10111:575::-;10360:3;10349:9;10342:22;10323:4;10381:46;10422:3;10411:9;10407:19;10399:6;10381:46;:::i;:::-;-1:-1:-1;;;;;10500:15:1;;;10495:2;10480:18;;10473:43;10552:15;;;10547:2;10532:18;;10525:43;-1:-1:-1;10611:14:1;;10604:22;10599:2;10584:18;;10577:50;10664:15;;;10658:3;10643:19;;;10636:44;;;;10373:54;10111:575;-1:-1:-1;10111:575:1:o;10691:456::-;10768:6;10776;10784;10837:2;10825:9;10816:7;10812:23;10808:32;10805:52;;;10853:1;10850;10843:12;10805:52;10892:9;10879:23;10911:31;10936:5;10911:31;:::i;:::-;10961:5;-1:-1:-1;11013:2:1;10998:18;;10985:32;;-1:-1:-1;11069:2:1;11054:18;;11041:32;11082:33;11041:32;11082:33;:::i;:::-;11134:7;11124:17;;;10691:456;;;;;:::o;11379:252::-;11443:6;11451;11504:2;11492:9;11483:7;11479:23;11475:32;11472:52;;;11520:1;11517;11510:12;11472:52;11543:27;11560:9;11543:27;:::i;:::-;11533:37;;11589:36;11621:2;11610:9;11606:18;11589:36;:::i;11636:669::-;11737:6;11745;11753;11761;11769;11777;11830:3;11818:9;11809:7;11805:23;11801:33;11798:53;;;11847:1;11844;11837:12;11798:53;11870:27;11887:9;11870:27;:::i;:::-;11860:37;;11944:2;11933:9;11929:18;11916:32;11906:42;;11995:2;11984:9;11980:18;11967:32;11957:42;;12049:2;12038:9;12034:18;12021:32;12062:31;12087:5;12062:31;:::i;:::-;12112:5;-1:-1:-1;12169:3:1;12154:19;;12141:33;12183;12141;12183;:::i;:::-;12235:7;-1:-1:-1;12261:38:1;12294:3;12279:19;;12261:38;:::i;:::-;12251:48;;11636:669;;;;;;;;:::o;12310:388::-;12378:6;12386;12439:2;12427:9;12418:7;12414:23;12410:32;12407:52;;;12455:1;12452;12445:12;12407:52;12494:9;12481:23;12513:31;12538:5;12513:31;:::i;12703:380::-;12782:1;12778:12;;;;12825;;;12846:61;;12900:4;12892:6;12888:17;12878:27;;12846:61;12953:2;12945:6;12942:14;12922:18;12919:38;12916:161;;;12999:10;12994:3;12990:20;12987:1;12980:31;13034:4;13031:1;13024:15;13062:4;13059:1;13052:15;12916:161;;12703:380;;;:::o;13442:127::-;13503:10;13498:3;13494:20;13491:1;13484:31;13534:4;13531:1;13524:15;13558:4;13555:1;13548:15;13574:209;13612:3;-1:-1:-1;;;;;13693:2:1;13686:5;13682:14;13720:2;13711:7;13708:15;13705:41;;;13726:18;;:::i;:::-;13775:1;13762:15;;13574:209;-1:-1:-1;;;13574:209:1:o;17922:127::-;17983:10;17978:3;17974:20;17971:1;17964:31;18014:4;18011:1;18004:15;18038:4;18035:1;18028:15;18054:135;18093:3;-1:-1:-1;;18114:17:1;;18111:43;;;18134:18;;:::i;:::-;-1:-1:-1;18181:1:1;18170:13;;18054:135::o;18194:128::-;18234:3;18265:1;18261:6;18258:1;18255:13;18252:39;;;18271:18;;:::i;:::-;-1:-1:-1;18307:9:1;;18194:128::o;20810:277::-;20877:6;20930:2;20918:9;20909:7;20905:23;20901:32;20898:52;;;20946:1;20943;20936:12;20898:52;20978:9;20972:16;21031:5;21024:13;21017:21;21010:5;21007:32;20997:60;;21053:1;21050;21043:12;21092:651;21287:2;21276:9;21269:21;21250:4;21325:6;21319:13;21368:4;21363:2;21352:9;21348:18;21341:32;21396:52;21443:3;21432:9;21428:19;21414:12;21396:52;:::i;:::-;21382:66;;21529:1;21525;21520:3;21516:11;21512:19;21506:2;21498:6;21494:15;21488:22;21484:48;21479:2;21468:9;21464:18;21457:76;21587:2;21579:6;21575:15;21569:22;21564:2;21553:9;21549:18;21542:50;21647:2;21639:6;21635:15;21629:22;21623:3;21612:9;21608:19;21601:51;21708:3;21700:6;21696:16;21690:23;21683:4;21672:9;21668:20;21661:53;21731:6;21723:14;;;21092:651;;;;:::o;21748:184::-;21818:6;21871:2;21859:9;21850:7;21846:23;21842:32;21839:52;;;21887:1;21884;21877:12;21839:52;-1:-1:-1;21910:16:1;;21748:184;-1:-1:-1;21748:184:1:o;21937:654::-;22034:6;22042;22050;22058;22111:3;22099:9;22090:7;22086:23;22082:33;22079:53;;;22128:1;22125;22118:12;22079:53;22160:9;22154:16;22179:31;22204:5;22179:31;:::i;:::-;22279:2;22264:18;;22258:25;22229:5;;-1:-1:-1;22292:33:1;22258:25;22292:33;:::i;:::-;22396:2;22381:18;;22375:25;22344:7;;-1:-1:-1;22409:33:1;22375:25;22409:33;:::i;:::-;22513:2;22498:18;;22492:25;22461:7;;-1:-1:-1;22526:33:1;22492:25;22526:33;:::i;:::-;21937:654;;;;-1:-1:-1;21937:654:1;;-1:-1:-1;;21937:654:1:o;25540:236::-;25579:3;-1:-1:-1;;;;;25652:2:1;25649:1;25645:10;25682:2;25679:1;25675:10;25713:3;25709:2;25705:12;25700:3;25697:21;25694:47;;;25721:18;;:::i;:::-;25757:13;;25540:236;-1:-1:-1;;;;25540:236:1:o;26979:127::-;27040:10;27035:3;27031:20;27028:1;27021:31;27071:4;27068:1;27061:15;27095:4;27092:1;27085:15;27111:120;27151:1;27177;27167:35;;27182:18;;:::i;:::-;-1:-1:-1;27216:9:1;;27111:120::o;27236:125::-;27276:4;27304:1;27301;27298:8;27295:34;;;27309:18;;:::i;:::-;-1:-1:-1;27346:9:1;;27236:125::o;27366:112::-;27398:1;27424;27414:35;;27429:18;;:::i;:::-;-1:-1:-1;27463:9:1;;27366:112::o;31001:168::-;31041:7;31107:1;31103;31099:6;31095:14;31092:1;31089:21;31084:1;31077:9;31070:17;31066:45;31063:71;;;31114:18;;:::i;:::-;-1:-1:-1;31154:9:1;;31001:168::o;32258:274::-;32387:3;32425:6;32419:13;32441:53;32487:6;32482:3;32475:4;32467:6;32463:17;32441:53;:::i;:::-;32510:16;;;;;32258:274;-1:-1:-1;;32258:274:1:o;33886:786::-;34297:25;34292:3;34285:38;34267:3;34352:6;34346:13;34368:62;34423:6;34418:2;34413:3;34409:12;34402:4;34394:6;34390:17;34368:62;:::i;:::-;-1:-1:-1;;;34489:2:1;34449:16;;;34481:11;;;34474:40;34539:13;;34561:63;34539:13;34610:2;34602:11;;34595:4;34583:17;;34561:63;:::i;:::-;34644:17;34663:2;34640:26;;33886:786;-1:-1:-1;;;;33886:786:1:o;34677:136::-;34716:3;34744:5;34734:39;;34753:18;;:::i;:::-;-1:-1:-1;;;34789:18:1;;34677:136::o
Swarm Source
ipfs://5e7097b4f91470c91f0e29b95afab1d26949239c5e480fab23a3641b7c015caf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.