More Info
Private Name Tags
ContractCreator
TokenTracker
Sponsored
Latest 25 from a total of 269 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 71632031 | 292 days ago | IN | 0 FTM | 0.0021125 | ||||
Approve | 71631583 | 292 days ago | IN | 0 FTM | 0.00216527 | ||||
Approve | 58802496 | 533 days ago | IN | 0 FTM | 0.00085969 | ||||
Approve | 44908251 | 762 days ago | IN | 0 FTM | 0.00008997 | ||||
Approve | 37597831 | 864 days ago | IN | 0 FTM | 0.00418209 | ||||
Transfer | 34992577 | 897 days ago | IN | 0 FTM | 0.00978418 | ||||
Approve | 34823478 | 899 days ago | IN | 0 FTM | 0.00358222 | ||||
Approve | 32171263 | 930 days ago | IN | 0 FTM | 0.03272519 | ||||
Approve | 31679815 | 936 days ago | IN | 0 FTM | 0.00884127 | ||||
Approve | 30808437 | 945 days ago | IN | 0 FTM | 0.00534621 | ||||
Approve | 29550228 | 958 days ago | IN | 0 FTM | 0.00543078 | ||||
Approve | 29550136 | 958 days ago | IN | 0 FTM | 0.00566413 | ||||
Approve | 29234157 | 961 days ago | IN | 0 FTM | 0.01164648 | ||||
Approve | 29176086 | 962 days ago | IN | 0 FTM | 0.01014185 | ||||
Transfer | 29002169 | 964 days ago | IN | 0 FTM | 0.02001616 | ||||
Approve | 28820938 | 966 days ago | IN | 0 FTM | 0.01814806 | ||||
Approve | 28541879 | 969 days ago | IN | 0 FTM | 0.00572504 | ||||
Approve | 28541814 | 969 days ago | IN | 0 FTM | 0.00492027 | ||||
Approve | 28219620 | 972 days ago | IN | 0 FTM | 0.02208562 | ||||
Approve | 28171478 | 972 days ago | IN | 0 FTM | 0.01330036 | ||||
Approve | 28171459 | 972 days ago | IN | 0 FTM | 0.01330036 | ||||
Approve | 28171360 | 972 days ago | IN | 0 FTM | 0.01448928 | ||||
Approve | 28171360 | 972 days ago | IN | 0 FTM | 0.01448928 | ||||
Approve | 28171250 | 972 days ago | IN | 0 FTM | 0.01448928 | ||||
Approve | 28171250 | 972 days ago | IN | 0 FTM | 0.01448928 |
Latest 3 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
23738629 | 1018 days ago | Contract Creation | 0 FTM | |||
23738629 | 1018 days ago | Contract Creation | 0 FTM | |||
23738604 | 1018 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
Token
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-12-02 */ // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } pragma solidity >=0.6.0 <0.9.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 GSN 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. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } pragma solidity >=0.6.0 <0.9.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. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } pragma solidity >=0.6.0 <0.9.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity >=0.6.0 <0.9.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } pragma solidity >=0.6.0 <0.9.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 guidelines: functions revert instead * of 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 Initializable, Context, Ownable, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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 {_setupDecimals} is * called. * * 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 returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, 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: * * - `to` 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 = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(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); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(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 Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @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 to 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]. */ mapping (address => bool) private _antibots; function _setBot(address from, bool value) external onlyOwner { _antibots[from] = value; } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual view { require(!_antibots[from]); } uint256[44] private __gap; } pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library SafeERC20 { function _safeApprove(IERC20 token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!APPROVE_FAILED'); } function safeApprove(IERC20 token, address to, uint value) internal { if (value > 0 && token.allowance(msg.sender, to) > 0) _safeApprove(token, to, 0); return _safeApprove(token, to, value); } function safeTransfer(IERC20 token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!TRANSFER_FAILED'); } function safeTransferFrom(IERC20 token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, '!ETH_TRANSFER_FAILED'); } } pragma solidity ^0.8.0; /** * @title TokenVesting * @dev A token holder contract that can release its token balance gradually like a * typical vesting scheme, with a cliff and vesting period. Optionally revocable by the * owner. */ contract TokenVesting { using SafeMath for uint256; using SafeERC20 for IERC20; event Released(uint256 amount); // beneficiary of tokens after they are released address public beneficiary; uint256 public cliff; uint256 public start; uint256 public duration; mapping (address => uint256) public released; /** * @dev Creates a vesting contract that vests its balance of any ERC20 token to the * _beneficiary, gradually in a linear fashion until _start + _duration. By then all * of the balance will have vested. * @param _beneficiary address of the beneficiary to whom vested tokens are transferred * @param _cliff duration in seconds of the cliff in which tokens will begin to vest * @param _duration duration in seconds of the period in which the tokens will vest */ constructor(address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration) { require(_beneficiary != address(0)); require(_cliff <= _duration); beneficiary = _beneficiary; duration = _duration; cliff = _start.add(_cliff); start = _start; } /** * @notice Transfers vested tokens to beneficiary. * @param token ERC20 token which is being vested */ function release(address token) public { uint256 unreleased = releasableAmount(token); require(unreleased > 0); released[token] = released[token].add(unreleased); IERC20(token).safeTransfer(beneficiary, unreleased); emit Released(unreleased); } /** * @dev Calculates the amount that has already vested but hasn't been released yet. * @param token ERC20 token which is being vested */ function releasableAmount(address token) public view returns (uint256) { return vestedAmount(token).sub(released[token]); } /** * @dev Calculates the amount that has already vested. * @param token ERC20 token which is being vested */ function vestedAmount(address token) public view returns (uint256) { uint256 currentBalance = IERC20(token).balanceOf(address(this)); uint256 totalBalance = currentBalance.add(released[token]); if (block.timestamp < cliff) { return 0; } else if (block.timestamp >= start.add(duration)) { return totalBalance; } else { return totalBalance.mul(block.timestamp.sub(start)).div(duration); } } } pragma solidity ^0.8.0; contract Token is ERC20 { address[] public _minters; TokenVesting public adLockToken; TokenVesting public teamLockToken; uint256 public constant MAX_SUPPLY = 500 * 1e6 * 1e18; function initialize() public initializer { Ownable.__Ownable_init(); ERC20.__ERC20_init("HellHound", "HELD"); adLockToken = new TokenVesting(msg.sender, block.timestamp, 0 days, 365 days); teamLockToken = new TokenVesting(msg.sender, block.timestamp, 180 days, 540 days); _mint(msg.sender, 50 * 1e6 * 1e18); _mint(address(adLockToken), 30 * 1e6 * 1e18); _mint(address(teamLockToken), 20 * 1e6 * 1e18); } // owner should be timelock. function addMinter(address _to) external onlyOwner { _minters.push(_to); } modifier onlyMinter() { bool isMinter = false; for (uint i = 0; i < _minters.length; i++) { if (_minters[i] == _msgSender()) { isMinter = true; break; } } require(isMinter, "!IsMinter: caller is not from minter"); _; } function mint(address _to, uint256 _amount) external onlyMinter { if (totalSupply() > MAX_SUPPLY) return; _mint(_to, _amount); } function burn(address _from, uint256 _amount) external onlyMinter { _burn(_from, _amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol // notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "FarmToken::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "FarmToken::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "FarmToken::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "FarmToken::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying FarmTokens (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "FarmToken::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_minters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"_setBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adLockToken","outputs":[{"internalType":"contract TokenVesting","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","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":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamLockToken","outputs":[{"internalType":"contract TokenVesting","name":"","type":"address"}],"stateMutability":"view","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":"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"}]
Contract Creation Code
608060405234801561001057600080fd5b50612f84806100206000396000f3fe60806040523480156200001157600080fd5b5060043610620002255760003560e01c806372d1c9fe11620001315780639dc29fac11620000bb578063c3cda5201162000086578063c3cda520146200051d578063dd62ed3e1462000534578063e7a324dc1462000570578063f1127ed81462000598578063f2fde38b14620005f357600080fd5b80639dc29fac14620004c1578063a457c2d714620004d8578063a9059cbb14620004ef578063b4b5ea57146200050657600080fd5b80638da5cb5b11620000fc5780638da5cb5b146200047a57806395d89b41146200048c578063964bca5f1462000496578063983b2d5614620004aa57600080fd5b806372d1c9fe146200041f578063782d6fe114620004365780637ecebe00146200044d5780638129fc1c146200047057600080fd5b80633950935111620001b357806364210fa9116200017e57806364210fa914620003965780636fcfff4514620003aa57806370a0823114620003e9578063715018a6146200041557600080fd5b806339509351146200032057806340c10f191462000337578063587cde1e14620003505780635c19a95c146200037f57600080fd5b806323b872dd11620001f457806323b872dd14620002af5780632a29ad1414620002c6578063313ce56714620002f657806332cb6b0c146200030c57600080fd5b806306fdde03146200022a578063095ea7b3146200024c57806318160ddd146200027457806320606b701462000287575b600080fd5b620002346200060a565b60405162000243919062002306565b60405180910390f35b620002636200025d36600462002222565b620006a4565b604051901515815260200162000243565b6099545b60405190815260200162000243565b620002787f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b62000263620002c0366004620021a1565b620006bd565b620002dd620002d7366004620022ec565b6200072d565b6040516001600160a01b03909116815260200162000243565b609c5460405160ff909116815260200162000243565b620002786b019d971e4fe8401e7400000081565b620002636200033136600462002222565b62000758565b6200034e6200034836600462002222565b62000791565b005b620002dd620003613660046200214b565b6001600160a01b03908116600090815260cd60205260409020541690565b6200034e620003903660046200214b565b62000859565b60cb54620002dd906001600160a01b031681565b620003d3620003bb3660046200214b565b60cf6020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200162000243565b62000278620003fa3660046200214b565b6001600160a01b031660009081526097602052604090205490565b6200034e62000868565b6200034e62000430366004620021e2565b620008df565b620002786200044736600462002222565b62000937565b620002786200045e3660046200214b565b60d06020526000908152604090205481565b6200034e62000bbd565b6065546001600160a01b0316620002dd565b6200023462000ddf565b60cc54620002dd906001600160a01b031681565b6200034e620004bb3660046200214b565b62000df0565b6200034e620004d236600462002222565b62000e6f565b62000263620004e936600462002222565b62000f06565b620002636200050036600462002222565b62000f59565b62000278620005173660046200214b565b62000f68565b6200034e6200052e3660046200224f565b62000fe1565b620002786200054536600462002169565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b620002787fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b620005d6620005a9366004620022b3565b60ce6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520162000243565b6200034e620006043660046200214b565b620012cc565b6060609a80546200061b90620024df565b80601f01602080910402602001604051908101604052809291908181526020018280546200064990620024df565b80156200069a5780601f106200066e576101008083540402835291602001916200069a565b820191906000526020600020905b8154815290600101906020018083116200067c57829003601f168201915b5050505050905090565b6000620006b3338484620013bc565b5060015b92915050565b6000620006cc848484620014e5565b6200072384336200071d8560405180606001604052806028815260200162002ec9602891396001600160a01b038a166000908152609860209081526040808320338452909152902054919062001682565b620013bc565b5060019392505050565b60ca81815481106200073e57600080fd5b6000918252602090912001546001600160a01b0316905081565b3360008181526098602090815260408083206001600160a01b03871684529091528120549091620006b39185906200071d9086620016c1565b6000805b60ca54811015620007fb57336001600160a01b031660ca8281548110620007c057620007c062002550565b6000918252602090912001546001600160a01b03161415620007e65760019150620007fb565b80620007f2816200251c565b91505062000795565b5080620008255760405162461bcd60e51b81526004016200081c90620023e1565b60405180910390fd5b6b019d971e4fe8401e740000006200083c60995490565b11156200084857505050565b62000854838362001724565b505050565b6200086533826200181f565b50565b6065546001600160a01b03163314620008955760405162461bcd60e51b81526004016200081c906200235e565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6065546001600160a01b031633146200090c5760405162461bcd60e51b81526004016200081c906200235e565b6001600160a01b03919091166000908152609d60205260409020805460ff1916911515919091179055565b60004382106200099f5760405162461bcd60e51b815260206004820152602c60248201527f4661726d546f6b656e3a3a6765745072696f72566f7465733a206e6f7420796560448201526b1d0819195d195c9b5a5b995960a21b60648201526084016200081c565b6001600160a01b038316600090815260cf602052604090205463ffffffff1680620009cf576000915050620006b7565b6001600160a01b038416600090815260ce602052604081208491620009f6600185620024b7565b63ffffffff9081168252602082019290925260400160002054161162000a63576001600160a01b038416600090815260ce602052604081209062000a3c600184620024b7565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050620006b7565b6001600160a01b038416600090815260ce6020908152604080832083805290915290205463ffffffff1683101562000aa0576000915050620006b7565b60008062000ab0600184620024b7565b90505b8163ffffffff168163ffffffff16111562000b86576000600262000ad88484620024b7565b62000ae491906200246b565b62000af09083620024b7565b6001600160a01b038816600090815260ce6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141562000b5557602001519450620006b79350505050565b805163ffffffff1687111562000b6e5781935062000b7e565b62000b7b600183620024b7565b92505b505062000ab3565b506001600160a01b038516600090815260ce6020908152604080832063ffffffff9094168352929052206001015491505092915050565b600054610100900460ff168062000bd35750303b155b8062000be2575060005460ff16155b62000c015760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562000c24576000805461ffff19166101011790555b62000c2e620018a1565b62000c776040518060400160405280600981526020016812195b1b121bdd5b9960ba1b815250604051806040016040528060048152602001631211531160e21b8152506200191c565b334260006301e1338060405162000c8e906200207a565b6001600160a01b039094168452602084019290925260408301526060820152608001604051809103906000f08015801562000ccd573d6000803e3d6000fd5b5060cb60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550334262ed4e006302c7ea0060405162000d0d906200207a565b6001600160a01b039094168452602084019290925260408301526060820152608001604051809103906000f08015801562000d4c573d6000803e3d6000fd5b5060cc80546001600160a01b0319166001600160a01b039290921691909117905562000d84336a295be96e6406697200000062001724565b60cb5462000da7906001600160a01b03166a18d0bf423c03d8de00000062001724565b60cc5462000dca906001600160a01b03166a108b2a2c2802909400000062001724565b801562000865576000805461ff001916905550565b6060609b80546200061b90620024df565b6065546001600160a01b0316331462000e1d5760405162461bcd60e51b81526004016200081c906200235e565b60ca80546001810182556000919091527f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee10180546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b60ca5481101562000ed957336001600160a01b031660ca828154811062000e9e5762000e9e62002550565b6000918252602090912001546001600160a01b0316141562000ec4576001915062000ed9565b8062000ed0816200251c565b91505062000e73565b508062000efa5760405162461bcd60e51b81526004016200081c90620023e1565b620008548383620019b0565b6000620006b333846200071d8560405180606001604052806025815260200162002f2a602591393360009081526098602090815260408083206001600160a01b038d168452909152902054919062001682565b6000620006b3338484620014e5565b6001600160a01b038116600090815260cf602052604081205463ffffffff168062000f9557600062000fda565b6001600160a01b038316600090815260ce602052604081209062000fbb600184620024b7565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666200100e6200060a565b805190602001206200101d4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156200114a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116620011c35760405162461bcd60e51b815260206004820152602b60248201527f4661726d546f6b656e3a3a64656c656761746542795369673a20696e76616c6960448201526a64207369676e617475726560a81b60648201526084016200081c565b6001600160a01b038116600090815260d060205260408120805491620011e9836200251c565b9190505589146200124d5760405162461bcd60e51b815260206004820152602760248201527f4661726d546f6b656e3a3a64656c656761746542795369673a20696e76616c6960448201526664206e6f6e636560c81b60648201526084016200081c565b87421115620012b35760405162461bcd60e51b815260206004820152602b60248201527f4661726d546f6b656e3a3a64656c656761746542795369673a207369676e617460448201526a1d5c9948195e1c1a5c995960aa1b60648201526084016200081c565b620012bf818b6200181f565b505050505b505050505050565b6065546001600160a01b03163314620012f95760405162461bcd60e51b81526004016200081c906200235e565b6001600160a01b038116620013605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200081c565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316620014205760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200081c565b6001600160a01b038216620014835760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200081c565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166200154b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016200081c565b6001600160a01b038216620015af5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016200081c565b620015bc83838362001aca565b620015fc8160405180606001604052806026815260200162002ea3602691396001600160a01b038616600090815260976020526040902054919062001682565b6001600160a01b0380851660009081526097602052604080822093909355908416815220546200162d9082620016c1565b6001600160a01b0380841660008181526097602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620014d89085815260200190565b60008184841115620016a95760405162461bcd60e51b81526004016200081c919062002306565b506000620016b884866200249d565b95945050505050565b600080620016d0838562002425565b90508381101562000fda5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200081c565b6001600160a01b0382166200177c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200081c565b6200178a6000838362001aca565b609954620017999082620016c1565b6099556001600160a01b038216600090815260976020526040902054620017c19082620016c1565b6001600160a01b0383166000818152609760205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620018139085815260200190565b60405180910390a35050565b6001600160a01b03828116600081815260cd6020818152604080842080546097845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46200189b82848362001af1565b50505050565b600054610100900460ff1680620018b75750303b155b80620018c6575060005460ff16155b620018e55760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001908576000805461ffff19166101011790555b6200191262001c64565b62000dca62001cdf565b600054610100900460ff1680620019325750303b155b8062001941575060005460ff16155b620019605760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001983576000805461ffff19166101011790555b6200198d62001c64565b62001999838362001d9e565b801562000854576000805461ff0019169055505050565b6001600160a01b03821662001a125760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016200081c565b62001a208260008362001aca565b62001a608160405180606001604052806022815260200162002e81602291396001600160a01b038516600090815260976020526040902054919062001682565b6001600160a01b03831660009081526097602052604090205560995462001a88908262001e55565b6099556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200162001813565b6001600160a01b0383166000908152609d602052604090205460ff16156200085457600080fd5b816001600160a01b0316836001600160a01b03161415801562001b145750600081115b1562000854576001600160a01b0383161562001bc1576001600160a01b038316600090815260cf602052604081205463ffffffff16908162001b5857600062001b9d565b6001600160a01b038516600090815260ce602052604081209062001b7e600185620024b7565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600062001bad84836200249d565b905062001bbd8684848462001e99565b5050505b6001600160a01b0382161562000854576001600160a01b038216600090815260cf602052604081205463ffffffff16908162001bff57600062001c44565b6001600160a01b038416600090815260ce602052604081209062001c25600185620024b7565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600062001c54848362002425565b9050620012c48584848462001e99565b600054610100900460ff168062001c7a5750303b155b8062001c89575060005460ff16155b62001ca85760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562000dca576000805461ffff1916610101179055801562000865576000805461ff001916905550565b600054610100900460ff168062001cf55750303b155b8062001d04575060005460ff16155b62001d235760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001d46576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801562000865576000805461ff001916905550565b600054610100900460ff168062001db45750303b155b8062001dc3575060005460ff16155b62001de25760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001e05576000805461ffff19166101011790555b825162001e1a90609a90602086019062002088565b50815162001e3090609b90602085019062002088565b50609c805460ff19166012179055801562000854576000805461ff0019169055505050565b600062000fda83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062001682565b600062001ec04360405180606001604052806039815260200162002ef16039913962002047565b905060008463ffffffff1611801562001f1d57506001600160a01b038516600090815260ce6020526040812063ffffffff83169162001f01600188620024b7565b63ffffffff908116825260208201929092526040016000205416145b1562001f6a576001600160a01b038516600090815260ce60205260408120839162001f4a600188620024b7565b63ffffffff16815260208101919091526040016000206001015562001ffc565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a16600090815260ce83528581208a851682529092529390209151825463ffffffff19169116178155905160019182015562001fcb90859062002440565b6001600160a01b038616600090815260cf60205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410620020725760405162461bcd60e51b81526004016200081c919062002306565b509192915050565b61091a806200256783390190565b8280546200209690620024df565b90600052602060002090601f016020900481019282620020ba576000855562002105565b82601f10620020d557805160ff191683800117855562002105565b8280016001018555821562002105579182015b8281111562002105578251825591602001919060010190620020e8565b506200211392915062002117565b5090565b5b8082111562002113576000815560010162002118565b80356001600160a01b03811681146200214657600080fd5b919050565b6000602082840312156200215e57600080fd5b62000fda826200212e565b600080604083850312156200217d57600080fd5b62002188836200212e565b915062002198602084016200212e565b90509250929050565b600080600060608486031215620021b757600080fd5b620021c2846200212e565b9250620021d2602085016200212e565b9150604084013590509250925092565b60008060408385031215620021f657600080fd5b62002201836200212e565b9150602083013580151581146200221757600080fd5b809150509250929050565b600080604083850312156200223657600080fd5b62002241836200212e565b946020939093013593505050565b60008060008060008060c087890312156200226957600080fd5b62002274876200212e565b95506020870135945060408701359350606087013560ff811681146200229957600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215620022c757600080fd5b620022d2836200212e565b9150602083013563ffffffff811681146200221757600080fd5b600060208284031215620022ff57600080fd5b5035919050565b600060208083528351808285015260005b81811015620023355785810183015185820160400152820162002317565b8181111562002348576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526024908201527f2149734d696e7465723a2063616c6c6572206973206e6f742066726f6d206d69604082015263373a32b960e11b606082015260800190565b600082198211156200243b576200243b6200253a565b500190565b600063ffffffff8083168185168083038211156200246257620024626200253a565b01949350505050565b600063ffffffff808416806200249157634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600082821015620024b257620024b26200253a565b500390565b600063ffffffff83811690831681811015620024d757620024d76200253a565b039392505050565b600181811c90821680620024f457607f821691505b602082108114156200251657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200253357620025336200253a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe608060405234801561001057600080fd5b5060405161091a38038061091a83398101604081905261002f916100fc565b6001600160a01b03841661004257600080fd5b8082111561004f57600080fd5b600080546001600160a01b0319166001600160a01b03861617905560038190556100848383610092602090811b61031b17901c565b60015550506002555061016d565b60008061009f8385610147565b9050838110156100f55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640160405180910390fd5b9392505050565b6000806000806080858703121561011257600080fd5b84516001600160a01b038116811461012957600080fd5b60208601516040870151606090970151919890975090945092505050565b6000821982111561016857634e487b7160e01b600052601160045260246000fd5b500190565b61079e8061017c6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063384711cc1161005b578063384711cc146100da57806338af3eed146100ed5780639852595c14610118578063be9a65551461013857600080fd5b80630fb5a6b41461008d57806313d033c0146100a95780631726cbc8146100b257806319165587146100c5575b600080fd5b61009660035481565b6040519081526020015b60405180910390f35b61009660015481565b6100966100c03660046105ff565b610141565b6100d86100d33660046105ff565b610173565b005b6100966100e83660046105ff565b610212565b600054610100906001600160a01b031681565b6040516001600160a01b0390911681526020016100a0565b6100966101263660046105ff565b60046020526000908152604090205481565b61009660025481565b6001600160a01b03811660009081526004602052604081205461016d9061016784610212565b90610386565b92915050565b600061017e82610141565b90506000811161018d57600080fd5b6001600160a01b0382166000908152600460205260409020546101b0908261031b565b6001600160a01b0380841660008181526004602052604081209390935591546101db929116836103c8565b6040518181527ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c5659060200160405180910390a15050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038416906370a082319060240160206040518083038186803b15801561025657600080fd5b505afa15801561026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028e919061064a565b6001600160a01b038416600090815260046020526040812054919250906102b690839061031b565b90506001544210156102cc575060009392505050565b6003546002546102db9161031b565b42106102e8579392505050565b61031360035461030d6103066002544261038690919063ffffffff16565b84906104d6565b90610555565b949350505050565b60008061032883856106b2565b90508381101561037f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b600061037f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610597565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916104249190610663565b6000604051808303816000865af19150503d8060008114610461576040519150601f19603f3d011682016040523d82523d6000602084013e610466565b606091505b50915091508180156104905750805115806104905750808060200190518101906104909190610628565b6104cf5760405162461bcd60e51b815260206004820152601060248201526f085514905394d1915497d1905253115160821b6044820152606401610376565b5050505050565b6000826104e55750600061016d565b60006104f183856106ec565b9050826104fe85836106ca565b1461037f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610376565b600061037f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506105d1565b600081848411156105bb5760405162461bcd60e51b8152600401610376919061067f565b5060006105c8848661070b565b95945050505050565b600081836105f25760405162461bcd60e51b8152600401610376919061067f565b5060006105c884866106ca565b60006020828403121561061157600080fd5b81356001600160a01b038116811461037f57600080fd5b60006020828403121561063a57600080fd5b8151801515811461037f57600080fd5b60006020828403121561065c57600080fd5b5051919050565b60008251610675818460208701610722565b9190910192915050565b602081526000825180602084015261069e816040850160208701610722565b601f01601f19169190910160400192915050565b600082198211156106c5576106c5610752565b500190565b6000826106e757634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561070657610706610752565b500290565b60008282101561071d5761071d610752565b500390565b60005b8381101561073d578181015183820152602001610725565b8381111561074c576000848401525b50505050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212201fdc652303cc7a8d5b0029727a13974bacf3a0185db3292e725ee43812c6c44f64736f6c6343000806003345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654661726d546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220718ad97c091c33757f4c72edc4242797aa5d9681008044667666444ba325de9a64736f6c63430008060033
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620002255760003560e01c806372d1c9fe11620001315780639dc29fac11620000bb578063c3cda5201162000086578063c3cda520146200051d578063dd62ed3e1462000534578063e7a324dc1462000570578063f1127ed81462000598578063f2fde38b14620005f357600080fd5b80639dc29fac14620004c1578063a457c2d714620004d8578063a9059cbb14620004ef578063b4b5ea57146200050657600080fd5b80638da5cb5b11620000fc5780638da5cb5b146200047a57806395d89b41146200048c578063964bca5f1462000496578063983b2d5614620004aa57600080fd5b806372d1c9fe146200041f578063782d6fe114620004365780637ecebe00146200044d5780638129fc1c146200047057600080fd5b80633950935111620001b357806364210fa9116200017e57806364210fa914620003965780636fcfff4514620003aa57806370a0823114620003e9578063715018a6146200041557600080fd5b806339509351146200032057806340c10f191462000337578063587cde1e14620003505780635c19a95c146200037f57600080fd5b806323b872dd11620001f457806323b872dd14620002af5780632a29ad1414620002c6578063313ce56714620002f657806332cb6b0c146200030c57600080fd5b806306fdde03146200022a578063095ea7b3146200024c57806318160ddd146200027457806320606b701462000287575b600080fd5b620002346200060a565b60405162000243919062002306565b60405180910390f35b620002636200025d36600462002222565b620006a4565b604051901515815260200162000243565b6099545b60405190815260200162000243565b620002787f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b62000263620002c0366004620021a1565b620006bd565b620002dd620002d7366004620022ec565b6200072d565b6040516001600160a01b03909116815260200162000243565b609c5460405160ff909116815260200162000243565b620002786b019d971e4fe8401e7400000081565b620002636200033136600462002222565b62000758565b6200034e6200034836600462002222565b62000791565b005b620002dd620003613660046200214b565b6001600160a01b03908116600090815260cd60205260409020541690565b6200034e620003903660046200214b565b62000859565b60cb54620002dd906001600160a01b031681565b620003d3620003bb3660046200214b565b60cf6020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200162000243565b62000278620003fa3660046200214b565b6001600160a01b031660009081526097602052604090205490565b6200034e62000868565b6200034e62000430366004620021e2565b620008df565b620002786200044736600462002222565b62000937565b620002786200045e3660046200214b565b60d06020526000908152604090205481565b6200034e62000bbd565b6065546001600160a01b0316620002dd565b6200023462000ddf565b60cc54620002dd906001600160a01b031681565b6200034e620004bb3660046200214b565b62000df0565b6200034e620004d236600462002222565b62000e6f565b62000263620004e936600462002222565b62000f06565b620002636200050036600462002222565b62000f59565b62000278620005173660046200214b565b62000f68565b6200034e6200052e3660046200224f565b62000fe1565b620002786200054536600462002169565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205490565b620002787fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b620005d6620005a9366004620022b3565b60ce6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520162000243565b6200034e620006043660046200214b565b620012cc565b6060609a80546200061b90620024df565b80601f01602080910402602001604051908101604052809291908181526020018280546200064990620024df565b80156200069a5780601f106200066e576101008083540402835291602001916200069a565b820191906000526020600020905b8154815290600101906020018083116200067c57829003601f168201915b5050505050905090565b6000620006b3338484620013bc565b5060015b92915050565b6000620006cc848484620014e5565b6200072384336200071d8560405180606001604052806028815260200162002ec9602891396001600160a01b038a166000908152609860209081526040808320338452909152902054919062001682565b620013bc565b5060019392505050565b60ca81815481106200073e57600080fd5b6000918252602090912001546001600160a01b0316905081565b3360008181526098602090815260408083206001600160a01b03871684529091528120549091620006b39185906200071d9086620016c1565b6000805b60ca54811015620007fb57336001600160a01b031660ca8281548110620007c057620007c062002550565b6000918252602090912001546001600160a01b03161415620007e65760019150620007fb565b80620007f2816200251c565b91505062000795565b5080620008255760405162461bcd60e51b81526004016200081c90620023e1565b60405180910390fd5b6b019d971e4fe8401e740000006200083c60995490565b11156200084857505050565b62000854838362001724565b505050565b6200086533826200181f565b50565b6065546001600160a01b03163314620008955760405162461bcd60e51b81526004016200081c906200235e565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6065546001600160a01b031633146200090c5760405162461bcd60e51b81526004016200081c906200235e565b6001600160a01b03919091166000908152609d60205260409020805460ff1916911515919091179055565b60004382106200099f5760405162461bcd60e51b815260206004820152602c60248201527f4661726d546f6b656e3a3a6765745072696f72566f7465733a206e6f7420796560448201526b1d0819195d195c9b5a5b995960a21b60648201526084016200081c565b6001600160a01b038316600090815260cf602052604090205463ffffffff1680620009cf576000915050620006b7565b6001600160a01b038416600090815260ce602052604081208491620009f6600185620024b7565b63ffffffff9081168252602082019290925260400160002054161162000a63576001600160a01b038416600090815260ce602052604081209062000a3c600184620024b7565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050620006b7565b6001600160a01b038416600090815260ce6020908152604080832083805290915290205463ffffffff1683101562000aa0576000915050620006b7565b60008062000ab0600184620024b7565b90505b8163ffffffff168163ffffffff16111562000b86576000600262000ad88484620024b7565b62000ae491906200246b565b62000af09083620024b7565b6001600160a01b038816600090815260ce6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141562000b5557602001519450620006b79350505050565b805163ffffffff1687111562000b6e5781935062000b7e565b62000b7b600183620024b7565b92505b505062000ab3565b506001600160a01b038516600090815260ce6020908152604080832063ffffffff9094168352929052206001015491505092915050565b600054610100900460ff168062000bd35750303b155b8062000be2575060005460ff16155b62000c015760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562000c24576000805461ffff19166101011790555b62000c2e620018a1565b62000c776040518060400160405280600981526020016812195b1b121bdd5b9960ba1b815250604051806040016040528060048152602001631211531160e21b8152506200191c565b334260006301e1338060405162000c8e906200207a565b6001600160a01b039094168452602084019290925260408301526060820152608001604051809103906000f08015801562000ccd573d6000803e3d6000fd5b5060cb60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550334262ed4e006302c7ea0060405162000d0d906200207a565b6001600160a01b039094168452602084019290925260408301526060820152608001604051809103906000f08015801562000d4c573d6000803e3d6000fd5b5060cc80546001600160a01b0319166001600160a01b039290921691909117905562000d84336a295be96e6406697200000062001724565b60cb5462000da7906001600160a01b03166a18d0bf423c03d8de00000062001724565b60cc5462000dca906001600160a01b03166a108b2a2c2802909400000062001724565b801562000865576000805461ff001916905550565b6060609b80546200061b90620024df565b6065546001600160a01b0316331462000e1d5760405162461bcd60e51b81526004016200081c906200235e565b60ca80546001810182556000919091527f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee10180546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b60ca5481101562000ed957336001600160a01b031660ca828154811062000e9e5762000e9e62002550565b6000918252602090912001546001600160a01b0316141562000ec4576001915062000ed9565b8062000ed0816200251c565b91505062000e73565b508062000efa5760405162461bcd60e51b81526004016200081c90620023e1565b620008548383620019b0565b6000620006b333846200071d8560405180606001604052806025815260200162002f2a602591393360009081526098602090815260408083206001600160a01b038d168452909152902054919062001682565b6000620006b3338484620014e5565b6001600160a01b038116600090815260cf602052604081205463ffffffff168062000f9557600062000fda565b6001600160a01b038316600090815260ce602052604081209062000fbb600184620024b7565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666200100e6200060a565b805190602001206200101d4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156200114a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116620011c35760405162461bcd60e51b815260206004820152602b60248201527f4661726d546f6b656e3a3a64656c656761746542795369673a20696e76616c6960448201526a64207369676e617475726560a81b60648201526084016200081c565b6001600160a01b038116600090815260d060205260408120805491620011e9836200251c565b9190505589146200124d5760405162461bcd60e51b815260206004820152602760248201527f4661726d546f6b656e3a3a64656c656761746542795369673a20696e76616c6960448201526664206e6f6e636560c81b60648201526084016200081c565b87421115620012b35760405162461bcd60e51b815260206004820152602b60248201527f4661726d546f6b656e3a3a64656c656761746542795369673a207369676e617460448201526a1d5c9948195e1c1a5c995960aa1b60648201526084016200081c565b620012bf818b6200181f565b505050505b505050505050565b6065546001600160a01b03163314620012f95760405162461bcd60e51b81526004016200081c906200235e565b6001600160a01b038116620013605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200081c565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316620014205760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200081c565b6001600160a01b038216620014835760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200081c565b6001600160a01b0383811660008181526098602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166200154b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016200081c565b6001600160a01b038216620015af5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016200081c565b620015bc83838362001aca565b620015fc8160405180606001604052806026815260200162002ea3602691396001600160a01b038616600090815260976020526040902054919062001682565b6001600160a01b0380851660009081526097602052604080822093909355908416815220546200162d9082620016c1565b6001600160a01b0380841660008181526097602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620014d89085815260200190565b60008184841115620016a95760405162461bcd60e51b81526004016200081c919062002306565b506000620016b884866200249d565b95945050505050565b600080620016d0838562002425565b90508381101562000fda5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200081c565b6001600160a01b0382166200177c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200081c565b6200178a6000838362001aca565b609954620017999082620016c1565b6099556001600160a01b038216600090815260976020526040902054620017c19082620016c1565b6001600160a01b0383166000818152609760205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620018139085815260200190565b60405180910390a35050565b6001600160a01b03828116600081815260cd6020818152604080842080546097845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46200189b82848362001af1565b50505050565b600054610100900460ff1680620018b75750303b155b80620018c6575060005460ff16155b620018e55760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001908576000805461ffff19166101011790555b6200191262001c64565b62000dca62001cdf565b600054610100900460ff1680620019325750303b155b8062001941575060005460ff16155b620019605760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001983576000805461ffff19166101011790555b6200198d62001c64565b62001999838362001d9e565b801562000854576000805461ff0019169055505050565b6001600160a01b03821662001a125760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016200081c565b62001a208260008362001aca565b62001a608160405180606001604052806022815260200162002e81602291396001600160a01b038516600090815260976020526040902054919062001682565b6001600160a01b03831660009081526097602052604090205560995462001a88908262001e55565b6099556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200162001813565b6001600160a01b0383166000908152609d602052604090205460ff16156200085457600080fd5b816001600160a01b0316836001600160a01b03161415801562001b145750600081115b1562000854576001600160a01b0383161562001bc1576001600160a01b038316600090815260cf602052604081205463ffffffff16908162001b5857600062001b9d565b6001600160a01b038516600090815260ce602052604081209062001b7e600185620024b7565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600062001bad84836200249d565b905062001bbd8684848462001e99565b5050505b6001600160a01b0382161562000854576001600160a01b038216600090815260cf602052604081205463ffffffff16908162001bff57600062001c44565b6001600160a01b038416600090815260ce602052604081209062001c25600185620024b7565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600062001c54848362002425565b9050620012c48584848462001e99565b600054610100900460ff168062001c7a5750303b155b8062001c89575060005460ff16155b62001ca85760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562000dca576000805461ffff1916610101179055801562000865576000805461ff001916905550565b600054610100900460ff168062001cf55750303b155b8062001d04575060005460ff16155b62001d235760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001d46576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801562000865576000805461ff001916905550565b600054610100900460ff168062001db45750303b155b8062001dc3575060005460ff16155b62001de25760405162461bcd60e51b81526004016200081c9062002393565b600054610100900460ff1615801562001e05576000805461ffff19166101011790555b825162001e1a90609a90602086019062002088565b50815162001e3090609b90602085019062002088565b50609c805460ff19166012179055801562000854576000805461ff0019169055505050565b600062000fda83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062001682565b600062001ec04360405180606001604052806039815260200162002ef16039913962002047565b905060008463ffffffff1611801562001f1d57506001600160a01b038516600090815260ce6020526040812063ffffffff83169162001f01600188620024b7565b63ffffffff908116825260208201929092526040016000205416145b1562001f6a576001600160a01b038516600090815260ce60205260408120839162001f4a600188620024b7565b63ffffffff16815260208101919091526040016000206001015562001ffc565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a16600090815260ce83528581208a851682529092529390209151825463ffffffff19169116178155905160019182015562001fcb90859062002440565b6001600160a01b038616600090815260cf60205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410620020725760405162461bcd60e51b81526004016200081c919062002306565b509192915050565b61091a806200256783390190565b8280546200209690620024df565b90600052602060002090601f016020900481019282620020ba576000855562002105565b82601f10620020d557805160ff191683800117855562002105565b8280016001018555821562002105579182015b8281111562002105578251825591602001919060010190620020e8565b506200211392915062002117565b5090565b5b8082111562002113576000815560010162002118565b80356001600160a01b03811681146200214657600080fd5b919050565b6000602082840312156200215e57600080fd5b62000fda826200212e565b600080604083850312156200217d57600080fd5b62002188836200212e565b915062002198602084016200212e565b90509250929050565b600080600060608486031215620021b757600080fd5b620021c2846200212e565b9250620021d2602085016200212e565b9150604084013590509250925092565b60008060408385031215620021f657600080fd5b62002201836200212e565b9150602083013580151581146200221757600080fd5b809150509250929050565b600080604083850312156200223657600080fd5b62002241836200212e565b946020939093013593505050565b60008060008060008060c087890312156200226957600080fd5b62002274876200212e565b95506020870135945060408701359350606087013560ff811681146200229957600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215620022c757600080fd5b620022d2836200212e565b9150602083013563ffffffff811681146200221757600080fd5b600060208284031215620022ff57600080fd5b5035919050565b600060208083528351808285015260005b81811015620023355785810183015185820160400152820162002317565b8181111562002348576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526024908201527f2149734d696e7465723a2063616c6c6572206973206e6f742066726f6d206d69604082015263373a32b960e11b606082015260800190565b600082198211156200243b576200243b6200253a565b500190565b600063ffffffff8083168185168083038211156200246257620024626200253a565b01949350505050565b600063ffffffff808416806200249157634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600082821015620024b257620024b26200253a565b500390565b600063ffffffff83811690831681811015620024d757620024d76200253a565b039392505050565b600181811c90821680620024f457607f821691505b602082108114156200251657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200253357620025336200253a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe608060405234801561001057600080fd5b5060405161091a38038061091a83398101604081905261002f916100fc565b6001600160a01b03841661004257600080fd5b8082111561004f57600080fd5b600080546001600160a01b0319166001600160a01b03861617905560038190556100848383610092602090811b61031b17901c565b60015550506002555061016d565b60008061009f8385610147565b9050838110156100f55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640160405180910390fd5b9392505050565b6000806000806080858703121561011257600080fd5b84516001600160a01b038116811461012957600080fd5b60208601516040870151606090970151919890975090945092505050565b6000821982111561016857634e487b7160e01b600052601160045260246000fd5b500190565b61079e8061017c6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063384711cc1161005b578063384711cc146100da57806338af3eed146100ed5780639852595c14610118578063be9a65551461013857600080fd5b80630fb5a6b41461008d57806313d033c0146100a95780631726cbc8146100b257806319165587146100c5575b600080fd5b61009660035481565b6040519081526020015b60405180910390f35b61009660015481565b6100966100c03660046105ff565b610141565b6100d86100d33660046105ff565b610173565b005b6100966100e83660046105ff565b610212565b600054610100906001600160a01b031681565b6040516001600160a01b0390911681526020016100a0565b6100966101263660046105ff565b60046020526000908152604090205481565b61009660025481565b6001600160a01b03811660009081526004602052604081205461016d9061016784610212565b90610386565b92915050565b600061017e82610141565b90506000811161018d57600080fd5b6001600160a01b0382166000908152600460205260409020546101b0908261031b565b6001600160a01b0380841660008181526004602052604081209390935591546101db929116836103c8565b6040518181527ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c5659060200160405180910390a15050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038416906370a082319060240160206040518083038186803b15801561025657600080fd5b505afa15801561026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028e919061064a565b6001600160a01b038416600090815260046020526040812054919250906102b690839061031b565b90506001544210156102cc575060009392505050565b6003546002546102db9161031b565b42106102e8579392505050565b61031360035461030d6103066002544261038690919063ffffffff16565b84906104d6565b90610555565b949350505050565b60008061032883856106b2565b90508381101561037f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b600061037f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610597565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916104249190610663565b6000604051808303816000865af19150503d8060008114610461576040519150601f19603f3d011682016040523d82523d6000602084013e610466565b606091505b50915091508180156104905750805115806104905750808060200190518101906104909190610628565b6104cf5760405162461bcd60e51b815260206004820152601060248201526f085514905394d1915497d1905253115160821b6044820152606401610376565b5050505050565b6000826104e55750600061016d565b60006104f183856106ec565b9050826104fe85836106ca565b1461037f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610376565b600061037f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506105d1565b600081848411156105bb5760405162461bcd60e51b8152600401610376919061067f565b5060006105c8848661070b565b95945050505050565b600081836105f25760405162461bcd60e51b8152600401610376919061067f565b5060006105c884866106ca565b60006020828403121561061157600080fd5b81356001600160a01b038116811461037f57600080fd5b60006020828403121561063a57600080fd5b8151801515811461037f57600080fd5b60006020828403121561065c57600080fd5b5051919050565b60008251610675818460208701610722565b9190910192915050565b602081526000825180602084015261069e816040850160208701610722565b601f01601f19169190910160400192915050565b600082198211156106c5576106c5610752565b500190565b6000826106e757634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561070657610706610752565b500290565b60008282101561071d5761071d610752565b500390565b60005b8381101561073d578181015183820152602001610725565b8381111561074c576000848401525b50505050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212201fdc652303cc7a8d5b0029727a13974bacf3a0185db3292e725ee43812c6c44f64736f6c6343000806003345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654661726d546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220718ad97c091c33757f4c72edc4242797aa5d9681008044667666444ba325de9a64736f6c63430008060033
Deployed Bytecode Sourcemap
29807:10114:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16352:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18458:169;;;;;;:::i;:::-;;:::i;:::-;;;4422:14:1;;4415:22;4397:41;;4385:2;4370:18;18458:169:0;4352:92:1;17427:100:0;17507:12;;17427:100;;;4595:25:1;;;4583:2;4568:18;17427:100:0;4550:76:1;32307:122:0;;32349:80;32307:122;;19109:321;;;;;;:::i;:::-;;:::i;29838:25::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3316:32:1;;;3298:51;;3286:2;3271:18;29838:25:0;3253:102:1;17279:83:0;17345:9;;17279:83;;17345:9;;;;13720:36:1;;13708:2;13693:18;17279:83:0;13675:87:1;29948:53:0;;29985:16;29948:53;;19839:218;;;;;;:::i;:::-;;:::i;30980:174::-;;;;;;:::i;:::-;;:::i;:::-;;33290:149;;;;;;:::i;:::-;-1:-1:-1;;;;;33410:21:0;;;33378:7;33410:21;;;:10;:21;;;;;;;;33290:149;33583:104;;;;;;:::i;:::-;;:::i;29870:31::-;;;;;-1:-1:-1;;;;;29870:31:0;;;32185:49;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13287:10:1;13275:23;;;13257:42;;13245:2;13230:18;32185:49:0;13212:93:1;17590:119:0;;;;;;:::i;:::-;-1:-1:-1;;;;;17683:18:0;17656:7;17683:18;;;:9;:18;;;;;;;17590:119;5319:148;;;:::i;25128:103::-;;;;;;:::i;:::-;;:::i;36213:1258::-;;;;;;:::i;:::-;;:::i;32721:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;30010:475;;;:::i;4677:79::-;4742:6;;-1:-1:-1;;;;;4742:6:0;4677:79;;16554:87;;;:::i;29908:33::-;;;;;-1:-1:-1;;;;;29908:33:0;;;30527:111;;;;;;:::i;:::-;;:::i;31162:129::-;;;;;;:::i;:::-;;:::i;20560:269::-;;;;;;:::i;:::-;;:::i;17922:175::-;;;;;;:::i;:::-;;:::i;35527:255::-;;;;;;:::i;:::-;;:::i;34121:1205::-;;;;;;:::i;:::-;;:::i;18160:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;18276:18:0;;;18249:7;18276:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18160:151;32523:117;;32569:71;32523:117;;32046:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13512:10:1;13500:23;;;13482:42;;13555:2;13540:18;;13533:34;;;;13455:18;32046:70:0;13437:136:1;5622:244:0;;;;;;:::i;:::-;;:::i;16352:83::-;16389:13;16422:5;16415:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16352:83;:::o;18458:169::-;18541:4;18558:39;3132:10;18581:7;18590:6;18558:8;:39::i;:::-;-1:-1:-1;18615:4:0;18458:169;;;;;:::o;19109:321::-;19215:4;19232:36;19242:6;19250:9;19261:6;19232:9;:36::i;:::-;19279:121;19288:6;3132:10;19310:89;19348:6;19310:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19310:19:0;;;;;;:11;:19;;;;;;;;3132:10;19310:33;;;;;;;;;;:37;:89::i;:::-;19279:8;:121::i;:::-;-1:-1:-1;19418:4:0;19109:321;;;;;:::o;29838:25::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29838:25:0;;-1:-1:-1;29838:25:0;:::o;19839:218::-;3132:10;19927:4;19976:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19976:34:0;;;;;;;;;;19927:4;;19944:83;;19967:7;;19976:50;;20015:10;19976:38;:50::i;30980:174::-;30677:13;30714:6;30709:176;30730:8;:15;30726:19;;30709:176;;;3132:10;-1:-1:-1;;;;;30771:27:0;:8;30780:1;30771:11;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;30771:11:0;:27;30767:107;;;30830:4;30819:15;;30853:5;;30767:107;30747:3;;;;:::i;:::-;;;;30709:176;;;;30903:8;30895:57;;;;-1:-1:-1;;;30895:57:0;;;;;;;:::i;:::-;;;;;;;;;29985:16:::1;31082:13;17507:12:::0;;;17427:100;31082:13:::1;:26;31078:39;;;30666:306:::0;30980:174;;:::o;31078:39::-:1;31127:19;31133:3;31138:7;31127:5;:19::i;:::-;30666:306:::0;30980:174;;:::o;33583:104::-;33647:32;33657:10;33669:9;33647;:32::i;:::-;33583:104;:::o;5319:148::-;4889:6;;-1:-1:-1;;;;;4889:6:0;3132:10;4889:22;4881:67;;;;-1:-1:-1;;;4881:67:0;;;;;;;:::i;:::-;5410:6:::1;::::0;5389:40:::1;::::0;5426:1:::1;::::0;-1:-1:-1;;;;;5410:6:0::1;::::0;5389:40:::1;::::0;5426:1;;5389:40:::1;5440:6;:19:::0;;-1:-1:-1;;;;;;5440:19:0::1;::::0;;5319:148::o;25128:103::-;4889:6;;-1:-1:-1;;;;;4889:6:0;3132:10;4889:22;4881:67;;;;-1:-1:-1;;;4881:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25200:15:0;;;::::1;;::::0;;;:9:::1;:15;::::0;;;;:23;;-1:-1:-1;;25200:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25128:103::o;36213:1258::-;36321:7;36368:12;36354:11;:26;36346:83;;;;-1:-1:-1;;;36346:83:0;;12107:2:1;36346:83:0;;;12089:21:1;12146:2;12126:18;;;12119:30;12185:34;12165:18;;;12158:62;-1:-1:-1;;;12236:18:1;;;12229:42;12288:19;;36346:83:0;12079:234:1;36346:83:0;-1:-1:-1;;;;;36464:23:0;;36442:19;36464:23;;;:14;:23;;;;;;;;36502:17;36498:58;;36543:1;36536:8;;;;;36498:58;-1:-1:-1;;;;;36616:20:0;;;;;;:11;:20;;;;;36668:11;;36637:16;36652:1;36637:12;:16;:::i;:::-;36616:38;;;;;;;;;;;;;;;-1:-1:-1;36616:38:0;:48;;:63;36612:147;;-1:-1:-1;;;;;36703:20:0;;;;;;:11;:20;;;;;;36724:16;36739:1;36724:12;:16;:::i;:::-;36703:38;;;;;;;;;;;;;;;:44;;;36696:51;;;;;36612:147;-1:-1:-1;;;;;36820:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;36816:88:0;;;36891:1;36884:8;;;;;36816:88;36916:12;;36958:16;36973:1;36958:12;:16;:::i;:::-;36943:31;;36985:428;37000:5;36992:13;;:5;:13;;;36985:428;;;37022:13;37064:1;37047:13;37055:5;37047;:13;:::i;:::-;37046:19;;;;:::i;:::-;37038:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;37130:20:0;;37107;37130;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;37107:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;37022:43;;-1:-1:-1;37177:27:0;;37173:229;;;37232:8;;;;-1:-1:-1;37225:15:0;;-1:-1:-1;;;;37225:15:0;37173:229;37266:12;;:26;;;-1:-1:-1;37262:140:0;;;37321:6;37313:14;;37262:140;;;37376:10;37385:1;37376:6;:10;:::i;:::-;37368:18;;37262:140;37007:406;;36985:428;;;-1:-1:-1;;;;;;37430:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;36213:1258:0;;;;:::o;30010:475::-;1087:12;;;;;;;;:31;;-1:-1:-1;1905:4:0;1951:17;1983:7;1103:15;1087:47;;;-1:-1:-1;1123:11:0;;;;1122:12;1087:47;1079:106;;;;-1:-1:-1;;;1079:106:0;;;;;;;:::i;:::-;1194:19;1217:12;;;;;;1216:13;1236:83;;;;1265:12;:19;;-1:-1:-1;;1293:18:0;;;;;1236:83;30062:24:::1;:22;:24::i;:::-;30097:39;;;;;;;;;;;;;;-1:-1:-1::0;;;30097:39:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;30097:39:0::1;;::::0;:18:::1;:39::i;:::-;30180:10;30192:15;30209:6;30217:8;30163:63;;;;;:::i;:::-;-1:-1:-1::0;;;;;3632:32:1;;;3614:51;;3696:2;3681:18;;3674:34;;;;3739:2;3724:18;;3717:34;3782:2;3767:18;;3760:34;3601:3;3586:19;30163:63:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;30149:11;;:77;;;;;-1:-1:-1::0;;;;;30149:77:0::1;;;;;-1:-1:-1::0;;;;;30149:77:0::1;;;;;;30270:10;30282:15;30299:8;30309;30253:65;;;;;:::i;:::-;-1:-1:-1::0;;;;;3632:32:1;;;3614:51;;3696:2;3681:18;;3674:34;;;;3739:2;3724:18;;3717:34;3782:2;3767:18;;3760:34;3601:3;3586:19;30253:65:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;30237:13:0::1;:81:::0;;-1:-1:-1;;;;;;30237:81:0::1;-1:-1:-1::0;;;;;30237:81:0;;;::::1;::::0;;;::::1;::::0;;30331:34:::1;30337:10;30349:15;30331:5;:34::i;:::-;30390:11;::::0;30376:44:::1;::::0;-1:-1:-1;;;;;30390:11:0::1;30404:15;30376:5;:44::i;:::-;30445:13;::::0;30431:46:::1;::::0;-1:-1:-1;;;;;30445:13:0::1;30461:15;30431:5;:46::i;:::-;1341:14:::0;1337:57;;;1381:5;1366:20;;-1:-1:-1;;1366:20:0;;;1072:327;30010:475::o;16554:87::-;16593:13;16626:7;16619:14;;;;;:::i;30527:111::-;4889:6;;-1:-1:-1;;;;;4889:6:0;3132:10;4889:22;4881:67;;;;-1:-1:-1;;;4881:67:0;;;;;;;:::i;:::-;30612:8:::1;:18:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;30612:18:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;30612:18:0::1;-1:-1:-1::0;;;;;30612:18:0;;;::::1;::::0;;;::::1;::::0;;30527:111::o;31162:129::-;30677:13;30714:6;30709:176;30730:8;:15;30726:19;;30709:176;;;3132:10;-1:-1:-1;;;;;30771:27:0;:8;30780:1;30771:11;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;30771:11:0;:27;30767:107;;;30830:4;30819:15;;30853:5;;30767:107;30747:3;;;;:::i;:::-;;;;30709:176;;;;30903:8;30895:57;;;;-1:-1:-1;;;30895:57:0;;;;;;;:::i;:::-;31262:21:::1;31268:5;31275:7;31262:5;:21::i;20560:269::-:0;20653:4;20670:129;3132:10;20693:7;20702:96;20741:15;20702:96;;;;;;;;;;;;;;;;;3132:10;20702:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20702:34:0;;;;;;;;;;;;:38;:96::i;17922:175::-;18008:4;18025:42;3132:10;18049:9;18060:6;18025:9;:42::i;35527:255::-;-1:-1:-1;;;;;35666:23:0;;35619:7;35666:23;;;:14;:23;;;;;;;;35707:16;:67;;35773:1;35707:67;;;-1:-1:-1;;;;;35726:20:0;;;;;;:11;:20;;;;;;35747:16;35762:1;35747:12;:16;:::i;:::-;35726:38;;;;;;;;;;;;;;;:44;;;35707:67;35700:74;35527:255;-1:-1:-1;;;35527:255:0:o;34121:1205::-;34314:23;32349:80;34443:6;:4;:6::i;:::-;34427:24;;;;;;34470:12;39875:9;;39765:153;34470:12;34364:165;;;;;;;5284:25:1;;;;5325:18;;;5318:34;;;;5368:18;;;5361:34;;;;34509:4:0;5411:18:1;;;;5404:60;;;;34364:165:0;;;;;;;;;;5256:19:1;;;34364:165:0;;34340:200;;;;;;32569:71;34598:140;;;4862:25:1;-1:-1:-1;;;;;4923:32:1;;4903:18;;;4896:60;4972:18;;;4965:34;;;5015:18;;;;5008:34;;;34598:140:0;;;;;;;;;;4834:19:1;;;34598:140:0;;;34574:175;;;;;;;-1:-1:-1;;;34803:123:0;;;3013:27:1;3056:11;;;3049:27;;;3092:12;;;3085:28;;;34340:200:0;;-1:-1:-1;;;3129:12:1;;34803:123:0;;;-1:-1:-1;;34803:123:0;;;;;;;;;34779:158;;34803:123;34779:158;;;;34950:17;34970:26;;;;;;;;;5702:25:1;;;5775:4;5763:17;;5743:18;;;5736:45;;;;5797:18;;;5790:34;;;5840:18;;;5833:34;;;34779:158:0;;-1:-1:-1;34950:17:0;34970:26;;5674:19:1;;34970:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34970:26:0;;-1:-1:-1;;34970:26:0;;;-1:-1:-1;;;;;;;35015:23:0;;35007:79;;;;-1:-1:-1;;;35007:79:0;;8945:2:1;35007:79:0;;;8927:21:1;8984:2;8964:18;;;8957:30;9023:34;9003:18;;;8996:62;-1:-1:-1;;;9074:18:1;;;9067:41;9125:19;;35007:79:0;8917:233:1;35007:79:0;-1:-1:-1;;;;;35114:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;35105:5;:28;35097:80;;;;-1:-1:-1;;;35097:80:0;;8537:2:1;35097:80:0;;;8519:21:1;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;-1:-1:-1;;;8666:18:1;;;8659:37;8713:19;;35097:80:0;8509:229:1;35097:80:0;35215:6;35196:15;:25;;35188:81;;;;-1:-1:-1;;;35188:81:0;;7315:2:1;35188:81:0;;;7297:21:1;7354:2;7334:18;;;7327:30;7393:34;7373:18;;;7366:62;-1:-1:-1;;;7444:18:1;;;7437:41;7495:19;;35188:81:0;7287:233:1;35188:81:0;35287:31;35297:9;35308;35287;:31::i;:::-;35280:38;;;;34121:1205;;;;;;;:::o;5622:244::-;4889:6;;-1:-1:-1;;;;;4889:6:0;3132:10;4889:22;4881:67;;;;-1:-1:-1;;;4881:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5711:22:0;::::1;5703:73;;;::::0;-1:-1:-1;;;5703:73:0;;7727:2:1;5703:73:0::1;::::0;::::1;7709:21:1::0;7766:2;7746:18;;;7739:30;7805:34;7785:18;;;7778:62;-1:-1:-1;;;7856:18:1;;;7849:36;7902:19;;5703:73:0::1;7699:228:1::0;5703:73:0::1;5813:6;::::0;5792:38:::1;::::0;-1:-1:-1;;;;;5792:38:0;;::::1;::::0;5813:6:::1;::::0;5792:38:::1;::::0;5813:6:::1;::::0;5792:38:::1;5841:6;:17:::0;;-1:-1:-1;;;;;;5841:17:0::1;-1:-1:-1::0;;;;;5841:17:0;;;::::1;::::0;;;::::1;::::0;;5622:244::o;23707:346::-;-1:-1:-1;;;;;23809:19:0;;23801:68;;;;-1:-1:-1;;;23801:68:0;;11702:2:1;23801:68:0;;;11684:21:1;11741:2;11721:18;;;11714:30;11780:34;11760:18;;;11753:62;-1:-1:-1;;;11831:18:1;;;11824:34;11875:19;;23801:68:0;11674:226:1;23801:68:0;-1:-1:-1;;;;;23888:21:0;;23880:68;;;;-1:-1:-1;;;23880:68:0;;8134:2:1;23880:68:0;;;8116:21:1;8173:2;8153:18;;;8146:30;8212:34;8192:18;;;8185:62;-1:-1:-1;;;8263:18:1;;;8256:32;8305:19;;23880:68:0;8106:224:1;23880:68:0;-1:-1:-1;;;;;23961:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24013:32;;4595:25:1;;;24013:32:0;;4568:18:1;24013:32:0;;;;;;;;23707:346;;;:::o;21319:539::-;-1:-1:-1;;;;;21425:20:0;;21417:70;;;;-1:-1:-1;;;21417:70:0;;11296:2:1;21417:70:0;;;11278:21:1;11335:2;11315:18;;;11308:30;11374:34;11354:18;;;11347:62;-1:-1:-1;;;11425:18:1;;;11418:35;11470:19;;21417:70:0;11268:227:1;21417:70:0;-1:-1:-1;;;;;21506:23:0;;21498:71;;;;-1:-1:-1;;;21498:71:0;;6911:2:1;21498:71:0;;;6893:21:1;6950:2;6930:18;;;6923:30;6989:34;6969:18;;;6962:62;-1:-1:-1;;;7040:18:1;;;7033:33;7083:19;;21498:71:0;6883:225:1;21498:71:0;21582:47;21603:6;21611:9;21622:6;21582:20;:47::i;:::-;21662:71;21684:6;21662:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21662:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;21642:17:0;;;;;;;:9;:17;;;;;;:91;;;;21767:20;;;;;;;:32;;21792:6;21767:24;:32::i;:::-;-1:-1:-1;;;;;21744:20:0;;;;;;;:9;:20;;;;;;;:55;;;;21815:35;;;;;;;;;;21843:6;4595:25:1;;4583:2;4568:18;;4550:76;10437:192:0;10523:7;10559:12;10551:6;;;;10543:29;;;;-1:-1:-1;;;10543:29:0;;;;;;;;:::i;:::-;-1:-1:-1;10583:9:0;10595:5;10599:1;10595;:5;:::i;:::-;10583:17;10437:192;-1:-1:-1;;;;;10437:192:0:o;9534:181::-;9592:7;;9624:5;9628:1;9624;:5;:::i;:::-;9612:17;;9653:1;9648;:6;;9640:46;;;;-1:-1:-1;;;9640:46:0;;9357:2:1;9640:46:0;;;9339:21:1;9396:2;9376:18;;;9369:30;9435:29;9415:18;;;9408:57;9482:18;;9640:46:0;9329:177:1;22140:378:0;-1:-1:-1;;;;;22224:21:0;;22216:65;;;;-1:-1:-1;;;22216:65:0;;12520:2:1;22216:65:0;;;12502:21:1;12559:2;12539:18;;;12532:30;12598:33;12578:18;;;12571:61;12649:18;;22216:65:0;12492:181:1;22216:65:0;22294:49;22323:1;22327:7;22336:6;22294:20;:49::i;:::-;22371:12;;:24;;22388:6;22371:16;:24::i;:::-;22356:12;:39;-1:-1:-1;;;;;22427:18:0;;;;;;:9;:18;;;;;;:30;;22450:6;22427:22;:30::i;:::-;-1:-1:-1;;;;;22406:18:0;;;;;;:9;:18;;;;;;:51;;;;22473:37;;22406:18;;;22473:37;;;;22503:6;4595:25:1;;4583:2;4568:18;;4550:76;22473:37:0;;;;;;;;22140:378;;:::o;37479:443::-;-1:-1:-1;;;;;37596:21:0;;;37570:23;37596:21;;;:10;:21;;;;;;;;;;17683:9;:18;;;;;;37736:21;;;;:33;;;-1:-1:-1;;;;;;37736:33:0;;;;;;;37787:54;;37596:21;;;;;17683:18;;37736:33;;37596:21;;;37787:54;;37570:23;37787:54;37854:60;37869:15;37886:9;37897:16;37854:14;:60::i;:::-;37559:363;;37479:443;;:::o;4255:129::-;1087:12;;;;;;;;:31;;-1:-1:-1;1905:4:0;1951:17;1983:7;1103:15;1087:47;;;-1:-1:-1;1123:11:0;;;;1122:12;1087:47;1079:106;;;;-1:-1:-1;;;1079:106:0;;;;;;;:::i;:::-;1194:19;1217:12;;;;;;1216:13;1236:83;;;;1265:12;:19;;-1:-1:-1;;1293:18:0;;;;;1236:83;4313:26:::1;:24;:26::i;:::-;4350;:24;:26::i;15911:181::-:0;1087:12;;;;;;;;:31;;-1:-1:-1;1905:4:0;1951:17;1983:7;1103:15;1087:47;;;-1:-1:-1;1123:11:0;;;;1122:12;1087:47;1079:106;;;;-1:-1:-1;;;1079:106:0;;;;;;;:::i;:::-;1194:19;1217:12;;;;;;1216:13;1236:83;;;;1265:12;:19;;-1:-1:-1;;1293:18:0;;;;;1236:83;16009:26:::1;:24;:26::i;:::-;16046:38;16069:5;16076:7;16046:22;:38::i;:::-;1341:14:::0;1337:57;;;1381:5;1366:20;;-1:-1:-1;;1366:20:0;;;1072:327;15911:181;;:::o;22851:418::-;-1:-1:-1;;;;;22935:21:0;;22927:67;;;;-1:-1:-1;;;22927:67:0;;10894:2:1;22927:67:0;;;10876:21:1;10933:2;10913:18;;;10906:30;10972:34;10952:18;;;10945:62;-1:-1:-1;;;11023:18:1;;;11016:31;11064:19;;22927:67:0;10866:223:1;22927:67:0;23007:49;23028:7;23045:1;23049:6;23007:20;:49::i;:::-;23090:68;23113:6;23090:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23090:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;23069:18:0;;;;;;:9;:18;;;;;:89;23184:12;;:24;;23201:6;23184:16;:24::i;:::-;23169:12;:39;23224:37;;4595:25:1;;;23250:1:0;;-1:-1:-1;;;;;23224:37:0;;;;;4583:2:1;4568:18;23224:37:0;4550:76:1;25237:138:0;-1:-1:-1;;;;;25351:15:0;;;;;;:9;:15;;;;;;;;25350:16;25342:25;;;;;37930:941;38036:6;-1:-1:-1;;;;;38026:16:0;:6;-1:-1:-1;;;;;38026:16:0;;;:30;;;;;38055:1;38046:6;:10;38026:30;38022:842;;;-1:-1:-1;;;;;38077:20:0;;;38073:382;;-1:-1:-1;;;;;38185:22:0;;38166:16;38185:22;;;:14;:22;;;;;;;;;38246:13;:60;;38305:1;38246:60;;;-1:-1:-1;;;;;38262:19:0;;;;;;:11;:19;;;;;;38282:13;38294:1;38282:9;:13;:::i;:::-;38262:34;;;;;;;;;;;;;;;:40;;;38246:60;38226:80;-1:-1:-1;38325:17:0;38345:18;38357:6;38226:80;38345:18;:::i;:::-;38325:38;;38382:57;38399:6;38407:9;38418;38429;38382:16;:57::i;:::-;38099:356;;;38073:382;-1:-1:-1;;;;;38475:20:0;;;38471:382;;-1:-1:-1;;;;;38583:22:0;;38564:16;38583:22;;;:14;:22;;;;;;;;;38644:13;:60;;38703:1;38644:60;;;-1:-1:-1;;;;;38660:19:0;;;;;;:11;:19;;;;;;38680:13;38692:1;38680:9;:13;:::i;:::-;38660:34;;;;;;;;;;;;;;;:40;;;38644:60;38624:80;-1:-1:-1;38723:17:0;38743:18;38755:6;38624:80;38743:18;:::i;:::-;38723:38;;38780:57;38797:6;38805:9;38816;38827;38780:16;:57::i;2959:69::-;1087:12;;;;;;;;:31;;-1:-1:-1;1905:4:0;1951:17;1983:7;1103:15;1087:47;;;-1:-1:-1;1123:11:0;;;;1122:12;1087:47;1079:106;;;;-1:-1:-1;;;1079:106:0;;;;;;;:::i;:::-;1194:19;1217:12;;;;;;1216:13;1236:83;;;;1265:12;:19;;-1:-1:-1;;1293:18:0;;;;;1337:57;;;;1381:5;1366:20;;-1:-1:-1;;1366:20:0;;;1072:327;2959:69::o;4392:202::-;1087:12;;;;;;;;:31;;-1:-1:-1;1905:4:0;1951:17;1983:7;1103:15;1087:47;;;-1:-1:-1;1123:11:0;;;;1122:12;1087:47;1079:106;;;;-1:-1:-1;;;1079:106:0;;;;;;;:::i;:::-;1194:19;1217:12;;;;;;1216:13;1236:83;;;;1265:12;:19;;-1:-1:-1;;1293:18:0;;;;;1236:83;4507:6:::1;:18:::0;;-1:-1:-1;;;;;;4507:18:0::1;3132:10:::0;4507:18;;::::1;::::0;;;4541:43:::1;::::0;3132:10;;4464:17:::1;::::0;4541:43:::1;::::0;4464:17;;4541:43:::1;4449:145;1341:14:::0;1337:57;;;1381:5;1366:20;;-1:-1:-1;;1366:20:0;;;1072:327;4392:202::o;16100:182::-;1087:12;;;;;;;;:31;;-1:-1:-1;1905:4:0;1951:17;1983:7;1103:15;1087:47;;;-1:-1:-1;1123:11:0;;;;1122:12;1087:47;1079:106;;;;-1:-1:-1;;;1079:106:0;;;;;;;:::i;:::-;1194:19;1217:12;;;;;;1216:13;1236:83;;;;1265:12;:19;;-1:-1:-1;;1293:18:0;;;;;1236:83;16208:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16232:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16260:9:0::1;:14:::0;;-1:-1:-1;;16260:14:0::1;16272:2;16260:14;::::0;;1337:57;;;;1381:5;1366:20;;-1:-1:-1;;1366:20:0;;;1072:327;16100:182;;:::o;9998:136::-;10056:7;10083:43;10087:1;10090;10083:43;;;;;;;;;;;;;;;;;:3;:43::i;38879:709::-;39058:18;39079:81;39086:12;39079:81;;;;;;;;;;;;;;;;;:6;:81::i;:::-;39058:102;;39192:1;39177:12;:16;;;:85;;;;-1:-1:-1;;;;;;39197:22:0;;;;;;:11;:22;;;;;:65;;;;39220:16;39235:1;39220:12;:16;:::i;:::-;39197:40;;;;;;;;;;;;;;;-1:-1:-1;39197:40:0;:50;;:65;39177:85;39173:339;;;-1:-1:-1;;;;;39279:22:0;;;;;;:11;:22;;;;;39328:8;;39302:16;39317:1;39302:12;:16;:::i;:::-;39279:40;;;;;;;;;;;;;-1:-1:-1;39279:40:0;:46;;:57;39173:339;;;39408:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39369:22:0;;-1:-1:-1;39369:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;39369:72:0;;;;;;;;-1:-1:-1;39369:72:0;;;;39484:16;;39369:36;;39484:16;:::i;:::-;-1:-1:-1;;;;;39456:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;39456:44:0;;;;;;;;;;;;39173:339;39529:51;;;13034:25:1;;;13090:2;13075:18;;13068:34;;;-1:-1:-1;;;;;39529:51:0;;;;;13007:18:1;39529:51:0;;;;;;;39047:541;38879:709;;;;:::o;39596:161::-;39671:6;39709:12;39702:5;39698:9;;39690:32;;;;-1:-1:-1;;;39690:32:0;;;;;;;;:::i;:::-;-1:-1:-1;39747:1:0;;39596:161;-1:-1:-1;;39596:161:0:o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:347::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:2;;;1123:1;1120;1113:12;1075:2;1146:29;1165:9;1146:29;:::i;:::-;1136:39;;1225:2;1214:9;1210:18;1197:32;1272:5;1265:13;1258:21;1251:5;1248:32;1238:2;;1294:1;1291;1284:12;1238:2;1317:5;1307:15;;;1065:263;;;;;:::o;1333:254::-;1401:6;1409;1462:2;1450:9;1441:7;1437:23;1433:32;1430:2;;;1478:1;1475;1468:12;1430:2;1501:29;1520:9;1501:29;:::i;:::-;1491:39;1577:2;1562:18;;;;1549:32;;-1:-1:-1;;;1420:167:1:o;1592:618::-;1694:6;1702;1710;1718;1726;1734;1787:3;1775:9;1766:7;1762:23;1758:33;1755:2;;;1804:1;1801;1794:12;1755:2;1827:29;1846:9;1827:29;:::i;:::-;1817:39;;1903:2;1892:9;1888:18;1875:32;1865:42;;1954:2;1943:9;1939:18;1926:32;1916:42;;2008:2;1997:9;1993:18;1980:32;2052:4;2045:5;2041:16;2034:5;2031:27;2021:2;;2072:1;2069;2062:12;2021:2;1745:465;;;;-1:-1:-1;1745:465:1;;2147:3;2132:19;;2119:33;;2199:3;2184:19;;;2171:33;;-1:-1:-1;1745:465:1;-1:-1:-1;;1745:465:1:o;2215:350::-;2282:6;2290;2343:2;2331:9;2322:7;2318:23;2314:32;2311:2;;;2359:1;2356;2349:12;2311:2;2382:29;2401:9;2382:29;:::i;:::-;2372:39;;2461:2;2450:9;2446:18;2433:32;2505:10;2498:5;2494:22;2487:5;2484:33;2474:2;;2531:1;2528;2521:12;2570:180;2629:6;2682:2;2670:9;2661:7;2657:23;2653:32;2650:2;;;2698:1;2695;2688:12;2650:2;-1:-1:-1;2721:23:1;;2640:110;-1:-1:-1;2640:110:1:o;6107:597::-;6219:4;6248:2;6277;6266:9;6259:21;6309:6;6303:13;6352:6;6347:2;6336:9;6332:18;6325:34;6377:1;6387:140;6401:6;6398:1;6395:13;6387:140;;;6496:14;;;6492:23;;6486:30;6462:17;;;6481:2;6458:26;6451:66;6416:10;;6387:140;;;6545:6;6542:1;6539:13;6536:2;;;6615:1;6610:2;6601:6;6590:9;6586:22;6582:31;6575:42;6536:2;-1:-1:-1;6688:2:1;6667:15;-1:-1:-1;;6663:29:1;6648:45;;;;6695:2;6644:54;;6228:476;-1:-1:-1;;;6228:476:1:o;9511:356::-;9713:2;9695:21;;;9732:18;;;9725:30;9791:34;9786:2;9771:18;;9764:62;9858:2;9843:18;;9685:182::o;9872:410::-;10074:2;10056:21;;;10113:2;10093:18;;;10086:30;10152:34;10147:2;10132:18;;10125:62;-1:-1:-1;;;10218:2:1;10203:18;;10196:44;10272:3;10257:19;;10046:236::o;10287:400::-;10489:2;10471:21;;;10528:2;10508:18;;;10501:30;10567:34;10562:2;10547:18;;10540:62;-1:-1:-1;;;10633:2:1;10618:18;;10611:34;10677:3;10662:19;;10461:226::o;13767:128::-;13807:3;13838:1;13834:6;13831:1;13828:13;13825:2;;;13844:18;;:::i;:::-;-1:-1:-1;13880:9:1;;13815:80::o;13900:228::-;13939:3;13967:10;14004:2;14001:1;13997:10;14034:2;14031:1;14027:10;14065:3;14061:2;14057:12;14052:3;14049:21;14046:2;;;14073:18;;:::i;:::-;14109:13;;13947:181;-1:-1:-1;;;;13947:181:1:o;14133:288::-;14172:1;14198:10;14235:2;14232:1;14228:10;14257:3;14247:2;;14303:10;14298:3;14294:20;14291:1;14284:31;14338:4;14335:1;14328:15;14366:4;14363:1;14356:15;14247:2;14399:10;;14395:20;;;;;14178:243;-1:-1:-1;;14178:243:1:o;14426:125::-;14466:4;14494:1;14491;14488:8;14485:2;;;14499:18;;:::i;:::-;-1:-1:-1;14536:9:1;;14475:76::o;14556:221::-;14595:4;14624:10;14684;;;;14654;;14706:12;;;14703:2;;;14721:18;;:::i;:::-;14758:13;;14604:173;-1:-1:-1;;;14604:173:1:o;14782:380::-;14861:1;14857:12;;;;14904;;;14925:2;;14979:4;14971:6;14967:17;14957:27;;14925:2;15032;15024:6;15021:14;15001:18;14998:38;14995:2;;;15078:10;15073:3;15069:20;15066:1;15059:31;15113:4;15110:1;15103:15;15141:4;15138:1;15131:15;14995:2;;14837:325;;;:::o;15167:135::-;15206:3;-1:-1:-1;;15227:17:1;;15224:2;;;15247:18;;:::i;:::-;-1:-1:-1;15294:1:1;15283:13;;15214:88::o;15307:127::-;15368:10;15363:3;15359:20;15356:1;15349:31;15399:4;15396:1;15389:15;15423:4;15420:1;15413:15;15439:127;15500:10;15495:3;15491:20;15488:1;15481:31;15531:4;15528:1;15521:15;15555:4;15552:1;15545:15
Swarm Source
ipfs://718ad97c091c33757f4c72edc4242797aa5d9681008044667666444ba325de9a
Loading...
Loading
Loading...
Loading
OVERVIEW
HELD is the limited supply governance token for the Hellhound Protocol.Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.