ETH Price: $3,121.57 (-0.54%)

Token

CryptoSpells:Guild (CSPL)
 

Overview

Max Total Supply

1,047 CSPL

Holders

147

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 CSPL
0x26b9619ced43f63c0db388d1ba5bb9808890f856
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CryptoSpells is a mobile card game where players can earn virtual currency by playing.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GuildAsset

Compiler Version
v0.5.5+commit.47a71e8f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-02
*/

// File: openzeppelin-solidity/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApprovalForAll}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApprovalForAll}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

// File: openzeppelin-solidity/contracts/drafts/Counters.sol

pragma solidity ^0.5.0;


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.5.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.5.0;








/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][to] = approved;
        emit ApprovalForAll(_msgSender(), to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransferFrom(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This function is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity ^0.5.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol

pragma solidity ^0.5.0;





/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {ERC721-_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity ^0.5.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Metadata.sol

pragma solidity ^0.5.0;





contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return _tokenURIs[tokenId];
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol

pragma solidity ^0.5.0;




/**
 * @title Full ERC721 Token
 * @dev This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology.
 *
 * See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
    constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/MinterRole.sol

pragma solidity ^0.5.0;



contract MinterRole is Context {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private _minters;

    constructor () internal {
        _addMinter(_msgSender());
    }

    modifier onlyMinter() {
        require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(_msgSender());
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol

pragma solidity ^0.5.0;



/**
 * @title ERC721Mintable
 * @dev ERC721 minting logic.
 */
contract ERC721Mintable is ERC721, MinterRole {
    /**
     * @dev Function to mint tokens.
     * @param to The address that will receive the minted token.
     * @param tokenId The token id to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function mint(address to, uint256 tokenId) public onlyMinter returns (bool) {
        _mint(to, tokenId);
        return true;
    }

    /**
     * @dev Function to safely mint tokens.
     * @param to The address that will receive the minted token.
     * @param tokenId The token id to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function safeMint(address to, uint256 tokenId) public onlyMinter returns (bool) {
        _safeMint(to, tokenId);
        return true;
    }

    /**
     * @dev Function to safely mint tokens.
     * @param to The address that will receive the minted token.
     * @param tokenId The token id to mint.
     * @param _data bytes data to send along with a safe transfer check.
     * @return A boolean that indicates if the operation was successful.
     */
    function safeMint(address to, uint256 tokenId, bytes memory _data) public onlyMinter returns (bool) {
        _safeMint(to, tokenId, _data);
        return true;
    }
}

// File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol

pragma solidity ^0.5.0;



contract PauserRole is Context {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(_msgSender());
    }

    modifier onlyPauser() {
        require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role");
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(_msgSender());
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.5.0;



/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
contract Pausable is Context, PauserRole {
    /**
     * @dev Emitted when the pause is triggered by a pauser (`account`).
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by a pauser (`account`).
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state. Assigns the Pauser role
     * to the deployer.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    /**
     * @dev Called by a pauser to pause, triggers stopped state.
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Called by a pauser to unpause, returns to normal state.
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Pausable.sol

pragma solidity ^0.5.0;



/**
 * @title ERC721 Non-Fungible Pausable token
 * @dev ERC721 modified with pausable transfers.
 */
contract ERC721Pausable is ERC721, Pausable {
    function approve(address to, uint256 tokenId) public whenNotPaused {
        super.approve(to, tokenId);
    }

    function setApprovalForAll(address to, bool approved) public whenNotPaused {
        super.setApprovalForAll(to, approved);
    }

    function _transferFrom(address from, address to, uint256 tokenId) internal whenNotPaused {
        super._transferFrom(from, to, tokenId);
    }
}

// File: contracts/GuildAsset.sol

pragma solidity ^0.5.5;




contract GuildAsset is ERC721Full, ERC721Mintable, ERC721Pausable {

    uint16 public constant GUILD_TYPE_OFFSET = 10000;
    uint16 public constant GUILD_RARITY_OFFSET = 1000;
    uint256 public constant SHARE_RATE_DECIMAL = 10**18;

    uint16 public constant LEGENDARY_RARITY = 3;
    uint16 public constant GOLD_RARITY = 2;
    uint16 public constant SILVER_RARITY = 1;

    uint16 public constant NO_GUILD = 0;

    string public tokenURIPrefix = "https://cryptospells.jp/metadata/guild/";

    mapping(uint16 => uint256) private guildTypeToTotalVolume;
    mapping(uint16 => uint256) private guildTypeToStockSupplyLimit;
    mapping(uint16 => mapping(uint16 => uint256)) private guildTypeAndRarityToStockSupply;
    mapping(uint16 => uint256[]) private guildTypeToGuildStockList;
    mapping(uint16 => uint256) private guildTypeToGuildStockIndex;
    mapping(uint16 => mapping(uint16 => uint256)) private guildTypeAndRarityToGuildStockCount;
    mapping(uint16 => uint256) private rarityToStockVolume;

    // ロックアップ期間用変数
    //mapping(uint256 => bool) private allowed;

    constructor() ERC721Full("CryptoSpells:Guild", "CSPL") public {
      rarityToStockVolume[LEGENDARY_RARITY] = 100;
      rarityToStockVolume[GOLD_RARITY] = 10;
      rarityToStockVolume[SILVER_RARITY] = 1;
      guildTypeToTotalVolume[NO_GUILD] = 0;
    }

    function setSupplyAndStock(
      uint16 _guildType, // 3桁。ギルドごと1つ
      uint256 _totalVolume,
      uint256 _stockSupplyLimit,
      uint256 legendarySupply,
      uint256 goldSupply,
      uint256 silverSupply
    ) external onlyMinter {
      require(_guildType != 0, "guildType 0 is noguild");
      require(_totalVolume != 0, "totalVolume must not be 0");
      //require(getMintedStockCount(_guildType) == 0, "This GuildType already exists");
      require(
        legendarySupply.mul(rarityToStockVolume[LEGENDARY_RARITY])
        .add(goldSupply.mul(rarityToStockVolume[GOLD_RARITY]))
        .add(silverSupply.mul(rarityToStockVolume[SILVER_RARITY]))
        == _totalVolume
      );
      require(
        legendarySupply
        .add(goldSupply)
        .add(silverSupply)
        == _stockSupplyLimit
      );
      guildTypeToTotalVolume[_guildType] = _totalVolume;
      guildTypeToStockSupplyLimit[_guildType] = _stockSupplyLimit;
      guildTypeAndRarityToStockSupply[_guildType][LEGENDARY_RARITY] = legendarySupply;
      guildTypeAndRarityToStockSupply[_guildType][GOLD_RARITY] = goldSupply;
      guildTypeAndRarityToStockSupply[_guildType][SILVER_RARITY] = silverSupply;
    }

    //    mapping(uint16 => uint16) private guildTypeToSupplyLimit;

    // ロックアップ期間用
    /*
    function approve(address _to, uint256 _tokenId) public {
      require(allowed[_tokenId]);
      super.approve(_to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public {
      require(allowed[_tokenId]);
      super.transferFrom(_from, _to, _tokenId);
    }

    function unLockToken(uint256 _tokenId) public onlyMinter {
      allowed[_tokenId] = true;
    }
    function canTransfer(uint256 _tokenId) public view returns (bool) {
      return allowed[_tokenId];
    }
    */

    function isAlreadyMinted(uint256 _tokenId) public view returns (bool) {
      return _exists(_tokenId);
    }

    function isValidGuildStock(uint256 _guildTokenId) public view {

      uint16 rarity = getRarity(_guildTokenId);
      require((rarityToStockVolume[rarity] > 0), "invalid rarityToStockVolume");

      uint16 guildType = getGuildType(_guildTokenId);
      require((guildTypeToTotalVolume[guildType] > 0), "invalid guildTypeToTotalVolume");

      uint256 serial = _guildTokenId % GUILD_TYPE_OFFSET;
      require(serial != 0, "invalid serial zero");
      require(serial <= guildTypeAndRarityToStockSupply[guildType][rarity], "invalid serial guildTypeAndRarityToStockSupply");
    }

    function getTotalVolume(uint16 _guildType) public view returns (uint256) {
      return guildTypeToTotalVolume[_guildType];
    }

    function getStockSupplyLimit(uint16 _guildType) public view returns (uint256) {
      return guildTypeToStockSupplyLimit[_guildType];
    }

    function getGuildType(uint256 _guildTokenId) public view returns (uint16) {
      uint16 _guildType = uint16((_guildTokenId.div(GUILD_TYPE_OFFSET)) % GUILD_RARITY_OFFSET);
      return _guildType;
    }

    function getRarity(uint256 _guildTokenId) public view returns (uint16) {
      return uint16(_guildTokenId.div(GUILD_TYPE_OFFSET).div(GUILD_RARITY_OFFSET) % 10);
    }

    function getMintedStockCount(uint16 _guildType) public view returns (uint256) {
      return guildTypeToGuildStockIndex[_guildType];
    }

    function getMintedStockCountByRarity(uint16 _guildType, uint16 _rarity) public view returns (uint256) {
      return guildTypeAndRarityToGuildStockCount[_guildType][_rarity];
    }

    function getStockSupplyByRarity(uint16 _guildType, uint16 _rarity) public view returns (uint256) {
      return guildTypeAndRarityToStockSupply[_guildType][_rarity];
    }

    function getMintedStockList(uint16 _guildType) public view returns (uint256[] memory) {
      return guildTypeToGuildStockList[_guildType];
    }

    function getStockVolumeByRarity(uint16 _rarity) public view returns (uint256) {
      return rarityToStockVolume[_rarity];
    }

    function getShareRateWithDecimal(uint256 _guildTokenId) public view returns (uint256, uint256) {
      return (
        getStockVolumeByRarity(getRarity(_guildTokenId))
          .mul(SHARE_RATE_DECIMAL)
          .div(getTotalVolume(getGuildType(_guildTokenId))),
        SHARE_RATE_DECIMAL
      );
    }


/*
    function setSupplyLimit(uint16 _guildType, uint16 _supplyLimit) external onlyMinter {
        require(_supplyLimit != 0);
        require(guildTypeToSupplyLimit[_guildType] == 0 || _supplyLimit < guildTypeToSupplyLimit[_guildType],
            "_supplyLimit is bigger");
        guildTypeToSupplyLimit[_guildType] = _supplyLimit;
    }
*/
    function setTokenURIPrefix(string calldata _tokenURIPrefix) external onlyMinter {
        tokenURIPrefix = _tokenURIPrefix;
    }
/*
    function getSupplyLimit(uint16 _guildType) public view returns (uint16) {
        return guildTypeToSupplyLimit[_guildType];
    }
*/
    function mintGuildStock(address _owner, uint256 _guildTokenId) public onlyMinter {
      // _guildStockがtokenId
      require(!isAlreadyMinted(_guildTokenId), "is Already Minted");

      // バリデーションチェック
      isValidGuildStock(_guildTokenId);

      //  supplyチェック
      uint16 _guildType = getGuildType(_guildTokenId);
      require(guildTypeToGuildStockIndex[_guildType] < guildTypeToStockSupplyLimit[_guildType]);
      uint16 rarity = getRarity(_guildTokenId);
      require(guildTypeAndRarityToGuildStockCount[_guildType][rarity] < guildTypeAndRarityToStockSupply[_guildType][rarity], "supply over");

      _mint(_owner, _guildTokenId);
      guildTypeToGuildStockList[_guildType].push(_guildTokenId);
      guildTypeToGuildStockIndex[_guildType]++;
      guildTypeAndRarityToGuildStockCount[_guildType][rarity]++;
    }
/*
    function mintGuildAsset(address _owner, uint256 _tokenId) public onlyMinter {
      // 200010001
        uint16 _guildType = uint16(_tokenId / GUILD_TYPE_OFFSET);
        uint16 _guildTypeIndex = uint16(_tokenId % GUILD_TYPE_OFFSET) - 1;
        require(_guildTypeIndex < guildTypeToSupplyLimit[_guildType], "supply over");
        _mint(_owner, _tokenId);
    }
*/

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        bytes32 tokenIdBytes;
        if (tokenId == 0) {
            tokenIdBytes = "0";
        } else {
            uint256 value = tokenId;
            while (value > 0) {
                tokenIdBytes = bytes32(uint256(tokenIdBytes) / (2 ** 8));
                tokenIdBytes |= bytes32(((value % 10) + 48) * 2 ** (8 * 31));
                value /= 10;
            }
        }

        bytes memory prefixBytes = bytes(tokenURIPrefix);
        bytes memory tokenURIBytes = new bytes(prefixBytes.length + tokenIdBytes.length);

        uint8 i;
        uint8 index = 0;

        for (i = 0; i < prefixBytes.length; i++) {
            tokenURIBytes[index] = prefixBytes[i];
            index++;
        }

        for (i = 0; i < tokenIdBytes.length; i++) {
            tokenURIBytes[index] = tokenIdBytes[i];
            index++;
        }

        return string(tokenURIBytes);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GUILD_RARITY_OFFSET","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"},{"name":"_rarity","type":"uint16"}],"name":"getStockSupplyByRarity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GUILD_TYPE_OFFSET","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"getShareRateWithDecimal","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GOLD_RARITY","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"isValidGuildStock","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getMintedStockList","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"getRarity","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rarity","type":"uint16"}],"name":"getStockVolumeByRarity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NO_GUILD","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_guildTokenId","type":"uint256"}],"name":"mintGuildStock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SHARE_RATE_DECIMAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"},{"name":"_rarity","type":"uint16"}],"name":"getMintedStockCountByRarity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getMintedStockCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isAlreadyMinted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"LEGENDARY_RARITY","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_guildType","type":"uint16"},{"name":"_totalVolume","type":"uint256"},{"name":"_stockSupplyLimit","type":"uint256"},{"name":"legendarySupply","type":"uint256"},{"name":"goldSupply","type":"uint256"},{"name":"silverSupply","type":"uint256"}],"name":"setSupplyAndStock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getStockSupplyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SILVER_RARITY","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildType","type":"uint16"}],"name":"getTotalVolume","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_guildTokenId","type":"uint256"}],"name":"getGuildType","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

60806040526040518060600160405280602781526020016200536f60279139600f908051906020019062000035929190620005cd565b503480156200004357600080fd5b506040518060400160405280601281526020017f43727970746f5370656c6c733a4775696c6400000000000000000000000000008152506040518060400160405280600481526020017f4353504c000000000000000000000000000000000000000000000000000000008152508181620000ca6301ffc9a760e01b6200023060201b60201c565b620000e26380ac58cd60e01b6200023060201b60201c565b620000fa63780e9d6360e01b6200023060201b60201c565b816009908051906020019062000112929190620005cd565b5080600a90805190602001906200012b929190620005cd565b5062000144635b5e139f60e01b6200023060201b60201c565b50505050620001686200015c6200033b60201b60201c565b6200034360201b60201c565b620001886200017c6200033b60201b60201c565b620003a460201b60201c565b6000600e60006101000a81548160ff021916908315150217905550606460166000600361ffff1661ffff16815260200190815260200160002081905550600a60166000600261ffff1661ffff16815260200190815260200160002081905550600160166000600161ffff1661ffff168152602001908152602001600020819055506000601060008061ffff1661ffff168152602001908152602001600020819055506200067c565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151515620002cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200035e81600c6200040560201b62003fa51790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b620003bf81600d6200040560201b62003fa51790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b620004178282620004eb60201b60201c565b1515156200048d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151562000576576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806200534d6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200061057805160ff191683800117855562000641565b8280016001018555821562000641579182015b828111156200064057825182559160200191906001019062000623565b5b50905062000650919062000654565b5090565b6200067991905b80821115620006755760008160009055506001016200065b565b5090565b90565b614cc1806200068c6000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c806370a082311161019d578063a1448194116100e9578063c87b56dd116100a2578063e985e9c51161007c578063e985e9c514611262578063fbb7fc6c146112de578063fbba7b6214611304578063fc044eb21461134a576102f1565b8063c87b56dd14611111578063d908c2fd146111b8578063dfe9b31f1461121c576102f1565b8063a144819414610e51578063a22cb46514610eb7578063aa271e1a14610f07578063b88d4fde14610f63578063bd7c40c714611068578063c0ac99831461108e576102f1565b806395d89b411161015657806398650275116101305780639865027514610d42578063988e4e2214610d4c57806399e0dd7c14610d925780639cc19bfb14610e0b576102f1565b806395d89b4114610c2757806397b388df14610caa578063983b2d5614610cfe576102f1565b806370a0823114610a185780637f6cc1a314610a7057806382dc1ec414610abe5780638456cb5914610b025780638832e6e314610b0c5780638c75065f14610c09576102f1565b80633f4ba83a1161025c57806348758697116102155780635c975abb116101ef5780635c975abb146109585780636352211e1461097a5780636db27957146109e85780636ef8d66d14610a0e576102f1565b806348758697146108865780634bc3ffef146108d05780634f6ccce714610916576102f1565b80633f4ba83a146106975780633f6fcc59146106a157806340c10f19146106cf57806342842e0e1461073557806343ec1724146107a357806346fbf68e1461082a576102f1565b806318160ddd116102ae57806318160ddd146105145780631ea7aabf146105325780631ee2ec931461055857806323b872dd146105a157806324e7a8841461060f5780632f745c5914610635576102f1565b806301ffc9a7146102f65780630563bdc61461035b57806306fdde0314610381578063081812fc14610404578063095ea7b3146104725780630d49ac7a146104c0575b600080fd5b6103416004803603602081101561030c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611394565b604051808215151515815260200191505060405180910390f35b6103636113fb565b604051808261ffff1661ffff16815260200191505060405180910390f35b610389611401565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104306004803603602081101561041a57600080fd5b81019080803590602001909291905050506114a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104be6004803603604081101561048857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611540565b005b6104fe600480360360408110156104d657600080fd5b81019080803561ffff169060200190929190803561ffff1690602001909291905050506115d3565b6040518082815260200191505060405180910390f35b61051c611612565b6040518082815260200191505060405180910390f35b61053a61161f565b604051808261ffff1661ffff16815260200191505060405180910390f35b6105846004803603602081101561056e57600080fd5b8101908080359060200190929190505050611625565b604051808381526020018281526020019250505060405180910390f35b61060d600480360360608110156105b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611687565b005b6106176116ff565b604051808261ffff1661ffff16815260200191505060405180910390f35b6106816004803603604081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611704565b6040518082815260200191505060405180910390f35b61069f6117c7565b005b6106cd600480360360208110156106b757600080fd5b8101908080359060200190929190505050611939565b005b61071b600480360360408110156106e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b9d565b604051808215151515815260200191505060405180910390f35b6107a16004803603606081101561074b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c1a565b005b6107d3600480360360208110156107b957600080fd5b81019080803561ffff169060200190929190505050611c3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108165780820151818401526020810190506107fb565b505050509050019250505060405180910390f35b61086c6004803603602081101561084057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cad565b604051808215151515815260200191505060405180910390f35b6108b26004803603602081101561089c57600080fd5b8101908080359060200190929190505050611cca565b604051808261ffff1661ffff16815260200191505060405180910390f35b610900600480360360208110156108e657600080fd5b81019080803561ffff169060200190929190505050611d10565b6040518082815260200191505060405180910390f35b6109426004803603602081101561092c57600080fd5b8101908080359060200190929190505050611d35565b6040518082815260200191505060405180910390f35b610960611db9565b604051808215151515815260200191505060405180910390f35b6109a66004803603602081101561099057600080fd5b8101908080359060200190929190505050611dd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f0611e9a565b604051808261ffff1661ffff16815260200191505060405180910390f35b610a16611e9f565b005b610a5a60048036036020811015610a2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611eb1565b6040518082815260200191505060405180910390f35b610abc60048036036040811015610a8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f88565b005b610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612277565b005b610b0a6122ea565b005b610bef60048036036060811015610b2257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610b6957600080fd5b820183602082011115610b7b57600080fd5b80359060200191846001830284011164010000000083111715610b9d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061245d565b604051808215151515815260200191505060405180910390f35b610c116124dc565b6040518082815260200191505060405180910390f35b610c2f6124e8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905090810190601f168015610c9c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ce860048036036040811015610cc057600080fd5b81019080803561ffff169060200190929190803561ffff16906020019092919050505061258a565b6040518082815260200191505060405180910390f35b610d4060048036036020811015610d1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c9565b005b610d4a61263c565b005b610d7c60048036036020811015610d6257600080fd5b81019080803561ffff16906020019092919050505061264e565b6040518082815260200191505060405180910390f35b610e0960048036036020811015610da857600080fd5b8101908080359060200190640100000000811115610dc557600080fd5b820183602082011115610dd757600080fd5b80359060200191846001830284011164010000000083111715610df957600080fd5b9091929391929390505050612673565b005b610e3760048036036020811015610e2157600080fd5b81019080803590602001909291905050506126f0565b604051808215151515815260200191505060405180910390f35b610e9d60048036036040811015610e6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612702565b604051808215151515815260200191505060405180910390f35b610f0560048036036040811015610ecd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061277f565b005b610f4960048036036020811015610f1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612812565b604051808215151515815260200191505060405180910390f35b61106660048036036080811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fe057600080fd5b820183602082011115610ff257600080fd5b8035906020019184600183028401116401000000008311171561101457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061282f565b005b6110706128a9565b604051808261ffff1661ffff16815260200191505060405180910390f35b6110966128ae565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110d65780820151818401526020810190506110bb565b50505050905090810190601f1680156111035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61113d6004803603602081101561112757600080fd5b810190808035906020019092919050505061294c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561117d578082015181840152602081019050611162565b50505050905090810190601f1680156111aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61121a600480360360c08110156111ce57600080fd5b81019080803561ffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612be9565b005b61124c6004803603602081101561123257600080fd5b81019080803561ffff169060200190929190505050612f2a565b6040518082815260200191505060405180910390f35b6112c46004803603604081101561127857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f4f565b604051808215151515815260200191505060405180910390f35b6112e6612fe3565b604051808261ffff1661ffff16815260200191505060405180910390f35b6113346004803603602081101561131a57600080fd5b81019080803561ffff169060200190929190505050612fe8565b6040518082815260200191505060405180910390f35b6113766004803603602081101561136057600080fd5b810190808035906020019092919050505061300d565b604051808261ffff1661ffff16815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6103e881565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b5050505050905090565b60006114ae82613045565b1515611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ba1602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60009054906101000a900460ff161515156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6115cf82826130b7565b5050565b6000601260008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6000600780549050905090565b61271081565b60008061167561163c6116378561300d565b612fe8565b611667670de0b6b3a764000061165961165488611cca565b611d10565b6132a290919063ffffffff16565b61332c90919063ffffffff16565b670de0b6b3a764000091509150915091565b611698611692613376565b8261337e565b15156116ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6116fa838383613474565b505050565b600281565b600061170f83611eb1565b82101515611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614999602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156117b457fe5b9060005260206000200154905092915050565b6117d76117d2613376565b611cad565b151561182e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118f6613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061194482611cca565b90506000601660008361ffff1661ffff168152602001908152602001600020541115156119d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f696e76616c696420726172697479546f53746f636b566f6c756d65000000000081525060200191505060405180910390fd5b60006119e48361300d565b90506000601060008361ffff1661ffff16815260200190815260200160002054111515611a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f696e76616c6964206775696c6454797065546f546f74616c566f6c756d65000081525060200191505060405180910390fd5b600061271061ffff1684811515611a8c57fe5b06905060008114151515611b08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642073657269616c207a65726f0000000000000000000000000081525060200191505060405180910390fd5b601260008361ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020548111151515611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614b52602e913960400191505060405180910390fd5b50505050565b6000611baf611baa613376565b612812565b1515611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611c108383613509565b6001905092915050565b611c358383836040518060200160405280600081525061282f565b505050565b6060601360008361ffff1661ffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611ca157602002820191906000526020600020905b815481526020019060010190808311611c8d575b50505050509050919050565b6000611cc382600d61352a90919063ffffffff16565b9050919050565b6000600a611cff6103e861ffff16611cf161271061ffff168661332c90919063ffffffff16565b61332c90919063ffffffff16565b811515611d0857fe5b069050919050565b6000601660008361ffff1661ffff168152602001908152602001600020549050919050565b6000611d3f611612565b82101515611d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614c6a602c913960400191505060405180910390fd5b600782815481101515611da757fe5b90600052602060002001549050919050565b6000600e60009054906101000a900460ff16905090565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ad86029913960400191505060405180910390fd5b80915050919050565b600081565b611eaf611eaa613376565b61360a565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614aae602a913960400191505060405180910390fd5b611f81600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613664565b9050919050565b611f98611f93613376565b612812565b1515611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611ff8816126f0565b15151561206d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f697320416c7265616479204d696e74656400000000000000000000000000000081525060200191505060405180910390fd5b61207681611939565b60006120818261300d565b9050601160008261ffff1661ffff16815260200190815260200160002054601460008361ffff1661ffff168152602001908152602001600020541015156120c757600080fd5b60006120d283611cca565b9050601260008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff16815260200190815260200160002054601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020541015156121b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f737570706c79206f76657200000000000000000000000000000000000000000081525060200191505060405180910390fd5b6121bd8484613509565b601360008361ffff1661ffff168152602001908152602001600020839080600181540180825580915050906001820390600052602060002001600090919290919091505550601460008361ffff1661ffff16815260200190815260200160002060008154809291906001019190505550601560008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff1681526020019081526020016000206000815480929190600101919050555050505050565b612287612282613376565b611cad565b15156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b6122e781613672565b50565b6122fa6122f5613376565b611cad565b1515612351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff161515156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861241a613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061246f61246a613376565b612812565b15156124c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6124d18484846136cc565b600190509392505050565b670de0b6b3a764000081565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125805780601f1061255557610100808354040283529160200191612580565b820191906000526020600020905b81548152906001019060200180831161256357829003601f168201915b5050505050905090565b6000601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6125d96125d4613376565b612812565b1515612630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6126398161373f565b50565b61264c612647613376565b613799565b565b6000601460008361ffff1661ffff168152602001908152602001600020549050919050565b61268361267e613376565b612812565b15156126da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b8181600f91906126eb9291906148c7565b505050565b60006126fb82613045565b9050919050565b600061271461270f613376565b612812565b151561276b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b61277583836137f3565b6001905092915050565b600e60009054906101000a900460ff16151515612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61280e8282613811565b5050565b600061282882600c61352a90919063ffffffff16565b9050919050565b61284061283a613376565b8361337e565b1515612897576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6128a3848484846139cb565b50505050565b600381565b600f8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129445780601f1061291957610100808354040283529160200191612944565b820191906000526020600020905b81548152906001019060200180831161292757829003601f168201915b505050505081565b6060600080831415612980577f300000000000000000000000000000000000000000000000000000000000000090506129f4565b60008390505b60008111156129f2576101008260001c81151561299f57fe5b0460001b91507f01000000000000000000000000000000000000000000000000000000000000006030600a838115156129d457fe5b06010260001b82179150600a818115156129ea57fe5b049050612986565b505b6060600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a8c5780601f10612a6157610100808354040283529160200191612a8c565b820191906000526020600020905b815481529060010190602001808311612a6f57829003601f168201915b505050505090506060602060ff168251016040519080825280601f01601f191660200182016040528015612acf5781602001600182028038833980820191505090505b50905060008060009050600091505b83518260ff161015612b5d57838260ff16815181101515612afb57fe5b90602001015160f81c60f81b838260ff16815181101515612b1857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612ade565b600091505b602060ff168260ff161015612bdc57848260ff16602081101515612b8257fe5b1a60f81b838260ff16815181101515612b9757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612b62565b8295505050505050919050565b612bf9612bf4613376565b612812565b1515612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b60008661ffff1614151515612ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6775696c64547970652030206973206e6f6775696c640000000000000000000081525060200191505060405180910390fd5b60008514151515612d46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f74616c566f6c756d65206d757374206e6f7420626520300000000000000081525060200191505060405180910390fd5b84612df6612d7960166000600161ffff1661ffff16815260200190815260200160002054846132a290919063ffffffff16565b612de8612dab60166000600261ffff1661ffff16815260200190815260200160002054876132a290919063ffffffff16565b612dda60166000600361ffff1661ffff16815260200190815260200160002054896132a290919063ffffffff16565b613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e0257600080fd5b83612e2882612e1a8587613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e3457600080fd5b84601060008861ffff1661ffff1681526020019081526020016000208190555083601160008861ffff1661ffff1681526020019081526020016000208190555082601260008861ffff1661ffff1681526020019081526020016000206000600361ffff1661ffff1681526020019081526020016000208190555081601260008861ffff1661ffff1681526020019081526020016000206000600261ffff1661ffff1681526020019081526020016000208190555080601260008861ffff1661ffff1681526020019081526020016000206000600161ffff1661ffff16815260200190815260200160002081905550505050505050565b6000601160008361ffff1661ffff168152602001908152602001600020549050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b6000601060008361ffff1661ffff168152602001908152602001600020549050919050565b6000806103e861ffff1661303061271061ffff168561332c90919063ffffffff16565b81151561303957fe5b06905080915050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60006130c282611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561314b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c186021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661316a613376565b73ffffffffffffffffffffffffffffffffffffffff161480613199575061319881613193613376565b612f4f565b5b15156131f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180614a766038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000808314156132b55760009050613326565b600082840290508284828115156132c857fe5b04141515613321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b806021913960400191505060405180910390fd5b809150505b92915050565b600061336e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ac9565b905092915050565b600033905090565b600061338982613045565b15156133e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a4a602c913960400191505060405180910390fd5b60006133eb83611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061345a57508373ffffffffffffffffffffffffffffffffffffffff16613442846114a3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061346b575061346a8185612f4f565b5b91505092915050565b600e60009054906101000a900460ff161515156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b613504838383613b93565b505050565b6135138282613bb7565b61351d8282613dd3565b61352681613e9a565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614bcd6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61361e81600d613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b600081600001549050919050565b61368681600d613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6136d68383613509565b6136e36000848484614082565b151561373a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b505050565b61375381600c613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6137ad81600c613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b61380d8282604051806020016040528060008152506136cc565b5050565b613819613376565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b80600460006138c9613376565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613976613376565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6139d6848484613474565b6139e284848484614082565b1515613a39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b50505050565b6000808284019050838110151515613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831182901515613b77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3c578082015181840152602081019050613b21565b50505050905090810190601f168015613b695780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385811515613b8557fe5b049050809150509392505050565b613b9e838383614274565b613ba883826144d3565b613bb28282613dd3565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613c5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613c6581613045565b151515613cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613d73600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b613ef0828261352a565b1515613f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b316021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b613faf828261352a565b151515614024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006140a38473ffffffffffffffffffffffffffffffffffffffff1661468d565b15156140b2576001905061426c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a026140d8613376565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614194578082015181840152602081019050614179565b50505050905090810190601f1680156141c15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156141e357600080fd5b505af11580156141f7573d6000803e3d6000fd5b505050506040513d602081101561420d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661429482611dd0565b73ffffffffffffffffffffffffffffffffffffffff16141515614302576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614bef6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561438a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a266024913960400191505060405180910390fd5b614393816146d8565b6143da600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614798565b614421600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061452b6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506147bb90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114151561461e576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561459c57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156145f657fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036146709190614947565b5050505050565b6001816000016000828254019250508190555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156146cf5750808214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156147955760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6147b0600182600001546147bb90919063ffffffff16565b816000018190555050565b60006147fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614805565b905092915050565b600083831115829015156148b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561487957808201518184015260208101905061485e565b50505050905090810190601f1680156148a65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061490857803560ff1916838001178555614936565b82800160010185558215614936579182015b8281111561493557823582559160200191906001019061491a565b5b5090506149439190614973565b5090565b81548183558181111561496e5781836000526020600020918201910161496d9190614973565b5b505050565b61499591905b80821115614991576000816000905550600101614979565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65696e76616c69642073657269616c206775696c6454797065416e64526172697479546f53746f636b537570706c79536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a165627a7a723058208621c890ff02e1f83cda02751cfd862fe6da1477ae8f33196b2a6971360a18dc0029526f6c65733a206163636f756e7420697320746865207a65726f206164647265737368747470733a2f2f63727970746f7370656c6c732e6a702f6d657461646174612f6775696c642f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102f15760003560e01c806370a082311161019d578063a1448194116100e9578063c87b56dd116100a2578063e985e9c51161007c578063e985e9c514611262578063fbb7fc6c146112de578063fbba7b6214611304578063fc044eb21461134a576102f1565b8063c87b56dd14611111578063d908c2fd146111b8578063dfe9b31f1461121c576102f1565b8063a144819414610e51578063a22cb46514610eb7578063aa271e1a14610f07578063b88d4fde14610f63578063bd7c40c714611068578063c0ac99831461108e576102f1565b806395d89b411161015657806398650275116101305780639865027514610d42578063988e4e2214610d4c57806399e0dd7c14610d925780639cc19bfb14610e0b576102f1565b806395d89b4114610c2757806397b388df14610caa578063983b2d5614610cfe576102f1565b806370a0823114610a185780637f6cc1a314610a7057806382dc1ec414610abe5780638456cb5914610b025780638832e6e314610b0c5780638c75065f14610c09576102f1565b80633f4ba83a1161025c57806348758697116102155780635c975abb116101ef5780635c975abb146109585780636352211e1461097a5780636db27957146109e85780636ef8d66d14610a0e576102f1565b806348758697146108865780634bc3ffef146108d05780634f6ccce714610916576102f1565b80633f4ba83a146106975780633f6fcc59146106a157806340c10f19146106cf57806342842e0e1461073557806343ec1724146107a357806346fbf68e1461082a576102f1565b806318160ddd116102ae57806318160ddd146105145780631ea7aabf146105325780631ee2ec931461055857806323b872dd146105a157806324e7a8841461060f5780632f745c5914610635576102f1565b806301ffc9a7146102f65780630563bdc61461035b57806306fdde0314610381578063081812fc14610404578063095ea7b3146104725780630d49ac7a146104c0575b600080fd5b6103416004803603602081101561030c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611394565b604051808215151515815260200191505060405180910390f35b6103636113fb565b604051808261ffff1661ffff16815260200191505060405180910390f35b610389611401565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104306004803603602081101561041a57600080fd5b81019080803590602001909291905050506114a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104be6004803603604081101561048857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611540565b005b6104fe600480360360408110156104d657600080fd5b81019080803561ffff169060200190929190803561ffff1690602001909291905050506115d3565b6040518082815260200191505060405180910390f35b61051c611612565b6040518082815260200191505060405180910390f35b61053a61161f565b604051808261ffff1661ffff16815260200191505060405180910390f35b6105846004803603602081101561056e57600080fd5b8101908080359060200190929190505050611625565b604051808381526020018281526020019250505060405180910390f35b61060d600480360360608110156105b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611687565b005b6106176116ff565b604051808261ffff1661ffff16815260200191505060405180910390f35b6106816004803603604081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611704565b6040518082815260200191505060405180910390f35b61069f6117c7565b005b6106cd600480360360208110156106b757600080fd5b8101908080359060200190929190505050611939565b005b61071b600480360360408110156106e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b9d565b604051808215151515815260200191505060405180910390f35b6107a16004803603606081101561074b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c1a565b005b6107d3600480360360208110156107b957600080fd5b81019080803561ffff169060200190929190505050611c3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108165780820151818401526020810190506107fb565b505050509050019250505060405180910390f35b61086c6004803603602081101561084057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cad565b604051808215151515815260200191505060405180910390f35b6108b26004803603602081101561089c57600080fd5b8101908080359060200190929190505050611cca565b604051808261ffff1661ffff16815260200191505060405180910390f35b610900600480360360208110156108e657600080fd5b81019080803561ffff169060200190929190505050611d10565b6040518082815260200191505060405180910390f35b6109426004803603602081101561092c57600080fd5b8101908080359060200190929190505050611d35565b6040518082815260200191505060405180910390f35b610960611db9565b604051808215151515815260200191505060405180910390f35b6109a66004803603602081101561099057600080fd5b8101908080359060200190929190505050611dd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f0611e9a565b604051808261ffff1661ffff16815260200191505060405180910390f35b610a16611e9f565b005b610a5a60048036036020811015610a2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611eb1565b6040518082815260200191505060405180910390f35b610abc60048036036040811015610a8657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f88565b005b610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612277565b005b610b0a6122ea565b005b610bef60048036036060811015610b2257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610b6957600080fd5b820183602082011115610b7b57600080fd5b80359060200191846001830284011164010000000083111715610b9d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061245d565b604051808215151515815260200191505060405180910390f35b610c116124dc565b6040518082815260200191505060405180910390f35b610c2f6124e8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905090810190601f168015610c9c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ce860048036036040811015610cc057600080fd5b81019080803561ffff169060200190929190803561ffff16906020019092919050505061258a565b6040518082815260200191505060405180910390f35b610d4060048036036020811015610d1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c9565b005b610d4a61263c565b005b610d7c60048036036020811015610d6257600080fd5b81019080803561ffff16906020019092919050505061264e565b6040518082815260200191505060405180910390f35b610e0960048036036020811015610da857600080fd5b8101908080359060200190640100000000811115610dc557600080fd5b820183602082011115610dd757600080fd5b80359060200191846001830284011164010000000083111715610df957600080fd5b9091929391929390505050612673565b005b610e3760048036036020811015610e2157600080fd5b81019080803590602001909291905050506126f0565b604051808215151515815260200191505060405180910390f35b610e9d60048036036040811015610e6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612702565b604051808215151515815260200191505060405180910390f35b610f0560048036036040811015610ecd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061277f565b005b610f4960048036036020811015610f1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612812565b604051808215151515815260200191505060405180910390f35b61106660048036036080811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fe057600080fd5b820183602082011115610ff257600080fd5b8035906020019184600183028401116401000000008311171561101457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061282f565b005b6110706128a9565b604051808261ffff1661ffff16815260200191505060405180910390f35b6110966128ae565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110d65780820151818401526020810190506110bb565b50505050905090810190601f1680156111035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61113d6004803603602081101561112757600080fd5b810190808035906020019092919050505061294c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561117d578082015181840152602081019050611162565b50505050905090810190601f1680156111aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61121a600480360360c08110156111ce57600080fd5b81019080803561ffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612be9565b005b61124c6004803603602081101561123257600080fd5b81019080803561ffff169060200190929190505050612f2a565b6040518082815260200191505060405180910390f35b6112c46004803603604081101561127857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f4f565b604051808215151515815260200191505060405180910390f35b6112e6612fe3565b604051808261ffff1661ffff16815260200191505060405180910390f35b6113346004803603602081101561131a57600080fd5b81019080803561ffff169060200190929190505050612fe8565b6040518082815260200191505060405180910390f35b6113766004803603602081101561136057600080fd5b810190808035906020019092919050505061300d565b604051808261ffff1661ffff16815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6103e881565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114995780601f1061146e57610100808354040283529160200191611499565b820191906000526020600020905b81548152906001019060200180831161147c57829003601f168201915b5050505050905090565b60006114ae82613045565b1515611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ba1602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60009054906101000a900460ff161515156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6115cf82826130b7565b5050565b6000601260008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6000600780549050905090565b61271081565b60008061167561163c6116378561300d565b612fe8565b611667670de0b6b3a764000061165961165488611cca565b611d10565b6132a290919063ffffffff16565b61332c90919063ffffffff16565b670de0b6b3a764000091509150915091565b611698611692613376565b8261337e565b15156116ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6116fa838383613474565b505050565b600281565b600061170f83611eb1565b82101515611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614999602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156117b457fe5b9060005260206000200154905092915050565b6117d76117d2613376565b611cad565b151561182e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118f6613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061194482611cca565b90506000601660008361ffff1661ffff168152602001908152602001600020541115156119d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f696e76616c696420726172697479546f53746f636b566f6c756d65000000000081525060200191505060405180910390fd5b60006119e48361300d565b90506000601060008361ffff1661ffff16815260200190815260200160002054111515611a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f696e76616c6964206775696c6454797065546f546f74616c566f6c756d65000081525060200191505060405180910390fd5b600061271061ffff1684811515611a8c57fe5b06905060008114151515611b08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642073657269616c207a65726f0000000000000000000000000081525060200191505060405180910390fd5b601260008361ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020548111151515611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614b52602e913960400191505060405180910390fd5b50505050565b6000611baf611baa613376565b612812565b1515611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611c108383613509565b6001905092915050565b611c358383836040518060200160405280600081525061282f565b505050565b6060601360008361ffff1661ffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611ca157602002820191906000526020600020905b815481526020019060010190808311611c8d575b50505050509050919050565b6000611cc382600d61352a90919063ffffffff16565b9050919050565b6000600a611cff6103e861ffff16611cf161271061ffff168661332c90919063ffffffff16565b61332c90919063ffffffff16565b811515611d0857fe5b069050919050565b6000601660008361ffff1661ffff168152602001908152602001600020549050919050565b6000611d3f611612565b82101515611d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614c6a602c913960400191505060405180910390fd5b600782815481101515611da757fe5b90600052602060002001549050919050565b6000600e60009054906101000a900460ff16905090565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ad86029913960400191505060405180910390fd5b80915050919050565b600081565b611eaf611eaa613376565b61360a565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614aae602a913960400191505060405180910390fd5b611f81600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613664565b9050919050565b611f98611f93613376565b612812565b1515611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b611ff8816126f0565b15151561206d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f697320416c7265616479204d696e74656400000000000000000000000000000081525060200191505060405180910390fd5b61207681611939565b60006120818261300d565b9050601160008261ffff1661ffff16815260200190815260200160002054601460008361ffff1661ffff168152602001908152602001600020541015156120c757600080fd5b60006120d283611cca565b9050601260008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff16815260200190815260200160002054601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020541015156121b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f737570706c79206f76657200000000000000000000000000000000000000000081525060200191505060405180910390fd5b6121bd8484613509565b601360008361ffff1661ffff168152602001908152602001600020839080600181540180825580915050906001820390600052602060002001600090919290919091505550601460008361ffff1661ffff16815260200190815260200160002060008154809291906001019190505550601560008361ffff1661ffff16815260200190815260200160002060008261ffff1661ffff1681526020019081526020016000206000815480929190600101919050555050505050565b612287612282613376565b611cad565b15156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b6122e781613672565b50565b6122fa6122f5613376565b611cad565b1515612351576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806149f66030913960400191505060405180910390fd5b600e60009054906101000a900460ff161515156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861241a613376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061246f61246a613376565b612812565b15156124c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6124d18484846136cc565b600190509392505050565b670de0b6b3a764000081565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125805780601f1061255557610100808354040283529160200191612580565b820191906000526020600020905b81548152906001019060200180831161256357829003601f168201915b5050505050905090565b6000601560008461ffff1661ffff16815260200190815260200160002060008361ffff1661ffff16815260200190815260200160002054905092915050565b6125d96125d4613376565b612812565b1515612630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b6126398161373f565b50565b61264c612647613376565b613799565b565b6000601460008361ffff1661ffff168152602001908152602001600020549050919050565b61268361267e613376565b612812565b15156126da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b8181600f91906126eb9291906148c7565b505050565b60006126fb82613045565b9050919050565b600061271461270f613376565b612812565b151561276b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b61277583836137f3565b6001905092915050565b600e60009054906101000a900460ff16151515612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61280e8282613811565b5050565b600061282882600c61352a90919063ffffffff16565b9050919050565b61284061283a613376565b8361337e565b1515612897576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c396031913960400191505060405180910390fd5b6128a3848484846139cb565b50505050565b600381565b600f8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129445780601f1061291957610100808354040283529160200191612944565b820191906000526020600020905b81548152906001019060200180831161292757829003601f168201915b505050505081565b6060600080831415612980577f300000000000000000000000000000000000000000000000000000000000000090506129f4565b60008390505b60008111156129f2576101008260001c81151561299f57fe5b0460001b91507f01000000000000000000000000000000000000000000000000000000000000006030600a838115156129d457fe5b06010260001b82179150600a818115156129ea57fe5b049050612986565b505b6060600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a8c5780601f10612a6157610100808354040283529160200191612a8c565b820191906000526020600020905b815481529060010190602001808311612a6f57829003601f168201915b505050505090506060602060ff168251016040519080825280601f01601f191660200182016040528015612acf5781602001600182028038833980820191505090505b50905060008060009050600091505b83518260ff161015612b5d57838260ff16815181101515612afb57fe5b90602001015160f81c60f81b838260ff16815181101515612b1857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612ade565b600091505b602060ff168260ff161015612bdc57848260ff16602081101515612b8257fe5b1a60f81b838260ff16815181101515612b9757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150508180600101925050612b62565b8295505050505050919050565b612bf9612bf4613376565b612812565b1515612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614b016030913960400191505060405180910390fd5b60008661ffff1614151515612ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6775696c64547970652030206973206e6f6775696c640000000000000000000081525060200191505060405180910390fd5b60008514151515612d46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f74616c566f6c756d65206d757374206e6f7420626520300000000000000081525060200191505060405180910390fd5b84612df6612d7960166000600161ffff1661ffff16815260200190815260200160002054846132a290919063ffffffff16565b612de8612dab60166000600261ffff1661ffff16815260200190815260200160002054876132a290919063ffffffff16565b612dda60166000600361ffff1661ffff16815260200190815260200160002054896132a290919063ffffffff16565b613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e0257600080fd5b83612e2882612e1a8587613a3f90919063ffffffff16565b613a3f90919063ffffffff16565b141515612e3457600080fd5b84601060008861ffff1661ffff1681526020019081526020016000208190555083601160008861ffff1661ffff1681526020019081526020016000208190555082601260008861ffff1661ffff1681526020019081526020016000206000600361ffff1661ffff1681526020019081526020016000208190555081601260008861ffff1661ffff1681526020019081526020016000206000600261ffff1661ffff1681526020019081526020016000208190555080601260008861ffff1661ffff1681526020019081526020016000206000600161ffff1661ffff16815260200190815260200160002081905550505050505050565b6000601160008361ffff1661ffff168152602001908152602001600020549050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b6000601060008361ffff1661ffff168152602001908152602001600020549050919050565b6000806103e861ffff1661303061271061ffff168561332c90919063ffffffff16565b81151561303957fe5b06905080915050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60006130c282611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561314b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614c186021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661316a613376565b73ffffffffffffffffffffffffffffffffffffffff161480613199575061319881613193613376565b612f4f565b5b15156131f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180614a766038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000808314156132b55760009050613326565b600082840290508284828115156132c857fe5b04141515613321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b806021913960400191505060405180910390fd5b809150505b92915050565b600061336e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ac9565b905092915050565b600033905090565b600061338982613045565b15156133e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a4a602c913960400191505060405180910390fd5b60006133eb83611dd0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061345a57508373ffffffffffffffffffffffffffffffffffffffff16613442846114a3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061346b575061346a8185612f4f565b5b91505092915050565b600e60009054906101000a900460ff161515156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b613504838383613b93565b505050565b6135138282613bb7565b61351d8282613dd3565b61352681613e9a565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614bcd6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61361e81600d613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b600081600001549050919050565b61368681600d613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6136d68383613509565b6136e36000848484614082565b151561373a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b505050565b61375381600c613fa590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6137ad81600c613ee690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b61380d8282604051806020016040528060008152506136cc565b5050565b613819613376565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b80600460006138c9613376565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613976613376565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6139d6848484613474565b6139e284848484614082565b1515613a39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806149c46032913960400191505060405180910390fd5b50505050565b6000808284019050838110151515613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831182901515613b77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3c578082015181840152602081019050613b21565b50505050905090810190601f168015613b695780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385811515613b8557fe5b049050809150509392505050565b613b9e838383614274565b613ba883826144d3565b613bb28282613dd3565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613c5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613c6581613045565b151515613cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613d73600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b613ef0828261352a565b1515613f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b316021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b613faf828261352a565b151515614024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006140a38473ffffffffffffffffffffffffffffffffffffffff1661468d565b15156140b2576001905061426c565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a026140d8613376565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614194578082015181840152602081019050614179565b50505050905090810190601f1680156141c15780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156141e357600080fd5b505af11580156141f7573d6000803e3d6000fd5b505050506040513d602081101561420d57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661429482611dd0565b73ffffffffffffffffffffffffffffffffffffffff16141515614302576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614bef6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561438a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a266024913960400191505060405180910390fd5b614393816146d8565b6143da600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614798565b614421600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614677565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061452b6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506147bb90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114151561461e576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561459c57fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156145f657fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036146709190614947565b5050505050565b6001816000016000828254019250508190555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156146cf5750808214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156147955760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6147b0600182600001546147bb90919063ffffffff16565b816000018190555050565b60006147fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614805565b905092915050565b600083831115829015156148b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561487957808201518184015260208101905061485e565b50505050905090810190601f1680156148a65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061490857803560ff1916838001178555614936565b82800160010185558215614936579182015b8281111561493557823582559160200191906001019061491a565b5b5090506149439190614973565b5090565b81548183558181111561496e5781836000526020600020918201910161496d9190614973565b5b505050565b61499591905b80821115614991576000816000905550600101614979565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65696e76616c69642073657269616c206775696c6454797065416e64526172697479546f53746f636b537570706c79536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a165627a7a723058208621c890ff02e1f83cda02751cfd862fe6da1477ae8f33196b2a6971360a18dc0029

Deployed Bytecode Sourcemap

53483:8737:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53483:8737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16518:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16518:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53613:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43535:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43535:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21488:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21488:204:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53001:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53001:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58526:173;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58526:173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35160:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53558:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59000:313;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59000:313:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;23171:292;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23171:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53779:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34769:232;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34769:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52610:120;;;:::i;:::-;;56910:592;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56910:592:0;;;;;;;;;;;;;;;;;:::i;:::-;;48507:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48507:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24125:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24125:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58707:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58707:147:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;58707:147:0;;;;;;;;;;;;;;;;;50081:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50081:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58011:169;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58011:169:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58862:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58862:130:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35602:199;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35602:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51817:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20111:228;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20111:228:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53873:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50298:79;;;:::i;:::-;;19674:211;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19674:211:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59960:875;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59960:875:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50198:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50198:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;52397:118;;;:::i;:::-;;49371:170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49371:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;49371:170:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;49371:170:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;49371:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;49371:170:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53669:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43735:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43735:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58336:182;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58336:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47585:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47585:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;47685:79;;;:::i;:::-;;58188:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58188:140:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59677:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59677:131:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;59677:131:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;59677:131:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;59677:131:0;;;;;;;;;;;;:::i;:::-;;56791:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56791:111:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;48898:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48898:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53121:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53121:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47468:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47468:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24996:272;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;24996:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24996:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24996:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24996:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24996:272:0;;;;;;;;;;;;;;;:::i;:::-;;53729:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53917:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;53917:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61225:990;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61225:990:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;61225:990:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54880:1243;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;54880:1243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57649:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57649:141:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22577:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22577:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53824:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57510:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57510:131:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57798:205;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57798:205:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16518:135;16588:4;16612:20;:33;16633:11;16612:33;;;;;;;;;;;;;;;;;;;;;;;;;;;16605:40;;16518:135;;;:::o;53613:49::-;53658:4;53613:49;:::o;43535:85::-;43574:13;43607:5;43600:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43535:85;:::o;21488:204::-;21547:7;21575:16;21583:7;21575;:16::i;:::-;21567:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21660:15;:24;21676:7;21660:24;;;;;;;;;;;;;;;;;;;;;21653:31;;21488:204;;;:::o;53001:112::-;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53079:26;53093:2;53097:7;53079:13;:26::i;:::-;53001:112;;:::o;58526:173::-;58614:7;58639:31;:43;58671:10;58639:43;;;;;;;;;;;;;;;:52;58683:7;58639:52;;;;;;;;;;;;;;;;58632:59;;58526:173;;;;:::o;35160:96::-;35204:7;35231:10;:17;;;;35224:24;;35160:96;:::o;53558:48::-;53601:5;53558:48;:::o;59000:313::-;59077:7;59086;59122:145;59223:43;59238:27;59251:13;59238:12;:27::i;:::-;59223:14;:43::i;:::-;59122:84;53714:6;59122:48;59145:24;59155:13;59145:9;:24::i;:::-;59122:22;:48::i;:::-;:64;;:84;;;;:::i;:::-;:100;;:145;;;;:::i;:::-;53714:6;59104:201;;;;59000:313;;;:::o;23171:292::-;23315:41;23334:12;:10;:12::i;:::-;23348:7;23315:18;:41::i;:::-;23307:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23423:32;23437:4;23443:2;23447:7;23423:13;:32::i;:::-;23171:292;;;:::o;53779:38::-;53816:1;53779:38;:::o;34769:232::-;34849:7;34885:16;34895:5;34885:9;:16::i;:::-;34877:5;:24;34869:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34967:12;:19;34980:5;34967:19;;;;;;;;;;;;;;;34987:5;34967:26;;;;;;;;;;;;;;;;;;34960:33;;34769:232;;;;:::o;52610:120::-;49978:22;49987:12;:10;:12::i;:::-;49978:8;:22::i;:::-;49970:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52253:7;;;;;;;;;;;52245:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52679:5;52669:7;;:15;;;;;;;;;;;;;;;;;;52700:22;52709:12;:10;:12::i;:::-;52700:22;;;;;;;;;;;;;;;;;;;;;;52610:120::o;56910:592::-;56983:13;56999:24;57009:13;56999:9;:24::i;:::-;56983:40;;57071:1;57041:19;:27;57061:6;57041:27;;;;;;;;;;;;;;;;:31;57032:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57116:16;57135:27;57148:13;57135:12;:27::i;:::-;57116:46;;57216:1;57180:22;:33;57203:9;57180:33;;;;;;;;;;;;;;;;:37;57171:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57264:14;53601:5;57281:33;;:13;:33;;;;;;;;57264:50;;57341:1;57331:6;:11;;57323:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57393:31;:42;57425:9;57393:42;;;;;;;;;;;;;;;:50;57436:6;57393:50;;;;;;;;;;;;;;;;57383:6;:60;;57375:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56910:592;;;;:::o;48507:135::-;48577:4;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48594:18;48600:2;48604:7;48594:5;:18::i;:::-;48630:4;48623:11;;48507:135;;;;:::o;24125:134::-;24212:39;24229:4;24235:2;24239:7;24212:39;;;;;;;;;;;;:16;:39::i;:::-;24125:134;;;:::o;58707:147::-;58775:16;58809:25;:37;58835:10;58809:37;;;;;;;;;;;;;;;58802:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58707:147;;;:::o;50081:109::-;50137:4;50161:21;50174:7;50161:8;:12;;:21;;;;:::i;:::-;50154:28;;50081:109;;;:::o;58011:169::-;58074:6;58169:2;58105:61;53658:4;58105:61;;:36;53601:5;58105:36;;:13;:17;;:36;;;;:::i;:::-;:40;;:61;;;;:::i;:::-;:66;;;;;;;;58091:81;;58011:169;;;:::o;58862:130::-;58931:7;58956:19;:28;58976:7;58956:28;;;;;;;;;;;;;;;;58949:35;;58862:130;;;:::o;35602:199::-;35660:7;35696:13;:11;:13::i;:::-;35688:5;:21;35680:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35776:10;35787:5;35776:17;;;;;;;;;;;;;;;;;;35769:24;;35602:199;;;:::o;51817:78::-;51856:4;51880:7;;;;;;;;;;;51873:14;;51817:78;:::o;20111:228::-;20166:7;20186:13;20202:11;:20;20214:7;20202:20;;;;;;;;;;;;;;;;;;;;;20186:36;;20258:1;20241:19;;:5;:19;;;;20233:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20326:5;20319:12;;;20111:228;;;:::o;53873:35::-;53907:1;53873:35;:::o;50298:79::-;50342:27;50356:12;:10;:12::i;:::-;50342:13;:27::i;:::-;50298:79::o;19674:211::-;19729:7;19774:1;19757:19;;:5;:19;;;;19749:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19843:34;:17;:24;19861:5;19843:24;;;;;;;;;;;;;;;:32;:34::i;:::-;19836:41;;19674:211;;;:::o;59960:875::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60091:30;60107:13;60091:15;:30::i;:::-;60090:31;60082:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60198:32;60216:13;60198:17;:32::i;:::-;60271:17;60291:27;60304:13;60291:12;:27::i;:::-;60271:47;;60376:27;:39;60404:10;60376:39;;;;;;;;;;;;;;;;60335:26;:38;60362:10;60335:38;;;;;;;;;;;;;;;;:80;60327:89;;;;;;;;60425:13;60441:24;60451:13;60441:9;:24::i;:::-;60425:40;;60540:31;:43;60572:10;60540:43;;;;;;;;;;;;;;;:51;60584:6;60540:51;;;;;;;;;;;;;;;;60482:35;:47;60518:10;60482:47;;;;;;;;;;;;;;;:55;60530:6;60482:55;;;;;;;;;;;;;;;;:109;60474:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60618:28;60624:6;60632:13;60618:5;:28::i;:::-;60655:25;:37;60681:10;60655:37;;;;;;;;;;;;;;;60698:13;60655:57;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;60655:57:0;;;;;;;;;;;;;;;;;;;;;;60721:26;:38;60748:10;60721:38;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;60770:35;:47;60806:10;60770:47;;;;;;;;;;;;;;;:55;60818:6;60770:55;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;47451:1;;59960:875;;:::o;50198:92::-;49978:22;49987:12;:10;:12::i;:::-;49978:8;:22::i;:::-;49970:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50263:19;50274:7;50263:10;:19::i;:::-;50198:92;:::o;52397:118::-;49978:22;49987:12;:10;:12::i;:::-;49978:8;:22::i;:::-;49970:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52467:4;52457:7;;:14;;;;;;;;;;;;;;;;;;52487:20;52494:12;:10;:12::i;:::-;52487:20;;;;;;;;;;;;;;;;;;;;;;52397:118::o;49371:170::-;49465:4;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49482:29;49492:2;49496:7;49505:5;49482:9;:29::i;:::-;49529:4;49522:11;;49371:170;;;;;:::o;53669:51::-;53714:6;53669:51;:::o;43735:89::-;43776:13;43809:7;43802:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43735:89;:::o;58336:182::-;58429:7;58454:35;:47;58490:10;58454:47;;;;;;;;;;;;;;;:56;58502:7;58454:56;;;;;;;;;;;;;;;;58447:63;;58336:182;;;;:::o;47585:92::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47650:19;47661:7;47650:10;:19::i;:::-;47585:92;:::o;47685:79::-;47729:27;47743:12;:10;:12::i;:::-;47729:13;:27::i;:::-;47685:79::o;58188:140::-;58257:7;58282:26;:38;58309:10;58282:38;;;;;;;;;;;;;;;;58275:45;;58188:140;;;:::o;59677:131::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59785:15;;59768:14;:32;;;;;;;:::i;:::-;;59677:131;;:::o;56791:111::-;56855:4;56877:17;56885:8;56877:7;:17::i;:::-;56870:24;;56791:111;;;:::o;48898:143::-;48972:4;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48989:22;48999:2;49003:7;48989:9;:22::i;:::-;49029:4;49022:11;;48898:143;;;;:::o;53121:131::-;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53207;53231:2;53235:8;53207:23;:37::i;:::-;53121:131;;:::o;47468:109::-;47524:4;47548:21;47561:7;47548:8;:12;;:21;;;;:::i;:::-;47541:28;;47468:109;;;:::o;24996:272::-;25111:41;25130:12;:10;:12::i;:::-;25144:7;25111:18;:41::i;:::-;25103:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25217:43;25235:4;25241:2;25245:7;25254:5;25217:17;:43::i;:::-;24996:272;;;;:::o;53729:43::-;53771:1;53729:43;:::o;53917:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61225:990::-;61281:13;61307:20;61353:1;61342:7;:12;61338:351;;;61371:18;;;61338:351;;;61422:13;61438:7;61422:23;;61460:218;61475:1;61467:5;:9;61460:218;;;61545:6;61528:12;61520:21;;:32;;;;;;;;61512:41;;61497:56;;61618:13;61612:2;61606;61598:5;:10;;;;;;;;61597:17;61596:35;61588:44;;61572:60;;;;61660:2;61651:11;;;;;;;;;;;61460:218;;;61338:351;;61701:24;61734:14;61701:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61760:26;61820:19;61799:40;;:11;:18;:40;61789:51;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;61789:51:0;;;;61760:80;;61853:7;61871:11;61885:1;61871:15;;61908:1;61904:5;;61899:127;61915:11;:18;61911:1;:22;;;61899:127;;;61978:11;61990:1;61978:14;;;;;;;;;;;;;;;;;;;;;61955:13;61969:5;61955:20;;;;;;;;;;;;;;;;:37;;;;;;;;;;;62007:7;;;;;;;61935:3;;;;;;;61899:127;;;62047:1;62043:5;;62038:129;62054:19;62050:23;;:1;:23;;;62038:129;;;62118:12;62131:1;62118:15;;;;;;;;;;;;;;62095:13;62109:5;62095:20;;;;;;;;;;;;;;;;:38;;;;;;;;;;;62148:7;;;;;;;62075:3;;;;;;;62038:129;;;62193:13;62179:28;;;;;;;61225:990;;;:::o;54880:1243::-;47365:22;47374:12;:10;:12::i;:::-;47365:8;:22::i;:::-;47357:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55174:1;55160:10;:15;;;;55152:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55235:1;55219:12;:17;;55211:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55585:12;55382:190;55519:52;55536:19;:34;53863:1;55536:34;;;;;;;;;;;;;;;;55519:12;:16;;:52;;;;:::i;:::-;55382:122;55455:48;55470:19;:32;53816:1;55470:32;;;;;;;;;;;;;;;;55455:10;:14;;:48;;;;:::i;:::-;55382:58;55402:19;:37;53771:1;55402:37;;;;;;;;;;;;;;;;55382:15;:19;;:58;;;;:::i;:::-;:72;;:122;;;;:::i;:::-;:136;;:190;;;;:::i;:::-;:215;55364:242;;;;;;;;55715:17;55633:69;55689:12;55633:41;55663:10;55633:15;:29;;:41;;;;:::i;:::-;:55;;:69;;;;:::i;:::-;:99;55615:126;;;;;;;;55787:12;55750:22;:34;55773:10;55750:34;;;;;;;;;;;;;;;:49;;;;55850:17;55808:27;:39;55836:10;55808:39;;;;;;;;;;;;;;;:59;;;;55940:15;55876:31;:43;55908:10;55876:43;;;;;;;;;;;;;;;:61;53771:1;55876:61;;;;;;;;;;;;;;;:79;;;;56023:10;55964:31;:43;55996:10;55964:43;;;;;;;;;;;;;;;:56;53816:1;55964:56;;;;;;;;;;;;;;;:69;;;;56103:12;56042:31;:43;56074:10;56042:43;;;;;;;;;;;;;;;:58;53863:1;56042:58;;;;;;;;;;;;;;;:73;;;;54880:1243;;;;;;:::o;57649:141::-;57718:7;57743:27;:39;57771:10;57743:39;;;;;;;;;;;;;;;;57736:46;;57649:141;;;:::o;22577:147::-;22657:4;22681:18;:25;22700:5;22681:25;;;;;;;;;;;;;;;:35;22707:8;22681:35;;;;;;;;;;;;;;;;;;;;;;;;;22674:42;;22577:147;;;;:::o;53824:40::-;53863:1;53824:40;:::o;57510:131::-;57574:7;57599:22;:34;57622:10;57599:34;;;;;;;;;;;;;;;;57592:41;;57510:131;;;:::o;57798:205::-;57864:6;57881:17;53658:4;57908:60;;57909:36;53601:5;57909:36;;:13;:17;;:36;;;;:::i;:::-;57908:60;;;;;;;;57881:88;;57985:10;57978:17;;;57798:205;;;:::o;26461:155::-;26518:4;26535:13;26551:11;:20;26563:7;26551:20;;;;;;;;;;;;;;;;;;;;;26535:36;;26606:1;26589:19;;:5;:19;;;;26582:26;;;26461:155;;;:::o;20770:425::-;20834:13;20850:16;20858:7;20850;:16::i;:::-;20834:32;;20891:5;20885:11;;:2;:11;;;;20877:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20971:5;20955:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20980:37;20997:5;21004:12;:10;:12::i;:::-;20980:16;:37::i;:::-;20955:62;20947:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21141:2;21114:15;:24;21130:7;21114:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;21179:7;21175:2;21159:28;;21168:5;21159:28;;;;;;;;;;;;20770:425;;;:::o;7697:471::-;7755:7;8005:1;8000;:6;7996:47;;;8030:1;8023:8;;;;7996:47;8055:9;8071:1;8067;:5;8055:17;;8100:1;8095;8091;:5;;;;;;;;:10;8083:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8159:1;8152:8;;;7697:471;;;;;:::o;8636:132::-;8694:7;8721:39;8725:1;8728;8721:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8714:46;;8636:132;;;;:::o;866:98::-;911:15;946:10;939:17;;866:98;:::o;26986:333::-;27071:4;27096:16;27104:7;27096;:16::i;:::-;27088:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27172:13;27188:16;27196:7;27188;:16::i;:::-;27172:32;;27234:5;27223:16;;:7;:16;;;:51;;;;27267:7;27243:31;;:20;27255:7;27243:11;:20::i;:::-;:31;;;27223:51;:87;;;;27278:32;27295:5;27302:7;27278:16;:32::i;:::-;27223:87;27215:96;;;26986:333;;;;:::o;53260:146::-;52054:7;;;;;;;;;;;52053:8;52045:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53360:38;53380:4;53386:2;53390:7;53360:19;:38::i;:::-;53260:146;;;:::o;36695:202::-;36759:24;36771:2;36775:7;36759:11;:24::i;:::-;36796:40;36824:2;36828:7;36796:27;:40::i;:::-;36849;36881:7;36849:31;:40::i;:::-;36695:202;;:::o;46725:203::-;46797:4;46841:1;46822:21;;:7;:21;;;;46814:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46900:4;:11;;:20;46912:7;46900:20;;;;;;;;;;;;;;;;;;;;;;;;;46893:27;;46725:203;;;;:::o;50515:130::-;50575:24;50591:7;50575:8;:15;;:24;;;;:::i;:::-;50629:7;50615:22;;;;;;;;;;;;50515:130;:::o;15189:114::-;15254:7;15281;:14;;;15274:21;;15189:114;;;:::o;50385:122::-;50442:21;50455:7;50442:8;:12;;:21;;;;:::i;:::-;50491:7;50479:20;;;;;;;;;;;;50385:122;:::o;28576:242::-;28664:18;28670:2;28674:7;28664:5;:18::i;:::-;28701:54;28732:1;28736:2;28740:7;28749:5;28701:22;:54::i;:::-;28693:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28576:242;;;:::o;47772:122::-;47829:21;47842:7;47829:8;:12;;:21;;;;:::i;:::-;47878:7;47866:20;;;;;;;;;;;;47772:122;:::o;47902:130::-;47962:24;47978:7;47962:8;:15;;:24;;;;:::i;:::-;48016:7;48002:22;;;;;;;;;;;;47902:130;:::o;27860:102::-;27928:26;27938:2;27942:7;27928:26;;;;;;;;;;;;:9;:26::i;:::-;27860:102;;:::o;21993:254::-;22079:12;:10;:12::i;:::-;22073:18;;:2;:18;;;;22065:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22173:8;22134:18;:32;22153:12;:10;:12::i;:::-;22134:32;;;;;;;;;;;;;;;:36;22167:2;22134:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;22226:2;22197:42;;22212:12;:10;:12::i;:::-;22197:42;;;22230:8;22197:42;;;;;;;;;;;;;;;;;;;;;;21993:254;;:::o;25987:272::-;26097:32;26111:4;26117:2;26121:7;26097:13;:32::i;:::-;26148:48;26171:4;26177:2;26181:7;26190:5;26148:22;:48::i;:::-;26140:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25987:272;;;;:::o;6325:181::-;6383:7;6403:9;6419:1;6415;:5;6403:17;;6444:1;6439;:6;;6431:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6497:1;6490:8;;;6325:181;;;;:::o;9298:345::-;9384:7;9483:1;9479;:5;9486:12;9471:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9471:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9510:9;9526:1;9522;:5;;;;;;;;9510:17;;9634:1;9627:8;;;9298:345;;;;;:::o;36185:245::-;36271:38;36291:4;36297:2;36301:7;36271:19;:38::i;:::-;36322:47;36355:4;36361:7;36322:32;:47::i;:::-;36382:40;36410:2;36414:7;36382:27;:40::i;:::-;36185:245;;;:::o;29071:335::-;29157:1;29143:16;;:2;:16;;;;29135:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29216:16;29224:7;29216;:16::i;:::-;29215:17;29207:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29301:2;29278:11;:20;29290:7;29278:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;29314:33;:17;:21;29332:2;29314:21;;;;;;;;;;;;;;;:31;:33::i;:::-;29390:7;29386:2;29365:33;;29382:1;29365:33;;;;;;;;;;;;29071:335;;:::o;38192:186::-;38306:12;:16;38319:2;38306:16;;;;;;;;;;;;;;;:23;;;;38277:17;:26;38295:7;38277:26;;;;;;;;;;;:52;;;;38340:12;:16;38353:2;38340:16;;;;;;;;;;;;;;;38362:7;38340:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38340:30:0;;;;;;;;;;;;;;;;;;;;;;38192:186;;:::o;38579:164::-;38683:10;:17;;;;38656:15;:24;38672:7;38656:24;;;;;;;;;;;:44;;;;38711:10;38727:7;38711:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38711:24:0;;;;;;;;;;;;;;;;;;;;;;38579:164;:::o;46447:183::-;46527:18;46531:4;46537:7;46527:3;:18::i;:::-;46519:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46617:5;46594:4;:11;;:20;46606:7;46594:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;46447:183;;:::o;46189:178::-;46267:18;46271:4;46277:7;46267:3;:18::i;:::-;46266:19;46258:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46355:4;46332;:11;;:20;46344:7;46332:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;46189:178;;:::o;31743:358::-;31865:4;31892:15;:2;:13;;;:15::i;:::-;31891:16;31887:60;;;31931:4;31924:11;;;;31887:60;31959:13;31991:2;31975:36;;;32012:12;:10;:12::i;:::-;32026:4;32032:7;32041:5;31975:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31975:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31975:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31975:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31975:72:0;;;;;;;;;;;;;;;;31959:88;;17875:10;32076:16;;32066:26;;;:6;:26;;;;32058:35;;;31743:358;;;;;;;:::o;30682:459::-;30796:4;30776:24;;:16;30784:7;30776;:16::i;:::-;:24;;;30768:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30879:1;30865:16;;:2;:16;;;;30857:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30935:23;30950:7;30935:14;:23::i;:::-;30971:35;:17;:23;30989:4;30971:23;;;;;;;;;;;;;;;:33;:35::i;:::-;31017:33;:17;:21;31035:2;31017:21;;;;;;;;;;;;;;;:31;:33::i;:::-;31086:2;31063:11;:20;31075:7;31063:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;31125:7;31121:2;31106:27;;31115:4;31106:27;;;;;;;;;;;;30682:459;;;:::o;39370:1148::-;39636:22;39661:32;39691:1;39661:12;:18;39674:4;39661:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;39636:57;;39704:18;39725:17;:26;39743:7;39725:26;;;;;;;;;;;;39704:47;;39872:14;39858:10;:28;;39854:328;;;39903:19;39925:12;:18;39938:4;39925:18;;;;;;;;;;;;;;;39944:14;39925:34;;;;;;;;;;;;;;;;;;39903:56;;40009:11;39976:12;:18;39989:4;39976:18;;;;;;;;;;;;;;;39995:10;39976:30;;;;;;;;;;;;;;;;;:44;;;;40126:10;40093:17;:30;40111:11;40093:30;;;;;;;;;;;:43;;;;39854:328;;40271:12;:18;40284:4;40271:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;39370:1148;;;;:::o;15311:91::-;15393:1;15375:7;:14;;;:19;;;;;;;;;;;15311:91;:::o;11558:810::-;11618:4;12071:16;12098:19;12120:66;12098:88;;;;12289:7;12277:20;12265:32;;12329:3;12317:15;;:8;:15;;:42;;;;;12348:11;12336:8;:23;;12317:42;12309:51;;;;11558:810;;;:::o;32269:175::-;32369:1;32333:38;;:15;:24;32349:7;32333:24;;;;;;;;;;;;;;;;;;;;;:38;;;;32329:108;;;32423:1;32388:15;:24;32404:7;32388:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32329:108;32269:175;:::o;15410:110::-;15491:21;15510:1;15491:7;:14;;;:18;;:21;;;;:::i;:::-;15474:7;:14;;:38;;;;15410:110;:::o;6781:136::-;6839:7;6866:43;6870:1;6873;6866:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6859:50;;6781:136;;;;:::o;7254:192::-;7340:7;7373:1;7368;:6;;7376:12;7360:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7360:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7400:9;7416:1;7412;:5;7400:17;;7437:1;7430:8;;;7254:192;;;;;:::o;53483:8737::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://8621c890ff02e1f83cda02751cfd862fe6da1477ae8f33196b2a6971360a18dc
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.