ERC-20
Overview
Max Total Supply
5,000 BASED
Holders
3
Market
Price
$0.00 @ 0.000000 S
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
4,999.999999999999998115 BASEDValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Based
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-23 */ /* BasedTomb an Algorithmic Token on Sonic backed by real yields! /* // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity 0.8.19; interface IOracle { function update() external; function consult( address _token, uint256 _amountIn ) external view returns (uint144 amountOut); function twap( address _token, uint256 _amountIn ) external view returns (uint144 _amountOut); } pragma solidity 0.8.19; library SafeMath8 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint8 a, uint8 b) internal pure returns (uint8) { uint8 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(uint8 a, uint8 b) internal pure returns (uint8) { 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( uint8 a, uint8 b, string memory errorMessage ) internal pure returns (uint8) { require(b <= a, errorMessage); uint8 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(uint8 a, uint8 b) internal pure returns (uint8) { // 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; } uint8 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(uint8 a, uint8 b) internal pure returns (uint8) { 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( uint8 a, uint8 b, string memory errorMessage ) internal pure returns (uint8) { require(b > 0, errorMessage); uint8 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(uint8 a, uint8 b) internal pure returns (uint8) { 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( uint8 a, uint8 b, string memory errorMessage ) internal pure returns (uint8) { require(b != 0, errorMessage); return a % b; } } pragma solidity 0.8.19; contract Operator is Context, Ownable { address private _operator; event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); constructor() { _transferOperator(_msgSender()); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require( _operator == _msgSender(), "operator: caller is not the operator" ); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator) public onlyOwner { _transferOperator(newOperator); } function _transferOperator(address newOperator) internal { require( newOperator != address(0), "operator: zero address given for new operator" ); emit OperatorTransferred(address(0), newOperator); _operator = newOperator; } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } pragma solidity 0.8.19; contract Based is ERC20Burnable, Operator { using SafeMath8 for uint8; using SafeMath for uint256; address public taxManager; address public oracle; // Initial pool uint256 public constant INITIAL_LIQUIDITY_DISTRIBUTION = 5000 ether; // Should the taxes be calculated using the tax tiers bool public autoCalculateTax; mapping(address => bool) public isLP; // Current tax rate uint256 public taxRate; // Tax Tiers uint256[] public taxTiersTwaps = [ 0, 5e17, 6e17, 7e17, 8e17, 9e17, 9.5e17, 1e18, 1.05e18, 1.10e18, 1.20e18, 1.30e18, 1.40e18, 1.50e18 ]; uint256[] public taxTiersRates = [ 2000, 1900, 1600, 1200, 1000, 1000, 500, 250, 200, 175, 150, 125, 125, 100 ]; // Sender addresses excluded from Tax mapping(address => bool) public excludedAddresses; modifier onlyTaxManager() { require(taxManager == _msgSender(), "Caller is not the tax office"); _; } function setTaxManager(address _taxManager) public onlyTaxManager { taxManager = _taxManager; } bool public rewardPoolDistributed = false; constructor() ERC20("Based Tomb", "BASED") { taxManager = _msgSender(); _mint(_msgSender(), INITIAL_LIQUIDITY_DISTRIBUTION); } /* ============= Taxation ============= */ function getTaxTiersTwapsCount() public view returns (uint256 count) { return taxTiersTwaps.length; } function getTaxTiersRatesCount() public view returns (uint256 count) { return taxTiersRates.length; } function isAddressExcluded(address _address) public view returns (bool) { return excludedAddresses[_address]; } function setTaxTiersTwap( uint8 _index, uint256 _value ) public onlyTaxManager returns (bool) { require(_index >= 0, "Index has to be higher than 0"); require( _index < getTaxTiersTwapsCount(), "Index has to lower than count of tax tiers" ); if (_index > 0) { require(_value > taxTiersTwaps[_index - 1]); } if (_index < getTaxTiersTwapsCount().sub(1)) { require(_value < taxTiersTwaps[_index + 1]); } taxTiersTwaps[_index] = _value; return true; } function setTaxTiersRate( uint8 _index, uint256 _value ) public onlyTaxManager returns (bool) { require(_index >= 0, "Index has to be higher than 0"); require( _index < getTaxTiersRatesCount(), "Index has to lower than count of tax tiers" ); taxTiersRates[_index] = _value; return true; } function _getBasedPrice() internal view returns (uint256 _basedPrice) { try IOracle(oracle).twap(address(this), 1e18) returns (uint144 _price) { return uint256(_price); } catch { revert("Based: failed to fetch BASED price from Oracle"); } } function _updateTaxRate(uint256 _basedPrice) internal returns (uint256) { for ( uint8 tierId = uint8(getTaxTiersTwapsCount()).sub(1); tierId >= 0; --tierId ) { if (_basedPrice >= taxTiersTwaps[tierId]) { require( taxTiersRates[tierId] < 10000, "tax equal or bigger to 100%" ); taxRate = taxTiersRates[tierId]; return taxTiersRates[tierId]; } } return 0; } function setLP(address _LP, bool _isLP) public onlyTaxManager { isLP[_LP] = _isLP; } function enableAutoCalculateTax() public onlyTaxManager { autoCalculateTax = true; } function disableAutoCalculateTax() public onlyTaxManager { autoCalculateTax = false; } function setOracle(address _oracle) public onlyTaxManager { require(_oracle != address(0), "oracle address cannot be 0 address"); oracle = _oracle; } function setTaxRate(uint256 _taxRate) public onlyTaxManager { require(!autoCalculateTax, "auto calculate tax cannot be enabled"); require(_taxRate <= 2000, "tax equal or bigger to 20%"); taxRate = _taxRate; } function excludeAddress( address _address ) public onlyTaxManager returns (bool) { require(!excludedAddresses[_address], "address can't be excluded"); excludedAddresses[_address] = true; return true; } function includeAddress( address _address ) public onlyTaxManager returns (bool) { require(excludedAddresses[_address], "address can't be included"); excludedAddresses[_address] = false; return true; } function mint( address recipient, uint256 amount ) public onlyOperator returns (bool) { _mint(recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transferBASED(sender, recipient, amount); _approve( sender, _msgSender(), allowance(sender, _msgSender()).sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } function transfer( address recipient, uint256 amount ) public virtual override returns (bool) { address sender = _msgSender(); _transferBASED(sender, recipient, amount); return true; } function _transferWithTax( address sender, address recipient, uint256 amount ) internal { uint256 taxAmount = amount.mul(taxRate).div(10000); uint256 amountAfterTax = amount.sub(taxAmount); _burn(sender, taxAmount); _transfer(sender, recipient, amountAfterTax); } function _transferBASED( address sender, address recipient, uint256 amount ) internal { uint256 currentTaxRate = 0; if (autoCalculateTax) { uint256 currentBasedPrice = _getBasedPrice(); currentTaxRate = _updateTaxRate(currentBasedPrice); } if (!autoCalculateTax) { currentTaxRate = taxRate; } if ( (isLP[recipient]) && currentTaxRate != 0 && !excludedAddresses[sender] && !excludedAddresses[recipient] ) { _transferWithTax(sender, recipient, amount); } else { _transfer(sender, recipient, amount); } } function governanceRecoverUnsupported( IERC20 _token, uint256 _amount, address _to ) external onlyOwner { _token.transfer(_to, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","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":"INITIAL_LIQUIDITY_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoCalculateTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":[],"name":"disableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"excludeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersRatesCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersTwapsCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"includeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAddressExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"rewardPoolDistributed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_LP","type":"address"},{"internalType":"bool","name":"_isLP","type":"bool"}],"name":"setLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxManager","type":"address"}],"name":"setTaxManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersTwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersTwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052604051806101c00160405280600067ffffffffffffffff1681526020016706f05b59d3b2000067ffffffffffffffff168152602001670853a0d2313c000067ffffffffffffffff1681526020016709b6e64a8ec6000067ffffffffffffffff168152602001670b1a2bc2ec50000067ffffffffffffffff168152602001670c7d713b49da000067ffffffffffffffff168152602001670d2f13f7789f000067ffffffffffffffff168152602001670de0b6b3a764000067ffffffffffffffff168152602001670e92596fd629000067ffffffffffffffff168152602001670f43fc2c04ee000067ffffffffffffffff1681526020016710a741a46278000067ffffffffffffffff16815260200167120a871cc002000067ffffffffffffffff16815260200167136dcc951d8c000067ffffffffffffffff1681526020016714d1120d7b16000067ffffffffffffffff16815250600b90600e62000169929190620006fa565b50604051806101c001604052806107d061ffff16815260200161076c61ffff16815260200161064061ffff1681526020016104b061ffff1681526020016103e861ffff1681526020016103e861ffff1681526020016101f461ffff16815260200160fa61ffff16815260200160c861ffff16815260200160af61ffff168152602001609661ffff168152602001607d61ffff168152602001607d61ffff168152602001606461ffff16815250600c90600e6200022792919062000758565b506000600e60006101000a81548160ff0219169083151502179055503480156200025057600080fd5b506040518060400160405280600a81526020017f426173656420546f6d62000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42415345440000000000000000000000000000000000000000000000000000008152508160039081620002ce919062000a49565b508060049081620002e0919062000a49565b50505062000303620002f7620003a460201b60201c565b620003ac60201b60201c565b6200032362000317620003a460201b60201c565b6200047260201b60201c565b62000333620003a460201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200039e62000387620003a460201b60201c565b69010f0cf064dd592000006200058360201b60201c565b62000ce3565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620004e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004db9062000bb7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ec9062000c29565b60405180910390fd5b6200060960008383620006f060201b60201c565b80600260008282546200061d919062000c7a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006d0919062000cc6565b60405180910390a3620006ec60008383620006f560201b60201c565b5050565b505050565b505050565b82805482825590600052602060002090810192821562000745579160200282015b8281111562000744578251829067ffffffffffffffff169055916020019190600101906200071b565b5b509050620007549190620007b0565b5090565b8280548282559060005260206000209081019282156200079d579160200282015b828111156200079c578251829061ffff1690559160200191906001019062000779565b5b509050620007ac9190620007b0565b5090565b5b80821115620007cb576000816000905550600101620007b1565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200085157607f821691505b60208210810362000867576200086662000809565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008d17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000892565b620008dd868362000892565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200092a620009246200091e84620008f5565b620008ff565b620008f5565b9050919050565b6000819050919050565b620009468362000909565b6200095e620009558262000931565b8484546200089f565b825550505050565b600090565b6200097562000966565b620009828184846200093b565b505050565b5b81811015620009aa576200099e6000826200096b565b60018101905062000988565b5050565b601f821115620009f957620009c3816200086d565b620009ce8462000882565b81016020851015620009de578190505b620009f6620009ed8562000882565b83018262000987565b50505b505050565b600082821c905092915050565b600062000a1e60001984600802620009fe565b1980831691505092915050565b600062000a39838362000a0b565b9150826002028217905092915050565b62000a5482620007cf565b67ffffffffffffffff81111562000a705762000a6f620007da565b5b62000a7c825462000838565b62000a89828285620009ae565b600060209050601f83116001811462000ac1576000841562000aac578287015190505b62000ab8858262000a2b565b86555062000b28565b601f19841662000ad1866200086d565b60005b8281101562000afb5784890151825560018201915060208501945060208101905062000ad4565b8683101562000b1b578489015162000b17601f89168262000a0b565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260008201527f206e6577206f70657261746f7200000000000000000000000000000000000000602082015250565b600062000b9f602d8362000b30565b915062000bac8262000b41565b604082019050919050565b6000602082019050818103600083015262000bd28162000b90565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000c11601f8362000b30565b915062000c1e8262000bd9565b602082019050919050565b6000602082019050818103600083015262000c448162000c02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c8782620008f5565b915062000c9483620008f5565b925082820190508082111562000caf5762000cae62000c4b565b5b92915050565b62000cc081620008f5565b82525050565b600060208201905062000cdd600083018462000cb5565b92915050565b6140eb8062000cf36000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c8063771a3a1d11610151578063a6431bba116100c3578063dbd5951111610087578063dbd59511146107c3578063dd62ed3e146107e1578063ebca1bd914610811578063ee2a953514610841578063f2fde38b1461085f578063ff87fc7c1461087b57610274565b8063a6431bba146106f9578063a9059cbb14610717578063b87c5a4a14610747578063c6d69a3014610777578063cf011b261461079357610274565b80638d3cc818116101155780638d3cc818146106215780638da5cb5b1461063f57806393995d4b1461065d57806395d89b411461068d5780639662676c146106ab578063a457c2d7146106c957610274565b8063771a3a1d1461057d57806379cc67901461059b5780637adbf973146105b75780637dc0d1d0146105d35780637df0f767146105f157610274565b806342966c68116101ea578063570ca735116101ae578063570ca735146104bb5780635c29908d146104d957806365bbacd91461050957806366206ce91461051357806370a0823114610543578063715018a61461057357610274565b806342966c681461041757806342c6b4f1146104335780634456eda2146104635780634d2377301461048157806354575af41461049f57610274565b806328d679381161023c57806328d679381461033157806329605e771461034d578063313ce567146103695780633758e6ce1461038757806339509351146103b757806340c10f19146103e757610274565b806306fdde0314610279578063095e391314610297578063095ea7b3146102b357806318160ddd146102e357806323b872dd14610301575b600080fd5b610281610885565b60405161028e9190612c76565b60405180910390f35b6102b160048036038101906102ac9190612cfb565b610917565b005b6102cd60048036038101906102c89190612d5e565b6109f2565b6040516102da9190612db9565b60405180910390f35b6102eb610a15565b6040516102f89190612de3565b60405180910390f35b61031b60048036038101906103169190612dfe565b610a1f565b6040516103289190612db9565b60405180910390f35b61034b60048036038101906103469190612e7d565b610a85565b005b61036760048036038101906103629190612cfb565b610b77565b005b610371610b8b565b60405161037e9190612ed9565b60405180910390f35b6103a1600480360381019061039c9190612cfb565b610b94565b6040516103ae9190612db9565b60405180910390f35b6103d160048036038101906103cc9190612d5e565b610d1b565b6040516103de9190612db9565b60405180910390f35b61040160048036038101906103fc9190612d5e565b610d52565b60405161040e9190612db9565b60405180910390f35b610431600480360381019061042c9190612ef4565b610dff565b005b61044d60048036038101906104489190612ef4565b610e13565b60405161045a9190612de3565b60405180910390f35b61046b610e37565b6040516104789190612db9565b60405180910390f35b610489610e96565b6040516104969190612f30565b60405180910390f35b6104b960048036038101906104b49190612f89565b610ebc565b005b6104c3610f48565b6040516104d09190612f30565b60405180910390f35b6104f360048036038101906104ee9190612ef4565b610f72565b6040516105009190612de3565b60405180910390f35b610511610f96565b005b61052d60048036038101906105289190613008565b61104a565b60405161053a9190612db9565b60405180910390f35b61055d60048036038101906105589190612cfb565b61124b565b60405161056a9190612de3565b60405180910390f35b61057b611293565b005b6105856112a7565b6040516105929190612de3565b60405180910390f35b6105b560048036038101906105b09190612d5e565b6112ad565b005b6105d160048036038101906105cc9190612cfb565b6112cd565b005b6105db611417565b6040516105e89190612f30565b60405180910390f35b61060b60048036038101906106069190612cfb565b61143d565b6040516106189190612db9565b60405180910390f35b61062961145d565b6040516106369190612db9565b60405180910390f35b610647611470565b6040516106549190612f30565b60405180910390f35b61067760048036038101906106729190612cfb565b61149a565b6040516106849190612db9565b60405180910390f35b610695611620565b6040516106a29190612c76565b60405180910390f35b6106b36116b2565b6040516106c09190612db9565b60405180910390f35b6106e360048036038101906106de9190612d5e565b6116c5565b6040516106f09190612db9565b60405180910390f35b61070161173c565b60405161070e9190612de3565b60405180910390f35b610731600480360381019061072c9190612d5e565b611749565b60405161073e9190612db9565b60405180910390f35b610761600480360381019061075c9190613008565b61176c565b60405161076e9190612db9565b60405180910390f35b610791600480360381019061078c9190612ef4565b6118c8565b005b6107ad60048036038101906107a89190612cfb565b6119fe565b6040516107ba9190612db9565b60405180910390f35b6107cb611a1e565b6040516107d89190612de3565b60405180910390f35b6107fb60048036038101906107f69190613048565b611a2c565b6040516108089190612de3565b60405180910390f35b61082b60048036038101906108269190612cfb565b611ab3565b6040516108389190612db9565b60405180910390f35b610849611b09565b6040516108569190612de3565b60405180910390f35b61087960048036038101906108749190612cfb565b611b16565b005b610883611b99565b005b606060038054610894906130b7565b80601f01602080910402602001604051908101604052809291908181526020018280546108c0906130b7565b801561090d5780601f106108e25761010080835404028352916020019161090d565b820191906000526020600020905b8154815290600101906020018083116108f057829003601f168201915b5050505050905090565b61091f611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590613134565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806109fd611c4d565b9050610a0a818585611c55565b600191505092915050565b6000600254905090565b6000610a2c848484611e1e565b610a7a84610a38611c4d565b610a758560405180606001604052806028815260200161408e60289139610a668a610a61611c4d565b611a2c565b611f959092919063ffffffff16565b611c55565b600190509392505050565b610a8d611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390613134565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610b7f611fea565b610b8881612068565b50565b60006012905090565b6000610b9e611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613134565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb1906131a0565b60405180910390fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080610d26611c4d565b9050610d47818585610d388589611a2c565b610d4291906131ef565b611c55565b600191505092915050565b6000610d5c611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290613295565b60405180910390fd5b610df58383612176565b6001905092915050565b610e10610e0a611c4d565b826122cc565b50565b600b8181548110610e2357600080fd5b906000526020600020016000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e7a611c4d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ec4611fea565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401610eff9291906132b5565b6020604051808303816000875af1158015610f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4291906132f3565b50505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c8181548110610f8257600080fd5b906000526020600020016000915090505481565b610f9e611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490613134565b60405180910390fd5b6000600860146101000a81548160ff021916908315150217905550565b6000611054611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613134565b60405180910390fd5b60008360ff16101561112a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111219061336c565b60405180910390fd5b61113261173c565b8360ff1610611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d906133fe565b60405180910390fd5b60008360ff1611156111bc57600b600184611191919061341e565b60ff16815481106111a5576111a4613453565b5b906000526020600020015482116111bb57600080fd5b5b6111d760016111c961173c565b61249990919063ffffffff16565b8360ff16101561121b57600b6001846111f09190613482565b60ff168154811061120457611203613453565b5b9060005260206000200154821061121a57600080fd5b5b81600b8460ff168154811061123357611232613453565b5b90600052602060002001819055506001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61129b611fea565b6112a560006124af565b565b600a5481565b6112bf826112b9611c4d565b83612575565b6112c982826122cc565b5050565b6112d5611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b90613134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613529565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b600860149054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006114a4611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90613134565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690613595565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60606004805461162f906130b7565b80601f016020809104026020016040519081016040528092919081815260200182805461165b906130b7565b80156116a85780601f1061167d576101008083540402835291602001916116a8565b820191906000526020600020905b81548152906001019060200180831161168b57829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b6000806116d0611c4d565b905060006116de8286611a2c565b905083811015611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90613627565b60405180910390fd5b6117308286868403611c55565b60019250505092915050565b6000600b80549050905090565b600080611754611c4d565b9050611761818585611e1e565b600191505092915050565b6000611776611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90613134565b60405180910390fd5b60008360ff16101561184c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118439061336c565b60405180910390fd5b611854611b09565b8360ff1610611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906133fe565b60405180910390fd5b81600c8460ff16815481106118b0576118af613453565b5b90600052602060002001819055506001905092915050565b6118d0611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613134565b60405180910390fd5b600860149054906101000a900460ff16156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a6906136b9565b60405180910390fd5b6107d08111156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613725565b60405180910390fd5b80600a8190555050565b600d6020528060005260406000206000915054906101000a900460ff1681565b69010f0cf064dd5920000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600c80549050905090565b611b1e611fea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b84906137b7565b60405180910390fd5b611b96816124af565b50565b611ba1611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613134565b60405180910390fd5b6001600860146101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90613849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a906138db565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e119190612de3565b60405180910390a3505050565b6000600860149054906101000a900460ff1615611e4e576000611e3f612601565b9050611e4a816126fc565b9150505b600860149054906101000a900460ff16611e6857600a5490505b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611ec2575060008114155b8015611f185750600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611f6e5750600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f8357611f7e848484612826565b611f8f565b611f8e848484612886565b5b50505050565b6000838311158290611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd49190612c76565b60405180910390fd5b5082840390509392505050565b611ff2611c4d565b73ffffffffffffffffffffffffffffffffffffffff16612010611470565b73ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90613947565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce906139d9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90613a45565b60405180910390fd5b6121f160008383612afc565b806002600082825461220391906131ef565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122b49190612de3565b60405180910390a36122c860008383612b01565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361233b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233290613ad7565b60405180910390fd5b61234782600083612afc565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c490613b69565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124809190612de3565b60405180910390a361249483600084612b01565b505050565b600081836124a79190613b89565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006125818484611a2c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125fb57818110156125ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e490613c09565b60405180910390fd5b6125fa8484848403611c55565b5b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636808a12830670de0b6b3a76400006040518363ffffffff1660e01b8152600401612668929190613c6e565b602060405180830381865afa9250505080156126a257506040513d601f19601f8201168201806040525081019061269f9190613ce1565b60015b6126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890613d80565b60405180910390fd5b8071ffffffffffffffffffffffffffffffffffff1691505090565b60008061271d600161270c61173c565b60ff16612b0690919063ffffffff16565b90505b60008160ff161061281b57600b8160ff168154811061274257612741613453565b5b9060005260206000200154831061280a57612710600c8260ff168154811061276d5761276c613453565b5b9060005260206000200154106127b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127af90613dec565b60405180910390fd5b600c8160ff16815481106127cf576127ce613453565b5b9060005260206000200154600a81905550600c8160ff16815481106127f7576127f6613453565b5b9060005260206000200154915050612821565b8061281490613e0c565b9050612720565b50600090505b919050565b6000612851612710612843600a5485612b5090919063ffffffff16565b612b6690919063ffffffff16565b90506000612868828461249990919063ffffffff16565b905061287485836122cc565b61287f858583612886565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec90613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295b90613f39565b60405180910390fd5b61296f838383612afc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec90613fcb565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ae39190612de3565b60405180910390a3612af6848484612b01565b50505050565b505050565b505050565b6000612b4883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b7c565b905092915050565b60008183612b5e9190613feb565b905092915050565b60008183612b74919061405c565b905092915050565b60008360ff168360ff1611158290612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc19190612c76565b60405180910390fd5b5060008385612bd9919061341e565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c20578082015181840152602081019050612c05565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c4882612be6565b612c528185612bf1565b9350612c62818560208601612c02565b612c6b81612c2c565b840191505092915050565b60006020820190508181036000830152612c908184612c3d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cc882612c9d565b9050919050565b612cd881612cbd565b8114612ce357600080fd5b50565b600081359050612cf581612ccf565b92915050565b600060208284031215612d1157612d10612c98565b5b6000612d1f84828501612ce6565b91505092915050565b6000819050919050565b612d3b81612d28565b8114612d4657600080fd5b50565b600081359050612d5881612d32565b92915050565b60008060408385031215612d7557612d74612c98565b5b6000612d8385828601612ce6565b9250506020612d9485828601612d49565b9150509250929050565b60008115159050919050565b612db381612d9e565b82525050565b6000602082019050612dce6000830184612daa565b92915050565b612ddd81612d28565b82525050565b6000602082019050612df86000830184612dd4565b92915050565b600080600060608486031215612e1757612e16612c98565b5b6000612e2586828701612ce6565b9350506020612e3686828701612ce6565b9250506040612e4786828701612d49565b9150509250925092565b612e5a81612d9e565b8114612e6557600080fd5b50565b600081359050612e7781612e51565b92915050565b60008060408385031215612e9457612e93612c98565b5b6000612ea285828601612ce6565b9250506020612eb385828601612e68565b9150509250929050565b600060ff82169050919050565b612ed381612ebd565b82525050565b6000602082019050612eee6000830184612eca565b92915050565b600060208284031215612f0a57612f09612c98565b5b6000612f1884828501612d49565b91505092915050565b612f2a81612cbd565b82525050565b6000602082019050612f456000830184612f21565b92915050565b6000612f5682612cbd565b9050919050565b612f6681612f4b565b8114612f7157600080fd5b50565b600081359050612f8381612f5d565b92915050565b600080600060608486031215612fa257612fa1612c98565b5b6000612fb086828701612f74565b9350506020612fc186828701612d49565b9250506040612fd286828701612ce6565b9150509250925092565b612fe581612ebd565b8114612ff057600080fd5b50565b60008135905061300281612fdc565b92915050565b6000806040838503121561301f5761301e612c98565b5b600061302d85828601612ff3565b925050602061303e85828601612d49565b9150509250929050565b6000806040838503121561305f5761305e612c98565b5b600061306d85828601612ce6565b925050602061307e85828601612ce6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130cf57607f821691505b6020821081036130e2576130e1613088565b5b50919050565b7f43616c6c6572206973206e6f742074686520746178206f666669636500000000600082015250565b600061311e601c83612bf1565b9150613129826130e8565b602082019050919050565b6000602082019050818103600083015261314d81613111565b9050919050565b7f616464726573732063616e2774206265206578636c7564656400000000000000600082015250565b600061318a601983612bf1565b915061319582613154565b602082019050919050565b600060208201905081810360008301526131b98161317d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131fa82612d28565b915061320583612d28565b925082820190508082111561321d5761321c6131c0565b5b92915050565b7f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b600061327f602483612bf1565b915061328a82613223565b604082019050919050565b600060208201905081810360008301526132ae81613272565b9050919050565b60006040820190506132ca6000830185612f21565b6132d76020830184612dd4565b9392505050565b6000815190506132ed81612e51565b92915050565b60006020828403121561330957613308612c98565b5b6000613317848285016132de565b91505092915050565b7f496e6465782068617320746f20626520686967686572207468616e2030000000600082015250565b6000613356601d83612bf1565b915061336182613320565b602082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f496e6465782068617320746f206c6f776572207468616e20636f756e74206f6660008201527f2074617820746965727300000000000000000000000000000000000000000000602082015250565b60006133e8602a83612bf1565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b600061342982612ebd565b915061343483612ebd565b9250828203905060ff81111561344d5761344c6131c0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061348d82612ebd565b915061349883612ebd565b9250828201905060ff8111156134b1576134b06131c0565b5b92915050565b7f6f7261636c6520616464726573732063616e6e6f74206265203020616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613513602283612bf1565b915061351e826134b7565b604082019050919050565b6000602082019050818103600083015261354281613506565b9050919050565b7f616464726573732063616e277420626520696e636c7564656400000000000000600082015250565b600061357f601983612bf1565b915061358a82613549565b602082019050919050565b600060208201905081810360008301526135ae81613572565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613611602583612bf1565b915061361c826135b5565b604082019050919050565b6000602082019050818103600083015261364081613604565b9050919050565b7f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e6160008201527f626c656400000000000000000000000000000000000000000000000000000000602082015250565b60006136a3602483612bf1565b91506136ae82613647565b604082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f74617820657175616c206f722062696767657220746f20323025000000000000600082015250565b600061370f601a83612bf1565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137a1602683612bf1565b91506137ac82613745565b604082019050919050565b600060208201905081810360008301526137d081613794565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613833602483612bf1565b915061383e826137d7565b604082019050919050565b6000602082019050818103600083015261386281613826565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006138c5602283612bf1565b91506138d082613869565b604082019050919050565b600060208201905081810360008301526138f4816138b8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613931602083612bf1565b915061393c826138fb565b602082019050919050565b6000602082019050818103600083015261396081613924565b9050919050565b7f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260008201527f206e6577206f70657261746f7200000000000000000000000000000000000000602082015250565b60006139c3602d83612bf1565b91506139ce82613967565b604082019050919050565b600060208201905081810360008301526139f2816139b6565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613a2f601f83612bf1565b9150613a3a826139f9565b602082019050919050565b60006020820190508181036000830152613a5e81613a22565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ac1602183612bf1565b9150613acc82613a65565b604082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b53602283612bf1565b9150613b5e82613af7565b604082019050919050565b60006020820190508181036000830152613b8281613b46565b9050919050565b6000613b9482612d28565b9150613b9f83612d28565b9250828203905081811115613bb757613bb66131c0565b5b92915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613bf3601d83612bf1565b9150613bfe82613bbd565b602082019050919050565b60006020820190508181036000830152613c2281613be6565b9050919050565b6000819050919050565b6000819050919050565b6000613c58613c53613c4e84613c29565b613c33565b612d28565b9050919050565b613c6881613c3d565b82525050565b6000604082019050613c836000830185612f21565b613c906020830184613c5f565b9392505050565b600071ffffffffffffffffffffffffffffffffffff82169050919050565b613cbe81613c97565b8114613cc957600080fd5b50565b600081519050613cdb81613cb5565b92915050565b600060208284031215613cf757613cf6612c98565b5b6000613d0584828501613ccc565b91505092915050565b7f42617365643a206661696c656420746f2066657463682042415345442070726960008201527f63652066726f6d204f7261636c65000000000000000000000000000000000000602082015250565b6000613d6a602e83612bf1565b9150613d7582613d0e565b604082019050919050565b60006020820190508181036000830152613d9981613d5d565b9050919050565b7f74617820657175616c206f722062696767657220746f20313030250000000000600082015250565b6000613dd6601b83612bf1565b9150613de182613da0565b602082019050919050565b60006020820190508181036000830152613e0581613dc9565b9050919050565b6000613e1782612ebd565b915060008203613e2a57613e296131c0565b5b600182039050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e91602583612bf1565b9150613e9c82613e35565b604082019050919050565b60006020820190508181036000830152613ec081613e84565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f23602383612bf1565b9150613f2e82613ec7565b604082019050919050565b60006020820190508181036000830152613f5281613f16565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613fb5602683612bf1565b9150613fc082613f59565b604082019050919050565b60006020820190508181036000830152613fe481613fa8565b9050919050565b6000613ff682612d28565b915061400183612d28565b925082820261400f81612d28565b91508282048414831517614026576140256131c0565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406782612d28565b915061407283612d28565b9250826140825761408161402d565b5b82820490509291505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212208c992904e7aea389c93e17a3306c61d5b4fd89f935fdf5dbf6026050ddfd0ca864736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063771a3a1d11610151578063a6431bba116100c3578063dbd5951111610087578063dbd59511146107c3578063dd62ed3e146107e1578063ebca1bd914610811578063ee2a953514610841578063f2fde38b1461085f578063ff87fc7c1461087b57610274565b8063a6431bba146106f9578063a9059cbb14610717578063b87c5a4a14610747578063c6d69a3014610777578063cf011b261461079357610274565b80638d3cc818116101155780638d3cc818146106215780638da5cb5b1461063f57806393995d4b1461065d57806395d89b411461068d5780639662676c146106ab578063a457c2d7146106c957610274565b8063771a3a1d1461057d57806379cc67901461059b5780637adbf973146105b75780637dc0d1d0146105d35780637df0f767146105f157610274565b806342966c68116101ea578063570ca735116101ae578063570ca735146104bb5780635c29908d146104d957806365bbacd91461050957806366206ce91461051357806370a0823114610543578063715018a61461057357610274565b806342966c681461041757806342c6b4f1146104335780634456eda2146104635780634d2377301461048157806354575af41461049f57610274565b806328d679381161023c57806328d679381461033157806329605e771461034d578063313ce567146103695780633758e6ce1461038757806339509351146103b757806340c10f19146103e757610274565b806306fdde0314610279578063095e391314610297578063095ea7b3146102b357806318160ddd146102e357806323b872dd14610301575b600080fd5b610281610885565b60405161028e9190612c76565b60405180910390f35b6102b160048036038101906102ac9190612cfb565b610917565b005b6102cd60048036038101906102c89190612d5e565b6109f2565b6040516102da9190612db9565b60405180910390f35b6102eb610a15565b6040516102f89190612de3565b60405180910390f35b61031b60048036038101906103169190612dfe565b610a1f565b6040516103289190612db9565b60405180910390f35b61034b60048036038101906103469190612e7d565b610a85565b005b61036760048036038101906103629190612cfb565b610b77565b005b610371610b8b565b60405161037e9190612ed9565b60405180910390f35b6103a1600480360381019061039c9190612cfb565b610b94565b6040516103ae9190612db9565b60405180910390f35b6103d160048036038101906103cc9190612d5e565b610d1b565b6040516103de9190612db9565b60405180910390f35b61040160048036038101906103fc9190612d5e565b610d52565b60405161040e9190612db9565b60405180910390f35b610431600480360381019061042c9190612ef4565b610dff565b005b61044d60048036038101906104489190612ef4565b610e13565b60405161045a9190612de3565b60405180910390f35b61046b610e37565b6040516104789190612db9565b60405180910390f35b610489610e96565b6040516104969190612f30565b60405180910390f35b6104b960048036038101906104b49190612f89565b610ebc565b005b6104c3610f48565b6040516104d09190612f30565b60405180910390f35b6104f360048036038101906104ee9190612ef4565b610f72565b6040516105009190612de3565b60405180910390f35b610511610f96565b005b61052d60048036038101906105289190613008565b61104a565b60405161053a9190612db9565b60405180910390f35b61055d60048036038101906105589190612cfb565b61124b565b60405161056a9190612de3565b60405180910390f35b61057b611293565b005b6105856112a7565b6040516105929190612de3565b60405180910390f35b6105b560048036038101906105b09190612d5e565b6112ad565b005b6105d160048036038101906105cc9190612cfb565b6112cd565b005b6105db611417565b6040516105e89190612f30565b60405180910390f35b61060b60048036038101906106069190612cfb565b61143d565b6040516106189190612db9565b60405180910390f35b61062961145d565b6040516106369190612db9565b60405180910390f35b610647611470565b6040516106549190612f30565b60405180910390f35b61067760048036038101906106729190612cfb565b61149a565b6040516106849190612db9565b60405180910390f35b610695611620565b6040516106a29190612c76565b60405180910390f35b6106b36116b2565b6040516106c09190612db9565b60405180910390f35b6106e360048036038101906106de9190612d5e565b6116c5565b6040516106f09190612db9565b60405180910390f35b61070161173c565b60405161070e9190612de3565b60405180910390f35b610731600480360381019061072c9190612d5e565b611749565b60405161073e9190612db9565b60405180910390f35b610761600480360381019061075c9190613008565b61176c565b60405161076e9190612db9565b60405180910390f35b610791600480360381019061078c9190612ef4565b6118c8565b005b6107ad60048036038101906107a89190612cfb565b6119fe565b6040516107ba9190612db9565b60405180910390f35b6107cb611a1e565b6040516107d89190612de3565b60405180910390f35b6107fb60048036038101906107f69190613048565b611a2c565b6040516108089190612de3565b60405180910390f35b61082b60048036038101906108269190612cfb565b611ab3565b6040516108389190612db9565b60405180910390f35b610849611b09565b6040516108569190612de3565b60405180910390f35b61087960048036038101906108749190612cfb565b611b16565b005b610883611b99565b005b606060038054610894906130b7565b80601f01602080910402602001604051908101604052809291908181526020018280546108c0906130b7565b801561090d5780601f106108e25761010080835404028352916020019161090d565b820191906000526020600020905b8154815290600101906020018083116108f057829003601f168201915b5050505050905090565b61091f611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590613134565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806109fd611c4d565b9050610a0a818585611c55565b600191505092915050565b6000600254905090565b6000610a2c848484611e1e565b610a7a84610a38611c4d565b610a758560405180606001604052806028815260200161408e60289139610a668a610a61611c4d565b611a2c565b611f959092919063ffffffff16565b611c55565b600190509392505050565b610a8d611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390613134565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610b7f611fea565b610b8881612068565b50565b60006012905090565b6000610b9e611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613134565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb1906131a0565b60405180910390fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080610d26611c4d565b9050610d47818585610d388589611a2c565b610d4291906131ef565b611c55565b600191505092915050565b6000610d5c611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290613295565b60405180910390fd5b610df58383612176565b6001905092915050565b610e10610e0a611c4d565b826122cc565b50565b600b8181548110610e2357600080fd5b906000526020600020016000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e7a611c4d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ec4611fea565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401610eff9291906132b5565b6020604051808303816000875af1158015610f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4291906132f3565b50505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c8181548110610f8257600080fd5b906000526020600020016000915090505481565b610f9e611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490613134565b60405180910390fd5b6000600860146101000a81548160ff021916908315150217905550565b6000611054611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613134565b60405180910390fd5b60008360ff16101561112a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111219061336c565b60405180910390fd5b61113261173c565b8360ff1610611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d906133fe565b60405180910390fd5b60008360ff1611156111bc57600b600184611191919061341e565b60ff16815481106111a5576111a4613453565b5b906000526020600020015482116111bb57600080fd5b5b6111d760016111c961173c565b61249990919063ffffffff16565b8360ff16101561121b57600b6001846111f09190613482565b60ff168154811061120457611203613453565b5b9060005260206000200154821061121a57600080fd5b5b81600b8460ff168154811061123357611232613453565b5b90600052602060002001819055506001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61129b611fea565b6112a560006124af565b565b600a5481565b6112bf826112b9611c4d565b83612575565b6112c982826122cc565b5050565b6112d5611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b90613134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613529565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b600860149054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006114a4611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90613134565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b690613595565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60606004805461162f906130b7565b80601f016020809104026020016040519081016040528092919081815260200182805461165b906130b7565b80156116a85780601f1061167d576101008083540402835291602001916116a8565b820191906000526020600020905b81548152906001019060200180831161168b57829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b6000806116d0611c4d565b905060006116de8286611a2c565b905083811015611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90613627565b60405180910390fd5b6117308286868403611c55565b60019250505092915050565b6000600b80549050905090565b600080611754611c4d565b9050611761818585611e1e565b600191505092915050565b6000611776611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90613134565b60405180910390fd5b60008360ff16101561184c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118439061336c565b60405180910390fd5b611854611b09565b8360ff1610611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906133fe565b60405180910390fd5b81600c8460ff16815481106118b0576118af613453565b5b90600052602060002001819055506001905092915050565b6118d0611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613134565b60405180910390fd5b600860149054906101000a900460ff16156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a6906136b9565b60405180910390fd5b6107d08111156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613725565b60405180910390fd5b80600a8190555050565b600d6020528060005260406000206000915054906101000a900460ff1681565b69010f0cf064dd5920000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600c80549050905090565b611b1e611fea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b84906137b7565b60405180910390fd5b611b96816124af565b50565b611ba1611c4d565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613134565b60405180910390fd5b6001600860146101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90613849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a906138db565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e119190612de3565b60405180910390a3505050565b6000600860149054906101000a900460ff1615611e4e576000611e3f612601565b9050611e4a816126fc565b9150505b600860149054906101000a900460ff16611e6857600a5490505b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611ec2575060008114155b8015611f185750600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611f6e5750600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f8357611f7e848484612826565b611f8f565b611f8e848484612886565b5b50505050565b6000838311158290611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd49190612c76565b60405180910390fd5b5082840390509392505050565b611ff2611c4d565b73ffffffffffffffffffffffffffffffffffffffff16612010611470565b73ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90613947565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce906139d9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90613a45565b60405180910390fd5b6121f160008383612afc565b806002600082825461220391906131ef565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122b49190612de3565b60405180910390a36122c860008383612b01565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361233b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233290613ad7565b60405180910390fd5b61234782600083612afc565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c490613b69565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124809190612de3565b60405180910390a361249483600084612b01565b505050565b600081836124a79190613b89565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006125818484611a2c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125fb57818110156125ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e490613c09565b60405180910390fd5b6125fa8484848403611c55565b5b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636808a12830670de0b6b3a76400006040518363ffffffff1660e01b8152600401612668929190613c6e565b602060405180830381865afa9250505080156126a257506040513d601f19601f8201168201806040525081019061269f9190613ce1565b60015b6126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890613d80565b60405180910390fd5b8071ffffffffffffffffffffffffffffffffffff1691505090565b60008061271d600161270c61173c565b60ff16612b0690919063ffffffff16565b90505b60008160ff161061281b57600b8160ff168154811061274257612741613453565b5b9060005260206000200154831061280a57612710600c8260ff168154811061276d5761276c613453565b5b9060005260206000200154106127b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127af90613dec565b60405180910390fd5b600c8160ff16815481106127cf576127ce613453565b5b9060005260206000200154600a81905550600c8160ff16815481106127f7576127f6613453565b5b9060005260206000200154915050612821565b8061281490613e0c565b9050612720565b50600090505b919050565b6000612851612710612843600a5485612b5090919063ffffffff16565b612b6690919063ffffffff16565b90506000612868828461249990919063ffffffff16565b905061287485836122cc565b61287f858583612886565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec90613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295b90613f39565b60405180910390fd5b61296f838383612afc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec90613fcb565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ae39190612de3565b60405180910390a3612af6848484612b01565b50505050565b505050565b505050565b6000612b4883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b7c565b905092915050565b60008183612b5e9190613feb565b905092915050565b60008183612b74919061405c565b905092915050565b60008360ff168360ff1611158290612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc19190612c76565b60405180910390fd5b5060008385612bd9919061341e565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c20578082015181840152602081019050612c05565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c4882612be6565b612c528185612bf1565b9350612c62818560208601612c02565b612c6b81612c2c565b840191505092915050565b60006020820190508181036000830152612c908184612c3d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cc882612c9d565b9050919050565b612cd881612cbd565b8114612ce357600080fd5b50565b600081359050612cf581612ccf565b92915050565b600060208284031215612d1157612d10612c98565b5b6000612d1f84828501612ce6565b91505092915050565b6000819050919050565b612d3b81612d28565b8114612d4657600080fd5b50565b600081359050612d5881612d32565b92915050565b60008060408385031215612d7557612d74612c98565b5b6000612d8385828601612ce6565b9250506020612d9485828601612d49565b9150509250929050565b60008115159050919050565b612db381612d9e565b82525050565b6000602082019050612dce6000830184612daa565b92915050565b612ddd81612d28565b82525050565b6000602082019050612df86000830184612dd4565b92915050565b600080600060608486031215612e1757612e16612c98565b5b6000612e2586828701612ce6565b9350506020612e3686828701612ce6565b9250506040612e4786828701612d49565b9150509250925092565b612e5a81612d9e565b8114612e6557600080fd5b50565b600081359050612e7781612e51565b92915050565b60008060408385031215612e9457612e93612c98565b5b6000612ea285828601612ce6565b9250506020612eb385828601612e68565b9150509250929050565b600060ff82169050919050565b612ed381612ebd565b82525050565b6000602082019050612eee6000830184612eca565b92915050565b600060208284031215612f0a57612f09612c98565b5b6000612f1884828501612d49565b91505092915050565b612f2a81612cbd565b82525050565b6000602082019050612f456000830184612f21565b92915050565b6000612f5682612cbd565b9050919050565b612f6681612f4b565b8114612f7157600080fd5b50565b600081359050612f8381612f5d565b92915050565b600080600060608486031215612fa257612fa1612c98565b5b6000612fb086828701612f74565b9350506020612fc186828701612d49565b9250506040612fd286828701612ce6565b9150509250925092565b612fe581612ebd565b8114612ff057600080fd5b50565b60008135905061300281612fdc565b92915050565b6000806040838503121561301f5761301e612c98565b5b600061302d85828601612ff3565b925050602061303e85828601612d49565b9150509250929050565b6000806040838503121561305f5761305e612c98565b5b600061306d85828601612ce6565b925050602061307e85828601612ce6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130cf57607f821691505b6020821081036130e2576130e1613088565b5b50919050565b7f43616c6c6572206973206e6f742074686520746178206f666669636500000000600082015250565b600061311e601c83612bf1565b9150613129826130e8565b602082019050919050565b6000602082019050818103600083015261314d81613111565b9050919050565b7f616464726573732063616e2774206265206578636c7564656400000000000000600082015250565b600061318a601983612bf1565b915061319582613154565b602082019050919050565b600060208201905081810360008301526131b98161317d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131fa82612d28565b915061320583612d28565b925082820190508082111561321d5761321c6131c0565b5b92915050565b7f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b600061327f602483612bf1565b915061328a82613223565b604082019050919050565b600060208201905081810360008301526132ae81613272565b9050919050565b60006040820190506132ca6000830185612f21565b6132d76020830184612dd4565b9392505050565b6000815190506132ed81612e51565b92915050565b60006020828403121561330957613308612c98565b5b6000613317848285016132de565b91505092915050565b7f496e6465782068617320746f20626520686967686572207468616e2030000000600082015250565b6000613356601d83612bf1565b915061336182613320565b602082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f496e6465782068617320746f206c6f776572207468616e20636f756e74206f6660008201527f2074617820746965727300000000000000000000000000000000000000000000602082015250565b60006133e8602a83612bf1565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b600061342982612ebd565b915061343483612ebd565b9250828203905060ff81111561344d5761344c6131c0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061348d82612ebd565b915061349883612ebd565b9250828201905060ff8111156134b1576134b06131c0565b5b92915050565b7f6f7261636c6520616464726573732063616e6e6f74206265203020616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613513602283612bf1565b915061351e826134b7565b604082019050919050565b6000602082019050818103600083015261354281613506565b9050919050565b7f616464726573732063616e277420626520696e636c7564656400000000000000600082015250565b600061357f601983612bf1565b915061358a82613549565b602082019050919050565b600060208201905081810360008301526135ae81613572565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613611602583612bf1565b915061361c826135b5565b604082019050919050565b6000602082019050818103600083015261364081613604565b9050919050565b7f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e6160008201527f626c656400000000000000000000000000000000000000000000000000000000602082015250565b60006136a3602483612bf1565b91506136ae82613647565b604082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f74617820657175616c206f722062696767657220746f20323025000000000000600082015250565b600061370f601a83612bf1565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137a1602683612bf1565b91506137ac82613745565b604082019050919050565b600060208201905081810360008301526137d081613794565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613833602483612bf1565b915061383e826137d7565b604082019050919050565b6000602082019050818103600083015261386281613826565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006138c5602283612bf1565b91506138d082613869565b604082019050919050565b600060208201905081810360008301526138f4816138b8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613931602083612bf1565b915061393c826138fb565b602082019050919050565b6000602082019050818103600083015261396081613924565b9050919050565b7f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260008201527f206e6577206f70657261746f7200000000000000000000000000000000000000602082015250565b60006139c3602d83612bf1565b91506139ce82613967565b604082019050919050565b600060208201905081810360008301526139f2816139b6565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613a2f601f83612bf1565b9150613a3a826139f9565b602082019050919050565b60006020820190508181036000830152613a5e81613a22565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ac1602183612bf1565b9150613acc82613a65565b604082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b53602283612bf1565b9150613b5e82613af7565b604082019050919050565b60006020820190508181036000830152613b8281613b46565b9050919050565b6000613b9482612d28565b9150613b9f83612d28565b9250828203905081811115613bb757613bb66131c0565b5b92915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613bf3601d83612bf1565b9150613bfe82613bbd565b602082019050919050565b60006020820190508181036000830152613c2281613be6565b9050919050565b6000819050919050565b6000819050919050565b6000613c58613c53613c4e84613c29565b613c33565b612d28565b9050919050565b613c6881613c3d565b82525050565b6000604082019050613c836000830185612f21565b613c906020830184613c5f565b9392505050565b600071ffffffffffffffffffffffffffffffffffff82169050919050565b613cbe81613c97565b8114613cc957600080fd5b50565b600081519050613cdb81613cb5565b92915050565b600060208284031215613cf757613cf6612c98565b5b6000613d0584828501613ccc565b91505092915050565b7f42617365643a206661696c656420746f2066657463682042415345442070726960008201527f63652066726f6d204f7261636c65000000000000000000000000000000000000602082015250565b6000613d6a602e83612bf1565b9150613d7582613d0e565b604082019050919050565b60006020820190508181036000830152613d9981613d5d565b9050919050565b7f74617820657175616c206f722062696767657220746f20313030250000000000600082015250565b6000613dd6601b83612bf1565b9150613de182613da0565b602082019050919050565b60006020820190508181036000830152613e0581613dc9565b9050919050565b6000613e1782612ebd565b915060008203613e2a57613e296131c0565b5b600182039050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e91602583612bf1565b9150613e9c82613e35565b604082019050919050565b60006020820190508181036000830152613ec081613e84565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f23602383612bf1565b9150613f2e82613ec7565b604082019050919050565b60006020820190508181036000830152613f5281613f16565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613fb5602683612bf1565b9150613fc082613f59565b604082019050919050565b60006020820190508181036000830152613fe481613fa8565b9050919050565b6000613ff682612d28565b915061400183612d28565b925082820261400f81612d28565b91508282048414831517614026576140256131c0565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406782612d28565b915061407283612d28565b9250826140825761408161402d565b5b82820490509291505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212208c992904e7aea389c93e17a3306c61d5b4fd89f935fdf5dbf6026050ddfd0ca864736f6c63430008130033
Deployed Bytecode Sourcemap
34285:7316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22188:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35531:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24548:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23317:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39620:451;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38180:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19039:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23159:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38928:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25999:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39438:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33679:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34773:267;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18931:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34401:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41414:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18664:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35047:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38392:100;;;:::i;:::-;;36284:608;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23488:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2761:103;;;:::i;:::-;;34724:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34089:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38500:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34433:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34654:36;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34619:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39183:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22407:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35648:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26740:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35905:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40079:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36900:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38680:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35341:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34484:67;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24077:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36151:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36028:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3019:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38286:98;;;:::i;:::-;;22188:100;22242:13;22275:5;22268:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22188:100;:::o;35531:109::-;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35621:11:::1;35608:10;;:24;;;;;;;;;;;;;;;;;;35531:109:::0;:::o;24548:201::-;24631:4;24648:13;24664:12;:10;:12::i;:::-;24648:28;;24687:32;24696:5;24703:7;24712:6;24687:8;:32::i;:::-;24737:4;24730:11;;;24548:201;;;;:::o;23317:108::-;23378:7;23405:12;;23398:19;;23317:108;:::o;39620:451::-;39752:4;39769:41;39784:6;39792:9;39803:6;39769:14;:41::i;:::-;39821:218;39844:6;39865:12;:10;:12::i;:::-;39892:136;39946:6;39892:136;;;;;;;;;;;;;;;;;:31;39902:6;39910:12;:10;:12::i;:::-;39892:9;:31::i;:::-;:35;;:136;;;;;:::i;:::-;39821:8;:218::i;:::-;40059:4;40052:11;;39620:451;;;;;:::o;38180:98::-;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38265:5:::1;38253:4;:9;38258:3;38253:9;;;;;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;38180:98:::0;;:::o;19039:113::-;2006:13;:11;:13::i;:::-;19114:30:::1;19132:11;19114:17;:30::i;:::-;19039:113:::0;:::o;23159:93::-;23217:5;23242:2;23235:9;;23159:93;:::o;38928:247::-;39017:4;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39043:17:::1;:27;39061:8;39043:27;;;;;;;;;;;;;;;;;;;;;;;;;39042:28;39034:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39141:4;39111:17;:27;39129:8;39111:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;39163:4;39156:11;;38928:247:::0;;;:::o;25999:238::-;26087:4;26104:13;26120:12;:10;:12::i;:::-;26104:28;;26143:64;26152:5;26159:7;26196:10;26168:25;26178:5;26185:7;26168:9;:25::i;:::-;:38;;;;:::i;:::-;26143:8;:64::i;:::-;26225:4;26218:11;;;25999:238;;;;:::o;39438:174::-;39541:4;18827:12;:10;:12::i;:::-;18814:25;;:9;;;;;;;;;;;:25;;;18792:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39558:24:::1;39564:9;39575:6;39558:5;:24::i;:::-;39600:4;39593:11;;39438:174:::0;;;;:::o;33679:91::-;33735:27;33741:12;:10;:12::i;:::-;33755:6;33735:5;:27::i;:::-;33679:91;:::o;34773:267::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18931:100::-;18974:4;19014:9;;;;;;;;;;;18998:25;;:12;:10;:12::i;:::-;:25;;;18991:32;;18931:100;:::o;34401:25::-;;;;;;;;;;;;;:::o;41414:184::-;2006:13;:11;:13::i;:::-;41561:6:::1;:15;;;41577:3;41582:7;41561:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41414:184:::0;;;:::o;18664:85::-;18705:7;18732:9;;;;;;;;;;;18725:16;;18664:85;:::o;35047:242::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38392:100::-;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38479:5:::1;38460:16;;:24;;;;;;;;;;;;;;;;;;38392:100::o:0;36284:608::-;36395:4;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36430:1:::1;36420:6;:11;;;;36412:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36507:23;:21;:23::i;:::-;36498:6;:32;;;36476:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;36624:1;36615:6;:10;;;36611:86;;;36659:13;36682:1;36673:6;:10;;;;:::i;:::-;36659:25;;;;;;;;;;:::i;:::-;;;;;;;;;;36650:6;:34;36642:43;;;::::0;::::1;;36611:86;36720:30;36748:1;36720:23;:21;:23::i;:::-;:27;;:30;;;;:::i;:::-;36711:6;:39;;;36707:115;;;36784:13;36807:1;36798:6;:10;;;;:::i;:::-;36784:25;;;;;;;;;;:::i;:::-;;;;;;;;;;36775:6;:34;36767:43;;;::::0;::::1;;36707:115;36856:6;36832:13;36846:6;36832:21;;;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;36880:4;36873:11;;36284:608:::0;;;;:::o;23488:127::-;23562:7;23589:9;:18;23599:7;23589:18;;;;;;;;;;;;;;;;23582:25;;23488:127;;;:::o;2761:103::-;2006:13;:11;:13::i;:::-;2826:30:::1;2853:1;2826:18;:30::i;:::-;2761:103::o:0;34724:22::-;;;;:::o;34089:164::-;34166:46;34182:7;34191:12;:10;:12::i;:::-;34205:6;34166:15;:46::i;:::-;34223:22;34229:7;34238:6;34223:5;:22::i;:::-;34089:164;;:::o;38500:172::-;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38596:1:::1;38577:21;;:7;:21;;::::0;38569:68:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38657:7;38648:6;;:16;;;;;;;;;;;;;;;;;;38500:172:::0;:::o;34433:21::-;;;;;;;;;;;;;:::o;34654:36::-;;;;;;;;;;;;;;;;;;;;;;:::o;34619:28::-;;;;;;;;;;;;;:::o;2120:87::-;2166:7;2193:6;;;;;;;;;;;2186:13;;2120:87;:::o;39183:247::-;39272:4;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39297:17:::1;:27;39315:8;39297:27;;;;;;;;;;;;;;;;;;;;;;;;;39289:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39395:5;39365:17;:27;39383:8;39365:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;39418:4;39411:11;;39183:247:::0;;;:::o;22407:104::-;22463:13;22496:7;22489:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22407:104;:::o;35648:41::-;;;;;;;;;;;;;:::o;26740:436::-;26833:4;26850:13;26866:12;:10;:12::i;:::-;26850:28;;26889:24;26916:25;26926:5;26933:7;26916:9;:25::i;:::-;26889:52;;26980:15;26960:16;:35;;26952:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27073:60;27082:5;27089:7;27117:15;27098:16;:34;27073:8;:60::i;:::-;27164:4;27157:11;;;;26740:436;;;;:::o;35905:115::-;35959:13;35992;:20;;;;35985:27;;35905:115;:::o;40079:239::-;40190:4;40207:14;40224:12;:10;:12::i;:::-;40207:29;;40247:41;40262:6;40270:9;40281:6;40247:14;:41::i;:::-;40306:4;40299:11;;;40079:239;;;;:::o;36900:387::-;37011:4;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37046:1:::1;37036:6;:11;;;;37028:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37123:23;:21;:23::i;:::-;37114:6;:32;;;37092:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37251:6;37227:13;37241:6;37227:21;;;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;37275:4;37268:11;;36900:387:::0;;;;:::o;38680:240::-;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38760:16:::1;;;;;;;;;;;38759:17;38751:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38848:4;38836:8;:16;;38828:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38904:8;38894:7;:18;;;;38680:240:::0;:::o;35341:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;34484:67::-;34541:10;34484:67;:::o;24077:151::-;24166:7;24193:11;:18;24205:5;24193:18;;;;;;;;;;;;;;;:27;24212:7;24193:27;;;;;;;;;;;;;;;;24186:34;;24077:151;;;;:::o;36151:125::-;36217:4;36241:17;:27;36259:8;36241:27;;;;;;;;;;;;;;;;;;;;;;;;;36234:34;;36151:125;;;:::o;36028:115::-;36082:13;36115;:20;;;;36108:27;;36028:115;:::o;3019:201::-;2006:13;:11;:13::i;:::-;3128:1:::1;3108:22;;:8;:22;;::::0;3100:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3184:28;3203:8;3184:18;:28::i;:::-;3019:201:::0;:::o;38286:98::-;35458:12;:10;:12::i;:::-;35444:26;;:10;;;;;;;;;;;:26;;;35436:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38372:4:::1;38353:16;;:23;;;;;;;;;;;;;;;;;;38286:98::o:0;730:::-;783:7;810:10;803:17;;730:98;:::o;30733:346::-;30852:1;30835:19;;:5;:19;;;30827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30933:1;30914:21;;:7;:21;;;30906:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31017:6;30987:11;:18;30999:5;30987:18;;;;;;;;;;;;;;;:27;31006:7;30987:27;;;;;;;;;;;;;;;:36;;;;31055:7;31039:32;;31048:5;31039:32;;;31064:6;31039:32;;;;;;:::i;:::-;;;;;;;;30733:346;;;:::o;40670:736::-;40799:22;40840:16;;;;;;;;;;;40836:158;;;40873:25;40901:16;:14;:16::i;:::-;40873:44;;40949:33;40964:17;40949:14;:33::i;:::-;40932:50;;40858:136;40836:158;41009:16;;;;;;;;;;;41004:74;;41059:7;;41042:24;;41004:74;41107:4;:15;41112:9;41107:15;;;;;;;;;;;;;;;;;;;;;;;;;41106:53;;;;;41158:1;41140:14;:19;;41106:53;:96;;;;;41177:17;:25;41195:6;41177:25;;;;;;;;;;;;;;;;;;;;;;;;;41176:26;41106:96;:142;;;;;41220:17;:28;41238:9;41220:28;;;;;;;;;;;;;;;;;;;;;;;;;41219:29;41106:142;41088:311;;;41275:43;41292:6;41300:9;41311:6;41275:16;:43::i;:::-;41088:311;;;41351:36;41361:6;41369:9;41380:6;41351:9;:36::i;:::-;41088:311;40788:618;40670:736;;;:::o;11451:206::-;11537:7;11595:1;11590;:6;;11598:12;11582:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11637:1;11633;:5;11626:12;;11451:206;;;;;:::o;2285:132::-;2360:12;:10;:12::i;:::-;2349:23;;:7;:5;:7::i;:::-;:23;;;2341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2285:132::o;19160:290::-;19273:1;19250:25;;:11;:25;;;19228:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;19396:11;19364:44;;19392:1;19364:44;;;;;;;;;;;;19431:11;19419:9;;:23;;;;;;;;;;;;;;;;;;19160:290;:::o;28739:548::-;28842:1;28823:21;;:7;:21;;;28815:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:49;28922:1;28926:7;28935:6;28893:20;:49::i;:::-;28971:6;28955:12;;:22;;;;;;;:::i;:::-;;;;;;;;29148:6;29126:9;:18;29136:7;29126:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;29202:7;29181:37;;29198:1;29181:37;;;29211:6;29181:37;;;;;;:::i;:::-;;;;;;;;29231:48;29259:1;29263:7;29272:6;29231:19;:48::i;:::-;28739:548;;:::o;29620:675::-;29723:1;29704:21;;:7;:21;;;29696:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29776:49;29797:7;29814:1;29818:6;29776:20;:49::i;:::-;29838:22;29863:9;:18;29873:7;29863:18;;;;;;;;;;;;;;;;29838:43;;29918:6;29900:14;:24;;29892:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30037:6;30020:14;:23;29999:9;:18;30009:7;29999:18;;;;;;;;;;;;;;;:44;;;;30154:6;30138:12;;:22;;;;;;;;;;;30215:1;30189:37;;30198:7;30189:37;;;30219:6;30189:37;;;;;;:::i;:::-;;;;;;;;30239:48;30259:7;30276:1;30280:6;30239:19;:48::i;:::-;29685:610;29620:675;;:::o;9553:98::-;9611:7;9642:1;9638;:5;;;;:::i;:::-;9631:12;;9553:98;;;;:::o;3380:191::-;3454:16;3473:6;;;;;;;;;;;3454:25;;3499:8;3490:6;;:17;;;;;;;;;;;;;;;;;;3554:8;3523:40;;3544:8;3523:40;;;;;;;;;;;;3443:128;3380:191;:::o;31370:419::-;31471:24;31498:25;31508:5;31515:7;31498:9;:25::i;:::-;31471:52;;31558:17;31538:16;:37;31534:248;;31620:6;31600:16;:26;;31592:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31704:51;31713:5;31720:7;31748:6;31729:16;:25;31704:8;:51::i;:::-;31534:248;31460:329;31370:419;;;:::o;37295:298::-;37344:19;37388:6;;;;;;;;;;;37380:20;;;37409:4;37416;37380:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37376:210;;37518:56;;;;;;;;;;:::i;:::-;;;;;;;;37376:210;37477:6;37469:15;;37462:22;;;37295:298;:::o;37601:571::-;37664:7;37703:12;37718:37;37753:1;37724:23;:21;:23::i;:::-;37718:34;;;;:37;;;;:::i;:::-;37703:52;;37684:462;37780:1;37770:6;:11;;;37684:462;;37850:13;37864:6;37850:21;;;;;;;;;;:::i;:::-;;;;;;;;;;37835:11;:36;37831:304;;37946:5;37922:13;37936:6;37922:21;;;;;;;;;;:::i;:::-;;;;;;;;;;:29;37892:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;38051:13;38065:6;38051:21;;;;;;;;;;:::i;:::-;;;;;;;;;;38041:7;:31;;;;38098:13;38112:6;38098:21;;;;;;;;;;:::i;:::-;;;;;;;;;;38091:28;;;;;37831:304;37796:8;;;;:::i;:::-;;;37684:462;;;;38163:1;38156:8;;37601:571;;;;:::o;40326:336::-;40457:17;40477:30;40501:5;40477:19;40488:7;;40477:6;:10;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;40457:50;;40518:22;40543:21;40554:9;40543:6;:10;;:21;;;;:::i;:::-;40518:46;;40575:24;40581:6;40589:9;40575:5;:24::i;:::-;40610:44;40620:6;40628:9;40639:14;40610:9;:44::i;:::-;40446:216;;40326:336;;;:::o;27646:806::-;27759:1;27743:18;;:4;:18;;;27735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27836:1;27822:16;;:2;:16;;;27814:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27891:38;27912:4;27918:2;27922:6;27891:20;:38::i;:::-;27942:19;27964:9;:15;27974:4;27964:15;;;;;;;;;;;;;;;;27942:37;;28013:6;27998:11;:21;;27990:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28130:6;28116:11;:20;28098:9;:15;28108:4;28098:15;;;;;;;;;;;;;;;:38;;;;28333:6;28316:9;:13;28326:2;28316:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;28383:2;28368:26;;28377:4;28368:26;;;28387:6;28368:26;;;;;;:::i;:::-;;;;;;;;28407:37;28427:4;28433:2;28437:6;28407:19;:37::i;:::-;27724:728;27646:806;;;:::o;32389:91::-;;;;:::o;33084:90::-;;;;:::o;14316:130::-;14370:5;14395:43;14399:1;14402;14395:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;14388:50;;14316:130;;;;:::o;9910:98::-;9968:7;9999:1;9995;:5;;;;:::i;:::-;9988:12;;9910:98;;;;:::o;10309:::-;10367:7;10398:1;10394;:5;;;;:::i;:::-;10387:12;;10309:98;;;;:::o;14749:218::-;14865:5;14896:1;14891:6;;:1;:6;;;;14899:12;14883:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;14923:7;14937:1;14933;:5;;;;:::i;:::-;14923:15;;14958:1;14951:8;;;14749:218;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:329::-;2242:6;2291:2;2279:9;2270:7;2266:23;2262:32;2259:119;;;2297:79;;:::i;:::-;2259:119;2417:1;2442:53;2487:7;2478:6;2467:9;2463:22;2442:53;:::i;:::-;2432:63;;2388:117;2183:329;;;;:::o;2518:77::-;2555:7;2584:5;2573:16;;2518:77;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:116::-;4828:21;4843:5;4828:21;:::i;:::-;4821:5;4818:32;4808:60;;4864:1;4861;4854:12;4808:60;4758:116;:::o;4880:133::-;4923:5;4961:6;4948:20;4939:29;;4977:30;5001:5;4977:30;:::i;:::-;4880:133;;;;:::o;5019:468::-;5084:6;5092;5141:2;5129:9;5120:7;5116:23;5112:32;5109:119;;;5147:79;;:::i;:::-;5109:119;5267:1;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5238:117;5394:2;5420:50;5462:7;5453:6;5442:9;5438:22;5420:50;:::i;:::-;5410:60;;5365:115;5019:468;;;;;:::o;5493:86::-;5528:7;5568:4;5561:5;5557:16;5546:27;;5493:86;;;:::o;5585:112::-;5668:22;5684:5;5668:22;:::i;:::-;5663:3;5656:35;5585:112;;:::o;5703:214::-;5792:4;5830:2;5819:9;5815:18;5807:26;;5843:67;5907:1;5896:9;5892:17;5883:6;5843:67;:::i;:::-;5703:214;;;;:::o;5923:329::-;5982:6;6031:2;6019:9;6010:7;6006:23;6002:32;5999:119;;;6037:79;;:::i;:::-;5999:119;6157:1;6182:53;6227:7;6218:6;6207:9;6203:22;6182:53;:::i;:::-;6172:63;;6128:117;5923:329;;;;:::o;6258:118::-;6345:24;6363:5;6345:24;:::i;:::-;6340:3;6333:37;6258:118;;:::o;6382:222::-;6475:4;6513:2;6502:9;6498:18;6490:26;;6526:71;6594:1;6583:9;6579:17;6570:6;6526:71;:::i;:::-;6382:222;;;;:::o;6610:110::-;6661:7;6690:24;6708:5;6690:24;:::i;:::-;6679:35;;6610:110;;;:::o;6726:150::-;6813:38;6845:5;6813:38;:::i;:::-;6806:5;6803:49;6793:77;;6866:1;6863;6856:12;6793:77;6726:150;:::o;6882:167::-;6942:5;6980:6;6967:20;6958:29;;6996:47;7037:5;6996:47;:::i;:::-;6882:167;;;;:::o;7055:647::-;7146:6;7154;7162;7211:2;7199:9;7190:7;7186:23;7182:32;7179:119;;;7217:79;;:::i;:::-;7179:119;7337:1;7362:67;7421:7;7412:6;7401:9;7397:22;7362:67;:::i;:::-;7352:77;;7308:131;7478:2;7504:53;7549:7;7540:6;7529:9;7525:22;7504:53;:::i;:::-;7494:63;;7449:118;7606:2;7632:53;7677:7;7668:6;7657:9;7653:22;7632:53;:::i;:::-;7622:63;;7577:118;7055:647;;;;;:::o;7708:118::-;7779:22;7795:5;7779:22;:::i;:::-;7772:5;7769:33;7759:61;;7816:1;7813;7806:12;7759:61;7708:118;:::o;7832:135::-;7876:5;7914:6;7901:20;7892:29;;7930:31;7955:5;7930:31;:::i;:::-;7832:135;;;;:::o;7973:470::-;8039:6;8047;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8222:1;8247:51;8290:7;8281:6;8270:9;8266:22;8247:51;:::i;:::-;8237:61;;8193:115;8347:2;8373:53;8418:7;8409:6;8398:9;8394:22;8373:53;:::i;:::-;8363:63;;8318:118;7973:470;;;;;:::o;8449:474::-;8517:6;8525;8574:2;8562:9;8553:7;8549:23;8545:32;8542:119;;;8580:79;;:::i;:::-;8542:119;8700:1;8725:53;8770:7;8761:6;8750:9;8746:22;8725:53;:::i;:::-;8715:63;;8671:117;8827:2;8853:53;8898:7;8889:6;8878:9;8874:22;8853:53;:::i;:::-;8843:63;;8798:118;8449:474;;;;;:::o;8929:180::-;8977:77;8974:1;8967:88;9074:4;9071:1;9064:15;9098:4;9095:1;9088:15;9115:320;9159:6;9196:1;9190:4;9186:12;9176:22;;9243:1;9237:4;9233:12;9264:18;9254:81;;9320:4;9312:6;9308:17;9298:27;;9254:81;9382:2;9374:6;9371:14;9351:18;9348:38;9345:84;;9401:18;;:::i;:::-;9345:84;9166:269;9115:320;;;:::o;9441:178::-;9581:30;9577:1;9569:6;9565:14;9558:54;9441:178;:::o;9625:366::-;9767:3;9788:67;9852:2;9847:3;9788:67;:::i;:::-;9781:74;;9864:93;9953:3;9864:93;:::i;:::-;9982:2;9977:3;9973:12;9966:19;;9625:366;;;:::o;9997:419::-;10163:4;10201:2;10190:9;10186:18;10178:26;;10250:9;10244:4;10240:20;10236:1;10225:9;10221:17;10214:47;10278:131;10404:4;10278:131;:::i;:::-;10270:139;;9997:419;;;:::o;10422:175::-;10562:27;10558:1;10550:6;10546:14;10539:51;10422:175;:::o;10603:366::-;10745:3;10766:67;10830:2;10825:3;10766:67;:::i;:::-;10759:74;;10842:93;10931:3;10842:93;:::i;:::-;10960:2;10955:3;10951:12;10944:19;;10603:366;;;:::o;10975:419::-;11141:4;11179:2;11168:9;11164:18;11156:26;;11228:9;11222:4;11218:20;11214:1;11203:9;11199:17;11192:47;11256:131;11382:4;11256:131;:::i;:::-;11248:139;;10975:419;;;:::o;11400:180::-;11448:77;11445:1;11438:88;11545:4;11542:1;11535:15;11569:4;11566:1;11559:15;11586:191;11626:3;11645:20;11663:1;11645:20;:::i;:::-;11640:25;;11679:20;11697:1;11679:20;:::i;:::-;11674:25;;11722:1;11719;11715:9;11708:16;;11743:3;11740:1;11737:10;11734:36;;;11750:18;;:::i;:::-;11734:36;11586:191;;;;:::o;11783:223::-;11923:34;11919:1;11911:6;11907:14;11900:58;11992:6;11987:2;11979:6;11975:15;11968:31;11783:223;:::o;12012:366::-;12154:3;12175:67;12239:2;12234:3;12175:67;:::i;:::-;12168:74;;12251:93;12340:3;12251:93;:::i;:::-;12369:2;12364:3;12360:12;12353:19;;12012:366;;;:::o;12384:419::-;12550:4;12588:2;12577:9;12573:18;12565:26;;12637:9;12631:4;12627:20;12623:1;12612:9;12608:17;12601:47;12665:131;12791:4;12665:131;:::i;:::-;12657:139;;12384:419;;;:::o;12809:332::-;12930:4;12968:2;12957:9;12953:18;12945:26;;12981:71;13049:1;13038:9;13034:17;13025:6;12981:71;:::i;:::-;13062:72;13130:2;13119:9;13115:18;13106:6;13062:72;:::i;:::-;12809:332;;;;;:::o;13147:137::-;13201:5;13232:6;13226:13;13217:22;;13248:30;13272:5;13248:30;:::i;:::-;13147:137;;;;:::o;13290:345::-;13357:6;13406:2;13394:9;13385:7;13381:23;13377:32;13374:119;;;13412:79;;:::i;:::-;13374:119;13532:1;13557:61;13610:7;13601:6;13590:9;13586:22;13557:61;:::i;:::-;13547:71;;13503:125;13290:345;;;;:::o;13641:179::-;13781:31;13777:1;13769:6;13765:14;13758:55;13641:179;:::o;13826:366::-;13968:3;13989:67;14053:2;14048:3;13989:67;:::i;:::-;13982:74;;14065:93;14154:3;14065:93;:::i;:::-;14183:2;14178:3;14174:12;14167:19;;13826:366;;;:::o;14198:419::-;14364:4;14402:2;14391:9;14387:18;14379:26;;14451:9;14445:4;14441:20;14437:1;14426:9;14422:17;14415:47;14479:131;14605:4;14479:131;:::i;:::-;14471:139;;14198:419;;;:::o;14623:229::-;14763:34;14759:1;14751:6;14747:14;14740:58;14832:12;14827:2;14819:6;14815:15;14808:37;14623:229;:::o;14858:366::-;15000:3;15021:67;15085:2;15080:3;15021:67;:::i;:::-;15014:74;;15097:93;15186:3;15097:93;:::i;:::-;15215:2;15210:3;15206:12;15199:19;;14858:366;;;:::o;15230:419::-;15396:4;15434:2;15423:9;15419:18;15411:26;;15483:9;15477:4;15473:20;15469:1;15458:9;15454:17;15447:47;15511:131;15637:4;15511:131;:::i;:::-;15503:139;;15230:419;;;:::o;15655:191::-;15693:4;15713:18;15729:1;15713:18;:::i;:::-;15708:23;;15745:18;15761:1;15745:18;:::i;:::-;15740:23;;15787:1;15784;15780:9;15772:17;;15811:4;15805;15802:14;15799:40;;;15819:18;;:::i;:::-;15799:40;15655:191;;;;:::o;15852:180::-;15900:77;15897:1;15890:88;15997:4;15994:1;15987:15;16021:4;16018:1;16011:15;16038:188;16076:3;16095:18;16111:1;16095:18;:::i;:::-;16090:23;;16127:18;16143:1;16127:18;:::i;:::-;16122:23;;16168:1;16165;16161:9;16154:16;;16191:4;16186:3;16183:13;16180:39;;;16199:18;;:::i;:::-;16180:39;16038:188;;;;:::o;16232:221::-;16372:34;16368:1;16360:6;16356:14;16349:58;16441:4;16436:2;16428:6;16424:15;16417:29;16232:221;:::o;16459:366::-;16601:3;16622:67;16686:2;16681:3;16622:67;:::i;:::-;16615:74;;16698:93;16787:3;16698:93;:::i;:::-;16816:2;16811:3;16807:12;16800:19;;16459:366;;;:::o;16831:419::-;16997:4;17035:2;17024:9;17020:18;17012:26;;17084:9;17078:4;17074:20;17070:1;17059:9;17055:17;17048:47;17112:131;17238:4;17112:131;:::i;:::-;17104:139;;16831:419;;;:::o;17256:175::-;17396:27;17392:1;17384:6;17380:14;17373:51;17256:175;:::o;17437:366::-;17579:3;17600:67;17664:2;17659:3;17600:67;:::i;:::-;17593:74;;17676:93;17765:3;17676:93;:::i;:::-;17794:2;17789:3;17785:12;17778:19;;17437:366;;;:::o;17809:419::-;17975:4;18013:2;18002:9;17998:18;17990:26;;18062:9;18056:4;18052:20;18048:1;18037:9;18033:17;18026:47;18090:131;18216:4;18090:131;:::i;:::-;18082:139;;17809:419;;;:::o;18234:224::-;18374:34;18370:1;18362:6;18358:14;18351:58;18443:7;18438:2;18430:6;18426:15;18419:32;18234:224;:::o;18464:366::-;18606:3;18627:67;18691:2;18686:3;18627:67;:::i;:::-;18620:74;;18703:93;18792:3;18703:93;:::i;:::-;18821:2;18816:3;18812:12;18805:19;;18464:366;;;:::o;18836:419::-;19002:4;19040:2;19029:9;19025:18;19017:26;;19089:9;19083:4;19079:20;19075:1;19064:9;19060:17;19053:47;19117:131;19243:4;19117:131;:::i;:::-;19109:139;;18836:419;;;:::o;19261:223::-;19401:34;19397:1;19389:6;19385:14;19378:58;19470:6;19465:2;19457:6;19453:15;19446:31;19261:223;:::o;19490:366::-;19632:3;19653:67;19717:2;19712:3;19653:67;:::i;:::-;19646:74;;19729:93;19818:3;19729:93;:::i;:::-;19847:2;19842:3;19838:12;19831:19;;19490:366;;;:::o;19862:419::-;20028:4;20066:2;20055:9;20051:18;20043:26;;20115:9;20109:4;20105:20;20101:1;20090:9;20086:17;20079:47;20143:131;20269:4;20143:131;:::i;:::-;20135:139;;19862:419;;;:::o;20287:176::-;20427:28;20423:1;20415:6;20411:14;20404:52;20287:176;:::o;20469:366::-;20611:3;20632:67;20696:2;20691:3;20632:67;:::i;:::-;20625:74;;20708:93;20797:3;20708:93;:::i;:::-;20826:2;20821:3;20817:12;20810:19;;20469:366;;;:::o;20841:419::-;21007:4;21045:2;21034:9;21030:18;21022:26;;21094:9;21088:4;21084:20;21080:1;21069:9;21065:17;21058:47;21122:131;21248:4;21122:131;:::i;:::-;21114:139;;20841:419;;;:::o;21266:225::-;21406:34;21402:1;21394:6;21390:14;21383:58;21475:8;21470:2;21462:6;21458:15;21451:33;21266:225;:::o;21497:366::-;21639:3;21660:67;21724:2;21719:3;21660:67;:::i;:::-;21653:74;;21736:93;21825:3;21736:93;:::i;:::-;21854:2;21849:3;21845:12;21838:19;;21497:366;;;:::o;21869:419::-;22035:4;22073:2;22062:9;22058:18;22050:26;;22122:9;22116:4;22112:20;22108:1;22097:9;22093:17;22086:47;22150:131;22276:4;22150:131;:::i;:::-;22142:139;;21869:419;;;:::o;22294:223::-;22434:34;22430:1;22422:6;22418:14;22411:58;22503:6;22498:2;22490:6;22486:15;22479:31;22294:223;:::o;22523:366::-;22665:3;22686:67;22750:2;22745:3;22686:67;:::i;:::-;22679:74;;22762:93;22851:3;22762:93;:::i;:::-;22880:2;22875:3;22871:12;22864:19;;22523:366;;;:::o;22895:419::-;23061:4;23099:2;23088:9;23084:18;23076:26;;23148:9;23142:4;23138:20;23134:1;23123:9;23119:17;23112:47;23176:131;23302:4;23176:131;:::i;:::-;23168:139;;22895:419;;;:::o;23320:221::-;23460:34;23456:1;23448:6;23444:14;23437:58;23529:4;23524:2;23516:6;23512:15;23505:29;23320:221;:::o;23547:366::-;23689:3;23710:67;23774:2;23769:3;23710:67;:::i;:::-;23703:74;;23786:93;23875:3;23786:93;:::i;:::-;23904:2;23899:3;23895:12;23888:19;;23547:366;;;:::o;23919:419::-;24085:4;24123:2;24112:9;24108:18;24100:26;;24172:9;24166:4;24162:20;24158:1;24147:9;24143:17;24136:47;24200:131;24326:4;24200:131;:::i;:::-;24192:139;;23919:419;;;:::o;24344:182::-;24484:34;24480:1;24472:6;24468:14;24461:58;24344:182;:::o;24532:366::-;24674:3;24695:67;24759:2;24754:3;24695:67;:::i;:::-;24688:74;;24771:93;24860:3;24771:93;:::i;:::-;24889:2;24884:3;24880:12;24873:19;;24532:366;;;:::o;24904:419::-;25070:4;25108:2;25097:9;25093:18;25085:26;;25157:9;25151:4;25147:20;25143:1;25132:9;25128:17;25121:47;25185:131;25311:4;25185:131;:::i;:::-;25177:139;;24904:419;;;:::o;25329:232::-;25469:34;25465:1;25457:6;25453:14;25446:58;25538:15;25533:2;25525:6;25521:15;25514:40;25329:232;:::o;25567:366::-;25709:3;25730:67;25794:2;25789:3;25730:67;:::i;:::-;25723:74;;25806:93;25895:3;25806:93;:::i;:::-;25924:2;25919:3;25915:12;25908:19;;25567:366;;;:::o;25939:419::-;26105:4;26143:2;26132:9;26128:18;26120:26;;26192:9;26186:4;26182:20;26178:1;26167:9;26163:17;26156:47;26220:131;26346:4;26220:131;:::i;:::-;26212:139;;25939:419;;;:::o;26364:181::-;26504:33;26500:1;26492:6;26488:14;26481:57;26364:181;:::o;26551:366::-;26693:3;26714:67;26778:2;26773:3;26714:67;:::i;:::-;26707:74;;26790:93;26879:3;26790:93;:::i;:::-;26908:2;26903:3;26899:12;26892:19;;26551:366;;;:::o;26923:419::-;27089:4;27127:2;27116:9;27112:18;27104:26;;27176:9;27170:4;27166:20;27162:1;27151:9;27147:17;27140:47;27204:131;27330:4;27204:131;:::i;:::-;27196:139;;26923:419;;;:::o;27348:220::-;27488:34;27484:1;27476:6;27472:14;27465:58;27557:3;27552:2;27544:6;27540:15;27533:28;27348:220;:::o;27574:366::-;27716:3;27737:67;27801:2;27796:3;27737:67;:::i;:::-;27730:74;;27813:93;27902:3;27813:93;:::i;:::-;27931:2;27926:3;27922:12;27915:19;;27574:366;;;:::o;27946:419::-;28112:4;28150:2;28139:9;28135:18;28127:26;;28199:9;28193:4;28189:20;28185:1;28174:9;28170:17;28163:47;28227:131;28353:4;28227:131;:::i;:::-;28219:139;;27946:419;;;:::o;28371:221::-;28511:34;28507:1;28499:6;28495:14;28488:58;28580:4;28575:2;28567:6;28563:15;28556:29;28371:221;:::o;28598:366::-;28740:3;28761:67;28825:2;28820:3;28761:67;:::i;:::-;28754:74;;28837:93;28926:3;28837:93;:::i;:::-;28955:2;28950:3;28946:12;28939:19;;28598:366;;;:::o;28970:419::-;29136:4;29174:2;29163:9;29159:18;29151:26;;29223:9;29217:4;29213:20;29209:1;29198:9;29194:17;29187:47;29251:131;29377:4;29251:131;:::i;:::-;29243:139;;28970:419;;;:::o;29395:194::-;29435:4;29455:20;29473:1;29455:20;:::i;:::-;29450:25;;29489:20;29507:1;29489:20;:::i;:::-;29484:25;;29533:1;29530;29526:9;29518:17;;29557:1;29551:4;29548:11;29545:37;;;29562:18;;:::i;:::-;29545:37;29395:194;;;;:::o;29595:179::-;29735:31;29731:1;29723:6;29719:14;29712:55;29595:179;:::o;29780:366::-;29922:3;29943:67;30007:2;30002:3;29943:67;:::i;:::-;29936:74;;30019:93;30108:3;30019:93;:::i;:::-;30137:2;30132:3;30128:12;30121:19;;29780:366;;;:::o;30152:419::-;30318:4;30356:2;30345:9;30341:18;30333:26;;30405:9;30399:4;30395:20;30391:1;30380:9;30376:17;30369:47;30433:131;30559:4;30433:131;:::i;:::-;30425:139;;30152:419;;;:::o;30577:103::-;30640:7;30669:5;30658:16;;30577:103;;;:::o;30686:60::-;30714:3;30735:5;30728:12;;30686:60;;;:::o;30752:194::-;30828:9;30861:79;30879:60;30888:50;30932:5;30888:50;:::i;:::-;30879:60;:::i;:::-;30861:79;:::i;:::-;30848:92;;30752:194;;;:::o;30952:183::-;31065:63;31122:5;31065:63;:::i;:::-;31060:3;31053:76;30952:183;;:::o;31141:384::-;31288:4;31326:2;31315:9;31311:18;31303:26;;31339:71;31407:1;31396:9;31392:17;31383:6;31339:71;:::i;:::-;31420:98;31514:2;31503:9;31499:18;31490:6;31420:98;:::i;:::-;31141:384;;;;;:::o;31531:122::-;31568:7;31608:38;31601:5;31597:50;31586:61;;31531:122;;;:::o;31659:::-;31732:24;31750:5;31732:24;:::i;:::-;31725:5;31722:35;31712:63;;31771:1;31768;31761:12;31712:63;31659:122;:::o;31787:143::-;31844:5;31875:6;31869:13;31860:22;;31891:33;31918:5;31891:33;:::i;:::-;31787:143;;;;:::o;31936:351::-;32006:6;32055:2;32043:9;32034:7;32030:23;32026:32;32023:119;;;32061:79;;:::i;:::-;32023:119;32181:1;32206:64;32262:7;32253:6;32242:9;32238:22;32206:64;:::i;:::-;32196:74;;32152:128;31936:351;;;;:::o;32293:233::-;32433:34;32429:1;32421:6;32417:14;32410:58;32502:16;32497:2;32489:6;32485:15;32478:41;32293:233;:::o;32532:366::-;32674:3;32695:67;32759:2;32754:3;32695:67;:::i;:::-;32688:74;;32771:93;32860:3;32771:93;:::i;:::-;32889:2;32884:3;32880:12;32873:19;;32532:366;;;:::o;32904:419::-;33070:4;33108:2;33097:9;33093:18;33085:26;;33157:9;33151:4;33147:20;33143:1;33132:9;33128:17;33121:47;33185:131;33311:4;33185:131;:::i;:::-;33177:139;;32904:419;;;:::o;33329:177::-;33469:29;33465:1;33457:6;33453:14;33446:53;33329:177;:::o;33512:366::-;33654:3;33675:67;33739:2;33734:3;33675:67;:::i;:::-;33668:74;;33751:93;33840:3;33751:93;:::i;:::-;33869:2;33864:3;33860:12;33853:19;;33512:366;;;:::o;33884:419::-;34050:4;34088:2;34077:9;34073:18;34065:26;;34137:9;34131:4;34127:20;34123:1;34112:9;34108:17;34101:47;34165:131;34291:4;34165:131;:::i;:::-;34157:139;;33884:419;;;:::o;34309:167::-;34346:3;34369:22;34385:5;34369:22;:::i;:::-;34360:31;;34413:4;34406:5;34403:15;34400:41;;34421:18;;:::i;:::-;34400:41;34468:1;34461:5;34457:13;34450:20;;34309:167;;;:::o;34482:224::-;34622:34;34618:1;34610:6;34606:14;34599:58;34691:7;34686:2;34678:6;34674:15;34667:32;34482:224;:::o;34712:366::-;34854:3;34875:67;34939:2;34934:3;34875:67;:::i;:::-;34868:74;;34951:93;35040:3;34951:93;:::i;:::-;35069:2;35064:3;35060:12;35053:19;;34712:366;;;:::o;35084:419::-;35250:4;35288:2;35277:9;35273:18;35265:26;;35337:9;35331:4;35327:20;35323:1;35312:9;35308:17;35301:47;35365:131;35491:4;35365:131;:::i;:::-;35357:139;;35084:419;;;:::o;35509:222::-;35649:34;35645:1;35637:6;35633:14;35626:58;35718:5;35713:2;35705:6;35701:15;35694:30;35509:222;:::o;35737:366::-;35879:3;35900:67;35964:2;35959:3;35900:67;:::i;:::-;35893:74;;35976:93;36065:3;35976:93;:::i;:::-;36094:2;36089:3;36085:12;36078:19;;35737:366;;;:::o;36109:419::-;36275:4;36313:2;36302:9;36298:18;36290:26;;36362:9;36356:4;36352:20;36348:1;36337:9;36333:17;36326:47;36390:131;36516:4;36390:131;:::i;:::-;36382:139;;36109:419;;;:::o;36534:225::-;36674:34;36670:1;36662:6;36658:14;36651:58;36743:8;36738:2;36730:6;36726:15;36719:33;36534:225;:::o;36765:366::-;36907:3;36928:67;36992:2;36987:3;36928:67;:::i;:::-;36921:74;;37004:93;37093:3;37004:93;:::i;:::-;37122:2;37117:3;37113:12;37106:19;;36765:366;;;:::o;37137:419::-;37303:4;37341:2;37330:9;37326:18;37318:26;;37390:9;37384:4;37380:20;37376:1;37365:9;37361:17;37354:47;37418:131;37544:4;37418:131;:::i;:::-;37410:139;;37137:419;;;:::o;37562:410::-;37602:7;37625:20;37643:1;37625:20;:::i;:::-;37620:25;;37659:20;37677:1;37659:20;:::i;:::-;37654:25;;37714:1;37711;37707:9;37736:30;37754:11;37736:30;:::i;:::-;37725:41;;37915:1;37906:7;37902:15;37899:1;37896:22;37876:1;37869:9;37849:83;37826:139;;37945:18;;:::i;:::-;37826:139;37610:362;37562:410;;;;:::o;37978:180::-;38026:77;38023:1;38016:88;38123:4;38120:1;38113:15;38147:4;38144:1;38137:15;38164:185;38204:1;38221:20;38239:1;38221:20;:::i;:::-;38216:25;;38255:20;38273:1;38255:20;:::i;:::-;38250:25;;38294:1;38284:35;;38299:18;;:::i;:::-;38284:35;38341:1;38338;38334:9;38329:14;;38164:185;;;;:::o
Swarm Source
ipfs://8c992904e7aea389c93e17a3306c61d5b4fd89f935fdf5dbf6026050ddfd0ca8
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.