ETH Price: $3,410.67 (+2.98%)

Token

Route (ROUTE)
 

Overview

Max Total Supply

20,000,000 ROUTE

Holders

5,344 ( -0.225%)

Market

Price

$1.88 @ 0.000551 ETH (+7.72%)

Onchain Market Cap

$37,600,000.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
meta-wallet.eth
Balance
0.000091454379640292 ROUTE

Value
$0.00 ( ~0 Eth) [0.0000%]
0x9d969f47c7d503bb56556bec3ab4115deae60122
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Router Protocol is a crosschain-liquidity aggregator platform that was built to seamlessly provide bridging infrastructure between current and emerging Layer 1 and Layer 2 blockchain solutions.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Route

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-13
*/

// File: contracts/SafeMath.sol

pragma solidity >=0.5.16;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/NativeMetaTransaction/Initializable.sol

pragma solidity >= 0.6.6;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

// File: contracts/NativeMetaTransaction/EIP712Base.sol

pragma solidity >= 0.6.6;


contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        uint256 chainId;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,uint256 chainId)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                getChainId()
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public pure returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

// File: contracts/NativeMetaTransaction/NativeMetaTransaction.sol

pragma solidity >= 0.6.6;



contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) public nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            msg.sender,
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }

    function _msgSender() internal view returns (address payable sender) {
        if(msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff)
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }

}

// File: contracts/Route.sol

pragma solidity >=0.6.6;
pragma experimental ABIEncoderV2;



contract Route is NativeMetaTransaction {
    // @notice EIP-20 token name for this token
    string public constant name = "Route";

    // @notice EIP-20 token symbol for this token
    string public constant symbol = "ROUTE";

    // @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 18;

    // @notice Total number of tokens in circulation
    uint public totalSupply = 20_000_000e18; // 20 Million Route Tokens

    // @notice Allowance amounts on behalf of others
    mapping (address => mapping (address => uint256)) internal allowances;

    // @notice Official record of token balances for each account
    mapping (address => uint256) internal balances;

    // @notice A record of each accounts delegate
    mapping (address => address) public delegates;

    // @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    // @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    // @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    // @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    // @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    // @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    // // @notice A record of states for signing / validating signatures
    // mapping (address => uint) public nonces;

    // @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    // @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    // @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    // @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /**
     * @notice Construct a new Route token
     */
    constructor() public {
        balances[_msgSender()] = uint256(totalSupply);
        emit Transfer(address(0), _msgSender(), totalSupply);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint rawAmount) external returns (bool) {
        uint256 amount;
        if (rawAmount == uint(-1)) {
            amount = uint256(-1);
        } else {
            amount = safe256(rawAmount, "Route::approve: amount exceeds 96 bits");
        }

        allowances[_msgSender()][spender] = amount;

        emit Approval(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline 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 permit(address owner, address spender, uint rawAmount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        uint256 amount;
        if (rawAmount == uint(-1)) {
            amount = uint256(-1);
        } else {
            amount = safe256(rawAmount, "Route::permit: amount exceeds 96 bits");
        }

        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, rawAmount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "Route::permit: invalid signature");
        require(signatory == owner, "Route::permit: unauthorized");
        require(block.timestamp <= deadline, "Route::permit: signature expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `_msgSender()` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint rawAmount) external returns (bool) {
        uint256 amount = safe256(rawAmount, "Route::transfer: amount exceeds 96 bits");
        _transferTokens(_msgSender(), dst, 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 rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint rawAmount) external returns (bool) {
        address spender = _msgSender();
        uint256 spenderAllowance = allowances[src][spender];
        uint256 amount = safe256(rawAmount, "Route::approve: amount exceeds 96 bits");

        if (spender != src && spenderAllowance != uint256(-1)) {
            uint256 newAllowance = sub256(spenderAllowance, amount, "Route::transferFrom: transfer amount exceeds spender allowance");
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `_msgSender()` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        return _delegate(_msgSender(), delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) 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), "Route::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "Route::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "Route::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "Route::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint256 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transferTokens(address src, address dst, uint256 amount) internal {
        require(src != address(0), "Route::_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "Route::_transferTokens: cannot transfer to the zero address");

        balances[src] = sub256(balances[src], amount, "Route::_transferTokens: transfer amount exceeds balance");
        balances[dst] = add256(balances[dst], amount, "Route::_transferTokens: transfer amount overflows");
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = sub256(srcRepOld, amount, "Route::_moveVotes: vote amount underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = add256(dstRepOld, amount, "Route::_moveVotes: vote amount overflows");
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal {
      uint32 blockNumber = safe32(block.number, "Route::_writeCheckpoint: block number exceeds 32 bits");

      if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
      } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe256(uint n, string memory errorMessage) internal pure returns (uint256) {
        return uint256(n);
    }

    function add256(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub256(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
}

Contract Security Audit

Contract ABI

[{"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":"amount","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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"rawAmount","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":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","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":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","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":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405260008060006101000a81548160ff0219169083151502179055506a108b2a2c280290940000006003553480156200003a57600080fd5b5060035460056000620000526200010f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620000a06200010f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600354604051620001019190620001d4565b60405180910390a3620001fb565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620001bc5760606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050620001c0565b3390505b90565b620001ce81620001f1565b82525050565b6000602082019050620001eb6000830184620001c3565b92915050565b6000819050919050565b613cfe806200020b6000396000f3fe6080604052600436106101815760003560e01c80635c19a95c116100d1578063a9059cbb1161008a578063d505accf11610064578063d505accf146105ed578063dd62ed3e14610616578063e7a324dc14610653578063f1127ed81461067e57610181565b8063a9059cbb1461054a578063b4b5ea5714610587578063c3cda520146105c457610181565b80635c19a95c146104025780636fcfff451461042b57806370a0823114610468578063782d6fe1146104a55780637ecebe00146104e257806395d89b411461051f57610181565b806320606b701161013e57806330adf81f1161011857806330adf81f14610344578063313ce5671461036f5780633408e4701461039a578063587cde1e146103c557610181565b806320606b701461029f57806323b872dd146102ca5780632d0335ab1461030757610181565b806306fdde0314610186578063095ea7b3146101b15780630c53c51c146101ee5780630f7e59701461021e57806318160ddd1461024957806320379ee514610274575b600080fd5b34801561019257600080fd5b5061019b6106bc565b6040516101a8919061364f565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190612cc8565b6106f5565b6040516101e59190613482565b60405180910390f35b61020860048036038101906102039190612c39565b61086c565b604051610215919061362d565b60405180910390f35b34801561022a57600080fd5b50610233610ae5565b604051610240919061364f565b60405180910390f35b34801561025557600080fd5b5061025e610b1e565b60405161026b9190613811565b60405180910390f35b34801561028057600080fd5b50610289610b24565b604051610296919061349d565b60405180910390f35b3480156102ab57600080fd5b506102b4610b2e565b6040516102c1919061349d565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612b4c565b610b52565b6040516102fe9190613482565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190612ae7565b610d8f565b60405161033b9190613811565b60405180910390f35b34801561035057600080fd5b50610359610dd8565b604051610366919061349d565b60405180910390f35b34801561037b57600080fd5b50610384610dfc565b6040516103919190613899565b60405180910390f35b3480156103a657600080fd5b506103af610e01565b6040516103bc9190613811565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e79190612ae7565b610e0e565b6040516103f99190613429565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190612ae7565b610e41565b005b34801561043757600080fd5b50610452600480360381019061044d9190612ae7565b610e55565b60405161045f9190613855565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190612ae7565b610e78565b60405161049c9190613811565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190612cc8565b610ec1565b6040516104d99190613811565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612ae7565b61126c565b6040516105169190613811565b60405180910390f35b34801561052b57600080fd5b50610534611284565b604051610541919061364f565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190612cc8565b6112bd565b60405161057e9190613482565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a99190612ae7565b611301565b6040516105bb9190613811565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190612d04565b6113d7565b005b3480156105f957600080fd5b50610614600480360381019061060f9190612b9b565b611694565b005b34801561062257600080fd5b5061063d60048036038101906106389190612b10565b611ad6565b60405161064a9190613811565b60405180910390f35b34801561065f57600080fd5b50610668611b5d565b604051610675919061349d565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612d8d565b611b81565b6040516106b3929190613870565b60405180910390f35b6040518060400160405280600581526020017f526f75746500000000000000000000000000000000000000000000000000000081525081565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415610748577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905061076d565b61076a83604051806060016040528060268152602001613c5460269139611bc2565b90505b806004600061077a611bcd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16610814611bcd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516108599190613811565b60405180910390a3600191505092915050565b60606108766129d3565b6040518060600160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781525090506108f58782878787611c7f565b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613771565b60405180910390fd5b6109876001600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8890919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8733886040516109fd93929190613444565b60405180910390a1600060603073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610a339291906133ca565b604051602081830303815290604052604051610a4f91906133b3565b6000604051808303816000865af19150503d8060008114610a8c576040519150601f19603f3d011682016040523d82523d6000602084013e610a91565b606091505b509150915081610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd906136d1565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60035481565b6000600154905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600080610b5d611bcd565b90506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000610c0485604051806060016040528060268152602001613c5460269139611bc2565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015610c6257507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214155b15610d76576000610c8c83836040518060600160405280603e8152602001613b60603e9139611ddd565b905080600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d6c9190613811565b60405180910390a3505b610d81878783611e32565b600193505050509392505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000804690508091505090565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e52610e4c611bcd565b8261218f565b50565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90613791565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610f72576000915050611266565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161105c57600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff16815260200190815260200160002060010154915050611266565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156110dd576000915050611266565b6000806001830390505b8163ffffffff168163ffffffff161115611200576000600283830363ffffffff168161110f57fe5b048203905061111c612a0a565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156111d857806020015195505050505050611266565b86816000015163ffffffff1610156111f2578193506111f9565b6001820392505b50506110e7565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60026020528060005260406000206000915090505481565b6040518060400160405280600581526020017f524f55544500000000000000000000000000000000000000000000000000000081525081565b6000806112e283604051806060016040528060278152602001613ca260279139611bc2565b90506112f66112ef611bcd565b8583611e32565b600191505092915050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161136b5760006113cf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600581526020017f526f7574650000000000000000000000000000000000000000000000000000008152508051906020012061143f610e01565b30604051602001611453949392919061355e565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016114a49493929190613519565b604051602081830303815290604052805190602001209050600082826040516020016114d19291906133f2565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161150e94939291906135e8565b6020604051602081039080840390855afa158015611530573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390613731565b60405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055891461163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906136b1565b60405180910390fd5b8742111561167e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611675906137b1565b60405180910390fd5b611688818b61218f565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8614156116e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905061170b565b61170886604051806060016040528060258152602001613c2f60259139611bc2565b90505b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600581526020017f526f75746500000000000000000000000000000000000000000000000000000081525080519060200120611773610e01565b30604051602001611787949392919061355e565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600260008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b604051602001611829969594939291906134b8565b604051602081830303815290604052805190602001209050600082826040516020016118569291906133f2565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161189394939291906135e8565b6020604051602081039080840390855afa1580156118b5573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890613711565b60405180910390fd5b8b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199690613671565b60405180910390fd5b884211156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d9906137d1565b60405180910390fd5b84600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611ac09190613811565b60405180910390a3505050505050505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b600082905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611c785760606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611c7c565b3390505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790613751565b60405180910390fd5b6001611d03611cfe87612337565b61239f565b83868660405160008152602001604052604051611d2394939291906135e8565b6020604051602081039080840390855afa158015611d45573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906136f1565b60405180910390fd5b8091505092915050565b6000838311158290611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c919061364f565b60405180910390fd5b5082840390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990613691565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f09906137f1565b60405180910390fd5b611f74600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482604051806060016040528060378152602001613b9e60379139611ddd565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612019600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482604051806060016040528060318152602001613bd5603191396123d8565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120b99190613811565b60405180910390a361218a600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612432565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612331828483612432565b50505050565b6000604051806080016040528060438152602001613ae860439139805190602001208260000151836020015184604001518051906020012060405160200161238294939291906135a3565b604051602081830303815290604052805190602001209050919050565b60006123a9610b24565b826040516020016123bb9291906133f2565b604051602081830303815290604052805190602001209050919050565b6000808385019050848110158390612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d919061364f565b60405180910390fd5b50809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561246e5750600081115b156126ea57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125ae576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612511576000612575565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061259c8285604051806060016040528060298152602001613c0660299139611ddd565b90506125aa868484846126ef565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126e9576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161264c5760006126b0565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006126d78285604051806060016040528060288152602001613c7a602891396123d8565b90506126e5858484846126ef565b5050505b5b505050565b600061271343604051806060016040528060358152602001613b2b6035913961297d565b905060008463ffffffff161180156127a857508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156128195781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060010181905550612926565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724848460405161296e92919061382c565b60405180910390a25050505050565b6000640100000000831082906129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c0919061364f565b60405180910390fd5b5082905092915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060400160405280600063ffffffff168152602001600081525090565b600081359050612a3981613a74565b92915050565b600081359050612a4e81613a8b565b92915050565b600082601f830112612a6557600080fd5b8135612a78612a73826138e5565b6138b4565b91508082526020830160208301858383011115612a9457600080fd5b612a9f8382846139e4565b50505092915050565b600081359050612ab781613aa2565b92915050565b600081359050612acc81613ab9565b92915050565b600081359050612ae181613ad0565b92915050565b600060208284031215612af957600080fd5b6000612b0784828501612a2a565b91505092915050565b60008060408385031215612b2357600080fd5b6000612b3185828601612a2a565b9250506020612b4285828601612a2a565b9150509250929050565b600080600060608486031215612b6157600080fd5b6000612b6f86828701612a2a565b9350506020612b8086828701612a2a565b9250506040612b9186828701612aa8565b9150509250925092565b600080600080600080600060e0888a031215612bb657600080fd5b6000612bc48a828b01612a2a565b9750506020612bd58a828b01612a2a565b9650506040612be68a828b01612aa8565b9550506060612bf78a828b01612aa8565b9450506080612c088a828b01612ad2565b93505060a0612c198a828b01612a3f565b92505060c0612c2a8a828b01612a3f565b91505092959891949750929550565b600080600080600060a08688031215612c5157600080fd5b6000612c5f88828901612a2a565b955050602086013567ffffffffffffffff811115612c7c57600080fd5b612c8888828901612a54565b9450506040612c9988828901612a3f565b9350506060612caa88828901612a3f565b9250506080612cbb88828901612ad2565b9150509295509295909350565b60008060408385031215612cdb57600080fd5b6000612ce985828601612a2a565b9250506020612cfa85828601612aa8565b9150509250929050565b60008060008060008060c08789031215612d1d57600080fd5b6000612d2b89828a01612a2a565b9650506020612d3c89828a01612aa8565b9550506040612d4d89828a01612aa8565b9450506060612d5e89828a01612ad2565b9350506080612d6f89828a01612a3f565b92505060a0612d8089828a01612a3f565b9150509295509295509295565b60008060408385031215612da057600080fd5b6000612dae85828601612a2a565b9250506020612dbf85828601612abd565b9150509250929050565b612dd281613975565b82525050565b612de181613963565b82525050565b612df8612df382613963565b613a26565b82525050565b612e0781613987565b82525050565b612e1681613993565b82525050565b612e2d612e2882613993565b613a38565b82525050565b6000612e3e82613915565b612e48818561392b565b9350612e588185602086016139f3565b612e6181613a56565b840191505092915050565b6000612e7782613915565b612e81818561393c565b9350612e918185602086016139f3565b80840191505092915050565b6000612ea882613920565b612eb28185613947565b9350612ec28185602086016139f3565b612ecb81613a56565b840191505092915050565b6000612ee3601b83613947565b91507f526f7574653a3a7065726d69743a20756e617574686f72697a656400000000006000830152602082019050919050565b6000612f23603d83613947565b91507f526f7574653a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460008301527f72616e736665722066726f6d20746865207a65726f20616464726573730000006020830152604082019050919050565b6000612f89602383613947565b91507f526f7574653a3a64656c656761746542795369673a20696e76616c6964206e6f60008301527f6e636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fef601c83613947565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006000830152602082019050919050565b600061302f600283613958565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061306f601b83613947565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006130af602083613947565b91507f526f7574653a3a7065726d69743a20696e76616c6964207369676e61747572656000830152602082019050919050565b60006130ef602783613947565b91507f526f7574653a3a64656c656761746542795369673a20696e76616c696420736960008301527f676e6174757265000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613155602583613947565b91507f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008301527f49474e45520000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131bb602183613947565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613221602883613947565b91507f526f7574653a3a6765745072696f72566f7465733a206e6f742079657420646560008301527f7465726d696e65640000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613287602783613947565b91507f526f7574653a3a64656c656761746542795369673a207369676e61747572652060008301527f65787069726564000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132ed602083613947565b91507f526f7574653a3a7065726d69743a207369676e617475726520657870697265646000830152602082019050919050565b600061332d603b83613947565b91507f526f7574653a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460008301527f72616e7366657220746f20746865207a65726f206164647265737300000000006020830152604082019050919050565b61338f816139bd565b82525050565b61339e816139c7565b82525050565b6133ad816139d7565b82525050565b60006133bf8284612e6c565b915081905092915050565b60006133d68285612e6c565b91506133e28284612de7565b6014820191508190509392505050565b60006133fd82613022565b91506134098285612e1c565b6020820191506134198284612e1c565b6020820191508190509392505050565b600060208201905061343e6000830184612dd8565b92915050565b60006060820190506134596000830186612dd8565b6134666020830185612dc9565b81810360408301526134788184612e33565b9050949350505050565b60006020820190506134976000830184612dfe565b92915050565b60006020820190506134b26000830184612e0d565b92915050565b600060c0820190506134cd6000830189612e0d565b6134da6020830188612dd8565b6134e76040830187612dd8565b6134f46060830186613386565b6135016080830185613386565b61350e60a0830184613386565b979650505050505050565b600060808201905061352e6000830187612e0d565b61353b6020830186612dd8565b6135486040830185613386565b6135556060830184613386565b95945050505050565b60006080820190506135736000830187612e0d565b6135806020830186612e0d565b61358d6040830185613386565b61359a6060830184612dd8565b95945050505050565b60006080820190506135b86000830187612e0d565b6135c56020830186613386565b6135d26040830185612dd8565b6135df6060830184612e0d565b95945050505050565b60006080820190506135fd6000830187612e0d565b61360a60208301866133a4565b6136176040830185612e0d565b6136246060830184612e0d565b95945050505050565b600060208201905081810360008301526136478184612e33565b905092915050565b600060208201905081810360008301526136698184612e9d565b905092915050565b6000602082019050818103600083015261368a81612ed6565b9050919050565b600060208201905081810360008301526136aa81612f16565b9050919050565b600060208201905081810360008301526136ca81612f7c565b9050919050565b600060208201905081810360008301526136ea81612fe2565b9050919050565b6000602082019050818103600083015261370a81613062565b9050919050565b6000602082019050818103600083015261372a816130a2565b9050919050565b6000602082019050818103600083015261374a816130e2565b9050919050565b6000602082019050818103600083015261376a81613148565b9050919050565b6000602082019050818103600083015261378a816131ae565b9050919050565b600060208201905081810360008301526137aa81613214565b9050919050565b600060208201905081810360008301526137ca8161327a565b9050919050565b600060208201905081810360008301526137ea816132e0565b9050919050565b6000602082019050818103600083015261380a81613320565b9050919050565b60006020820190506138266000830184613386565b92915050565b60006040820190506138416000830185613386565b61384e6020830184613386565b9392505050565b600060208201905061386a6000830184613395565b92915050565b60006040820190506138856000830185613395565b6138926020830184613386565b9392505050565b60006020820190506138ae60008301846133a4565b92915050565b6000604051905081810181811067ffffffffffffffff821117156138db576138da613a54565b5b8060405250919050565b600067ffffffffffffffff821115613900576138ff613a54565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061396e8261399d565b9050919050565b60006139808261399d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a115780820151818401526020810190506139f6565b83811115613a20576000848401525b50505050565b6000613a3182613a42565b9050919050565b6000819050919050565b6000613a4d82613a67565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b613a7d81613963565b8114613a8857600080fd5b50565b613a9481613993565b8114613a9f57600080fd5b50565b613aab816139bd565b8114613ab657600080fd5b50565b613ac2816139c7565b8114613acd57600080fd5b50565b613ad9816139d7565b8114613ae457600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529526f7574653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473526f7574653a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365526f7574653a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e6365526f7574653a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f7773526f7574653a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773526f7574653a3a7065726d69743a20616d6f756e7420657863656564732039362062697473526f7574653a3a617070726f76653a20616d6f756e7420657863656564732039362062697473526f7574653a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773526f7574653a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473a2646970667358221220b911b04182f5e67b0e249b297546a1f7031f33b86d125c01139a28fe53c7845664736f6c63430007040033

Deployed Bytecode

0x6080604052600436106101815760003560e01c80635c19a95c116100d1578063a9059cbb1161008a578063d505accf11610064578063d505accf146105ed578063dd62ed3e14610616578063e7a324dc14610653578063f1127ed81461067e57610181565b8063a9059cbb1461054a578063b4b5ea5714610587578063c3cda520146105c457610181565b80635c19a95c146104025780636fcfff451461042b57806370a0823114610468578063782d6fe1146104a55780637ecebe00146104e257806395d89b411461051f57610181565b806320606b701161013e57806330adf81f1161011857806330adf81f14610344578063313ce5671461036f5780633408e4701461039a578063587cde1e146103c557610181565b806320606b701461029f57806323b872dd146102ca5780632d0335ab1461030757610181565b806306fdde0314610186578063095ea7b3146101b15780630c53c51c146101ee5780630f7e59701461021e57806318160ddd1461024957806320379ee514610274575b600080fd5b34801561019257600080fd5b5061019b6106bc565b6040516101a8919061364f565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190612cc8565b6106f5565b6040516101e59190613482565b60405180910390f35b61020860048036038101906102039190612c39565b61086c565b604051610215919061362d565b60405180910390f35b34801561022a57600080fd5b50610233610ae5565b604051610240919061364f565b60405180910390f35b34801561025557600080fd5b5061025e610b1e565b60405161026b9190613811565b60405180910390f35b34801561028057600080fd5b50610289610b24565b604051610296919061349d565b60405180910390f35b3480156102ab57600080fd5b506102b4610b2e565b6040516102c1919061349d565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612b4c565b610b52565b6040516102fe9190613482565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190612ae7565b610d8f565b60405161033b9190613811565b60405180910390f35b34801561035057600080fd5b50610359610dd8565b604051610366919061349d565b60405180910390f35b34801561037b57600080fd5b50610384610dfc565b6040516103919190613899565b60405180910390f35b3480156103a657600080fd5b506103af610e01565b6040516103bc9190613811565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e79190612ae7565b610e0e565b6040516103f99190613429565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190612ae7565b610e41565b005b34801561043757600080fd5b50610452600480360381019061044d9190612ae7565b610e55565b60405161045f9190613855565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190612ae7565b610e78565b60405161049c9190613811565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190612cc8565b610ec1565b6040516104d99190613811565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612ae7565b61126c565b6040516105169190613811565b60405180910390f35b34801561052b57600080fd5b50610534611284565b604051610541919061364f565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190612cc8565b6112bd565b60405161057e9190613482565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a99190612ae7565b611301565b6040516105bb9190613811565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190612d04565b6113d7565b005b3480156105f957600080fd5b50610614600480360381019061060f9190612b9b565b611694565b005b34801561062257600080fd5b5061063d60048036038101906106389190612b10565b611ad6565b60405161064a9190613811565b60405180910390f35b34801561065f57600080fd5b50610668611b5d565b604051610675919061349d565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612d8d565b611b81565b6040516106b3929190613870565b60405180910390f35b6040518060400160405280600581526020017f526f75746500000000000000000000000000000000000000000000000000000081525081565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415610748577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905061076d565b61076a83604051806060016040528060268152602001613c5460269139611bc2565b90505b806004600061077a611bcd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16610814611bcd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516108599190613811565b60405180910390a3600191505092915050565b60606108766129d3565b6040518060600160405280600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781525090506108f58782878787611c7f565b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613771565b60405180910390fd5b6109876001600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8890919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8733886040516109fd93929190613444565b60405180910390a1600060603073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610a339291906133ca565b604051602081830303815290604052604051610a4f91906133b3565b6000604051808303816000865af19150503d8060008114610a8c576040519150601f19603f3d011682016040523d82523d6000602084013e610a91565b606091505b509150915081610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd906136d1565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60035481565b6000600154905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600080610b5d611bcd565b90506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000610c0485604051806060016040528060268152602001613c5460269139611bc2565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015610c6257507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214155b15610d76576000610c8c83836040518060600160405280603e8152602001613b60603e9139611ddd565b905080600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d6c9190613811565b60405180910390a3505b610d81878783611e32565b600193505050509392505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000804690508091505090565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e52610e4c611bcd565b8261218f565b50565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90613791565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610f72576000915050611266565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161105c57600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff16815260200190815260200160002060010154915050611266565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156110dd576000915050611266565b6000806001830390505b8163ffffffff168163ffffffff161115611200576000600283830363ffffffff168161110f57fe5b048203905061111c612a0a565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156111d857806020015195505050505050611266565b86816000015163ffffffff1610156111f2578193506111f9565b6001820392505b50506110e7565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60026020528060005260406000206000915090505481565b6040518060400160405280600581526020017f524f55544500000000000000000000000000000000000000000000000000000081525081565b6000806112e283604051806060016040528060278152602001613ca260279139611bc2565b90506112f66112ef611bcd565b8583611e32565b600191505092915050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161136b5760006113cf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600581526020017f526f7574650000000000000000000000000000000000000000000000000000008152508051906020012061143f610e01565b30604051602001611453949392919061355e565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016114a49493929190613519565b604051602081830303815290604052805190602001209050600082826040516020016114d19291906133f2565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161150e94939291906135e8565b6020604051602081039080840390855afa158015611530573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390613731565b60405180910390fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055891461163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906136b1565b60405180910390fd5b8742111561167e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611675906137b1565b60405180910390fd5b611688818b61218f565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8614156116e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905061170b565b61170886604051806060016040528060258152602001613c2f60259139611bc2565b90505b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600581526020017f526f75746500000000000000000000000000000000000000000000000000000081525080519060200120611773610e01565b30604051602001611787949392919061355e565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600260008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b604051602001611829969594939291906134b8565b604051602081830303815290604052805190602001209050600082826040516020016118569291906133f2565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161189394939291906135e8565b6020604051602081039080840390855afa1580156118b5573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890613711565b60405180910390fd5b8b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199690613671565b60405180910390fd5b884211156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d9906137d1565b60405180910390fd5b84600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611ac09190613811565b60405180910390a3505050505050505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b600082905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611c785760606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611c7c565b3390505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790613751565b60405180910390fd5b6001611d03611cfe87612337565b61239f565b83868660405160008152602001604052604051611d2394939291906135e8565b6020604051602081039080840390855afa158015611d45573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906136f1565b60405180910390fd5b8091505092915050565b6000838311158290611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c919061364f565b60405180910390fd5b5082840390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990613691565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f09906137f1565b60405180910390fd5b611f74600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482604051806060016040528060378152602001613b9e60379139611ddd565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612019600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482604051806060016040528060318152602001613bd5603191396123d8565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120b99190613811565b60405180910390a361218a600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612432565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612331828483612432565b50505050565b6000604051806080016040528060438152602001613ae860439139805190602001208260000151836020015184604001518051906020012060405160200161238294939291906135a3565b604051602081830303815290604052805190602001209050919050565b60006123a9610b24565b826040516020016123bb9291906133f2565b604051602081830303815290604052805190602001209050919050565b6000808385019050848110158390612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d919061364f565b60405180910390fd5b50809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561246e5750600081115b156126ea57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125ae576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612511576000612575565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061259c8285604051806060016040528060298152602001613c0660299139611ddd565b90506125aa868484846126ef565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126e9576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161264c5760006126b0565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006126d78285604051806060016040528060288152602001613c7a602891396123d8565b90506126e5858484846126ef565b5050505b5b505050565b600061271343604051806060016040528060358152602001613b2b6035913961297d565b905060008463ffffffff161180156127a857508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156128195781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060010181905550612926565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724848460405161296e92919061382c565b60405180910390a25050505050565b6000640100000000831082906129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c0919061364f565b60405180910390fd5b5082905092915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6040518060400160405280600063ffffffff168152602001600081525090565b600081359050612a3981613a74565b92915050565b600081359050612a4e81613a8b565b92915050565b600082601f830112612a6557600080fd5b8135612a78612a73826138e5565b6138b4565b91508082526020830160208301858383011115612a9457600080fd5b612a9f8382846139e4565b50505092915050565b600081359050612ab781613aa2565b92915050565b600081359050612acc81613ab9565b92915050565b600081359050612ae181613ad0565b92915050565b600060208284031215612af957600080fd5b6000612b0784828501612a2a565b91505092915050565b60008060408385031215612b2357600080fd5b6000612b3185828601612a2a565b9250506020612b4285828601612a2a565b9150509250929050565b600080600060608486031215612b6157600080fd5b6000612b6f86828701612a2a565b9350506020612b8086828701612a2a565b9250506040612b9186828701612aa8565b9150509250925092565b600080600080600080600060e0888a031215612bb657600080fd5b6000612bc48a828b01612a2a565b9750506020612bd58a828b01612a2a565b9650506040612be68a828b01612aa8565b9550506060612bf78a828b01612aa8565b9450506080612c088a828b01612ad2565b93505060a0612c198a828b01612a3f565b92505060c0612c2a8a828b01612a3f565b91505092959891949750929550565b600080600080600060a08688031215612c5157600080fd5b6000612c5f88828901612a2a565b955050602086013567ffffffffffffffff811115612c7c57600080fd5b612c8888828901612a54565b9450506040612c9988828901612a3f565b9350506060612caa88828901612a3f565b9250506080612cbb88828901612ad2565b9150509295509295909350565b60008060408385031215612cdb57600080fd5b6000612ce985828601612a2a565b9250506020612cfa85828601612aa8565b9150509250929050565b60008060008060008060c08789031215612d1d57600080fd5b6000612d2b89828a01612a2a565b9650506020612d3c89828a01612aa8565b9550506040612d4d89828a01612aa8565b9450506060612d5e89828a01612ad2565b9350506080612d6f89828a01612a3f565b92505060a0612d8089828a01612a3f565b9150509295509295509295565b60008060408385031215612da057600080fd5b6000612dae85828601612a2a565b9250506020612dbf85828601612abd565b9150509250929050565b612dd281613975565b82525050565b612de181613963565b82525050565b612df8612df382613963565b613a26565b82525050565b612e0781613987565b82525050565b612e1681613993565b82525050565b612e2d612e2882613993565b613a38565b82525050565b6000612e3e82613915565b612e48818561392b565b9350612e588185602086016139f3565b612e6181613a56565b840191505092915050565b6000612e7782613915565b612e81818561393c565b9350612e918185602086016139f3565b80840191505092915050565b6000612ea882613920565b612eb28185613947565b9350612ec28185602086016139f3565b612ecb81613a56565b840191505092915050565b6000612ee3601b83613947565b91507f526f7574653a3a7065726d69743a20756e617574686f72697a656400000000006000830152602082019050919050565b6000612f23603d83613947565b91507f526f7574653a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460008301527f72616e736665722066726f6d20746865207a65726f20616464726573730000006020830152604082019050919050565b6000612f89602383613947565b91507f526f7574653a3a64656c656761746542795369673a20696e76616c6964206e6f60008301527f6e636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fef601c83613947565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006000830152602082019050919050565b600061302f600283613958565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061306f601b83613947565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006130af602083613947565b91507f526f7574653a3a7065726d69743a20696e76616c6964207369676e61747572656000830152602082019050919050565b60006130ef602783613947565b91507f526f7574653a3a64656c656761746542795369673a20696e76616c696420736960008301527f676e6174757265000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613155602583613947565b91507f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008301527f49474e45520000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131bb602183613947565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613221602883613947565b91507f526f7574653a3a6765745072696f72566f7465733a206e6f742079657420646560008301527f7465726d696e65640000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613287602783613947565b91507f526f7574653a3a64656c656761746542795369673a207369676e61747572652060008301527f65787069726564000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132ed602083613947565b91507f526f7574653a3a7065726d69743a207369676e617475726520657870697265646000830152602082019050919050565b600061332d603b83613947565b91507f526f7574653a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460008301527f72616e7366657220746f20746865207a65726f206164647265737300000000006020830152604082019050919050565b61338f816139bd565b82525050565b61339e816139c7565b82525050565b6133ad816139d7565b82525050565b60006133bf8284612e6c565b915081905092915050565b60006133d68285612e6c565b91506133e28284612de7565b6014820191508190509392505050565b60006133fd82613022565b91506134098285612e1c565b6020820191506134198284612e1c565b6020820191508190509392505050565b600060208201905061343e6000830184612dd8565b92915050565b60006060820190506134596000830186612dd8565b6134666020830185612dc9565b81810360408301526134788184612e33565b9050949350505050565b60006020820190506134976000830184612dfe565b92915050565b60006020820190506134b26000830184612e0d565b92915050565b600060c0820190506134cd6000830189612e0d565b6134da6020830188612dd8565b6134e76040830187612dd8565b6134f46060830186613386565b6135016080830185613386565b61350e60a0830184613386565b979650505050505050565b600060808201905061352e6000830187612e0d565b61353b6020830186612dd8565b6135486040830185613386565b6135556060830184613386565b95945050505050565b60006080820190506135736000830187612e0d565b6135806020830186612e0d565b61358d6040830185613386565b61359a6060830184612dd8565b95945050505050565b60006080820190506135b86000830187612e0d565b6135c56020830186613386565b6135d26040830185612dd8565b6135df6060830184612e0d565b95945050505050565b60006080820190506135fd6000830187612e0d565b61360a60208301866133a4565b6136176040830185612e0d565b6136246060830184612e0d565b95945050505050565b600060208201905081810360008301526136478184612e33565b905092915050565b600060208201905081810360008301526136698184612e9d565b905092915050565b6000602082019050818103600083015261368a81612ed6565b9050919050565b600060208201905081810360008301526136aa81612f16565b9050919050565b600060208201905081810360008301526136ca81612f7c565b9050919050565b600060208201905081810360008301526136ea81612fe2565b9050919050565b6000602082019050818103600083015261370a81613062565b9050919050565b6000602082019050818103600083015261372a816130a2565b9050919050565b6000602082019050818103600083015261374a816130e2565b9050919050565b6000602082019050818103600083015261376a81613148565b9050919050565b6000602082019050818103600083015261378a816131ae565b9050919050565b600060208201905081810360008301526137aa81613214565b9050919050565b600060208201905081810360008301526137ca8161327a565b9050919050565b600060208201905081810360008301526137ea816132e0565b9050919050565b6000602082019050818103600083015261380a81613320565b9050919050565b60006020820190506138266000830184613386565b92915050565b60006040820190506138416000830185613386565b61384e6020830184613386565b9392505050565b600060208201905061386a6000830184613395565b92915050565b60006040820190506138856000830185613395565b6138926020830184613386565b9392505050565b60006020820190506138ae60008301846133a4565b92915050565b6000604051905081810181811067ffffffffffffffff821117156138db576138da613a54565b5b8060405250919050565b600067ffffffffffffffff821115613900576138ff613a54565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061396e8261399d565b9050919050565b60006139808261399d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613a115780820151818401526020810190506139f6565b83811115613a20576000848401525b50505050565b6000613a3182613a42565b9050919050565b6000819050919050565b6000613a4d82613a67565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b613a7d81613963565b8114613a8857600080fd5b50565b613a9481613993565b8114613a9f57600080fd5b50565b613aab816139bd565b8114613ab657600080fd5b50565b613ac2816139c7565b8114613acd57600080fd5b50565b613ad9816139d7565b8114613ae457600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529526f7574653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473526f7574653a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365526f7574653a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e6365526f7574653a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f7773526f7574653a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773526f7574653a3a7065726d69743a20616d6f756e7420657863656564732039362062697473526f7574653a3a617070726f76653a20616d6f756e7420657863656564732039362062697473526f7574653a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773526f7574653a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473a2646970667358221220b911b04182f5e67b0e249b297546a1f7031f33b86d125c01139a28fe53c7845664736f6c63430007040033

Deployed Bytecode Sourcemap

12853:14443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12949:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16639:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10020:1142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7183:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13245:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8187:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14172:122;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19759:682;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11588:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14593:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13147:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8296:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13625:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20591:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14051:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18832:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:1220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9611:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13046:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19206:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22134:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21129:804;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17556:1073;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16025:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14387:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13913:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;12949:37;;;;;;;;;;;;;;;;;;;:::o;16639:427::-;16707:4;16724:14;16771:2;16753:9;:21;16749:176;;;16808:2;16791:20;;16749:176;;;16853:60;16861:9;16853:60;;;;;;;;;;;;;;;;;:7;:60::i;:::-;16844:69;;16749:176;16973:6;16937:10;:24;16948:12;:10;:12::i;:::-;16937:24;;;;;;;;;;;;;;;:33;16962:7;16937:33;;;;;;;;;;;;;;;:42;;;;17020:7;16997:39;;17006:12;:10;:12::i;:::-;16997:39;;;17029:6;16997:39;;;;;;:::i;:::-;;;;;;;;17054:4;17047:11;;;16639:427;;;;:::o;10020:1142::-;10221:12;10246:29;;:::i;:::-;10278:152;;;;;;;;10316:6;:19;10323:11;10316:19;;;;;;;;;;;;;;;;10278:152;;;;10356:11;10278:152;;;;;;10401:17;10278:152;;;10246:184;;10465:45;10472:11;10485:6;10493:4;10499;10505;10465:6;:45::i;:::-;10443:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;10660:26;10684:1;10660:6;:19;10667:11;10660:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;10638:6;:19;10645:11;10638:19;;;;;;;;;;;;;;;:48;;;;10704:117;10742:11;10768:10;10793:17;10704:117;;;;;;;;:::i;:::-;;;;;;;;10932:12;10946:23;10981:4;10973:18;;11023:17;11042:11;11006:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10973:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10931:134;;;;11084:7;11076:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;11144:10;11137:17;;;;;10020:1142;;;;;;;:::o;7183:43::-;;;;;;;;;;;;;;;;;;;:::o;13245:39::-;;;;:::o;8187:101::-;8238:7;8265:15;;8258:22;;8187:101;:::o;14172:122::-;14214:80;14172:122;:::o;19759:682::-;19841:4;19858:15;19876:12;:10;:12::i;:::-;19858:30;;19899:24;19926:10;:15;19937:3;19926:15;;;;;;;;;;;;;;;:24;19942:7;19926:24;;;;;;;;;;;;;;;;19899:51;;19961:14;19978:60;19986:9;19978:60;;;;;;;;;;;;;;;;;:7;:60::i;:::-;19961:77;;20066:3;20055:14;;:7;:14;;;;:49;;;;;20101:2;20073:16;:31;;20055:49;20051:315;;;20121:20;20144:98;20151:16;20169:6;20144:98;;;;;;;;;;;;;;;;;:6;:98::i;:::-;20121:121;;20284:12;20257:10;:15;20268:3;20257:15;;;;;;;;;;;;;;;:24;20273:7;20257:24;;;;;;;;;;;;;;;:39;;;;20332:7;20318:36;;20327:3;20318:36;;;20341:12;20318:36;;;;;;:::i;:::-;;;;;;;;20051:315;;20378:33;20394:3;20399;20404:6;20378:15;:33::i;:::-;20429:4;20422:11;;;;;19759:682;;;;;:::o;11588:107::-;11641:13;11675:6;:12;11682:4;11675:12;;;;;;;;;;;;;;;;11667:20;;11588:107;;;:::o;14593:137::-;14635:95;14593:137;:::o;13147:35::-;13180:2;13147:35;:::o;8296:161::-;8339:7;8359:10;8410:9;8404:15;;8447:2;8440:9;;;8296:161;:::o;13625:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;20591:104::-;20653:34;20663:12;:10;:12::i;:::-;20677:9;20653;:34::i;:::-;20591:104;:::o;14051:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;18832:108::-;18891:4;18915:8;:17;18924:7;18915:17;;;;;;;;;;;;;;;;18908:24;;18832:108;;;:::o;22788:1220::-;22867:7;22909:12;22895:11;:26;22887:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;22979:19;23001:14;:23;23016:7;23001:23;;;;;;;;;;;;;;;;;;;;;;;;;22979:45;;23055:1;23039:12;:17;;;23035:58;;;23080:1;23073:8;;;;;23035:58;23205:11;23153;:20;23165:7;23153:20;;;;;;;;;;;;;;;:38;23189:1;23174:12;:16;23153:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;23149:147;;23240:11;:20;23252:7;23240:20;;;;;;;;;;;;;;;:38;23276:1;23261:12;:16;23240:38;;;;;;;;;;;;;;;:44;;;23233:51;;;;;23149:147;23393:11;23357;:20;23369:7;23357:20;;;;;;;;;;;;;;;:23;23378:1;23357:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;23353:88;;;23428:1;23421:8;;;;;23353:88;23453:12;23480;23510:1;23495:12;:16;23480:31;;23522:428;23537:5;23529:13;;:5;:13;;;23522:428;;;23559:13;23601:1;23592:5;23584;:13;23583:19;;;;;;;;23575:5;:27;23559:43;;23644:20;;:::i;:::-;23667:11;:20;23679:7;23667:20;;;;;;;;;;;;;;;:28;23688:6;23667:28;;;;;;;;;;;;;;;23644:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23730:11;23714:2;:12;;;:27;;;23710:229;;;23769:2;:8;;;23762:15;;;;;;;;;23710:229;23818:11;23803:2;:12;;;:26;;;23799:140;;;23858:6;23850:14;;23799:140;;;23922:1;23913:6;:10;23905:18;;23799:140;23522:428;;;;;23967:11;:20;23979:7;23967:20;;;;;;;;;;;;;;;:27;23988:5;23967:27;;;;;;;;;;;;;;;:33;;;23960:40;;;;;22788:1220;;;;;:::o;9611:41::-;;;;;;;;;;;;;;;;;:::o;13046:39::-;;;;;;;;;;;;;;;;;;;:::o;19206:243::-;19271:4;19288:14;19305:61;19313:9;19305:61;;;;;;;;;;;;;;;;;:7;:61::i;:::-;19288:78;;19377:42;19393:12;:10;:12::i;:::-;19407:3;19412:6;19377:15;:42::i;:::-;19437:4;19430:11;;;19206:243;;;;:::o;22134:223::-;22199:7;22219:19;22241:14;:23;22256:7;22241:23;;;;;;;;;;;;;;;;;;;;;;;;;22219:45;;22297:1;22282:12;:16;;;:67;;22348:1;22282:67;;;22301:11;:20;22313:7;22301:20;;;;;;;;;;;;;;;:38;22337:1;22322:12;:16;22301:38;;;;;;;;;;;;;;;:44;;;22282:67;22275:74;;;22134:223;;;:::o;21129:804::-;21245:23;14214:80;21325:4;;;;;;;;;;;;;;;;;21309:22;;;;;;21333:12;:10;:12::i;:::-;21355:4;21281:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21271:91;;;;;;21245:117;;21373:18;14433:71;21436:9;21447:5;21454:6;21404:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21394:68;;;;;;21373:89;;21473:14;21529:15;21546:10;21500:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21490:68;;;;;;21473:85;;21569:17;21589:26;21599:6;21607:1;21610;21613;21589:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21569:46;;21655:1;21634:23;;:9;:23;;;;21626:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;21729:6;:17;21736:9;21729:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;21720:5;:28;21712:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21826:6;21807:15;:25;;21799:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;21894:31;21904:9;21915;21894;:31::i;:::-;21887:38;;;;21129:804;;;;;;:::o;17556:1073::-;17686:14;17733:2;17715:9;:21;17711:175;;;17770:2;17753:20;;17711:175;;;17815:59;17823:9;17815:59;;;;;;;;;;;;;;;;;:7;:59::i;:::-;17806:68;;17711:175;17898:23;14214:80;17978:4;;;;;;;;;;;;;;;;;17962:22;;;;;;17986:12;:10;:12::i;:::-;18008:4;17934:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17924:91;;;;;;17898:117;;18026:18;14635:95;18085:5;18092:7;18101:9;18112:6;:13;18119:5;18112:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;18129:8;18057:81;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18047:92;;;;;;18026:113;;18150:14;18206:15;18223:10;18177:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18167:68;;;;;;18150:85;;18246:17;18266:26;18276:6;18284:1;18287;18290;18266:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18246:46;;18332:1;18311:23;;:9;:23;;;;18303:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18403:5;18390:18;;:9;:18;;;18382:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;18478:8;18459:15;:27;;18451:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;18565:6;18536:10;:17;18547:5;18536:17;;;;;;;;;;;;;;;:26;18554:7;18536:26;;;;;;;;;;;;;;;:35;;;;18605:7;18589:32;;18598:5;18589:32;;;18614:6;18589:32;;;;;;:::i;:::-;;;;;;;;17556:1073;;;;;;;;;;;;:::o;16025:136::-;16101:4;16125:10;:19;16136:7;16125:19;;;;;;;;;;;;;;;:28;16145:7;16125:28;;;;;;;;;;;;;;;;16118:35;;16025:136;;;;:::o;14387:117::-;14433:71;14387:117;:::o;13913:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26794:121::-;26870:7;26905:1;26890:17;;26794:121;;;;:::o;12197:548::-;12242:22;12302:4;12280:27;;:10;:27;;;12277:437;;;12324:18;12345:8;;12324:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12368:13;12384:8;;:15;;12368:31;;12593:42;12584:5;12577;12573:17;12567:24;12563:73;12553:83;;12423:228;;;;;12692:10;12683:19;;12277:437;12197:548;:::o;11703:486::-;11881:4;11924:1;11906:20;;:6;:20;;;;11898:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12022:159;12050:47;12069:27;12089:6;12069:19;:27::i;:::-;12050:18;:47::i;:::-;12116:4;12139;12162;12022:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11999:182;;:6;:182;;;11979:202;;11703:486;;;;;;;:::o;1022:181::-;1080:7;1100:9;1116:1;1112;:5;1100:17;;1141:1;1136;:6;;1128:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1194:1;1187:8;;;1022:181;;;;:::o;27124:169::-;27213:7;27246:1;27241;:6;;27249:12;27233:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27284:1;27280;:5;27273:12;;27124:169;;;;;:::o;24400:621::-;24510:1;24495:17;;:3;:17;;;;24487:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;24612:1;24597:17;;:3;:17;;;;24589:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;24707:88;24714:8;:13;24723:3;24714:13;;;;;;;;;;;;;;;;24729:6;24707:88;;;;;;;;;;;;;;;;;:6;:88::i;:::-;24691:8;:13;24700:3;24691:13;;;;;;;;;;;;;;;:104;;;;24822:82;24829:8;:13;24838:3;24829:13;;;;;;;;;;;;;;;;24844:6;24822:82;;;;;;;;;;;;;;;;;:6;:82::i;:::-;24806:8;:13;24815:3;24806:13;;;;;;;;;;;;;;;:98;;;;24934:3;24920:26;;24929:3;24920:26;;;24939:6;24920:26;;;;;;:::i;:::-;;;;;;;;24959:54;24974:9;:14;24984:3;24974:14;;;;;;;;;;;;;;;;;;;;;;;;;24990:9;:14;25000:3;24990:14;;;;;;;;;;;;;;;;;;;;;;;;;25006:6;24959:14;:54::i;:::-;24400:621;;;:::o;24016:376::-;24093:23;24119:9;:20;24129:9;24119:20;;;;;;;;;;;;;;;;;;;;;;;;;24093:46;;24150:24;24177:8;:19;24186:9;24177:19;;;;;;;;;;;;;;;;24150:46;;24230:9;24207;:20;24217:9;24207:20;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;24301:9;24257:54;;24284:15;24257:54;;24273:9;24257:54;;;;;;;;;;;;24324:60;24339:15;24356:9;24367:16;24324:14;:60::i;:::-;24016:376;;;;:::o;11170:410::-;11280:7;9349:100;;;;;;;;;;;;;;;;;9329:127;;;;;;11434:6;:12;;;11469:6;:11;;;11513:6;:24;;;11503:35;;;;;;11353:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11325:247;;;;;;11305:267;;11170:410;;;:::o;8826:258::-;8925:7;9027:20;:18;:20::i;:::-;9049:11;8998:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8970:106;;;;;;8950:126;;8826:258;;;:::o;26923:193::-;27012:7;27032:9;27048:1;27044;:5;27032:17;;27073:1;27068;:6;;27076:12;27060:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27107:1;27100:8;;;26923:193;;;;;:::o;25029:948::-;25135:6;25125:16;;:6;:16;;;;:30;;;;;25154:1;25145:6;:10;25125:30;25121:849;;;25194:1;25176:20;;:6;:20;;;25172:386;;25217:16;25236:14;:22;25251:6;25236:22;;;;;;;;;;;;;;;;;;;;;;;;;25217:41;;25277:17;25309:1;25297:9;:13;;;:60;;25356:1;25297:60;;;25313:11;:19;25325:6;25313:19;;;;;;;;;;;;;;;:34;25345:1;25333:9;:13;25313:34;;;;;;;;;;;;;;;:40;;;25297:60;25277:80;;25376:17;25396:70;25403:9;25414:6;25396:70;;;;;;;;;;;;;;;;;:6;:70::i;:::-;25376:90;;25485:57;25502:6;25510:9;25521;25532;25485:16;:57::i;:::-;25172:386;;;;25596:1;25578:20;;:6;:20;;;25574:385;;25619:16;25638:14;:22;25653:6;25638:22;;;;;;;;;;;;;;;;;;;;;;;;;25619:41;;25679:17;25711:1;25699:9;:13;;;:60;;25758:1;25699:60;;;25715:11;:19;25727:6;25715:19;;;;;;;;;;;;;;;:34;25747:1;25735:9;:13;25715:34;;;;;;;;;;;;;;;:40;;;25699:60;25679:80;;25778:17;25798:69;25805:9;25816:6;25798:69;;;;;;;;;;;;;;;;;:6;:69::i;:::-;25778:89;;25886:57;25903:6;25911:9;25922;25933;25886:16;:57::i;:::-;25574:385;;;;25121:849;25029:948;;;:::o;25985:632::-;26105:18;26126:77;26133:12;26126:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;26105:98;;26233:1;26218:12;:16;;;:85;;;;;26292:11;26238:65;;:11;:22;26250:9;26238:22;;;;;;;;;;;;;;;:40;26276:1;26261:12;:16;26238:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;26218:85;26214:329;;;26367:8;26318:11;:22;26330:9;26318:22;;;;;;;;;;;;;;;:40;26356:1;26341:12;:16;26318:40;;;;;;;;;;;;;;;:46;;:57;;;;26214:329;;;26443:33;;;;;;;;26454:11;26443:33;;;;;;26467:8;26443:33;;;26404:11;:22;26416:9;26404:22;;;;;;;;;;;;;;;:36;26427:12;26404:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26532:1;26517:12;:16;26489:14;:25;26504:9;26489:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;26214:329;26579:9;26558:51;;;26590:8;26600;26558:51;;;;;;;:::i;:::-;;;;;;;;25985:632;;;;;:::o;26625:161::-;26700:6;26731:5;26727:1;:9;26738:12;26719:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26776:1;26762:16;;26625:161;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:464::-;;401:3;394:4;386:6;382:17;378:27;368:2;;419:1;416;409:12;368:2;459:6;446:20;484:64;499:48;540:6;499:48;:::i;:::-;484:64;:::i;:::-;475:73;;571:6;564:5;557:21;610:4;602:6;598:17;646:4;639:5;635:16;684:3;675:6;670:3;666:16;663:25;660:2;;;701:1;698;691:12;660:2;714:41;748:6;743:3;738;714:41;:::i;:::-;358:403;;;;;;;:::o;767:139::-;;851:6;838:20;829:29;;867:33;894:5;867:33;:::i;:::-;819:87;;;;:::o;912:137::-;;995:6;982:20;973:29;;1011:32;1037:5;1011:32;:::i;:::-;963:86;;;;:::o;1055:135::-;;1137:6;1124:20;1115:29;;1153:31;1178:5;1153:31;:::i;:::-;1105:85;;;;:::o;1196:260::-;;1304:2;1292:9;1283:7;1279:23;1275:32;1272:2;;;1320:1;1317;1310:12;1272:2;1362:1;1386:53;1431:7;1422:6;1411:9;1407:22;1386:53;:::i;:::-;1376:63;;1334:115;1262:194;;;;:::o;1462:403::-;;;1587:2;1575:9;1566:7;1562:23;1558:32;1555:2;;;1603:1;1600;1593:12;1555:2;1645:1;1669:53;1714:7;1705:6;1694:9;1690:22;1669:53;:::i;:::-;1659:63;;1617:115;1770:2;1795:53;1840:7;1831:6;1820:9;1816:22;1795:53;:::i;:::-;1785:63;;1742:116;1545:320;;;;;:::o;1871:546::-;;;;2013:2;2001:9;1992:7;1988:23;1984:32;1981:2;;;2029:1;2026;2019:12;1981:2;2071:1;2095:53;2140:7;2131:6;2120:9;2116:22;2095:53;:::i;:::-;2085:63;;2043:115;2196:2;2221:53;2266:7;2257:6;2246:9;2242:22;2221:53;:::i;:::-;2211:63;;2168:116;2322:2;2347:53;2392:7;2383:6;2372:9;2368:22;2347:53;:::i;:::-;2337:63;;2294:116;1971:446;;;;;:::o;2423:1118::-;;;;;;;;2631:3;2619:9;2610:7;2606:23;2602:33;2599:2;;;2648:1;2645;2638:12;2599:2;2690:1;2714:53;2759:7;2750:6;2739:9;2735:22;2714:53;:::i;:::-;2704:63;;2662:115;2815:2;2840:53;2885:7;2876:6;2865:9;2861:22;2840:53;:::i;:::-;2830:63;;2787:116;2941:2;2966:53;3011:7;3002:6;2991:9;2987:22;2966:53;:::i;:::-;2956:63;;2913:116;3067:2;3092:53;3137:7;3128:6;3117:9;3113:22;3092:53;:::i;:::-;3082:63;;3039:116;3193:3;3219:51;3262:7;3253:6;3242:9;3238:22;3219:51;:::i;:::-;3209:61;;3165:115;3318:3;3344:53;3389:7;3380:6;3369:9;3365:22;3344:53;:::i;:::-;3334:63;;3290:117;3445:3;3471:53;3516:7;3507:6;3496:9;3492:22;3471:53;:::i;:::-;3461:63;;3417:117;2589:952;;;;;;;;;;:::o;3547:941::-;;;;;;3730:3;3718:9;3709:7;3705:23;3701:33;3698:2;;;3747:1;3744;3737:12;3698:2;3789:1;3813:53;3858:7;3849:6;3838:9;3834:22;3813:53;:::i;:::-;3803:63;;3761:115;3942:2;3931:9;3927:18;3914:32;3973:18;3965:6;3962:30;3959:2;;;4005:1;4002;3995:12;3959:2;4032:62;4086:7;4077:6;4066:9;4062:22;4032:62;:::i;:::-;4022:72;;3886:218;4142:2;4167:53;4212:7;4203:6;4192:9;4188:22;4167:53;:::i;:::-;4157:63;;4114:116;4268:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4240:116;4394:3;4420:51;4463:7;4454:6;4443:9;4439:22;4420:51;:::i;:::-;4410:61;;4366:115;3688:800;;;;;;;;:::o;4494:403::-;;;4619:2;4607:9;4598:7;4594:23;4590:32;4587:2;;;4635:1;4632;4625:12;4587:2;4677:1;4701:53;4746:7;4737:6;4726:9;4722:22;4701:53;:::i;:::-;4691:63;;4649:115;4802:2;4827:53;4872:7;4863:6;4852:9;4848:22;4827:53;:::i;:::-;4817:63;;4774:116;4577:320;;;;;:::o;4903:974::-;;;;;;;5094:3;5082:9;5073:7;5069:23;5065:33;5062:2;;;5111:1;5108;5101:12;5062:2;5153:1;5177:53;5222:7;5213:6;5202:9;5198:22;5177:53;:::i;:::-;5167:63;;5125:115;5278:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5250:116;5404:2;5429:53;5474:7;5465:6;5454:9;5450:22;5429:53;:::i;:::-;5419:63;;5376:116;5530:2;5555:51;5598:7;5589:6;5578:9;5574:22;5555:51;:::i;:::-;5545:61;;5502:114;5654:3;5680:53;5725:7;5716:6;5705:9;5701:22;5680:53;:::i;:::-;5670:63;;5626:117;5781:3;5807:53;5852:7;5843:6;5832:9;5828:22;5807:53;:::i;:::-;5797:63;;5753:117;5052:825;;;;;;;;:::o;5883:401::-;;;6007:2;5995:9;5986:7;5982:23;5978:32;5975:2;;;6023:1;6020;6013:12;5975:2;6065:1;6089:53;6134:7;6125:6;6114:9;6110:22;6089:53;:::i;:::-;6079:63;;6037:115;6190:2;6215:52;6259:7;6250:6;6239:9;6235:22;6215:52;:::i;:::-;6205:62;;6162:115;5965:319;;;;;:::o;6290:142::-;6393:32;6419:5;6393:32;:::i;:::-;6388:3;6381:45;6371:61;;:::o;6438:118::-;6525:24;6543:5;6525:24;:::i;:::-;6520:3;6513:37;6503:53;;:::o;6562:157::-;6667:45;6687:24;6705:5;6687:24;:::i;:::-;6667:45;:::i;:::-;6662:3;6655:58;6645:74;;:::o;6725:109::-;6806:21;6821:5;6806:21;:::i;:::-;6801:3;6794:34;6784:50;;:::o;6840:118::-;6927:24;6945:5;6927:24;:::i;:::-;6922:3;6915:37;6905:53;;:::o;6964:157::-;7069:45;7089:24;7107:5;7089:24;:::i;:::-;7069:45;:::i;:::-;7064:3;7057:58;7047:74;;:::o;7127:360::-;;7241:38;7273:5;7241:38;:::i;:::-;7295:70;7358:6;7353:3;7295:70;:::i;:::-;7288:77;;7374:52;7419:6;7414:3;7407:4;7400:5;7396:16;7374:52;:::i;:::-;7451:29;7473:6;7451:29;:::i;:::-;7446:3;7442:39;7435:46;;7217:270;;;;;:::o;7493:373::-;;7625:38;7657:5;7625:38;:::i;:::-;7679:88;7760:6;7755:3;7679:88;:::i;:::-;7672:95;;7776:52;7821:6;7816:3;7809:4;7802:5;7798:16;7776:52;:::i;:::-;7853:6;7848:3;7844:16;7837:23;;7601:265;;;;;:::o;7872:364::-;;7988:39;8021:5;7988:39;:::i;:::-;8043:71;8107:6;8102:3;8043:71;:::i;:::-;8036:78;;8123:52;8168:6;8163:3;8156:4;8149:5;8145:16;8123:52;:::i;:::-;8200:29;8222:6;8200:29;:::i;:::-;8195:3;8191:39;8184:46;;7964:272;;;;;:::o;8242:325::-;;8405:67;8469:2;8464:3;8405:67;:::i;:::-;8398:74;;8502:29;8498:1;8493:3;8489:11;8482:50;8558:2;8553:3;8549:12;8542:19;;8388:179;;;:::o;8573:393::-;;8736:67;8800:2;8795:3;8736:67;:::i;:::-;8729:74;;8833:34;8829:1;8824:3;8820:11;8813:55;8899:31;8894:2;8889:3;8885:12;8878:53;8957:2;8952:3;8948:12;8941:19;;8719:247;;;:::o;8972:367::-;;9135:67;9199:2;9194:3;9135:67;:::i;:::-;9128:74;;9232:34;9228:1;9223:3;9219:11;9212:55;9298:5;9293:2;9288:3;9284:12;9277:27;9330:2;9325:3;9321:12;9314:19;;9118:221;;;:::o;9345:326::-;;9508:67;9572:2;9567:3;9508:67;:::i;:::-;9501:74;;9605:30;9601:1;9596:3;9592:11;9585:51;9662:2;9657:3;9653:12;9646:19;;9491:180;;;:::o;9677:396::-;;9858:84;9940:1;9935:3;9858:84;:::i;:::-;9851:91;;9972:66;9968:1;9963:3;9959:11;9952:87;10065:1;10060:3;10056:11;10049:18;;9841:232;;;:::o;10079:325::-;;10242:67;10306:2;10301:3;10242:67;:::i;:::-;10235:74;;10339:29;10335:1;10330:3;10326:11;10319:50;10395:2;10390:3;10386:12;10379:19;;10225:179;;;:::o;10410:330::-;;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10670:34;10666:1;10661:3;10657:11;10650:55;10731:2;10726:3;10722:12;10715:19;;10556:184;;;:::o;10746:371::-;;10909:67;10973:2;10968:3;10909:67;:::i;:::-;10902:74;;11006:34;11002:1;10997:3;10993:11;10986:55;11072:9;11067:2;11062:3;11058:12;11051:31;11108:2;11103:3;11099:12;11092:19;;10892:225;;;:::o;11123:369::-;;11286:67;11350:2;11345:3;11286:67;:::i;:::-;11279:74;;11383:34;11379:1;11374:3;11370:11;11363:55;11449:7;11444:2;11439:3;11435:12;11428:29;11483:2;11478:3;11474:12;11467:19;;11269:223;;;:::o;11498:365::-;;11661:67;11725:2;11720:3;11661:67;:::i;:::-;11654:74;;11758:34;11754:1;11749:3;11745:11;11738:55;11824:3;11819:2;11814:3;11810:12;11803:25;11854:2;11849:3;11845:12;11838:19;;11644:219;;;:::o;11869:372::-;;12032:67;12096:2;12091:3;12032:67;:::i;:::-;12025:74;;12129:34;12125:1;12120:3;12116:11;12109:55;12195:10;12190:2;12185:3;12181:12;12174:32;12232:2;12227:3;12223:12;12216:19;;12015:226;;;:::o;12247:371::-;;12410:67;12474:2;12469:3;12410:67;:::i;:::-;12403:74;;12507:34;12503:1;12498:3;12494:11;12487:55;12573:9;12568:2;12563:3;12559:12;12552:31;12609:2;12604:3;12600:12;12593:19;;12393:225;;;:::o;12624:330::-;;12787:67;12851:2;12846:3;12787:67;:::i;:::-;12780:74;;12884:34;12880:1;12875:3;12871:11;12864:55;12945:2;12940:3;12936:12;12929:19;;12770:184;;;:::o;12960:391::-;;13123:67;13187:2;13182:3;13123:67;:::i;:::-;13116:74;;13220:34;13216:1;13211:3;13207:11;13200:55;13286:29;13281:2;13276:3;13272:12;13265:51;13342:2;13337:3;13333:12;13326:19;;13106:245;;;:::o;13357:118::-;13444:24;13462:5;13444:24;:::i;:::-;13439:3;13432:37;13422:53;;:::o;13481:115::-;13566:23;13583:5;13566:23;:::i;:::-;13561:3;13554:36;13544:52;;:::o;13602:112::-;13685:22;13701:5;13685:22;:::i;:::-;13680:3;13673:35;13663:51;;:::o;13720:271::-;;13872:93;13961:3;13952:6;13872:93;:::i;:::-;13865:100;;13982:3;13975:10;;13854:137;;;;:::o;13997:412::-;;14177:93;14266:3;14257:6;14177:93;:::i;:::-;14170:100;;14280:75;14351:3;14342:6;14280:75;:::i;:::-;14380:2;14375:3;14371:12;14364:19;;14400:3;14393:10;;14159:250;;;;;:::o;14415:663::-;;14678:148;14822:3;14678:148;:::i;:::-;14671:155;;14836:75;14907:3;14898:6;14836:75;:::i;:::-;14936:2;14931:3;14927:12;14920:19;;14949:75;15020:3;15011:6;14949:75;:::i;:::-;15049:2;15044:3;15040:12;15033:19;;15069:3;15062:10;;14660:418;;;;;:::o;15084:222::-;;15215:2;15204:9;15200:18;15192:26;;15228:71;15296:1;15285:9;15281:17;15272:6;15228:71;:::i;:::-;15182:124;;;;:::o;15312:561::-;;15533:2;15522:9;15518:18;15510:26;;15546:71;15614:1;15603:9;15599:17;15590:6;15546:71;:::i;:::-;15627:88;15711:2;15700:9;15696:18;15687:6;15627:88;:::i;:::-;15762:9;15756:4;15752:20;15747:2;15736:9;15732:18;15725:48;15790:76;15861:4;15852:6;15790:76;:::i;:::-;15782:84;;15500:373;;;;;;:::o;15879:210::-;;16004:2;15993:9;15989:18;15981:26;;16017:65;16079:1;16068:9;16064:17;16055:6;16017:65;:::i;:::-;15971:118;;;;:::o;16095:222::-;;16226:2;16215:9;16211:18;16203:26;;16239:71;16307:1;16296:9;16292:17;16283:6;16239:71;:::i;:::-;16193:124;;;;:::o;16323:775::-;;16594:3;16583:9;16579:19;16571:27;;16608:71;16676:1;16665:9;16661:17;16652:6;16608:71;:::i;:::-;16689:72;16757:2;16746:9;16742:18;16733:6;16689:72;:::i;:::-;16771;16839:2;16828:9;16824:18;16815:6;16771:72;:::i;:::-;16853;16921:2;16910:9;16906:18;16897:6;16853:72;:::i;:::-;16935:73;17003:3;16992:9;16988:19;16979:6;16935:73;:::i;:::-;17018;17086:3;17075:9;17071:19;17062:6;17018:73;:::i;:::-;16561:537;;;;;;;;;:::o;17104:553::-;;17319:3;17308:9;17304:19;17296:27;;17333:71;17401:1;17390:9;17386:17;17377:6;17333:71;:::i;:::-;17414:72;17482:2;17471:9;17467:18;17458:6;17414:72;:::i;:::-;17496;17564:2;17553:9;17549:18;17540:6;17496:72;:::i;:::-;17578;17646:2;17635:9;17631:18;17622:6;17578:72;:::i;:::-;17286:371;;;;;;;:::o;17663:553::-;;17878:3;17867:9;17863:19;17855:27;;17892:71;17960:1;17949:9;17945:17;17936:6;17892:71;:::i;:::-;17973:72;18041:2;18030:9;18026:18;18017:6;17973:72;:::i;:::-;18055;18123:2;18112:9;18108:18;18099:6;18055:72;:::i;:::-;18137;18205:2;18194:9;18190:18;18181:6;18137:72;:::i;:::-;17845:371;;;;;;;:::o;18222:553::-;;18437:3;18426:9;18422:19;18414:27;;18451:71;18519:1;18508:9;18504:17;18495:6;18451:71;:::i;:::-;18532:72;18600:2;18589:9;18585:18;18576:6;18532:72;:::i;:::-;18614;18682:2;18671:9;18667:18;18658:6;18614:72;:::i;:::-;18696;18764:2;18753:9;18749:18;18740:6;18696:72;:::i;:::-;18404:371;;;;;;;:::o;18781:545::-;;18992:3;18981:9;18977:19;18969:27;;19006:71;19074:1;19063:9;19059:17;19050:6;19006:71;:::i;:::-;19087:68;19151:2;19140:9;19136:18;19127:6;19087:68;:::i;:::-;19165:72;19233:2;19222:9;19218:18;19209:6;19165:72;:::i;:::-;19247;19315:2;19304:9;19300:18;19291:6;19247:72;:::i;:::-;18959:367;;;;;;;:::o;19332:309::-;;19481:2;19470:9;19466:18;19458:26;;19530:9;19524:4;19520:20;19516:1;19505:9;19501:17;19494:47;19558:76;19629:4;19620:6;19558:76;:::i;:::-;19550:84;;19448:193;;;;:::o;19647:313::-;;19798:2;19787:9;19783:18;19775:26;;19847:9;19841:4;19837:20;19833:1;19822:9;19818:17;19811:47;19875:78;19948:4;19939:6;19875:78;:::i;:::-;19867:86;;19765:195;;;;:::o;19966:419::-;;20170:2;20159:9;20155:18;20147:26;;20219:9;20213:4;20209:20;20205:1;20194:9;20190:17;20183:47;20247:131;20373:4;20247:131;:::i;:::-;20239:139;;20137:248;;;:::o;20391:419::-;;20595:2;20584:9;20580:18;20572:26;;20644:9;20638:4;20634:20;20630:1;20619:9;20615:17;20608:47;20672:131;20798:4;20672:131;:::i;:::-;20664:139;;20562:248;;;:::o;20816:419::-;;21020:2;21009:9;21005:18;20997:26;;21069:9;21063:4;21059:20;21055:1;21044:9;21040:17;21033:47;21097:131;21223:4;21097:131;:::i;:::-;21089:139;;20987:248;;;:::o;21241:419::-;;21445:2;21434:9;21430:18;21422:26;;21494:9;21488:4;21484:20;21480:1;21469:9;21465:17;21458:47;21522:131;21648:4;21522:131;:::i;:::-;21514:139;;21412:248;;;:::o;21666:419::-;;21870:2;21859:9;21855:18;21847:26;;21919:9;21913:4;21909:20;21905:1;21894:9;21890:17;21883:47;21947:131;22073:4;21947:131;:::i;:::-;21939:139;;21837:248;;;:::o;22091:419::-;;22295:2;22284:9;22280:18;22272:26;;22344:9;22338:4;22334:20;22330:1;22319:9;22315:17;22308:47;22372:131;22498:4;22372:131;:::i;:::-;22364:139;;22262:248;;;:::o;22516:419::-;;22720:2;22709:9;22705:18;22697:26;;22769:9;22763:4;22759:20;22755:1;22744:9;22740:17;22733:47;22797:131;22923:4;22797:131;:::i;:::-;22789:139;;22687:248;;;:::o;22941:419::-;;23145:2;23134:9;23130:18;23122:26;;23194:9;23188:4;23184:20;23180:1;23169:9;23165:17;23158:47;23222:131;23348:4;23222:131;:::i;:::-;23214:139;;23112:248;;;:::o;23366:419::-;;23570:2;23559:9;23555:18;23547:26;;23619:9;23613:4;23609:20;23605:1;23594:9;23590:17;23583:47;23647:131;23773:4;23647:131;:::i;:::-;23639:139;;23537:248;;;:::o;23791:419::-;;23995:2;23984:9;23980:18;23972:26;;24044:9;24038:4;24034:20;24030:1;24019:9;24015:17;24008:47;24072:131;24198:4;24072:131;:::i;:::-;24064:139;;23962:248;;;:::o;24216:419::-;;24420:2;24409:9;24405:18;24397:26;;24469:9;24463:4;24459:20;24455:1;24444:9;24440:17;24433:47;24497:131;24623:4;24497:131;:::i;:::-;24489:139;;24387:248;;;:::o;24641:419::-;;24845:2;24834:9;24830:18;24822:26;;24894:9;24888:4;24884:20;24880:1;24869:9;24865:17;24858:47;24922:131;25048:4;24922:131;:::i;:::-;24914:139;;24812:248;;;:::o;25066:419::-;;25270:2;25259:9;25255:18;25247:26;;25319:9;25313:4;25309:20;25305:1;25294:9;25290:17;25283:47;25347:131;25473:4;25347:131;:::i;:::-;25339:139;;25237:248;;;:::o;25491:222::-;;25622:2;25611:9;25607:18;25599:26;;25635:71;25703:1;25692:9;25688:17;25679:6;25635:71;:::i;:::-;25589:124;;;;:::o;25719:332::-;;25878:2;25867:9;25863:18;25855:26;;25891:71;25959:1;25948:9;25944:17;25935:6;25891:71;:::i;:::-;25972:72;26040:2;26029:9;26025:18;26016:6;25972:72;:::i;:::-;25845:206;;;;;:::o;26057:218::-;;26186:2;26175:9;26171:18;26163:26;;26199:69;26265:1;26254:9;26250:17;26241:6;26199:69;:::i;:::-;26153:122;;;;:::o;26281:328::-;;26438:2;26427:9;26423:18;26415:26;;26451:69;26517:1;26506:9;26502:17;26493:6;26451:69;:::i;:::-;26530:72;26598:2;26587:9;26583:18;26574:6;26530:72;:::i;:::-;26405:204;;;;;:::o;26615:214::-;;26742:2;26731:9;26727:18;26719:26;;26755:67;26819:1;26808:9;26804:17;26795:6;26755:67;:::i;:::-;26709:120;;;;:::o;26835:278::-;;26901:2;26895:9;26885:19;;26943:4;26935:6;26931:17;27050:6;27038:10;27035:22;27014:18;27002:10;26999:34;26996:62;26993:2;;;27061:13;;:::i;:::-;26993:2;27096:10;27092:2;27085:22;26875:238;;;;:::o;27119:326::-;;27270:18;27262:6;27259:30;27256:2;;;27292:13;;:::i;:::-;27256:2;27372:4;27368:9;27361:4;27353:6;27349:17;27345:33;27337:41;;27433:4;27427;27423:15;27415:23;;27185:260;;;:::o;27451:98::-;;27536:5;27530:12;27520:22;;27509:40;;;:::o;27555:99::-;;27641:5;27635:12;27625:22;;27614:40;;;:::o;27660:168::-;;27777:6;27772:3;27765:19;27817:4;27812:3;27808:14;27793:29;;27755:73;;;;:::o;27834:147::-;;27972:3;27957:18;;27947:34;;;;:::o;27987:169::-;;28105:6;28100:3;28093:19;28145:4;28140:3;28136:14;28121:29;;28083:73;;;;:::o;28162:148::-;;28301:3;28286:18;;28276:34;;;;:::o;28316:96::-;;28382:24;28400:5;28382:24;:::i;:::-;28371:35;;28361:51;;;:::o;28418:104::-;;28492:24;28510:5;28492:24;:::i;:::-;28481:35;;28471:51;;;:::o;28528:90::-;;28605:5;28598:13;28591:21;28580:32;;28570:48;;;:::o;28624:77::-;;28690:5;28679:16;;28669:32;;;:::o;28707:126::-;;28784:42;28777:5;28773:54;28762:65;;28752:81;;;:::o;28839:77::-;;28905:5;28894:16;;28884:32;;;:::o;28922:93::-;;28998:10;28991:5;28987:22;28976:33;;28966:49;;;:::o;29021:86::-;;29096:4;29089:5;29085:16;29074:27;;29064:43;;;:::o;29113:154::-;29197:6;29192:3;29187;29174:30;29259:1;29250:6;29245:3;29241:16;29234:27;29164:103;;;:::o;29273:307::-;29341:1;29351:113;29365:6;29362:1;29359:13;29351:113;;;29450:1;29445:3;29441:11;29435:18;29431:1;29426:3;29422:11;29415:39;29387:2;29384:1;29380:10;29375:15;;29351:113;;;29482:6;29479:1;29476:13;29473:2;;;29562:1;29553:6;29548:3;29544:16;29537:27;29473:2;29322:258;;;;:::o;29586:100::-;;29654:26;29674:5;29654:26;:::i;:::-;29643:37;;29633:53;;;:::o;29692:79::-;;29760:5;29749:16;;29739:32;;;:::o;29777:94::-;;29845:20;29859:5;29845:20;:::i;:::-;29834:31;;29824:47;;;:::o;29877:48::-;29910:9;29931:102;;30023:2;30019:7;30014:2;30007:5;30003:14;29999:28;29989:38;;29979:54;;;:::o;30039:94::-;;30120:5;30116:2;30112:14;30091:35;;30081:52;;;:::o;30139:122::-;30212:24;30230:5;30212:24;:::i;:::-;30205:5;30202:35;30192:2;;30251:1;30248;30241:12;30192:2;30182:79;:::o;30267:122::-;30340:24;30358:5;30340:24;:::i;:::-;30333:5;30330:35;30320:2;;30379:1;30376;30369:12;30320:2;30310:79;:::o;30395:122::-;30468:24;30486:5;30468:24;:::i;:::-;30461:5;30458:35;30448:2;;30507:1;30504;30497:12;30448:2;30438:79;:::o;30523:120::-;30595:23;30612:5;30595:23;:::i;:::-;30588:5;30585:34;30575:2;;30633:1;30630;30623:12;30575:2;30565:78;:::o;30649:118::-;30720:22;30736:5;30720:22;:::i;:::-;30713:5;30710:33;30700:2;;30757:1;30754;30747:12;30700:2;30690:77;:::o

Swarm Source

ipfs://b911b04182f5e67b0e249b297546a1f7031f33b86d125c01139a28fe53c78456
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.