Polygon Sponsored slots available. Book your slot here!
ERC-20
Wallet App
Overview
Max Total Supply
1,000,000,000 SAFLE
Holders
4,807 (0.00%)
Market
Price
$0.0018 @ 0.003115 POL (-5.70%)
Onchain Market Cap
$1,779,316.80
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
112,479.649904420549550804 SAFLEValue
$200.14 ( ~350.3248 POL) [0.0112%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
SafleToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-12-17 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } 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); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 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 {} } 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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } 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 substraction 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; } } } contract SafleToken is ERC20, Ownable { uint256 constant _totalSupply = 1000000000 * 10 ** 18; string constant _name = "Safle"; string constant _symbol = "SAFLE"; // mappings to keep track of delegations and change in the user balance for voting rights mapping (address => address) public delegates; mapping (address => uint256) public numCheckpoints; mapping (address => mapping (uint256 => Checkpoint)) public checkpoints; mapping (address => uint256) public nonces; // Allowance amounts on behalf of others mapping (address => mapping (address => uint256)) private allowances; // The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); // The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); struct Checkpoint { uint256 fromBlock; uint256 votes; } using SafeMath for uint256; address public governance; // whitelist and set the timelock address and distribute intial allocations constructor() ERC20(_name, _symbol) { _mint(msg.sender, _totalSupply); } /// @notice This function is used to revoke the admin access. The owner address with be set to 0x00.. function revokeAdminAccess() public onlyOwner { return renounceOwnership(); } // set the governance contract function setGovernance(address _governance) public onlyOwner { governance = _governance; } /** * @notice Transfer `amount` tokens from `msg.sender` to `recepient` * @param recepient The address of the destination account * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transfer(address recepient, uint256 amount) override public returns (bool) { _transfer(msg.sender, recepient, amount); _moveDelegates(delegates[msg.sender], delegates[recepient], amount); return true; } /** * @notice Transfer `amount` tokens from `src` to `dst` * @param src The address of the source account * @param dst The address of the destination account * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transferFrom(address src, address dst, uint amount) override public returns (bool) { uint256 currentAllowance = allowances[src][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(src, _msgSender(), currentAllowance - amount); } _transfer(src, dst, amount); return true; } /** * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * @param spender The address of the spending account * @param amount The number of tokens for allowance * @return Whether or not the approval succeeded */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function _approve( address owner, address spender, uint256 amount ) override internal { 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); } /// returns the allowance for a spender function allowance(address owner, address spender) public view virtual override returns (uint256) { return allowances[owner][spender]; } /** * @notice increase the spender's allowance * @param spender The address of the spender * @param addedValue The value to be added * @return Whether or not the decrease allowance succeeded */ function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) { _approve(_msgSender(), spender, allowances[_msgSender()][spender] + addedValue); return true; } /** * @notice decrease the spender's allowance * @param spender The address of the spender * @param subtractedValue The value to be subtracted * @return Whether or not the decrease allowance succeeded */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) { uint256 currentAllowance = allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) public { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) public { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "Safle::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "Safle::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "Safle::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint256 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) public view returns (uint256) { require(blockNumber < block.number, "Safle::getPriorVotes: not yet determined"); uint256 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } /// @notice Internal function to delegate the votes to another address /// @param delegator Address of the delegator /// @param delegatee Address of the delegatee function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } /// @notice Internal function to keep track of vote checkpoints /// @param source Source address of the token transfer /// @param destination Destination address of the token transfer /// @param amount Amount of token transferred function _moveDelegates(address source, address destination, uint256 amount) internal { if (source != destination && amount > 0) { if (source != address(0)) { uint256 srcRepNum = numCheckpoints[source]; uint256 srcOldVotesCount = srcRepNum > 0 ? checkpoints[source][srcRepNum - 1].votes : 0; uint256 srcNewVotesCount = srcOldVotesCount.sub(amount); _writeCheckpoint(source, srcRepNum, srcOldVotesCount, srcNewVotesCount); } if (destination != address(0)) { uint256 dstRepNum = numCheckpoints[destination]; uint256 dstOldVotesCount = dstRepNum > 0 ? checkpoints[destination][dstRepNum - 1].votes : 0; uint256 dstNewVotesCount = dstOldVotesCount.add(amount); _writeCheckpoint(destination, dstRepNum, dstOldVotesCount, dstNewVotesCount); } } } /// @notice Internal function to keep track of votes after token transfer /// @param delegatee Address of the vote delegatee /// @param nCheckpoints Number of checkpoints /// @param oldVotes votes prior to token transfer /// @param newVotes votes post token transfer function _writeCheckpoint(address delegatee, uint256 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal { uint256 blockNumber = safe32(block.number, "Safle::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); }
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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"fromBlock","type":"uint256"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"revokeAdminAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recepient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600581526020017f5361666c650000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5341464c4500000000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000347565b508060049080519060200190620000af92919062000347565b505050620000d2620000c6620000f660201b60201c565b620000fe60201b60201c565b620000f0336b033b2e3c9fd0803ce8000000620001c460201b60201c565b620005a3565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022e906200042f565b60405180910390fd5b6200024b600083836200033d60201b60201c565b80600260008282546200025f91906200047f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002b691906200047f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200031d919062000451565b60405180910390a362000339600083836200034260201b60201c565b5050565b505050565b505050565b8280546200035590620004e6565b90600052602060002090601f016020900481019282620003795760008555620003c5565b82601f106200039457805160ff1916838001178555620003c5565b82800160010185558215620003c5579182015b82811115620003c4578251825591602001919060010190620003a7565b5b509050620003d49190620003d8565b5090565b5b80821115620003f3576000816000905550600101620003d9565b5090565b600062000406601f836200046e565b915062000413826200057a565b602082019050919050565b6200042981620004dc565b82525050565b600060208201905081810360008301526200044a81620003f7565b9050919050565b60006020820190506200046860008301846200041e565b92915050565b600082825260208201905092915050565b60006200048c82620004dc565b91506200049983620004dc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620004d157620004d06200051c565b5b828201905092915050565b6000819050919050565b60006002820490506001821680620004ff57607f821691505b602082108114156200051657620005156200054b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6130a380620005b36000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063ab033ea911610097578063d63f31c011610071578063d63f31c01461051f578063dd62ed3e14610529578063e7a324dc14610559578063f2fde38b14610577576101a9565b8063ab033ea9146104b7578063b4b5ea57146104d3578063c3cda52014610503576101a9565b80638da5cb5b116100d35780638da5cb5b1461041b57806395d89b4114610439578063a457c2d714610457578063a9059cbb14610487576101a9565b8063715018a6146103b1578063782d6fe1146103bb5780637ecebe00146103eb576101a9565b8063313ce567116101665780635aa6e675116101405780635aa6e675146103175780635c19a95c146103355780636fcfff451461035157806370a0823114610381576101a9565b8063313ce5671461029957806339509351146102b7578063587cde1e146102e7576101a9565b806306fdde03146101ae578063095ea7b3146101cc5780630cdfebfa146101fc57806318160ddd1461022d57806320606b701461024b57806323b872dd14610269575b600080fd5b6101b6610593565b6040516101c39190612719565b60405180910390f35b6101e660048036038101906101e19190612270565b610625565b6040516101f39190612614565b60405180910390f35b61021660048036038101906102119190612270565b610643565b6040516102249291906128f6565b60405180910390f35b610235610674565b60405161024291906128db565b60405180910390f35b61025361067e565b604051610260919061262f565b60405180910390f35b610283600480360381019061027e919061221d565b6106a2565b6040516102909190612614565b60405180910390f35b6102a1610799565b6040516102ae919061291f565b60405180910390f35b6102d160048036038101906102cc9190612270565b6107a2565b6040516102de9190612614565b60405180910390f35b61030160048036038101906102fc91906121b0565b61084e565b60405161030e91906125f9565b60405180910390f35b61031f610881565b60405161032c91906125f9565b60405180910390f35b61034f600480360381019061034a91906121b0565b6108a7565b005b61036b600480360381019061036691906121b0565b6108b4565b60405161037891906128db565b60405180910390f35b61039b600480360381019061039691906121b0565b6108cc565b6040516103a891906128db565b60405180910390f35b6103b9610914565b005b6103d560048036038101906103d09190612270565b61099c565b6040516103e291906128db565b60405180910390f35b610405600480360381019061040091906121b0565b610cc7565b60405161041291906128db565b60405180910390f35b610423610cdf565b60405161043091906125f9565b60405180910390f35b610441610d09565b60405161044e9190612719565b60405180910390f35b610471600480360381019061046c9190612270565b610d9b565b60405161047e9190612614565b60405180910390f35b6104a1600480360381019061049c9190612270565b610e86565b6040516104ae9190612614565b60405180910390f35b6104d160048036038101906104cc91906121b0565b610f66565b005b6104ed60048036038101906104e891906121b0565b611026565b6040516104fa91906128db565b60405180910390f35b61051d600480360381019061051891906122b0565b6110e3565b005b610527611378565b005b610543600480360381019061053e91906121dd565b6113fe565b60405161055091906128db565b60405180910390f35b610561611485565b60405161056e919061262f565b60405180910390f35b610591600480360381019061058c91906121b0565b6114a9565b005b6060600380546105a290612aae565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce90612aae565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b5050505050905090565b60006106396106326115a1565b84846115a9565b6001905092915050565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600080600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106ee6115a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561076e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107659061281b565b60405180910390fd5b6107828561077a6115a1565b8584036115a9565b61078d858585611774565b60019150509392505050565b60006012905090565b60006108446107af6115a1565b8484600a60006107bd6115a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461083f9190612961565b6115a9565b6001905092915050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108b133826119f5565b50565b60076020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61091c6115a1565b73ffffffffffffffffffffffffffffffffffffffff1661093a610cdf565b73ffffffffffffffffffffffffffffffffffffffff1614610990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109879061283b565b60405180910390fd5b61099a6000611b66565b565b60004382106109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906127fb565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610a37576000915050610cc1565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610a8691906129e8565b81526020019081526020016000206000015411610b0557600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610aeb91906129e8565b815260200190815260200160002060010154915050610cc1565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808152602001908152602001600020600001541115610b6a576000915050610cc1565b600080600183610b7a91906129e8565b90505b81811115610c6757600060028383610b9591906129e8565b610b9f91906129b7565b82610baa91906129e8565b90506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090508681600001511415610c3c57806020015195505050505050610cc1565b8681600001511015610c5057819350610c60565b600182610c5d91906129e8565b92505b5050610b7d565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206001015493505050505b92915050565b60096020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610d1890612aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4490612aae565b8015610d915780601f10610d6657610100808354040283529160200191610d91565b820191906000526020600020905b815481529060010190602001808311610d7457829003601f168201915b5050505050905090565b600080600a6000610daa6115a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e9061289b565b60405180910390fd5b610e7b610e726115a1565b858584036115a9565b600191505092915050565b6000610e93338484611774565b610f5c600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611c2c565b6001905092915050565b610f6e6115a1565b73ffffffffffffffffffffffffffffffffffffffff16610f8c610cdf565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd99061283b565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161107a5760006110db565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836110c891906129e8565b8152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661110e610593565b8051906020012061111d611e97565b30604051602001611131949392919061268f565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611182949392919061264a565b604051602081830303815290604052805190602001209050600082826040516020016111af9291906125c2565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516111ec94939291906126d4565b6020604051602081039080840390855afa15801561120e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112819061277b565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112da90612ae0565b91905055891461131f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113169061275b565b60405180910390fd5b87421115611362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611359906128bb565b60405180910390fd5b61136c818b6119f5565b50505050505050505050565b6113806115a1565b73ffffffffffffffffffffffffffffffffffffffff1661139e610cdf565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb9061283b565b60405180910390fd5b6113fc610914565b565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6114b16115a1565b73ffffffffffffffffffffffffffffffffffffffff166114cf610cdf565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c9061283b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061279b565b60405180910390fd5b61159e81611b66565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116109061287b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906127bb565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161176791906128db565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db9061285b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b9061273b565b60405180910390fd5b61185f838383611ea4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc906127db565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119789190612961565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119dc91906128db565b60405180910390a36119ef848484611ea9565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611a64846108cc565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b60828483611c2c565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c685750600081115b15611e9257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611d7f576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211611cf5576000611d56565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611d4391906129e8565b8152602001908152602001600020600101545b90506000611d6d8483611eae90919063ffffffff16565b9050611d7b86848484611ec4565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211611e07576000611e68565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611e5591906129e8565b8152602001908152602001600020600101545b90506000611e7f84836120f090919063ffffffff16565b9050611e8d85848484611ec4565b5050505b5b505050565b6000804690508091505090565b505050565b505050565b60008183611ebc91906129e8565b905092915050565b6000611ee84360405180606001604052806035815260200161303960359139612106565b63ffffffff169050600084118015611f5e575080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611f4a91906129e8565b815260200190815260200160002060000154145b15611fcc5781600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611fb291906129e8565b815260200190815260200160002060010181905550612099565b604051806040016040528082815260200183815250600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000155602082015181600101559050506001846120559190612961565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516120e19291906128f6565b60405180910390a25050505050565b600081836120fe9190612961565b905092915050565b600064010000000083108290612152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121499190612719565b60405180910390fd5b5082905092915050565b60008135905061216b81612fdc565b92915050565b60008135905061218081612ff3565b92915050565b6000813590506121958161300a565b92915050565b6000813590506121aa81613021565b92915050565b6000602082840312156121c6576121c5612bc0565b5b60006121d48482850161215c565b91505092915050565b600080604083850312156121f4576121f3612bc0565b5b60006122028582860161215c565b92505060206122138582860161215c565b9150509250929050565b60008060006060848603121561223657612235612bc0565b5b60006122448682870161215c565b93505060206122558682870161215c565b925050604061226686828701612186565b9150509250925092565b6000806040838503121561228757612286612bc0565b5b60006122958582860161215c565b92505060206122a685828601612186565b9150509250929050565b60008060008060008060c087890312156122cd576122cc612bc0565b5b60006122db89828a0161215c565b96505060206122ec89828a01612186565b95505060406122fd89828a01612186565b945050606061230e89828a0161219b565b935050608061231f89828a01612171565b92505060a061233089828a01612171565b9150509295509295509295565b61234681612a1c565b82525050565b61235581612a2e565b82525050565b61236481612a3a565b82525050565b61237b61237682612a3a565b612b29565b82525050565b600061238c8261293a565b6123968185612945565b93506123a6818560208601612a7b565b6123af81612bc5565b840191505092915050565b60006123c7602383612945565b91506123d282612bd6565b604082019050919050565b60006123ea602383612945565b91506123f582612c25565b604082019050919050565b600061240d602783612945565b915061241882612c74565b604082019050919050565b6000612430602683612945565b915061243b82612cc3565b604082019050919050565b6000612453602283612945565b915061245e82612d12565b604082019050919050565b6000612476600283612956565b915061248182612d61565b600282019050919050565b6000612499602683612945565b91506124a482612d8a565b604082019050919050565b60006124bc602883612945565b91506124c782612dd9565b604082019050919050565b60006124df602883612945565b91506124ea82612e28565b604082019050919050565b6000612502602083612945565b915061250d82612e77565b602082019050919050565b6000612525602583612945565b915061253082612ea0565b604082019050919050565b6000612548602483612945565b915061255382612eef565b604082019050919050565b600061256b602583612945565b915061257682612f3e565b604082019050919050565b600061258e602783612945565b915061259982612f8d565b604082019050919050565b6125ad81612a64565b82525050565b6125bc81612a6e565b82525050565b60006125cd82612469565b91506125d9828561236a565b6020820191506125e9828461236a565b6020820191508190509392505050565b600060208201905061260e600083018461233d565b92915050565b6000602082019050612629600083018461234c565b92915050565b6000602082019050612644600083018461235b565b92915050565b600060808201905061265f600083018761235b565b61266c602083018661233d565b61267960408301856125a4565b61268660608301846125a4565b95945050505050565b60006080820190506126a4600083018761235b565b6126b1602083018661235b565b6126be60408301856125a4565b6126cb606083018461233d565b95945050505050565b60006080820190506126e9600083018761235b565b6126f660208301866125b3565b612703604083018561235b565b612710606083018461235b565b95945050505050565b600060208201905081810360008301526127338184612381565b905092915050565b60006020820190508181036000830152612754816123ba565b9050919050565b60006020820190508181036000830152612774816123dd565b9050919050565b6000602082019050818103600083015261279481612400565b9050919050565b600060208201905081810360008301526127b481612423565b9050919050565b600060208201905081810360008301526127d481612446565b9050919050565b600060208201905081810360008301526127f48161248c565b9050919050565b60006020820190508181036000830152612814816124af565b9050919050565b60006020820190508181036000830152612834816124d2565b9050919050565b60006020820190508181036000830152612854816124f5565b9050919050565b6000602082019050818103600083015261287481612518565b9050919050565b600060208201905081810360008301526128948161253b565b9050919050565b600060208201905081810360008301526128b48161255e565b9050919050565b600060208201905081810360008301526128d481612581565b9050919050565b60006020820190506128f060008301846125a4565b92915050565b600060408201905061290b60008301856125a4565b61291860208301846125a4565b9392505050565b600060208201905061293460008301846125b3565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061296c82612a64565b915061297783612a64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129ac576129ab612b33565b5b828201905092915050565b60006129c282612a64565b91506129cd83612a64565b9250826129dd576129dc612b62565b5b828204905092915050565b60006129f382612a64565b91506129fe83612a64565b925082821015612a1157612a10612b33565b5b828203905092915050565b6000612a2782612a44565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612a99578082015181840152602081019050612a7e565b83811115612aa8576000848401525b50505050565b60006002820490506001821680612ac657607f821691505b60208210811415612ada57612ad9612b91565b5b50919050565b6000612aeb82612a64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b1e57612b1d612b33565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a64656c656761746542795369673a20696e76616c6964206e6f60008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a64656c656761746542795369673a20696e76616c696420736960008201527f676e617475726500000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a6765745072696f72566f7465733a206e6f742079657420646560008201527f7465726d696e6564000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a64656c656761746542795369673a207369676e61747572652060008201527f6578706972656400000000000000000000000000000000000000000000000000602082015250565b612fe581612a1c565b8114612ff057600080fd5b50565b612ffc81612a3a565b811461300757600080fd5b50565b61301381612a64565b811461301e57600080fd5b50565b61302a81612a6e565b811461303557600080fd5b5056fe5361666c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220b33c1c431d0b87335f0730c2fffbc91378a5b2493eacf6ac844ff9afeebc51d164736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063ab033ea911610097578063d63f31c011610071578063d63f31c01461051f578063dd62ed3e14610529578063e7a324dc14610559578063f2fde38b14610577576101a9565b8063ab033ea9146104b7578063b4b5ea57146104d3578063c3cda52014610503576101a9565b80638da5cb5b116100d35780638da5cb5b1461041b57806395d89b4114610439578063a457c2d714610457578063a9059cbb14610487576101a9565b8063715018a6146103b1578063782d6fe1146103bb5780637ecebe00146103eb576101a9565b8063313ce567116101665780635aa6e675116101405780635aa6e675146103175780635c19a95c146103355780636fcfff451461035157806370a0823114610381576101a9565b8063313ce5671461029957806339509351146102b7578063587cde1e146102e7576101a9565b806306fdde03146101ae578063095ea7b3146101cc5780630cdfebfa146101fc57806318160ddd1461022d57806320606b701461024b57806323b872dd14610269575b600080fd5b6101b6610593565b6040516101c39190612719565b60405180910390f35b6101e660048036038101906101e19190612270565b610625565b6040516101f39190612614565b60405180910390f35b61021660048036038101906102119190612270565b610643565b6040516102249291906128f6565b60405180910390f35b610235610674565b60405161024291906128db565b60405180910390f35b61025361067e565b604051610260919061262f565b60405180910390f35b610283600480360381019061027e919061221d565b6106a2565b6040516102909190612614565b60405180910390f35b6102a1610799565b6040516102ae919061291f565b60405180910390f35b6102d160048036038101906102cc9190612270565b6107a2565b6040516102de9190612614565b60405180910390f35b61030160048036038101906102fc91906121b0565b61084e565b60405161030e91906125f9565b60405180910390f35b61031f610881565b60405161032c91906125f9565b60405180910390f35b61034f600480360381019061034a91906121b0565b6108a7565b005b61036b600480360381019061036691906121b0565b6108b4565b60405161037891906128db565b60405180910390f35b61039b600480360381019061039691906121b0565b6108cc565b6040516103a891906128db565b60405180910390f35b6103b9610914565b005b6103d560048036038101906103d09190612270565b61099c565b6040516103e291906128db565b60405180910390f35b610405600480360381019061040091906121b0565b610cc7565b60405161041291906128db565b60405180910390f35b610423610cdf565b60405161043091906125f9565b60405180910390f35b610441610d09565b60405161044e9190612719565b60405180910390f35b610471600480360381019061046c9190612270565b610d9b565b60405161047e9190612614565b60405180910390f35b6104a1600480360381019061049c9190612270565b610e86565b6040516104ae9190612614565b60405180910390f35b6104d160048036038101906104cc91906121b0565b610f66565b005b6104ed60048036038101906104e891906121b0565b611026565b6040516104fa91906128db565b60405180910390f35b61051d600480360381019061051891906122b0565b6110e3565b005b610527611378565b005b610543600480360381019061053e91906121dd565b6113fe565b60405161055091906128db565b60405180910390f35b610561611485565b60405161056e919061262f565b60405180910390f35b610591600480360381019061058c91906121b0565b6114a9565b005b6060600380546105a290612aae565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce90612aae565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b5050505050905090565b60006106396106326115a1565b84846115a9565b6001905092915050565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600080600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106ee6115a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561076e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107659061281b565b60405180910390fd5b6107828561077a6115a1565b8584036115a9565b61078d858585611774565b60019150509392505050565b60006012905090565b60006108446107af6115a1565b8484600a60006107bd6115a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461083f9190612961565b6115a9565b6001905092915050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108b133826119f5565b50565b60076020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61091c6115a1565b73ffffffffffffffffffffffffffffffffffffffff1661093a610cdf565b73ffffffffffffffffffffffffffffffffffffffff1614610990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109879061283b565b60405180910390fd5b61099a6000611b66565b565b60004382106109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906127fb565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610a37576000915050610cc1565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610a8691906129e8565b81526020019081526020016000206000015411610b0557600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610aeb91906129e8565b815260200190815260200160002060010154915050610cc1565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808152602001908152602001600020600001541115610b6a576000915050610cc1565b600080600183610b7a91906129e8565b90505b81811115610c6757600060028383610b9591906129e8565b610b9f91906129b7565b82610baa91906129e8565b90506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090508681600001511415610c3c57806020015195505050505050610cc1565b8681600001511015610c5057819350610c60565b600182610c5d91906129e8565b92505b5050610b7d565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206001015493505050505b92915050565b60096020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610d1890612aae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4490612aae565b8015610d915780601f10610d6657610100808354040283529160200191610d91565b820191906000526020600020905b815481529060010190602001808311610d7457829003601f168201915b5050505050905090565b600080600a6000610daa6115a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e9061289b565b60405180910390fd5b610e7b610e726115a1565b858584036115a9565b600191505092915050565b6000610e93338484611774565b610f5c600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611c2c565b6001905092915050565b610f6e6115a1565b73ffffffffffffffffffffffffffffffffffffffff16610f8c610cdf565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd99061283b565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161107a5760006110db565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836110c891906129e8565b8152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661110e610593565b8051906020012061111d611e97565b30604051602001611131949392919061268f565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611182949392919061264a565b604051602081830303815290604052805190602001209050600082826040516020016111af9291906125c2565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516111ec94939291906126d4565b6020604051602081039080840390855afa15801561120e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112819061277b565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112da90612ae0565b91905055891461131f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113169061275b565b60405180910390fd5b87421115611362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611359906128bb565b60405180910390fd5b61136c818b6119f5565b50505050505050505050565b6113806115a1565b73ffffffffffffffffffffffffffffffffffffffff1661139e610cdf565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb9061283b565b60405180910390fd5b6113fc610914565b565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6114b16115a1565b73ffffffffffffffffffffffffffffffffffffffff166114cf610cdf565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c9061283b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061279b565b60405180910390fd5b61159e81611b66565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116109061287b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906127bb565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161176791906128db565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db9061285b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b9061273b565b60405180910390fd5b61185f838383611ea4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc906127db565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119789190612961565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119dc91906128db565b60405180910390a36119ef848484611ea9565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611a64846108cc565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b60828483611c2c565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c685750600081115b15611e9257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611d7f576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211611cf5576000611d56565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611d4391906129e8565b8152602001908152602001600020600101545b90506000611d6d8483611eae90919063ffffffff16565b9050611d7b86848484611ec4565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211611e07576000611e68565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611e5591906129e8565b8152602001908152602001600020600101545b90506000611e7f84836120f090919063ffffffff16565b9050611e8d85848484611ec4565b5050505b5b505050565b6000804690508091505090565b505050565b505050565b60008183611ebc91906129e8565b905092915050565b6000611ee84360405180606001604052806035815260200161303960359139612106565b63ffffffff169050600084118015611f5e575080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611f4a91906129e8565b815260200190815260200160002060000154145b15611fcc5781600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611fb291906129e8565b815260200190815260200160002060010181905550612099565b604051806040016040528082815260200183815250600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000155602082015181600101559050506001846120559190612961565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516120e19291906128f6565b60405180910390a25050505050565b600081836120fe9190612961565b905092915050565b600064010000000083108290612152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121499190612719565b60405180910390fd5b5082905092915050565b60008135905061216b81612fdc565b92915050565b60008135905061218081612ff3565b92915050565b6000813590506121958161300a565b92915050565b6000813590506121aa81613021565b92915050565b6000602082840312156121c6576121c5612bc0565b5b60006121d48482850161215c565b91505092915050565b600080604083850312156121f4576121f3612bc0565b5b60006122028582860161215c565b92505060206122138582860161215c565b9150509250929050565b60008060006060848603121561223657612235612bc0565b5b60006122448682870161215c565b93505060206122558682870161215c565b925050604061226686828701612186565b9150509250925092565b6000806040838503121561228757612286612bc0565b5b60006122958582860161215c565b92505060206122a685828601612186565b9150509250929050565b60008060008060008060c087890312156122cd576122cc612bc0565b5b60006122db89828a0161215c565b96505060206122ec89828a01612186565b95505060406122fd89828a01612186565b945050606061230e89828a0161219b565b935050608061231f89828a01612171565b92505060a061233089828a01612171565b9150509295509295509295565b61234681612a1c565b82525050565b61235581612a2e565b82525050565b61236481612a3a565b82525050565b61237b61237682612a3a565b612b29565b82525050565b600061238c8261293a565b6123968185612945565b93506123a6818560208601612a7b565b6123af81612bc5565b840191505092915050565b60006123c7602383612945565b91506123d282612bd6565b604082019050919050565b60006123ea602383612945565b91506123f582612c25565b604082019050919050565b600061240d602783612945565b915061241882612c74565b604082019050919050565b6000612430602683612945565b915061243b82612cc3565b604082019050919050565b6000612453602283612945565b915061245e82612d12565b604082019050919050565b6000612476600283612956565b915061248182612d61565b600282019050919050565b6000612499602683612945565b91506124a482612d8a565b604082019050919050565b60006124bc602883612945565b91506124c782612dd9565b604082019050919050565b60006124df602883612945565b91506124ea82612e28565b604082019050919050565b6000612502602083612945565b915061250d82612e77565b602082019050919050565b6000612525602583612945565b915061253082612ea0565b604082019050919050565b6000612548602483612945565b915061255382612eef565b604082019050919050565b600061256b602583612945565b915061257682612f3e565b604082019050919050565b600061258e602783612945565b915061259982612f8d565b604082019050919050565b6125ad81612a64565b82525050565b6125bc81612a6e565b82525050565b60006125cd82612469565b91506125d9828561236a565b6020820191506125e9828461236a565b6020820191508190509392505050565b600060208201905061260e600083018461233d565b92915050565b6000602082019050612629600083018461234c565b92915050565b6000602082019050612644600083018461235b565b92915050565b600060808201905061265f600083018761235b565b61266c602083018661233d565b61267960408301856125a4565b61268660608301846125a4565b95945050505050565b60006080820190506126a4600083018761235b565b6126b1602083018661235b565b6126be60408301856125a4565b6126cb606083018461233d565b95945050505050565b60006080820190506126e9600083018761235b565b6126f660208301866125b3565b612703604083018561235b565b612710606083018461235b565b95945050505050565b600060208201905081810360008301526127338184612381565b905092915050565b60006020820190508181036000830152612754816123ba565b9050919050565b60006020820190508181036000830152612774816123dd565b9050919050565b6000602082019050818103600083015261279481612400565b9050919050565b600060208201905081810360008301526127b481612423565b9050919050565b600060208201905081810360008301526127d481612446565b9050919050565b600060208201905081810360008301526127f48161248c565b9050919050565b60006020820190508181036000830152612814816124af565b9050919050565b60006020820190508181036000830152612834816124d2565b9050919050565b60006020820190508181036000830152612854816124f5565b9050919050565b6000602082019050818103600083015261287481612518565b9050919050565b600060208201905081810360008301526128948161253b565b9050919050565b600060208201905081810360008301526128b48161255e565b9050919050565b600060208201905081810360008301526128d481612581565b9050919050565b60006020820190506128f060008301846125a4565b92915050565b600060408201905061290b60008301856125a4565b61291860208301846125a4565b9392505050565b600060208201905061293460008301846125b3565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061296c82612a64565b915061297783612a64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129ac576129ab612b33565b5b828201905092915050565b60006129c282612a64565b91506129cd83612a64565b9250826129dd576129dc612b62565b5b828204905092915050565b60006129f382612a64565b91506129fe83612a64565b925082821015612a1157612a10612b33565b5b828203905092915050565b6000612a2782612a44565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612a99578082015181840152602081019050612a7e565b83811115612aa8576000848401525b50505050565b60006002820490506001821680612ac657607f821691505b60208210811415612ada57612ad9612b91565b5b50919050565b6000612aeb82612a64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b1e57612b1d612b33565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a64656c656761746542795369673a20696e76616c6964206e6f60008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a64656c656761746542795369673a20696e76616c696420736960008201527f676e617475726500000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a6765745072696f72566f7465733a206e6f742079657420646560008201527f7465726d696e6564000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f5361666c653a3a64656c656761746542795369673a207369676e61747572652060008201527f6578706972656400000000000000000000000000000000000000000000000000602082015250565b612fe581612a1c565b8114612ff057600080fd5b50565b612ffc81612a3a565b811461300757600080fd5b50565b61301381612a64565b811461301e57600080fd5b50565b61302a81612a6e565b811461303557600080fd5b5056fe5361666c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220b33c1c431d0b87335f0730c2fffbc91378a5b2493eacf6ac844ff9afeebc51d164736f6c63430008070033
Deployed Bytecode Sourcemap
22541:11985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4184:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25803:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22932:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5304:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23242:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25077:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5146:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26800:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22823:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23696:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27836:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22875:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5475:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15208:103;;;:::i;:::-;;30022:1227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23010:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14557:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4403:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27270:421;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24527:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24150:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29373:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28364:812;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24015:91;;;:::i;:::-;;26413:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23449:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15466:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4184:100;4238:13;4271:5;4264:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4184:100;:::o;25803:169::-;25886:4;25903:39;25912:12;:10;:12::i;:::-;25926:7;25935:6;25903:8;:39::i;:::-;25960:4;25953:11;;25803:169;;;;:::o;22932:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5304:108::-;5365:7;5392:12;;5385:19;;5304:108;:::o;23242:122::-;23284:80;23242:122;:::o;25077:422::-;25163:4;25180:24;25207:10;:15;25218:3;25207:15;;;;;;;;;;;;;;;:29;25223:12;:10;:12::i;:::-;25207:29;;;;;;;;;;;;;;;;25180:56;;25275:6;25255:16;:26;;25247:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;25362:54;25371:3;25376:12;:10;:12::i;:::-;25409:6;25390:16;:25;25362:8;:54::i;:::-;25440:27;25450:3;25455;25460:6;25440:9;:27::i;:::-;25487:4;25480:11;;;25077:422;;;;;:::o;5146:93::-;5204:5;5229:2;5222:9;;5146:93;:::o;26800:223::-;26897:4;26914:79;26923:12;:10;:12::i;:::-;26937:7;26982:10;26946;:24;26957:12;:10;:12::i;:::-;26946:24;;;;;;;;;;;;;;;:33;26971:7;26946:33;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;26914:8;:79::i;:::-;27011:4;27004:11;;26800:223;;;;:::o;22823:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;23696:25::-;;;;;;;;;;;;;:::o;27836:102::-;27898:32;27908:10;27920:9;27898;:32::i;:::-;27836:102;:::o;22875:50::-;;;;;;;;;;;;;;;;;:::o;5475:127::-;5549:7;5576:9;:18;5586:7;5576:18;;;;;;;;;;;;;;;;5569:25;;5475:127;;;:::o;15208:103::-;14788:12;:10;:12::i;:::-;14777:23;;:7;:5;:7::i;:::-;:23;;;14769:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15273:30:::1;15300:1;15273:18;:30::i;:::-;15208:103::o:0;30022:1227::-;30104:7;30146:12;30132:11;:26;30124:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;30216:20;30239:14;:23;30254:7;30239:23;;;;;;;;;;;;;;;;30216:46;;30293:1;30277:12;:17;30273:58;;;30318:1;30311:8;;;;;30273:58;30443:11;30391;:20;30403:7;30391:20;;;;;;;;;;;;;;;:38;30427:1;30412:12;:16;;;;:::i;:::-;30391:38;;;;;;;;;;;:48;;;:63;30387:147;;30478:11;:20;30490:7;30478:20;;;;;;;;;;;;;;;:38;30514:1;30499:12;:16;;;;:::i;:::-;30478:38;;;;;;;;;;;:44;;;30471:51;;;;;30387:147;30631:11;30595;:20;30607:7;30595:20;;;;;;;;;;;;;;;:23;30616:1;30595:23;;;;;;;;;;;:33;;;:47;30591:88;;;30666:1;30659:8;;;;;30591:88;30691:13;30719;30750:1;30735:12;:16;;;;:::i;:::-;30719:32;;30762:429;30777:5;30769;:13;30762:429;;;30799:14;30842:1;30833:5;30825;:13;;;;:::i;:::-;30824:19;;;;:::i;:::-;30816:5;:27;;;;:::i;:::-;30799:44;;30885:20;30908:11;:20;30920:7;30908:20;;;;;;;;;;;;;;;:28;30929:6;30908:28;;;;;;;;;;;30885:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30971:11;30955:2;:12;;;:27;30951:229;;;31010:2;:8;;;31003:15;;;;;;;;;30951:229;31059:11;31044:2;:12;;;:26;31040:140;;;31099:6;31091:14;;31040:140;;;31163:1;31154:6;:10;;;;:::i;:::-;31146:18;;31040:140;30784:407;;30762:429;;;31208:11;:20;31220:7;31208:20;;;;;;;;;;;;;;;:27;31229:5;31208:27;;;;;;;;;;;:33;;;31201:40;;;;;30022:1227;;;;;:::o;23010:42::-;;;;;;;;;;;;;;;;;:::o;14557:87::-;14603:7;14630:6;;;;;;;;;;;14623:13;;14557:87;:::o;4403:104::-;4459:13;4492:7;4485:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4403:104;:::o;27270:421::-;27372:4;27389:24;27416:10;:24;27427:12;:10;:12::i;:::-;27416:24;;;;;;;;;;;;;;;:33;27441:7;27416:33;;;;;;;;;;;;;;;;27389:60;;27488:15;27468:16;:35;;27460:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27581:67;27590:12;:10;:12::i;:::-;27604:7;27632:15;27613:16;:34;27581:8;:67::i;:::-;27679:4;27672:11;;;27270:421;;;;:::o;24527:243::-;24605:4;24622:40;24632:10;24644:9;24655:6;24622:9;:40::i;:::-;24673:67;24688:9;:21;24698:10;24688:21;;;;;;;;;;;;;;;;;;;;;;;;;24711:9;:20;24721:9;24711:20;;;;;;;;;;;;;;;;;;;;;;;;;24733:6;24673:14;:67::i;:::-;24758:4;24751:11;;24527:243;;;;:::o;24150:104::-;14788:12;:10;:12::i;:::-;14777:23;;:7;:5;:7::i;:::-;:23;;;14769:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24235:11:::1;24222:10;;:24;;;;;;;;;;;;;;;;;;24150:104:::0;:::o;29373:224::-;29438:7;29458:20;29481:14;:23;29496:7;29481:23;;;;;;;;;;;;;;;;29458:46;;29537:1;29522:12;:16;:67;;29588:1;29522:67;;;29541:11;:20;29553:7;29541:20;;;;;;;;;;;;;;;:38;29577:1;29562:12;:16;;;;:::i;:::-;29541:38;;;;;;;;;;;:44;;;29522:67;29515:74;;;29373:224;;;:::o;28364:812::-;28486:23;23284:80;28566:6;:4;:6::i;:::-;28550:24;;;;;;28576:12;:10;:12::i;:::-;28598:4;28522:82;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28512:93;;;;;;28486:119;;28616:18;23495:71;28679:9;28690:5;28697:6;28647:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28637:68;;;;;;28616:89;;28716:14;28772:15;28789:10;28743:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28733:68;;;;;;28716:85;;28812:17;28832:26;28842:6;28850:1;28853;28856;28832:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28812:46;;28898:1;28877:23;;:9;:23;;;;28869:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28972:6;:17;28979:9;28972:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;28963:5;:28;28955:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29069:6;29050:15;:25;;29042:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;29137:31;29147:9;29158;29137;:31::i;:::-;29130:38;;;;28364:812;;;;;;:::o;24015:91::-;14788:12;:10;:12::i;:::-;14777:23;;:7;:5;:7::i;:::-;:23;;;14769:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24079:19:::1;:17;:19::i;:::-;24015:91::o:0;26413:150::-;26502:7;26529:10;:17;26540:5;26529:17;;;;;;;;;;;;;;;:26;26547:7;26529:26;;;;;;;;;;;;;;;;26522:33;;26413:150;;;;:::o;23449:117::-;23495:71;23449:117;:::o;15466:201::-;14788:12;:10;:12::i;:::-;14777:23;;:7;:5;:7::i;:::-;:23;;;14769:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15575:1:::1;15555:22;;:8;:22;;;;15547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15631:28;15650:8;15631:18;:28::i;:::-;15466:201:::0;:::o;3190:98::-;3243:7;3270:10;3263:17;;3190:98;:::o;25980:380::-;26134:1;26117:19;;:5;:19;;;;26109:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26215:1;26196:21;;:7;:21;;;;26188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26298:6;26269:10;:17;26280:5;26269:17;;;;;;;;;;;;;;;:26;26287:7;26269:26;;;;;;;;;;;;;;;:35;;;;26336:7;26320:32;;26329:5;26320:32;;;26345:6;26320:32;;;;;;:::i;:::-;;;;;;;;25980:380;;;:::o;9524:733::-;9682:1;9664:20;;:6;:20;;;;9656:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;9766:1;9745:23;;:9;:23;;;;9737:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9821:47;9842:6;9850:9;9861:6;9821:20;:47::i;:::-;9881:21;9905:9;:17;9915:6;9905:17;;;;;;;;;;;;;;;;9881:41;;9958:6;9941:13;:23;;9933:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;10079:6;10063:13;:22;10043:9;:17;10053:6;10043:17;;;;;;;;;;;;;;;:42;;;;10131:6;10107:9;:20;10117:9;10107:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;10172:9;10155:35;;10164:6;10155:35;;;10183:6;10155:35;;;;;;:::i;:::-;;;;;;;;10203:46;10223:6;10231:9;10242:6;10203:19;:46::i;:::-;9645:612;9524:733;;;:::o;31437:377::-;31514:23;31540:9;:20;31550:9;31540:20;;;;;;;;;;;;;;;;;;;;;;;;;31514:46;;31571:24;31598:20;31608:9;31598;:20::i;:::-;31571:47;;31652:9;31629;:20;31639:9;31629:20;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;31723:9;31679:54;;31706:15;31679:54;;31695:9;31679:54;;;;;;;;;;;;31746:60;31761:15;31778:9;31789:16;31746:14;:60::i;:::-;31503:311;;31437:377;;:::o;15827:191::-;15901:16;15920:6;;;;;;;;;;;15901:25;;15946:8;15937:6;;:17;;;;;;;;;;;;;;;;;;16001:8;15970:40;;15991:8;15970:40;;;;;;;;;;;;15890:128;15827:191;:::o;32072:953::-;32183:11;32173:21;;:6;:21;;;;:35;;;;;32207:1;32198:6;:10;32173:35;32169:849;;;32247:1;32229:20;;:6;:20;;;32225:373;;32270:17;32290:14;:22;32305:6;32290:22;;;;;;;;;;;;;;;;32270:42;;32331:24;32370:1;32358:9;:13;:60;;32417:1;32358:60;;;32374:11;:19;32386:6;32374:19;;;;;;;;;;;;;;;:34;32406:1;32394:9;:13;;;;:::i;:::-;32374:34;;;;;;;;;;;:40;;;32358:60;32331:87;;32437:24;32464:28;32485:6;32464:16;:20;;:28;;;;:::i;:::-;32437:55;;32511:71;32528:6;32536:9;32547:16;32565;32511;:71::i;:::-;32251:347;;;32225:373;32641:1;32618:25;;:11;:25;;;32614:393;;32664:17;32684:14;:27;32699:11;32684:27;;;;;;;;;;;;;;;;32664:47;;32730:24;32769:1;32757:9;:13;:65;;32821:1;32757:65;;;32773:11;:24;32785:11;32773:24;;;;;;;;;;;;;;;:39;32810:1;32798:9;:13;;;;:::i;:::-;32773:39;;;;;;;;;;;:45;;;32757:65;32730:92;;32841:24;32868:28;32889:6;32868:16;:20;;:28;;;;:::i;:::-;32841:55;;32915:76;32932:11;32945:9;32956:16;32974;32915;:76::i;:::-;32645:362;;;32614:393;32169:849;32072:953;;;:::o;33986:153::-;34031:4;34048:15;34096:9;34085:20;;34124:7;34117:14;;;33986:153;:::o;13285:125::-;;;;:::o;14014:124::-;;;;:::o;18757:98::-;18815:7;18846:1;18842;:5;;;;:::i;:::-;18835:12;;18757:98;;;;:::o;33325:650::-;33448:19;33470:77;33477:12;33470:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;33448:99;;;;33579:1;33564:12;:16;:85;;;;;33638:11;33584;:22;33596:9;33584:22;;;;;;;;;;;;;;;:40;33622:1;33607:12;:16;;;;:::i;:::-;33584:40;;;;;;;;;;;:50;;;:65;33564:85;33560:339;;;33715:8;33666:11;:22;33678:9;33666:22;;;;;;;;;;;;;;;:40;33704:1;33689:12;:16;;;;:::i;:::-;33666:40;;;;;;;;;;;:46;;:57;;;;33560:339;;;33795:33;;;;;;;;33806:11;33795:33;;;;33819:8;33795:33;;;33756:11;:22;33768:9;33756:22;;;;;;;;;;;;;;;:36;33779:12;33756:36;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;33886:1;33871:12;:16;;;;:::i;:::-;33843:14;:25;33858:9;33843:25;;;;;;;;;;;;;;;:44;;;;33560:339;33937:9;33916:51;;;33948:8;33958;33916:51;;;;;;;:::i;:::-;;;;;;;;33437:538;33325:650;;;;:::o;18376:98::-;18434:7;18465:1;18461;:5;;;;:::i;:::-;18454:12;;18376:98;;;;:::o;34147:161::-;34222:6;34253:5;34249:1;:9;34260:12;34241:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;34298:1;34284:16;;34147:161;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;297:139;;;;:::o;442:135::-;486:5;524:6;511:20;502:29;;540:31;565:5;540:31;:::i;:::-;442:135;;;;:::o;583:329::-;642:6;691:2;679:9;670:7;666:23;662:32;659:119;;;697:79;;:::i;:::-;659:119;817:1;842:53;887:7;878:6;867:9;863:22;842:53;:::i;:::-;832:63;;788:117;583:329;;;;:::o;918:474::-;986:6;994;1043:2;1031:9;1022:7;1018:23;1014:32;1011:119;;;1049:79;;:::i;:::-;1011:119;1169:1;1194:53;1239:7;1230:6;1219:9;1215:22;1194:53;:::i;:::-;1184:63;;1140:117;1296:2;1322:53;1367:7;1358:6;1347:9;1343:22;1322:53;:::i;:::-;1312:63;;1267:118;918:474;;;;;:::o;1398:619::-;1475:6;1483;1491;1540:2;1528:9;1519:7;1515:23;1511:32;1508:119;;;1546:79;;:::i;:::-;1508:119;1666:1;1691:53;1736:7;1727:6;1716:9;1712:22;1691:53;:::i;:::-;1681:63;;1637:117;1793:2;1819:53;1864:7;1855:6;1844:9;1840:22;1819:53;:::i;:::-;1809:63;;1764:118;1921:2;1947:53;1992:7;1983:6;1972:9;1968:22;1947:53;:::i;:::-;1937:63;;1892:118;1398:619;;;;;:::o;2023:474::-;2091:6;2099;2148:2;2136:9;2127:7;2123:23;2119:32;2116:119;;;2154:79;;:::i;:::-;2116:119;2274:1;2299:53;2344:7;2335:6;2324:9;2320:22;2299:53;:::i;:::-;2289:63;;2245:117;2401:2;2427:53;2472:7;2463:6;2452:9;2448:22;2427:53;:::i;:::-;2417:63;;2372:118;2023:474;;;;;:::o;2503:1053::-;2605:6;2613;2621;2629;2637;2645;2694:3;2682:9;2673:7;2669:23;2665:33;2662:120;;;2701:79;;:::i;:::-;2662:120;2821:1;2846:53;2891:7;2882:6;2871:9;2867:22;2846:53;:::i;:::-;2836:63;;2792:117;2948:2;2974:53;3019:7;3010:6;2999:9;2995:22;2974:53;:::i;:::-;2964:63;;2919:118;3076:2;3102:53;3147:7;3138:6;3127:9;3123:22;3102:53;:::i;:::-;3092:63;;3047:118;3204:2;3230:51;3273:7;3264:6;3253:9;3249:22;3230:51;:::i;:::-;3220:61;;3175:116;3330:3;3357:53;3402:7;3393:6;3382:9;3378:22;3357:53;:::i;:::-;3347:63;;3301:119;3459:3;3486:53;3531:7;3522:6;3511:9;3507:22;3486:53;:::i;:::-;3476:63;;3430:119;2503:1053;;;;;;;;:::o;3562:118::-;3649:24;3667:5;3649:24;:::i;:::-;3644:3;3637:37;3562:118;;:::o;3686:109::-;3767:21;3782:5;3767:21;:::i;:::-;3762:3;3755:34;3686:109;;:::o;3801:118::-;3888:24;3906:5;3888:24;:::i;:::-;3883:3;3876:37;3801:118;;:::o;3925:157::-;4030:45;4050:24;4068:5;4050:24;:::i;:::-;4030:45;:::i;:::-;4025:3;4018:58;3925:157;;:::o;4088:364::-;4176:3;4204:39;4237:5;4204:39;:::i;:::-;4259:71;4323:6;4318:3;4259:71;:::i;:::-;4252:78;;4339:52;4384:6;4379:3;4372:4;4365:5;4361:16;4339:52;:::i;:::-;4416:29;4438:6;4416:29;:::i;:::-;4411:3;4407:39;4400:46;;4180:272;4088:364;;;;:::o;4458:366::-;4600:3;4621:67;4685:2;4680:3;4621:67;:::i;:::-;4614:74;;4697:93;4786:3;4697:93;:::i;:::-;4815:2;4810:3;4806:12;4799:19;;4458:366;;;:::o;4830:::-;4972:3;4993:67;5057:2;5052:3;4993:67;:::i;:::-;4986:74;;5069:93;5158:3;5069:93;:::i;:::-;5187:2;5182:3;5178:12;5171:19;;4830:366;;;:::o;5202:::-;5344:3;5365:67;5429:2;5424:3;5365:67;:::i;:::-;5358:74;;5441:93;5530:3;5441:93;:::i;:::-;5559:2;5554:3;5550:12;5543:19;;5202:366;;;:::o;5574:::-;5716:3;5737:67;5801:2;5796:3;5737:67;:::i;:::-;5730:74;;5813:93;5902:3;5813:93;:::i;:::-;5931:2;5926:3;5922:12;5915:19;;5574:366;;;:::o;5946:::-;6088:3;6109:67;6173:2;6168:3;6109:67;:::i;:::-;6102:74;;6185:93;6274:3;6185:93;:::i;:::-;6303:2;6298:3;6294:12;6287:19;;5946:366;;;:::o;6318:400::-;6478:3;6499:84;6581:1;6576:3;6499:84;:::i;:::-;6492:91;;6592:93;6681:3;6592:93;:::i;:::-;6710:1;6705:3;6701:11;6694:18;;6318:400;;;:::o;6724:366::-;6866:3;6887:67;6951:2;6946:3;6887:67;:::i;:::-;6880:74;;6963:93;7052:3;6963:93;:::i;:::-;7081:2;7076:3;7072:12;7065:19;;6724:366;;;:::o;7096:::-;7238:3;7259:67;7323:2;7318:3;7259:67;:::i;:::-;7252:74;;7335:93;7424:3;7335:93;:::i;:::-;7453:2;7448:3;7444:12;7437:19;;7096:366;;;:::o;7468:::-;7610:3;7631:67;7695:2;7690:3;7631:67;:::i;:::-;7624:74;;7707:93;7796:3;7707:93;:::i;:::-;7825:2;7820:3;7816:12;7809:19;;7468:366;;;:::o;7840:::-;7982:3;8003:67;8067:2;8062:3;8003:67;:::i;:::-;7996:74;;8079:93;8168:3;8079:93;:::i;:::-;8197:2;8192:3;8188:12;8181:19;;7840:366;;;:::o;8212:::-;8354:3;8375:67;8439:2;8434:3;8375:67;:::i;:::-;8368:74;;8451:93;8540:3;8451:93;:::i;:::-;8569:2;8564:3;8560:12;8553:19;;8212:366;;;:::o;8584:::-;8726:3;8747:67;8811:2;8806:3;8747:67;:::i;:::-;8740:74;;8823:93;8912:3;8823:93;:::i;:::-;8941:2;8936:3;8932:12;8925:19;;8584:366;;;:::o;8956:::-;9098:3;9119:67;9183:2;9178:3;9119:67;:::i;:::-;9112:74;;9195:93;9284:3;9195:93;:::i;:::-;9313:2;9308:3;9304:12;9297:19;;8956:366;;;:::o;9328:::-;9470:3;9491:67;9555:2;9550:3;9491:67;:::i;:::-;9484:74;;9567:93;9656:3;9567:93;:::i;:::-;9685:2;9680:3;9676:12;9669:19;;9328:366;;;:::o;9700:118::-;9787:24;9805:5;9787:24;:::i;:::-;9782:3;9775:37;9700:118;;:::o;9824:112::-;9907:22;9923:5;9907:22;:::i;:::-;9902:3;9895:35;9824:112;;:::o;9942:663::-;10183:3;10205:148;10349:3;10205:148;:::i;:::-;10198:155;;10363:75;10434:3;10425:6;10363:75;:::i;:::-;10463:2;10458:3;10454:12;10447:19;;10476:75;10547:3;10538:6;10476:75;:::i;:::-;10576:2;10571:3;10567:12;10560:19;;10596:3;10589:10;;9942:663;;;;;:::o;10611:222::-;10704:4;10742:2;10731:9;10727:18;10719:26;;10755:71;10823:1;10812:9;10808:17;10799:6;10755:71;:::i;:::-;10611:222;;;;:::o;10839:210::-;10926:4;10964:2;10953:9;10949:18;10941:26;;10977:65;11039:1;11028:9;11024:17;11015:6;10977:65;:::i;:::-;10839:210;;;;:::o;11055:222::-;11148:4;11186:2;11175:9;11171:18;11163:26;;11199:71;11267:1;11256:9;11252:17;11243:6;11199:71;:::i;:::-;11055:222;;;;:::o;11283:553::-;11460:4;11498:3;11487:9;11483:19;11475:27;;11512:71;11580:1;11569:9;11565:17;11556:6;11512:71;:::i;:::-;11593:72;11661:2;11650:9;11646:18;11637:6;11593:72;:::i;:::-;11675;11743:2;11732:9;11728:18;11719:6;11675:72;:::i;:::-;11757;11825:2;11814:9;11810:18;11801:6;11757:72;:::i;:::-;11283:553;;;;;;;:::o;11842:::-;12019:4;12057:3;12046:9;12042:19;12034:27;;12071:71;12139:1;12128:9;12124:17;12115:6;12071:71;:::i;:::-;12152:72;12220:2;12209:9;12205:18;12196:6;12152:72;:::i;:::-;12234;12302:2;12291:9;12287:18;12278:6;12234:72;:::i;:::-;12316;12384:2;12373:9;12369:18;12360:6;12316:72;:::i;:::-;11842:553;;;;;;;:::o;12401:545::-;12574:4;12612:3;12601:9;12597:19;12589:27;;12626:71;12694:1;12683:9;12679:17;12670:6;12626:71;:::i;:::-;12707:68;12771:2;12760:9;12756:18;12747:6;12707:68;:::i;:::-;12785:72;12853:2;12842:9;12838:18;12829:6;12785:72;:::i;:::-;12867;12935:2;12924:9;12920:18;12911:6;12867:72;:::i;:::-;12401:545;;;;;;;:::o;12952:313::-;13065:4;13103:2;13092:9;13088:18;13080:26;;13152:9;13146:4;13142:20;13138:1;13127:9;13123:17;13116:47;13180:78;13253:4;13244:6;13180:78;:::i;:::-;13172:86;;12952:313;;;;:::o;13271:419::-;13437:4;13475:2;13464:9;13460:18;13452:26;;13524:9;13518:4;13514:20;13510:1;13499:9;13495:17;13488:47;13552:131;13678:4;13552:131;:::i;:::-;13544:139;;13271:419;;;:::o;13696:::-;13862:4;13900:2;13889:9;13885:18;13877:26;;13949:9;13943:4;13939:20;13935:1;13924:9;13920:17;13913:47;13977:131;14103:4;13977:131;:::i;:::-;13969:139;;13696:419;;;:::o;14121:::-;14287:4;14325:2;14314:9;14310:18;14302:26;;14374:9;14368:4;14364:20;14360:1;14349:9;14345:17;14338:47;14402:131;14528:4;14402:131;:::i;:::-;14394:139;;14121:419;;;:::o;14546:::-;14712:4;14750:2;14739:9;14735:18;14727:26;;14799:9;14793:4;14789:20;14785:1;14774:9;14770:17;14763:47;14827:131;14953:4;14827:131;:::i;:::-;14819:139;;14546:419;;;:::o;14971:::-;15137:4;15175:2;15164:9;15160:18;15152:26;;15224:9;15218:4;15214:20;15210:1;15199:9;15195:17;15188:47;15252:131;15378:4;15252:131;:::i;:::-;15244:139;;14971:419;;;:::o;15396:::-;15562:4;15600:2;15589:9;15585:18;15577:26;;15649:9;15643:4;15639:20;15635:1;15624:9;15620:17;15613:47;15677:131;15803:4;15677:131;:::i;:::-;15669:139;;15396:419;;;:::o;15821:::-;15987:4;16025:2;16014:9;16010:18;16002:26;;16074:9;16068:4;16064:20;16060:1;16049:9;16045:17;16038:47;16102:131;16228:4;16102:131;:::i;:::-;16094:139;;15821:419;;;:::o;16246:::-;16412:4;16450:2;16439:9;16435:18;16427:26;;16499:9;16493:4;16489:20;16485:1;16474:9;16470:17;16463:47;16527:131;16653:4;16527:131;:::i;:::-;16519:139;;16246:419;;;:::o;16671:::-;16837:4;16875:2;16864:9;16860:18;16852:26;;16924:9;16918:4;16914:20;16910:1;16899:9;16895:17;16888:47;16952:131;17078:4;16952:131;:::i;:::-;16944:139;;16671:419;;;:::o;17096:::-;17262:4;17300:2;17289:9;17285:18;17277:26;;17349:9;17343:4;17339:20;17335:1;17324:9;17320:17;17313:47;17377:131;17503:4;17377:131;:::i;:::-;17369:139;;17096:419;;;:::o;17521:::-;17687:4;17725:2;17714:9;17710:18;17702:26;;17774:9;17768:4;17764:20;17760:1;17749:9;17745:17;17738:47;17802:131;17928:4;17802:131;:::i;:::-;17794:139;;17521:419;;;:::o;17946:::-;18112:4;18150:2;18139:9;18135:18;18127:26;;18199:9;18193:4;18189:20;18185:1;18174:9;18170:17;18163:47;18227:131;18353:4;18227:131;:::i;:::-;18219:139;;17946:419;;;:::o;18371:::-;18537:4;18575:2;18564:9;18560:18;18552:26;;18624:9;18618:4;18614:20;18610:1;18599:9;18595:17;18588:47;18652:131;18778:4;18652:131;:::i;:::-;18644:139;;18371:419;;;:::o;18796:222::-;18889:4;18927:2;18916:9;18912:18;18904:26;;18940:71;19008:1;18997:9;18993:17;18984:6;18940:71;:::i;:::-;18796:222;;;;:::o;19024:332::-;19145:4;19183:2;19172:9;19168:18;19160:26;;19196:71;19264:1;19253:9;19249:17;19240:6;19196:71;:::i;:::-;19277:72;19345:2;19334:9;19330:18;19321:6;19277:72;:::i;:::-;19024:332;;;;;:::o;19362:214::-;19451:4;19489:2;19478:9;19474:18;19466:26;;19502:67;19566:1;19555:9;19551:17;19542:6;19502:67;:::i;:::-;19362:214;;;;:::o;19663:99::-;19715:6;19749:5;19743:12;19733:22;;19663:99;;;:::o;19768:169::-;19852:11;19886:6;19881:3;19874:19;19926:4;19921:3;19917:14;19902:29;;19768:169;;;;:::o;19943:148::-;20045:11;20082:3;20067:18;;19943:148;;;;:::o;20097:305::-;20137:3;20156:20;20174:1;20156:20;:::i;:::-;20151:25;;20190:20;20208:1;20190:20;:::i;:::-;20185:25;;20344:1;20276:66;20272:74;20269:1;20266:81;20263:107;;;20350:18;;:::i;:::-;20263:107;20394:1;20391;20387:9;20380:16;;20097:305;;;;:::o;20408:185::-;20448:1;20465:20;20483:1;20465:20;:::i;:::-;20460:25;;20499:20;20517:1;20499:20;:::i;:::-;20494:25;;20538:1;20528:35;;20543:18;;:::i;:::-;20528:35;20585:1;20582;20578:9;20573:14;;20408:185;;;;:::o;20599:191::-;20639:4;20659:20;20677:1;20659:20;:::i;:::-;20654:25;;20693:20;20711:1;20693:20;:::i;:::-;20688:25;;20732:1;20729;20726:8;20723:34;;;20737:18;;:::i;:::-;20723:34;20782:1;20779;20775:9;20767:17;;20599:191;;;;:::o;20796:96::-;20833:7;20862:24;20880:5;20862:24;:::i;:::-;20851:35;;20796:96;;;:::o;20898:90::-;20932:7;20975:5;20968:13;20961:21;20950:32;;20898:90;;;:::o;20994:77::-;21031:7;21060:5;21049:16;;20994:77;;;:::o;21077:126::-;21114:7;21154:42;21147:5;21143:54;21132:65;;21077:126;;;:::o;21209:77::-;21246:7;21275:5;21264:16;;21209:77;;;:::o;21292:86::-;21327:7;21367:4;21360:5;21356:16;21345:27;;21292:86;;;:::o;21384:307::-;21452:1;21462:113;21476:6;21473:1;21470:13;21462:113;;;21561:1;21556:3;21552:11;21546:18;21542:1;21537:3;21533:11;21526:39;21498:2;21495:1;21491:10;21486:15;;21462:113;;;21593:6;21590:1;21587:13;21584:101;;;21673:1;21664:6;21659:3;21655:16;21648:27;21584:101;21433:258;21384:307;;;:::o;21697:320::-;21741:6;21778:1;21772:4;21768:12;21758:22;;21825:1;21819:4;21815:12;21846:18;21836:81;;21902:4;21894:6;21890:17;21880:27;;21836:81;21964:2;21956:6;21953:14;21933:18;21930:38;21927:84;;;21983:18;;:::i;:::-;21927:84;21748:269;21697:320;;;:::o;22023:233::-;22062:3;22085:24;22103:5;22085:24;:::i;:::-;22076:33;;22131:66;22124:5;22121:77;22118:103;;;22201:18;;:::i;:::-;22118:103;22248:1;22241:5;22237:13;22230:20;;22023:233;;;:::o;22262:79::-;22301:7;22330:5;22319:16;;22262:79;;;:::o;22347:180::-;22395:77;22392:1;22385:88;22492:4;22489:1;22482:15;22516:4;22513:1;22506:15;22533:180;22581:77;22578:1;22571:88;22678:4;22675:1;22668:15;22702:4;22699:1;22692:15;22719:180;22767:77;22764:1;22757:88;22864:4;22861:1;22854:15;22888:4;22885:1;22878:15;23028:117;23137:1;23134;23127:12;23151:102;23192:6;23243:2;23239:7;23234:2;23227:5;23223:14;23219:28;23209:38;;23151:102;;;:::o;23259:222::-;23399:34;23395:1;23387:6;23383:14;23376:58;23468:5;23463:2;23455:6;23451:15;23444:30;23259:222;:::o;23487:::-;23627:34;23623:1;23615:6;23611:14;23604:58;23696:5;23691:2;23683:6;23679:15;23672:30;23487:222;:::o;23715:226::-;23855:34;23851:1;23843:6;23839:14;23832:58;23924:9;23919:2;23911:6;23907:15;23900:34;23715:226;:::o;23947:225::-;24087:34;24083:1;24075:6;24071:14;24064:58;24156:8;24151:2;24143:6;24139:15;24132:33;23947:225;:::o;24178:221::-;24318:34;24314:1;24306:6;24302:14;24295:58;24387:4;24382:2;24374:6;24370:15;24363:29;24178:221;:::o;24405:214::-;24545:66;24541:1;24533:6;24529:14;24522:90;24405:214;:::o;24625:225::-;24765:34;24761:1;24753:6;24749:14;24742:58;24834:8;24829:2;24821:6;24817:15;24810:33;24625:225;:::o;24856:227::-;24996:34;24992:1;24984:6;24980:14;24973:58;25065:10;25060:2;25052:6;25048:15;25041:35;24856:227;:::o;25089:::-;25229:34;25225:1;25217:6;25213:14;25206:58;25298:10;25293:2;25285:6;25281:15;25274:35;25089:227;:::o;25322:182::-;25462:34;25458:1;25450:6;25446:14;25439:58;25322:182;:::o;25510:224::-;25650:34;25646:1;25638:6;25634:14;25627:58;25719:7;25714:2;25706:6;25702:15;25695:32;25510:224;:::o;25740:223::-;25880:34;25876:1;25868:6;25864:14;25857:58;25949:6;25944:2;25936:6;25932:15;25925:31;25740:223;:::o;25969:224::-;26109:34;26105:1;26097:6;26093:14;26086:58;26178:7;26173:2;26165:6;26161:15;26154:32;25969:224;:::o;26199:226::-;26339:34;26335:1;26327:6;26323:14;26316:58;26408:9;26403:2;26395:6;26391:15;26384:34;26199:226;:::o;26431:122::-;26504:24;26522:5;26504:24;:::i;:::-;26497:5;26494:35;26484:63;;26543:1;26540;26533:12;26484:63;26431:122;:::o;26559:::-;26632:24;26650:5;26632:24;:::i;:::-;26625:5;26622:35;26612:63;;26671:1;26668;26661:12;26612:63;26559:122;:::o;26687:::-;26760:24;26778:5;26760:24;:::i;:::-;26753:5;26750:35;26740:63;;26799:1;26796;26789:12;26740:63;26687:122;:::o;26815:118::-;26886:22;26902:5;26886:22;:::i;:::-;26879:5;26876:33;26866:61;;26923:1;26920;26913:12;26866:61;26815:118;:::o
Swarm Source
ipfs://b33c1c431d0b87335f0730c2fffbc91378a5b2493eacf6ac844ff9afeebc51d1
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.