ETH Price: $3,168.31 (+1.97%)

Token

The Ninja Hideout (TNH)
 

Overview

Max Total Supply

8,888 TNH

Holders

3,451

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0xagree.eth
Balance
2 TNH
0xd57f5d1c30de1d45149bc2d9cf528374d17f10ab
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Ninja Hideout conceals 8,888 unique, randomized Ninjas as collectible NFTs on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheNinjaHideout

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 17 of 17: TheNinjaHideout.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC721.sol";
import "./Ownable.sol";

contract TheNinjaHideout is ERC721, Ownable {
    using Strings for uint256;

    uint256 public constant MAX_NINJAS = 8888;
    uint256 public reservedNinjas = 88;
    uint256 public presaleSupply = 2500;
    uint256 public mintPrice = 0.05 ether;
    uint256 public presaleMintcap = 2;
    uint256 public mintCap = 5;

    // Withdrawal addresses
    address public constant ADD = 0xa64b407D4363E203F682f7D95eB13241B039E580;

    bool public preSale;
    bool public publicSale;
    bool public revealed;

    uint256 public reservedMintedAmount;

    mapping(address => bool) public presalerList;
    mapping(address => uint256) public presalerListPurchases;

    string public defaultURI =
        "https://theninjahideout.mypinata.cloud/ipfs/QmfJc4PfhvUjxRYjiAvR72AecnikbRoySknGGrawuWrzn1";

    constructor(string memory baseURI) ERC721("The Ninja Hideout", "TNH") {
        setBaseURI(baseURI);
    }

    function addToPresaleList(address[] calldata entries) external onlyOwner {
        for (uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            require(!presalerList[entry], "DUPLICATE_ENTRY");

            presalerList[entry] = true;
        }
    }

    function removeFromPresaleList(address[] calldata entries)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");

            presalerList[entry] = false;
        }
    }

    function gift(address[] calldata receivers) external onlyOwner {
        require(totalSupply() + receivers.length <= MAX_NINJAS, "MAX_MINT");
        // require(
        //     reservedMintedAmount + receivers.length <= reservedNinjas,
        //     "GIFTS_EMPTY"
        // );
        require(receivers.length <= reservedNinjas, "No reserved ninjas left");

        for (uint256 i = 0; i < receivers.length; i++) {
            reservedNinjas--;
            _safeMint(receivers[i], totalSupply());
        }
    }

    function mintPreSale(uint256 num) public payable returns (bool) {
        uint256 currentSupply = totalSupply();
        require(preSale, "The pre-sale has NOT started, please wait.");
        require(presalerList[msg.sender], "Not qualified for presale");
        require(
            presalerListPurchases[msg.sender] + num <= presaleMintcap,
            "Exceeded presale allocation"
        );
        require(
            currentSupply + num <= MAX_NINJAS - reservedNinjas,
            "Exceeding total supply"
        );
        require(
            currentSupply + num <= presaleSupply,
            "Exceeding presale supply."
        );
        require(msg.value >= mintPrice * num, "Ether sent is not sufficient.");
        require(!_isContract(msg.sender), "Caller cannot be contract");


        for (uint256 i = 0; i < num; i++) {
            presalerListPurchases[msg.sender]++;
            uint256 tokenIndex = totalSupply();
            if (tokenIndex < MAX_NINJAS) _safeMint(_msgSender(), tokenIndex);
        }

        return true;
    }

    function mintPublicSale(uint256 num) public payable returns (bool) {
        uint256 currentSupply = totalSupply();
        require(publicSale, "The public sale has NOT started, please wait.");
        require(num <= mintCap, "You are trying to mint too many.");
        require(
            currentSupply + num <= MAX_NINJAS - reservedNinjas,
            "Exceeding total supply"
        );
        require(msg.value >= num * mintPrice, "Ether sent is not sufficient.");
        require(!_isContract(msg.sender), "Caller cannot be contract");


        for (uint256 i = 0; i < num; i++) {
            presalerListPurchases[msg.sender]++;
            uint256 tokenIndex = totalSupply();
            if (tokenIndex < MAX_NINJAS) _safeMint(_msgSender(), tokenIndex);
        }

        return true;
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            for (uint256 i; i < tokenCount; i++) {
                result[i] = tokenOfOwnerByIndex(_owner, i);
            }
            return result;
        }
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(tokenId < totalSupply(), "Token not exist.");

        // show default image before reveal
        if (!revealed) {
            return defaultURI;
        }

        string memory _tokenURI = _tokenUriMapping[tokenId];

        //return tokenURI if it is set
        if (bytes(_tokenURI).length > 0) {
            return _tokenURI;
        }

        tokenId += 1;
        //If tokenURI is not set, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(baseURI(), tokenId.toString(), ".json"));
    }

    /*
     * Only the owner can do these things
     */
    function togglePublicSale() public onlyOwner {
        publicSale = !publicSale;
    }

    function togglePresale() public onlyOwner {
        preSale = !preSale;
    }

    function toggleReveal() public onlyOwner {
        revealed = !revealed;
    }

    function setDefaultURI(string memory _defaultURI) public onlyOwner {
        defaultURI = _defaultURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        _setBaseURI(_newBaseURI);
    }

    function setTokenURI(uint256 tokenId, string memory _tokenURI)
        public
        onlyOwner
    {
        _setTokenURI(tokenId, _tokenURI);
    }

    function setPresaleSupply(uint256 _presaleSupply) public onlyOwner {
        presaleSupply = _presaleSupply;
    }

    function setPreSalePrice(uint256 _newPrice) public onlyOwner {
        mintPrice = _newPrice;
    }

    function setMintCap(uint256 _mintCap) public onlyOwner {
        mintCap = _mintCap;
    }

    function setPresaleMintCap(uint256 _presaleMintCap) public onlyOwner {
        presaleMintcap = _presaleMintCap;
    }

    function withdrawAll() public payable onlyOwner {
        //withdraw half
        require(
            payable(ADD).send(address(this).balance),
            "Withdraw Unsuccessful"
        );
    }

    function isWhiteListed(address entry) external view returns (bool) {
        return presalerList[entry];
    }

    function _isContract(address _addr) internal view returns (bool) {
        uint32 _size;
        assembly {
            _size := extcodesize(_addr)
        }
        return (_size > 0);
    }
}

File 1 of 17: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is 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.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 17: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 17: EnumerableMap.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./EnumerableSet.sol";

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    using EnumerableSet for EnumerableSet.Bytes32Set;

    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct Map {
        // Storage of keys
        EnumerableSet.Bytes32Set _keys;
        mapping(bytes32 => bytes32) _values;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(
        Map storage map,
        bytes32 key,
        bytes32 value
    ) private returns (bool) {
        map._values[key] = value;
        return map._keys.add(key);
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        delete map._values[key];
        return map._keys.remove(key);
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._keys.contains(key);
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._keys.length();
    }

    /**
     * @dev Returns the key-value pair stored at position `index` in the map. O(1).
     *
     * Note that there are no guarantees on the ordering of entries inside the
     * array, and it may change when more entries are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        bytes32 key = map._keys.at(index);
        return (key, map._values[key]);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        bytes32 value = map._values[key];
        if (value == bytes32(0)) {
            return (_contains(map, key), bytes32(0));
        } else {
            return (true, value);
        }
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key");
        return value;
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(
        Map storage map,
        bytes32 key,
        string memory errorMessage
    ) private view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), errorMessage);
        return value;
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        UintToAddressMap storage map,
        uint256 key,
        address value
    ) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        UintToAddressMap storage map,
        uint256 key,
        string memory errorMessage
    ) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

File 4 of 17: EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 5 of 17: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 6 of 17: ERC165Storage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC165.sol";

/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _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 virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 7 of 17: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Receiver.sol";
import "./ERC165Storage.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./EnumerableSet.sol";
import "./EnumerableMap.sol";
import "./Strings.sol";

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165Storage, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // 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 holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) internal _tokenUriMapping;

    // Base URI
    string private _baseURI;

    /*
     *     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 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     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;

    /*
     *     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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public virtual view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenUriMapping[tokenId];

        // If there is no base URI, return the token URI.
        if (bytes(_baseURI).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(_baseURI, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(_baseURI, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        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"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    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 Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenUriMapping[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @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)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

File 8 of 17: ERC721Holder.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721Receiver.sol";

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

File 9 of 17: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.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 10 of 17: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 11 of 17: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 12 of 17: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 17: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 14 of 17: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 15 of 17: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 16 of 17: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NINJAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintPreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMintcap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedNinjas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_defaultURI","type":"string"}],"name":"setDefaultURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCap","type":"uint256"}],"name":"setMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleMintCap","type":"uint256"}],"name":"setPresaleMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleSupply","type":"uint256"}],"name":"setPresaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526058600c556109c4600d5566b1a2bc2ec50000600e556002600f5560056010556040518060800160405280605a815260200162006460605a9139601590805190602001906200005592919062000438565b503480156200006357600080fd5b50604051620064ba380380620064ba83398181016040528101906200008991906200055a565b6040518060400160405280601181526020017f546865204e696e6a6120486964656f75740000000000000000000000000000008152506040518060400160405280600381526020017f544e48000000000000000000000000000000000000000000000000000000000081525081600790805190602001906200010d92919062000438565b5080600890805190602001906200012692919062000438565b506200013f6380ac58cd60e01b620001a960201b60201c565b62000157635b5e139f60e01b620001a960201b60201c565b6200016f63780e9d6360e01b620001a960201b60201c565b505062000191620001856200028160201b60201c565b6200028960201b60201c565b620001a2816200034f60201b60201c565b5062000804565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000215576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200020c90620005ed565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200035f6200028160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000385620003f260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d5906200060f565b60405180910390fd5b620003ef816200041c60201b60201c565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600a90805190602001906200043492919062000438565b5050565b8280546200044690620006d7565b90600052602060002090601f0160209004810192826200046a5760008555620004b6565b82601f106200048557805160ff1916838001178555620004b6565b82800160010185558215620004b6579182015b82811115620004b557825182559160200191906001019062000498565b5b509050620004c59190620004c9565b5090565b5b80821115620004e4576000816000905550600101620004ca565b5090565b6000620004ff620004f9846200065a565b62000631565b9050828152602081018484840111156200051857600080fd5b62000525848285620006a1565b509392505050565b600082601f8301126200053f57600080fd5b815162000551848260208601620004e8565b91505092915050565b6000602082840312156200056d57600080fd5b600082015167ffffffffffffffff8111156200058857600080fd5b62000596848285016200052d565b91505092915050565b6000620005ae601c8362000690565b9150620005bb82620007b2565b602082019050919050565b6000620005d560208362000690565b9150620005e282620007db565b602082019050919050565b6000602082019050818103600083015262000608816200059f565b9050919050565b600060208201905081810360008301526200062a81620005c6565b9050919050565b60006200063d62000650565b90506200064b82826200070d565b919050565b6000604051905090565b600067ffffffffffffffff82111562000678576200067762000772565b5b6200068382620007a1565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620006c1578082015181840152602081019050620006a4565b83811115620006d1576000848401525b50505050565b60006002820490506001821680620006f057607f821691505b6020821081141562000707576200070662000743565b5b50919050565b6200071882620007a1565b810181811067ffffffffffffffff821117156200073a576200073962000772565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b615c4c80620008146000396000f3fe6080604052600436106102ff5760003560e01c806370a0823111610190578063a22cb465116100dc578063c81d60bd11610095578063da1b9e081161006f578063da1b9e0814610b6b578063e222c7f914610b94578063e985e9c514610bab578063f2fde38b14610be8576102ff565b8063c81d60bd14610ad8578063c87b56dd14610b03578063d08afb4214610b40576102ff565b8063a22cb465146109d9578063b179e06014610a02578063b3a196e914610a2b578063b88d4fde14610a56578063b96502cb14610a7f578063b988477214610aa8576102ff565b8063853828b6116101495780639bf80316116101235780639bf803161461090b5780639cf2e8d6146109485780639ec9986b14610985578063a06f269b146109b0576102ff565b8063853828b6146108ab5780638da5cb5b146108b557806395d89b41146108e0576102ff565b806370a082311461079d578063715018a6146107da5780637204a3c9146107f157806376c71ca11461081a5780637d7eee42146108455780638462151c1461086e576102ff565b806342842e0e1161024f5780635a7adf7f116102085780636817c76c116101e25780636817c76c146106df5780636c0360eb1461070a5780636f9170f6146107355780637018d29814610772576102ff565b80635a7adf7f146106605780635b8ad4291461068b5780636352211e146106a2576102ff565b806342842e0e1461054b5780634f6ccce71461057457806351830227146105b157806355f804b3146105dc578063562f9e47146106055780635a5e5d5814610630576102ff565b806318160ddd116102bc57806333bc1c5c1161029657806333bc1c5c146104b557806334393743146104e05780633a367a67146104f75780634070a0c914610522576102ff565b806318160ddd1461042457806323b872dd1461044f5780632f745c5914610478576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a9578063162094c4146103d2578063163e1e61146103fb575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190614315565b610c11565b6040516103389190614afd565b60405180910390f35b34801561034d57600080fd5b50610356610c88565b6040516103639190614b18565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e91906143a8565b610d1a565b6040516103a09190614a74565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190614294565b610d9f565b005b3480156103de57600080fd5b506103f960048036038101906103f491906143d1565b610eb7565b005b34801561040757600080fd5b50610422600480360381019061041d91906142d0565b610f41565b005b34801561043057600080fd5b506104396110fb565b6040516104469190614f3a565b60405180910390f35b34801561045b57600080fd5b506104766004803603810190610471919061418e565b61110c565b005b34801561048457600080fd5b5061049f600480360381019061049a9190614294565b61116c565b6040516104ac9190614f3a565b60405180910390f35b3480156104c157600080fd5b506104ca6111c7565b6040516104d79190614afd565b60405180910390f35b3480156104ec57600080fd5b506104f56111da565b005b34801561050357600080fd5b5061050c611282565b6040516105199190614b18565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906143a8565b611310565b005b34801561055757600080fd5b50610572600480360381019061056d919061418e565b611396565b005b34801561058057600080fd5b5061059b600480360381019061059691906143a8565b6113b6565b6040516105a89190614f3a565b60405180910390f35b3480156105bd57600080fd5b506105c66113d9565b6040516105d39190614afd565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190614367565b6113ec565b005b34801561061157600080fd5b5061061a611474565b6040516106279190614a74565b60405180910390f35b61064a600480360381019061064591906143a8565b61148c565b6040516106579190614afd565b60405180910390f35b34801561066c57600080fd5b506106756116ca565b6040516106829190614afd565b60405180910390f35b34801561069757600080fd5b506106a06116dd565b005b3480156106ae57600080fd5b506106c960048036038101906106c491906143a8565b611785565b6040516106d69190614a74565b60405180910390f35b3480156106eb57600080fd5b506106f46117bc565b6040516107019190614f3a565b60405180910390f35b34801561071657600080fd5b5061071f6117c2565b60405161072c9190614b18565b60405180910390f35b34801561074157600080fd5b5061075c60048036038101906107579190614129565b611854565b6040516107699190614afd565b60405180910390f35b34801561077e57600080fd5b506107876118aa565b6040516107949190614f3a565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190614129565b6118b0565b6040516107d19190614f3a565b60405180910390f35b3480156107e657600080fd5b506107ef61196f565b005b3480156107fd57600080fd5b50610818600480360381019061081391906142d0565b6119f7565b005b34801561082657600080fd5b5061082f611c41565b60405161083c9190614f3a565b60405180910390f35b34801561085157600080fd5b5061086c600480360381019061086791906143a8565b611c47565b005b34801561087a57600080fd5b5061089560048036038101906108909190614129565b611ccd565b6040516108a29190614adb565b60405180910390f35b6108b3611e49565b005b3480156108c157600080fd5b506108ca611f4f565b6040516108d79190614a74565b60405180910390f35b3480156108ec57600080fd5b506108f5611f79565b6040516109029190614b18565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190614129565b61200b565b60405161093f9190614f3a565b60405180910390f35b34801561095457600080fd5b5061096f600480360381019061096a9190614129565b612023565b60405161097c9190614afd565b60405180910390f35b34801561099157600080fd5b5061099a612043565b6040516109a79190614f3a565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d291906143a8565b612049565b005b3480156109e557600080fd5b50610a0060048036038101906109fb9190614258565b6120cf565b005b348015610a0e57600080fd5b50610a296004803603810190610a2491906142d0565b612250565b005b348015610a3757600080fd5b50610a4061240d565b604051610a4d9190614f3a565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a7891906141dd565b612413565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa191906143a8565b612475565b005b610ac26004803603810190610abd91906143a8565b6124fb565b604051610acf9190614afd565b60405180910390f35b348015610ae457600080fd5b50610aed61285f565b604051610afa9190614f3a565b60405180910390f35b348015610b0f57600080fd5b50610b2a6004803603810190610b2591906143a8565b612865565b604051610b379190614b18565b60405180910390f35b348015610b4c57600080fd5b50610b55612a52565b604051610b629190614f3a565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d9190614367565b612a58565b005b348015610ba057600080fd5b50610ba9612aee565b005b348015610bb757600080fd5b50610bd26004803603810190610bcd9190614152565b612b96565b604051610bdf9190614afd565b60405180910390f35b348015610bf457600080fd5b50610c0f6004803603810190610c0a9190614129565b612c2a565b005b6000610c1c82612d22565b80610c815750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b606060078054610c9790615258565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc390615258565b8015610d105780601f10610ce557610100808354040283529160200191610d10565b820191906000526020600020905b815481529060010190602001808311610cf357829003601f168201915b5050505050905090565b6000610d2582612d8c565b610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90614dfa565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610daa82611785565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1290614e7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e3a612da9565b73ffffffffffffffffffffffffffffffffffffffff161480610e695750610e6881610e63612da9565b612b96565b5b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90614cda565b60405180910390fd5b610eb28383612db1565b505050565b610ebf612da9565b73ffffffffffffffffffffffffffffffffffffffff16610edd611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90614e3a565b60405180910390fd5b610f3d8282612e6a565b5050565b610f49612da9565b73ffffffffffffffffffffffffffffffffffffffff16610f67611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490614e3a565b60405180910390fd5b6122b882829050610fcc6110fb565b610fd69190615063565b1115611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90614d9a565b60405180910390fd5b600c5482829050111561105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690614f1a565b60405180910390fd5b60005b828290508110156110f657600c60008154809291906110809061522e565b91905055506110e38383838181106110c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906110d69190614129565b6110de6110fb565b612ede565b80806110ee906152bb565b915050611062565b505050565b60006111076002612efc565b905090565b61111d611117612da9565b82612f11565b61115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614e9a565b60405180910390fd5b611167838383612fef565b505050565b60006111bf82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061320690919063ffffffff16565b905092915050565b601160019054906101000a900460ff1681565b6111e2612da9565b73ffffffffffffffffffffffffffffffffffffffff16611200611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614e3a565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6015805461128f90615258565b80601f01602080910402602001604051908101604052809291908181526020018280546112bb90615258565b80156113085780601f106112dd57610100808354040283529160200191611308565b820191906000526020600020905b8154815290600101906020018083116112eb57829003601f168201915b505050505081565b611318612da9565b73ffffffffffffffffffffffffffffffffffffffff16611336611f4f565b73ffffffffffffffffffffffffffffffffffffffff161461138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390614e3a565b60405180910390fd5b8060108190555050565b6113b183838360405180602001604052806000815250612413565b505050565b6000806113cd83600261322090919063ffffffff16565b50905080915050919050565b601160029054906101000a900460ff1681565b6113f4612da9565b73ffffffffffffffffffffffffffffffffffffffff16611412611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614e3a565b60405180910390fd5b6114718161324c565b50565b73a64b407d4363e203f682f7d95eb13241b039e58081565b6000806114976110fb565b9050601160019054906101000a900460ff166114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90614eba565b60405180910390fd5b60105483111561152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490614cfa565b60405180910390fd5b600c546122b861153d9190615144565b83826115499190615063565b111561158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190614efa565b60405180910390fd5b600e548361159891906150ea565b3410156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190614bfa565b60405180910390fd5b6115e333613266565b15611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90614d3a565b60405180910390fd5b60005b838110156116bf57601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061167e906152bb565b9190505550600061168d6110fb565b90506122b88110156116ab576116aa6116a4612da9565b82612ede565b5b5080806116b7906152bb565b915050611626565b506001915050919050565b601160009054906101000a900460ff1681565b6116e5612da9565b73ffffffffffffffffffffffffffffffffffffffff16611703611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090614e3a565b60405180910390fd5b601160029054906101000a900460ff1615601160026101000a81548160ff021916908315150217905550565b60006117b582604051806060016040528060298152602001615bee60299139600261327f9092919063ffffffff16565b9050919050565b600e5481565b6060600a80546117d190615258565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd90615258565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b5050505050905090565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6122b881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890614d1a565b60405180910390fd5b611968600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061329e565b9050919050565b611977612da9565b73ffffffffffffffffffffffffffffffffffffffff16611995611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614e3a565b60405180910390fd5b6119f560006132b3565b565b6119ff612da9565b73ffffffffffffffffffffffffffffffffffffffff16611a1d611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90614e3a565b60405180910390fd5b60005b82829050811015611c3c576000838383818110611abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611ad19190614129565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90614b3a565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614cba565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611c34906152bb565b915050611a76565b505050565b60105481565b611c4f612da9565b73ffffffffffffffffffffffffffffffffffffffff16611c6d611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba90614e3a565b60405180910390fd5b80600e8190555050565b60606000611cda836118b0565b90506000811415611d5d57600067ffffffffffffffff811115611d26577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d545781602001602082028036833780820191505090505b50915050611e44565b60008167ffffffffffffffff811115611d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611dcd5781602001602082028036833780820191505090505b50905060005b82811015611e3d57611de5858261116c565b828281518110611e1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611e35906152bb565b915050611dd3565b5080925050505b919050565b611e51612da9565b73ffffffffffffffffffffffffffffffffffffffff16611e6f611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc90614e3a565b60405180910390fd5b73a64b407d4363e203f682f7d95eb13241b039e58073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4490614c5a565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060088054611f8890615258565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb490615258565b80156120015780601f10611fd657610100808354040283529160200191612001565b820191906000526020600020905b815481529060010190602001808311611fe457829003601f168201915b5050505050905090565b60146020528060005260406000206000915090505481565b60136020528060005260406000206000915054906101000a900460ff1681565b600c5481565b612051612da9565b73ffffffffffffffffffffffffffffffffffffffff1661206f611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614e3a565b60405180910390fd5b80600f8190555050565b6120d7612da9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90614c3a565b60405180910390fd5b8060066000612152612da9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121ff612da9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122449190614afd565b60405180910390a35050565b612258612da9565b73ffffffffffffffffffffffffffffffffffffffff16612276611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c390614e3a565b60405180910390fd5b60005b82829050811015612408576000838383818110612315577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061232a9190614129565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390614b3a565b60405180910390fd5b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612400906152bb565b9150506122cf565b505050565b600d5481565b61242461241e612da9565b83612f11565b612463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245a90614e9a565b60405180910390fd5b61246f84848484613379565b50505050565b61247d612da9565b73ffffffffffffffffffffffffffffffffffffffff1661249b611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890614e3a565b60405180910390fd5b80600d8190555050565b6000806125066110fb565b9050601160009054906101000a900460ff16612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614b5a565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90614d7a565b60405180910390fd5b600f5483601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126319190615063565b1115612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990614dda565b60405180910390fd5b600c546122b86126829190615144565b838261268e9190615063565b11156126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614efa565b60405180910390fd5b600d5483826126de9190615063565b111561271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271690614d5a565b60405180910390fd5b82600e5461272d91906150ea565b34101561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276690614bfa565b60405180910390fd5b61277833613266565b156127b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127af90614d3a565b60405180910390fd5b60005b8381101561285457601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612813906152bb565b919050555060006128226110fb565b90506122b88110156128405761283f612839612da9565b82612ede565b5b50808061284c906152bb565b9150506127bb565b506001915050919050565b600f5481565b606061286f6110fb565b82106128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614bda565b60405180910390fd5b601160029054906101000a900460ff1661295657601580546128d190615258565b80601f01602080910402602001604051908101604052809291908181526020018280546128fd90615258565b801561294a5780601f1061291f5761010080835404028352916020019161294a565b820191906000526020600020905b81548152906001019060200180831161292d57829003601f168201915b50505050509050612a4d565b600060096000848152602001908152602001600020805461297690615258565b80601f01602080910402602001604051908101604052809291908181526020018280546129a290615258565b80156129ef5780601f106129c4576101008083540402835291602001916129ef565b820191906000526020600020905b8154815290600101906020018083116129d257829003601f168201915b50505050509050600081511115612a095780915050612a4d565b600183612a169190615063565b9250612a206117c2565b612a29846133d5565b604051602001612a3a929190614a45565b6040516020818303038152906040529150505b919050565b60125481565b612a60612da9565b73ffffffffffffffffffffffffffffffffffffffff16612a7e611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acb90614e3a565b60405180910390fd5b8060159080519060200190612aea929190613f03565b5050565b612af6612da9565b73ffffffffffffffffffffffffffffffffffffffff16612b14611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614e3a565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612c32612da9565b73ffffffffffffffffffffffffffffffffffffffff16612c50611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9d90614e3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0d90614b9a565b60405180910390fd5b612d1f816132b3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612da282600261358290919063ffffffff16565b9050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e2483611785565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612e7382612d8c565b612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614e1a565b60405180910390fd5b80600960008481526020019081526020016000209080519060200190612ed9929190613f03565b505050565b612ef882826040518060200160405280600081525061359c565b5050565b6000612f0a826000016135f7565b9050919050565b6000612f1c82612d8c565b612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5290614c9a565b60405180910390fd5b6000612f6683611785565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fd557508373ffffffffffffffffffffffffffffffffffffffff16612fbd84610d1a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612fe65750612fe58185612b96565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661300f82611785565b73ffffffffffffffffffffffffffffffffffffffff1614613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305c90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cc90614c1a565b60405180910390fd5b6130e083838361360c565b6130eb600082612db1565b61313c81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061361190919063ffffffff16565b5061318e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061362b90919063ffffffff16565b506131a5818360026136459092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000613215836000018361367a565b60001c905092915050565b60008060008061323386600001866136cb565b915091508160001c8160001c9350935050509250929050565b80600a9080519060200190613262929190613f03565b5050565b600080823b905060008163ffffffff1611915050919050565b6000613292846000018460001b8461370b565b60001c90509392505050565b60006132ac8260000161378c565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613384848484612fef565b6133908484848461379d565b6133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614b7a565b60405180910390fd5b50505050565b6060600082141561341d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061357d565b600082905060005b6000821461344f578080613438906152bb565b915050600a8261344891906150b9565b9150613425565b60008167ffffffffffffffff811115613491577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134c35781602001600182028036833780820191505090505b5090505b60008514613576576001826134dc9190615144565b9150600a856134eb9190615304565b60306134f79190615063565b60f81b818381518110613533577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561356f91906150b9565b94506134c7565b8093505050505b919050565b6000613594836000018360001b613901565b905092915050565b6135a68383613921565b6135b3600084848461379d565b6135f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e990614b7a565b60405180910390fd5b505050565b600061360582600001613aaf565b9050919050565b505050565b6000613623836000018360001b613ac4565b905092915050565b600061363d836000018360001b613c4a565b905092915050565b6000613671846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613cba565b90509392505050565b60008260000182815481106136b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008060006136e68486600001613cf590919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b8114158061373e575061373d8585613901565b5b8390613780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137779190614b18565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b60006137be8473ffffffffffffffffffffffffffffffffffffffff16613d0c565b6137cb57600190506138f9565b600061389263150b7a0260e01b6137e0612da9565b8887876040516024016137f69493929190614a8f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615bbc603291398773ffffffffffffffffffffffffffffffffffffffff16613d1f9092919063ffffffff16565b90506000818060200190518101906138aa919061433e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60006139198284600001613d3790919063ffffffff16565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398890614dba565b60405180910390fd5b61399a81612d8c565b156139da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d190614bba565b60405180910390fd5b6139e66000838361360c565b613a3781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061362b90919063ffffffff16565b50613a4e818360026136459092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613abd8260000161378c565b9050919050565b60008083600101600084815260200190815260200160002054905060008114613c3e576000600182613af69190615144565b9050600060018660000180549050613b0e9190615144565b9050818114613bc9576000866000018281548110613b55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613b9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613c44565b60009150505b92915050565b6000613c568383613d4e565b613caf578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613cb4565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550613cec8385600001613d7190919063ffffffff16565b90509392505050565b6000613d04836000018361367a565b905092915050565b600080823b905060008111915050919050565b6060613d2e8484600085613d88565b90509392505050565b6000613d468360000183613d4e565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613d808360000183613c4a565b905092915050565b606082471015613dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc490614c7a565b60405180910390fd5b613dd685613d0c565b613e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e0c90614eda565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e3e9190614a2e565b60006040518083038185875af1925050503d8060008114613e7b576040519150601f19603f3d011682016040523d82523d6000602084013e613e80565b606091505b5091509150613e90828286613e9c565b92505050949350505050565b60608315613eac57829050613efc565b600083511115613ebf5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ef39190614b18565b60405180910390fd5b9392505050565b828054613f0f90615258565b90600052602060002090601f016020900481019282613f315760008555613f78565b82601f10613f4a57805160ff1916838001178555613f78565b82800160010185558215613f78579182015b82811115613f77578251825591602001919060010190613f5c565b5b509050613f859190613f89565b5090565b5b80821115613fa2576000816000905550600101613f8a565b5090565b6000613fb9613fb484614f7a565b614f55565b905082815260208101848484011115613fd157600080fd5b613fdc8482856151ec565b509392505050565b6000613ff7613ff284614fab565b614f55565b90508281526020810184848401111561400f57600080fd5b61401a8482856151ec565b509392505050565b60008135905061403181615b5f565b92915050565b60008083601f84011261404957600080fd5b8235905067ffffffffffffffff81111561406257600080fd5b60208301915083602082028301111561407a57600080fd5b9250929050565b60008135905061409081615b76565b92915050565b6000813590506140a581615b8d565b92915050565b6000815190506140ba81615b8d565b92915050565b600082601f8301126140d157600080fd5b81356140e1848260208601613fa6565b91505092915050565b600082601f8301126140fb57600080fd5b813561410b848260208601613fe4565b91505092915050565b60008135905061412381615ba4565b92915050565b60006020828403121561413b57600080fd5b600061414984828501614022565b91505092915050565b6000806040838503121561416557600080fd5b600061417385828601614022565b925050602061418485828601614022565b9150509250929050565b6000806000606084860312156141a357600080fd5b60006141b186828701614022565b93505060206141c286828701614022565b92505060406141d386828701614114565b9150509250925092565b600080600080608085870312156141f357600080fd5b600061420187828801614022565b945050602061421287828801614022565b935050604061422387828801614114565b925050606085013567ffffffffffffffff81111561424057600080fd5b61424c878288016140c0565b91505092959194509250565b6000806040838503121561426b57600080fd5b600061427985828601614022565b925050602061428a85828601614081565b9150509250929050565b600080604083850312156142a757600080fd5b60006142b585828601614022565b92505060206142c685828601614114565b9150509250929050565b600080602083850312156142e357600080fd5b600083013567ffffffffffffffff8111156142fd57600080fd5b61430985828601614037565b92509250509250929050565b60006020828403121561432757600080fd5b600061433584828501614096565b91505092915050565b60006020828403121561435057600080fd5b600061435e848285016140ab565b91505092915050565b60006020828403121561437957600080fd5b600082013567ffffffffffffffff81111561439357600080fd5b61439f848285016140ea565b91505092915050565b6000602082840312156143ba57600080fd5b60006143c884828501614114565b91505092915050565b600080604083850312156143e457600080fd5b60006143f285828601614114565b925050602083013567ffffffffffffffff81111561440f57600080fd5b61441b858286016140ea565b9150509250929050565b60006144318383614a10565b60208301905092915050565b61444681615178565b82525050565b600061445782614fec565b614461818561501a565b935061446c83614fdc565b8060005b8381101561449d5781516144848882614425565b975061448f8361500d565b925050600181019050614470565b5085935050505092915050565b6144b38161518a565b82525050565b60006144c482614ff7565b6144ce818561502b565b93506144de8185602086016151fb565b6144e7816153f1565b840191505092915050565b60006144fd82614ff7565b614507818561503c565b93506145178185602086016151fb565b80840191505092915050565b600061452e82615002565b6145388185615047565b93506145488185602086016151fb565b614551816153f1565b840191505092915050565b600061456782615002565b6145718185615058565b93506145818185602086016151fb565b80840191505092915050565b600061459a600c83615047565b91506145a582615402565b602082019050919050565b60006145bd602a83615047565b91506145c88261542b565b604082019050919050565b60006145e0603283615047565b91506145eb8261547a565b604082019050919050565b6000614603602683615047565b915061460e826154c9565b604082019050919050565b6000614626601c83615047565b915061463182615518565b602082019050919050565b6000614649601083615047565b915061465482615541565b602082019050919050565b600061466c601d83615047565b91506146778261556a565b602082019050919050565b600061468f602483615047565b915061469a82615593565b604082019050919050565b60006146b2601983615047565b91506146bd826155e2565b602082019050919050565b60006146d5601583615047565b91506146e08261560b565b602082019050919050565b60006146f8602683615047565b915061470382615634565b604082019050919050565b600061471b602c83615047565b915061472682615683565b604082019050919050565b600061473e600f83615047565b9150614749826156d2565b602082019050919050565b6000614761603883615047565b915061476c826156fb565b604082019050919050565b6000614784602083615047565b915061478f8261574a565b602082019050919050565b60006147a7602a83615047565b91506147b282615773565b604082019050919050565b60006147ca601983615047565b91506147d5826157c2565b602082019050919050565b60006147ed601983615047565b91506147f8826157eb565b602082019050919050565b6000614810601983615047565b915061481b82615814565b602082019050919050565b6000614833600883615047565b915061483e8261583d565b602082019050919050565b6000614856602083615047565b915061486182615866565b602082019050919050565b6000614879601b83615047565b91506148848261588f565b602082019050919050565b600061489c602c83615047565b91506148a7826158b8565b604082019050919050565b60006148bf600583615058565b91506148ca82615907565b600582019050919050565b60006148e2602c83615047565b91506148ed82615930565b604082019050919050565b6000614905602083615047565b91506149108261597f565b602082019050919050565b6000614928602983615047565b9150614933826159a8565b604082019050919050565b600061494b602183615047565b9150614956826159f7565b604082019050919050565b600061496e603183615047565b915061497982615a46565b604082019050919050565b6000614991602d83615047565b915061499c82615a95565b604082019050919050565b60006149b4601d83615047565b91506149bf82615ae4565b602082019050919050565b60006149d7601683615047565b91506149e282615b0d565b602082019050919050565b60006149fa601783615047565b9150614a0582615b36565b602082019050919050565b614a19816151e2565b82525050565b614a28816151e2565b82525050565b6000614a3a82846144f2565b915081905092915050565b6000614a51828561455c565b9150614a5d828461455c565b9150614a68826148b2565b91508190509392505050565b6000602082019050614a89600083018461443d565b92915050565b6000608082019050614aa4600083018761443d565b614ab1602083018661443d565b614abe6040830185614a1f565b8181036060830152614ad081846144b9565b905095945050505050565b60006020820190508181036000830152614af5818461444c565b905092915050565b6000602082019050614b1260008301846144aa565b92915050565b60006020820190508181036000830152614b328184614523565b905092915050565b60006020820190508181036000830152614b538161458d565b9050919050565b60006020820190508181036000830152614b73816145b0565b9050919050565b60006020820190508181036000830152614b93816145d3565b9050919050565b60006020820190508181036000830152614bb3816145f6565b9050919050565b60006020820190508181036000830152614bd381614619565b9050919050565b60006020820190508181036000830152614bf38161463c565b9050919050565b60006020820190508181036000830152614c138161465f565b9050919050565b60006020820190508181036000830152614c3381614682565b9050919050565b60006020820190508181036000830152614c53816146a5565b9050919050565b60006020820190508181036000830152614c73816146c8565b9050919050565b60006020820190508181036000830152614c93816146eb565b9050919050565b60006020820190508181036000830152614cb38161470e565b9050919050565b60006020820190508181036000830152614cd381614731565b9050919050565b60006020820190508181036000830152614cf381614754565b9050919050565b60006020820190508181036000830152614d1381614777565b9050919050565b60006020820190508181036000830152614d338161479a565b9050919050565b60006020820190508181036000830152614d53816147bd565b9050919050565b60006020820190508181036000830152614d73816147e0565b9050919050565b60006020820190508181036000830152614d9381614803565b9050919050565b60006020820190508181036000830152614db381614826565b9050919050565b60006020820190508181036000830152614dd381614849565b9050919050565b60006020820190508181036000830152614df38161486c565b9050919050565b60006020820190508181036000830152614e138161488f565b9050919050565b60006020820190508181036000830152614e33816148d5565b9050919050565b60006020820190508181036000830152614e53816148f8565b9050919050565b60006020820190508181036000830152614e738161491b565b9050919050565b60006020820190508181036000830152614e938161493e565b9050919050565b60006020820190508181036000830152614eb381614961565b9050919050565b60006020820190508181036000830152614ed381614984565b9050919050565b60006020820190508181036000830152614ef3816149a7565b9050919050565b60006020820190508181036000830152614f13816149ca565b9050919050565b60006020820190508181036000830152614f33816149ed565b9050919050565b6000602082019050614f4f6000830184614a1f565b92915050565b6000614f5f614f70565b9050614f6b828261528a565b919050565b6000604051905090565b600067ffffffffffffffff821115614f9557614f946153c2565b5b614f9e826153f1565b9050602081019050919050565b600067ffffffffffffffff821115614fc657614fc56153c2565b5b614fcf826153f1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061506e826151e2565b9150615079836151e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150ae576150ad615335565b5b828201905092915050565b60006150c4826151e2565b91506150cf836151e2565b9250826150df576150de615364565b5b828204905092915050565b60006150f5826151e2565b9150615100836151e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561513957615138615335565b5b828202905092915050565b600061514f826151e2565b915061515a836151e2565b92508282101561516d5761516c615335565b5b828203905092915050565b6000615183826151c2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152195780820151818401526020810190506151fe565b83811115615228576000848401525b50505050565b6000615239826151e2565b9150600082141561524d5761524c615335565b5b600182039050919050565b6000600282049050600182168061527057607f821691505b6020821081141561528457615283615393565b5b50919050565b615293826153f1565b810181811067ffffffffffffffff821117156152b2576152b16153c2565b5b80604052505050565b60006152c6826151e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152f9576152f8615335565b5b600182019050919050565b600061530f826151e2565b915061531a836151e2565b92508261532a57615329615364565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b7f546865207072652d73616c6520686173204e4f5420737461727465642c20706c60008201527f6561736520776169742e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6b656e206e6f742065786973742e00000000000000000000000000000000600082015250565b7f45746865722073656e74206973206e6f742073756666696369656e742e000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f576974686472617720556e7375636365737366756c0000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752061726520747279696e6720746f206d696e7420746f6f206d616e792e600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f43616c6c65722063616e6e6f7420626520636f6e747261637400000000000000600082015250565b7f457863656564696e672070726573616c6520737570706c792e00000000000000600082015250565b7f4e6f74207175616c696669656420666f722070726573616c6500000000000000600082015250565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45786365656465642070726573616c6520616c6c6f636174696f6e0000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865207075626c69632073616c6520686173204e4f5420737461727465642c60008201527f20706c6561736520776169742e00000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f457863656564696e6720746f74616c20737570706c7900000000000000000000600082015250565b7f4e6f207265736572766564206e696e6a6173206c656674000000000000000000600082015250565b615b6881615178565b8114615b7357600080fd5b50565b615b7f8161518a565b8114615b8a57600080fd5b50565b615b9681615196565b8114615ba157600080fd5b50565b615bad816151e2565b8114615bb857600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d16c5d76dd60b30485138469b1739e52b47aa447ecc71408adad2f0ec3131cea64736f6c6343000804003368747470733a2f2f7468656e696e6a61686964656f75742e6d7970696e6174612e636c6f75642f697066732f516d664a633450666876556a7852596a6941765237324165636e696b62526f79536b6e47477261777557727a6e3100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c806370a0823111610190578063a22cb465116100dc578063c81d60bd11610095578063da1b9e081161006f578063da1b9e0814610b6b578063e222c7f914610b94578063e985e9c514610bab578063f2fde38b14610be8576102ff565b8063c81d60bd14610ad8578063c87b56dd14610b03578063d08afb4214610b40576102ff565b8063a22cb465146109d9578063b179e06014610a02578063b3a196e914610a2b578063b88d4fde14610a56578063b96502cb14610a7f578063b988477214610aa8576102ff565b8063853828b6116101495780639bf80316116101235780639bf803161461090b5780639cf2e8d6146109485780639ec9986b14610985578063a06f269b146109b0576102ff565b8063853828b6146108ab5780638da5cb5b146108b557806395d89b41146108e0576102ff565b806370a082311461079d578063715018a6146107da5780637204a3c9146107f157806376c71ca11461081a5780637d7eee42146108455780638462151c1461086e576102ff565b806342842e0e1161024f5780635a7adf7f116102085780636817c76c116101e25780636817c76c146106df5780636c0360eb1461070a5780636f9170f6146107355780637018d29814610772576102ff565b80635a7adf7f146106605780635b8ad4291461068b5780636352211e146106a2576102ff565b806342842e0e1461054b5780634f6ccce71461057457806351830227146105b157806355f804b3146105dc578063562f9e47146106055780635a5e5d5814610630576102ff565b806318160ddd116102bc57806333bc1c5c1161029657806333bc1c5c146104b557806334393743146104e05780633a367a67146104f75780634070a0c914610522576102ff565b806318160ddd1461042457806323b872dd1461044f5780632f745c5914610478576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a9578063162094c4146103d2578063163e1e61146103fb575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190614315565b610c11565b6040516103389190614afd565b60405180910390f35b34801561034d57600080fd5b50610356610c88565b6040516103639190614b18565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e91906143a8565b610d1a565b6040516103a09190614a74565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190614294565b610d9f565b005b3480156103de57600080fd5b506103f960048036038101906103f491906143d1565b610eb7565b005b34801561040757600080fd5b50610422600480360381019061041d91906142d0565b610f41565b005b34801561043057600080fd5b506104396110fb565b6040516104469190614f3a565b60405180910390f35b34801561045b57600080fd5b506104766004803603810190610471919061418e565b61110c565b005b34801561048457600080fd5b5061049f600480360381019061049a9190614294565b61116c565b6040516104ac9190614f3a565b60405180910390f35b3480156104c157600080fd5b506104ca6111c7565b6040516104d79190614afd565b60405180910390f35b3480156104ec57600080fd5b506104f56111da565b005b34801561050357600080fd5b5061050c611282565b6040516105199190614b18565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906143a8565b611310565b005b34801561055757600080fd5b50610572600480360381019061056d919061418e565b611396565b005b34801561058057600080fd5b5061059b600480360381019061059691906143a8565b6113b6565b6040516105a89190614f3a565b60405180910390f35b3480156105bd57600080fd5b506105c66113d9565b6040516105d39190614afd565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190614367565b6113ec565b005b34801561061157600080fd5b5061061a611474565b6040516106279190614a74565b60405180910390f35b61064a600480360381019061064591906143a8565b61148c565b6040516106579190614afd565b60405180910390f35b34801561066c57600080fd5b506106756116ca565b6040516106829190614afd565b60405180910390f35b34801561069757600080fd5b506106a06116dd565b005b3480156106ae57600080fd5b506106c960048036038101906106c491906143a8565b611785565b6040516106d69190614a74565b60405180910390f35b3480156106eb57600080fd5b506106f46117bc565b6040516107019190614f3a565b60405180910390f35b34801561071657600080fd5b5061071f6117c2565b60405161072c9190614b18565b60405180910390f35b34801561074157600080fd5b5061075c60048036038101906107579190614129565b611854565b6040516107699190614afd565b60405180910390f35b34801561077e57600080fd5b506107876118aa565b6040516107949190614f3a565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190614129565b6118b0565b6040516107d19190614f3a565b60405180910390f35b3480156107e657600080fd5b506107ef61196f565b005b3480156107fd57600080fd5b50610818600480360381019061081391906142d0565b6119f7565b005b34801561082657600080fd5b5061082f611c41565b60405161083c9190614f3a565b60405180910390f35b34801561085157600080fd5b5061086c600480360381019061086791906143a8565b611c47565b005b34801561087a57600080fd5b5061089560048036038101906108909190614129565b611ccd565b6040516108a29190614adb565b60405180910390f35b6108b3611e49565b005b3480156108c157600080fd5b506108ca611f4f565b6040516108d79190614a74565b60405180910390f35b3480156108ec57600080fd5b506108f5611f79565b6040516109029190614b18565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190614129565b61200b565b60405161093f9190614f3a565b60405180910390f35b34801561095457600080fd5b5061096f600480360381019061096a9190614129565b612023565b60405161097c9190614afd565b60405180910390f35b34801561099157600080fd5b5061099a612043565b6040516109a79190614f3a565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d291906143a8565b612049565b005b3480156109e557600080fd5b50610a0060048036038101906109fb9190614258565b6120cf565b005b348015610a0e57600080fd5b50610a296004803603810190610a2491906142d0565b612250565b005b348015610a3757600080fd5b50610a4061240d565b604051610a4d9190614f3a565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a7891906141dd565b612413565b005b348015610a8b57600080fd5b50610aa66004803603810190610aa191906143a8565b612475565b005b610ac26004803603810190610abd91906143a8565b6124fb565b604051610acf9190614afd565b60405180910390f35b348015610ae457600080fd5b50610aed61285f565b604051610afa9190614f3a565b60405180910390f35b348015610b0f57600080fd5b50610b2a6004803603810190610b2591906143a8565b612865565b604051610b379190614b18565b60405180910390f35b348015610b4c57600080fd5b50610b55612a52565b604051610b629190614f3a565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d9190614367565b612a58565b005b348015610ba057600080fd5b50610ba9612aee565b005b348015610bb757600080fd5b50610bd26004803603810190610bcd9190614152565b612b96565b604051610bdf9190614afd565b60405180910390f35b348015610bf457600080fd5b50610c0f6004803603810190610c0a9190614129565b612c2a565b005b6000610c1c82612d22565b80610c815750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b606060078054610c9790615258565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc390615258565b8015610d105780601f10610ce557610100808354040283529160200191610d10565b820191906000526020600020905b815481529060010190602001808311610cf357829003601f168201915b5050505050905090565b6000610d2582612d8c565b610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90614dfa565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610daa82611785565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1290614e7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e3a612da9565b73ffffffffffffffffffffffffffffffffffffffff161480610e695750610e6881610e63612da9565b612b96565b5b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90614cda565b60405180910390fd5b610eb28383612db1565b505050565b610ebf612da9565b73ffffffffffffffffffffffffffffffffffffffff16610edd611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90614e3a565b60405180910390fd5b610f3d8282612e6a565b5050565b610f49612da9565b73ffffffffffffffffffffffffffffffffffffffff16610f67611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490614e3a565b60405180910390fd5b6122b882829050610fcc6110fb565b610fd69190615063565b1115611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90614d9a565b60405180910390fd5b600c5482829050111561105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690614f1a565b60405180910390fd5b60005b828290508110156110f657600c60008154809291906110809061522e565b91905055506110e38383838181106110c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906110d69190614129565b6110de6110fb565b612ede565b80806110ee906152bb565b915050611062565b505050565b60006111076002612efc565b905090565b61111d611117612da9565b82612f11565b61115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614e9a565b60405180910390fd5b611167838383612fef565b505050565b60006111bf82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061320690919063ffffffff16565b905092915050565b601160019054906101000a900460ff1681565b6111e2612da9565b73ffffffffffffffffffffffffffffffffffffffff16611200611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614e3a565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6015805461128f90615258565b80601f01602080910402602001604051908101604052809291908181526020018280546112bb90615258565b80156113085780601f106112dd57610100808354040283529160200191611308565b820191906000526020600020905b8154815290600101906020018083116112eb57829003601f168201915b505050505081565b611318612da9565b73ffffffffffffffffffffffffffffffffffffffff16611336611f4f565b73ffffffffffffffffffffffffffffffffffffffff161461138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390614e3a565b60405180910390fd5b8060108190555050565b6113b183838360405180602001604052806000815250612413565b505050565b6000806113cd83600261322090919063ffffffff16565b50905080915050919050565b601160029054906101000a900460ff1681565b6113f4612da9565b73ffffffffffffffffffffffffffffffffffffffff16611412611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614e3a565b60405180910390fd5b6114718161324c565b50565b73a64b407d4363e203f682f7d95eb13241b039e58081565b6000806114976110fb565b9050601160019054906101000a900460ff166114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90614eba565b60405180910390fd5b60105483111561152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490614cfa565b60405180910390fd5b600c546122b861153d9190615144565b83826115499190615063565b111561158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190614efa565b60405180910390fd5b600e548361159891906150ea565b3410156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190614bfa565b60405180910390fd5b6115e333613266565b15611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90614d3a565b60405180910390fd5b60005b838110156116bf57601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061167e906152bb565b9190505550600061168d6110fb565b90506122b88110156116ab576116aa6116a4612da9565b82612ede565b5b5080806116b7906152bb565b915050611626565b506001915050919050565b601160009054906101000a900460ff1681565b6116e5612da9565b73ffffffffffffffffffffffffffffffffffffffff16611703611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090614e3a565b60405180910390fd5b601160029054906101000a900460ff1615601160026101000a81548160ff021916908315150217905550565b60006117b582604051806060016040528060298152602001615bee60299139600261327f9092919063ffffffff16565b9050919050565b600e5481565b6060600a80546117d190615258565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd90615258565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b5050505050905090565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6122b881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890614d1a565b60405180910390fd5b611968600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061329e565b9050919050565b611977612da9565b73ffffffffffffffffffffffffffffffffffffffff16611995611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614e3a565b60405180910390fd5b6119f560006132b3565b565b6119ff612da9565b73ffffffffffffffffffffffffffffffffffffffff16611a1d611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90614e3a565b60405180910390fd5b60005b82829050811015611c3c576000838383818110611abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611ad19190614129565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90614b3a565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614cba565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611c34906152bb565b915050611a76565b505050565b60105481565b611c4f612da9565b73ffffffffffffffffffffffffffffffffffffffff16611c6d611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba90614e3a565b60405180910390fd5b80600e8190555050565b60606000611cda836118b0565b90506000811415611d5d57600067ffffffffffffffff811115611d26577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d545781602001602082028036833780820191505090505b50915050611e44565b60008167ffffffffffffffff811115611d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611dcd5781602001602082028036833780820191505090505b50905060005b82811015611e3d57611de5858261116c565b828281518110611e1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611e35906152bb565b915050611dd3565b5080925050505b919050565b611e51612da9565b73ffffffffffffffffffffffffffffffffffffffff16611e6f611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc90614e3a565b60405180910390fd5b73a64b407d4363e203f682f7d95eb13241b039e58073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4490614c5a565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060088054611f8890615258565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb490615258565b80156120015780601f10611fd657610100808354040283529160200191612001565b820191906000526020600020905b815481529060010190602001808311611fe457829003601f168201915b5050505050905090565b60146020528060005260406000206000915090505481565b60136020528060005260406000206000915054906101000a900460ff1681565b600c5481565b612051612da9565b73ffffffffffffffffffffffffffffffffffffffff1661206f611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614e3a565b60405180910390fd5b80600f8190555050565b6120d7612da9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90614c3a565b60405180910390fd5b8060066000612152612da9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121ff612da9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122449190614afd565b60405180910390a35050565b612258612da9565b73ffffffffffffffffffffffffffffffffffffffff16612276611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c390614e3a565b60405180910390fd5b60005b82829050811015612408576000838383818110612315577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061232a9190614129565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390614b3a565b60405180910390fd5b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612400906152bb565b9150506122cf565b505050565b600d5481565b61242461241e612da9565b83612f11565b612463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245a90614e9a565b60405180910390fd5b61246f84848484613379565b50505050565b61247d612da9565b73ffffffffffffffffffffffffffffffffffffffff1661249b611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890614e3a565b60405180910390fd5b80600d8190555050565b6000806125066110fb565b9050601160009054906101000a900460ff16612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614b5a565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90614d7a565b60405180910390fd5b600f5483601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126319190615063565b1115612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990614dda565b60405180910390fd5b600c546122b86126829190615144565b838261268e9190615063565b11156126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614efa565b60405180910390fd5b600d5483826126de9190615063565b111561271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271690614d5a565b60405180910390fd5b82600e5461272d91906150ea565b34101561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276690614bfa565b60405180910390fd5b61277833613266565b156127b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127af90614d3a565b60405180910390fd5b60005b8381101561285457601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612813906152bb565b919050555060006128226110fb565b90506122b88110156128405761283f612839612da9565b82612ede565b5b50808061284c906152bb565b9150506127bb565b506001915050919050565b600f5481565b606061286f6110fb565b82106128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614bda565b60405180910390fd5b601160029054906101000a900460ff1661295657601580546128d190615258565b80601f01602080910402602001604051908101604052809291908181526020018280546128fd90615258565b801561294a5780601f1061291f5761010080835404028352916020019161294a565b820191906000526020600020905b81548152906001019060200180831161292d57829003601f168201915b50505050509050612a4d565b600060096000848152602001908152602001600020805461297690615258565b80601f01602080910402602001604051908101604052809291908181526020018280546129a290615258565b80156129ef5780601f106129c4576101008083540402835291602001916129ef565b820191906000526020600020905b8154815290600101906020018083116129d257829003601f168201915b50505050509050600081511115612a095780915050612a4d565b600183612a169190615063565b9250612a206117c2565b612a29846133d5565b604051602001612a3a929190614a45565b6040516020818303038152906040529150505b919050565b60125481565b612a60612da9565b73ffffffffffffffffffffffffffffffffffffffff16612a7e611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acb90614e3a565b60405180910390fd5b8060159080519060200190612aea929190613f03565b5050565b612af6612da9565b73ffffffffffffffffffffffffffffffffffffffff16612b14611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614e3a565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612c32612da9565b73ffffffffffffffffffffffffffffffffffffffff16612c50611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9d90614e3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0d90614b9a565b60405180910390fd5b612d1f816132b3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612da282600261358290919063ffffffff16565b9050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e2483611785565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612e7382612d8c565b612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614e1a565b60405180910390fd5b80600960008481526020019081526020016000209080519060200190612ed9929190613f03565b505050565b612ef882826040518060200160405280600081525061359c565b5050565b6000612f0a826000016135f7565b9050919050565b6000612f1c82612d8c565b612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5290614c9a565b60405180910390fd5b6000612f6683611785565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fd557508373ffffffffffffffffffffffffffffffffffffffff16612fbd84610d1a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612fe65750612fe58185612b96565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661300f82611785565b73ffffffffffffffffffffffffffffffffffffffff1614613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305c90614e5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cc90614c1a565b60405180910390fd5b6130e083838361360c565b6130eb600082612db1565b61313c81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061361190919063ffffffff16565b5061318e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061362b90919063ffffffff16565b506131a5818360026136459092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000613215836000018361367a565b60001c905092915050565b60008060008061323386600001866136cb565b915091508160001c8160001c9350935050509250929050565b80600a9080519060200190613262929190613f03565b5050565b600080823b905060008163ffffffff1611915050919050565b6000613292846000018460001b8461370b565b60001c90509392505050565b60006132ac8260000161378c565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613384848484612fef565b6133908484848461379d565b6133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614b7a565b60405180910390fd5b50505050565b6060600082141561341d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061357d565b600082905060005b6000821461344f578080613438906152bb565b915050600a8261344891906150b9565b9150613425565b60008167ffffffffffffffff811115613491577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134c35781602001600182028036833780820191505090505b5090505b60008514613576576001826134dc9190615144565b9150600a856134eb9190615304565b60306134f79190615063565b60f81b818381518110613533577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561356f91906150b9565b94506134c7565b8093505050505b919050565b6000613594836000018360001b613901565b905092915050565b6135a68383613921565b6135b3600084848461379d565b6135f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e990614b7a565b60405180910390fd5b505050565b600061360582600001613aaf565b9050919050565b505050565b6000613623836000018360001b613ac4565b905092915050565b600061363d836000018360001b613c4a565b905092915050565b6000613671846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613cba565b90509392505050565b60008260000182815481106136b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008060006136e68486600001613cf590919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b8114158061373e575061373d8585613901565b5b8390613780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137779190614b18565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b60006137be8473ffffffffffffffffffffffffffffffffffffffff16613d0c565b6137cb57600190506138f9565b600061389263150b7a0260e01b6137e0612da9565b8887876040516024016137f69493929190614a8f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615bbc603291398773ffffffffffffffffffffffffffffffffffffffff16613d1f9092919063ffffffff16565b90506000818060200190518101906138aa919061433e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60006139198284600001613d3790919063ffffffff16565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398890614dba565b60405180910390fd5b61399a81612d8c565b156139da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d190614bba565b60405180910390fd5b6139e66000838361360c565b613a3781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061362b90919063ffffffff16565b50613a4e818360026136459092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613abd8260000161378c565b9050919050565b60008083600101600084815260200190815260200160002054905060008114613c3e576000600182613af69190615144565b9050600060018660000180549050613b0e9190615144565b9050818114613bc9576000866000018281548110613b55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613b9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613c44565b60009150505b92915050565b6000613c568383613d4e565b613caf578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613cb4565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550613cec8385600001613d7190919063ffffffff16565b90509392505050565b6000613d04836000018361367a565b905092915050565b600080823b905060008111915050919050565b6060613d2e8484600085613d88565b90509392505050565b6000613d468360000183613d4e565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613d808360000183613c4a565b905092915050565b606082471015613dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc490614c7a565b60405180910390fd5b613dd685613d0c565b613e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e0c90614eda565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e3e9190614a2e565b60006040518083038185875af1925050503d8060008114613e7b576040519150601f19603f3d011682016040523d82523d6000602084013e613e80565b606091505b5091509150613e90828286613e9c565b92505050949350505050565b60608315613eac57829050613efc565b600083511115613ebf5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ef39190614b18565b60405180910390fd5b9392505050565b828054613f0f90615258565b90600052602060002090601f016020900481019282613f315760008555613f78565b82601f10613f4a57805160ff1916838001178555613f78565b82800160010185558215613f78579182015b82811115613f77578251825591602001919060010190613f5c565b5b509050613f859190613f89565b5090565b5b80821115613fa2576000816000905550600101613f8a565b5090565b6000613fb9613fb484614f7a565b614f55565b905082815260208101848484011115613fd157600080fd5b613fdc8482856151ec565b509392505050565b6000613ff7613ff284614fab565b614f55565b90508281526020810184848401111561400f57600080fd5b61401a8482856151ec565b509392505050565b60008135905061403181615b5f565b92915050565b60008083601f84011261404957600080fd5b8235905067ffffffffffffffff81111561406257600080fd5b60208301915083602082028301111561407a57600080fd5b9250929050565b60008135905061409081615b76565b92915050565b6000813590506140a581615b8d565b92915050565b6000815190506140ba81615b8d565b92915050565b600082601f8301126140d157600080fd5b81356140e1848260208601613fa6565b91505092915050565b600082601f8301126140fb57600080fd5b813561410b848260208601613fe4565b91505092915050565b60008135905061412381615ba4565b92915050565b60006020828403121561413b57600080fd5b600061414984828501614022565b91505092915050565b6000806040838503121561416557600080fd5b600061417385828601614022565b925050602061418485828601614022565b9150509250929050565b6000806000606084860312156141a357600080fd5b60006141b186828701614022565b93505060206141c286828701614022565b92505060406141d386828701614114565b9150509250925092565b600080600080608085870312156141f357600080fd5b600061420187828801614022565b945050602061421287828801614022565b935050604061422387828801614114565b925050606085013567ffffffffffffffff81111561424057600080fd5b61424c878288016140c0565b91505092959194509250565b6000806040838503121561426b57600080fd5b600061427985828601614022565b925050602061428a85828601614081565b9150509250929050565b600080604083850312156142a757600080fd5b60006142b585828601614022565b92505060206142c685828601614114565b9150509250929050565b600080602083850312156142e357600080fd5b600083013567ffffffffffffffff8111156142fd57600080fd5b61430985828601614037565b92509250509250929050565b60006020828403121561432757600080fd5b600061433584828501614096565b91505092915050565b60006020828403121561435057600080fd5b600061435e848285016140ab565b91505092915050565b60006020828403121561437957600080fd5b600082013567ffffffffffffffff81111561439357600080fd5b61439f848285016140ea565b91505092915050565b6000602082840312156143ba57600080fd5b60006143c884828501614114565b91505092915050565b600080604083850312156143e457600080fd5b60006143f285828601614114565b925050602083013567ffffffffffffffff81111561440f57600080fd5b61441b858286016140ea565b9150509250929050565b60006144318383614a10565b60208301905092915050565b61444681615178565b82525050565b600061445782614fec565b614461818561501a565b935061446c83614fdc565b8060005b8381101561449d5781516144848882614425565b975061448f8361500d565b925050600181019050614470565b5085935050505092915050565b6144b38161518a565b82525050565b60006144c482614ff7565b6144ce818561502b565b93506144de8185602086016151fb565b6144e7816153f1565b840191505092915050565b60006144fd82614ff7565b614507818561503c565b93506145178185602086016151fb565b80840191505092915050565b600061452e82615002565b6145388185615047565b93506145488185602086016151fb565b614551816153f1565b840191505092915050565b600061456782615002565b6145718185615058565b93506145818185602086016151fb565b80840191505092915050565b600061459a600c83615047565b91506145a582615402565b602082019050919050565b60006145bd602a83615047565b91506145c88261542b565b604082019050919050565b60006145e0603283615047565b91506145eb8261547a565b604082019050919050565b6000614603602683615047565b915061460e826154c9565b604082019050919050565b6000614626601c83615047565b915061463182615518565b602082019050919050565b6000614649601083615047565b915061465482615541565b602082019050919050565b600061466c601d83615047565b91506146778261556a565b602082019050919050565b600061468f602483615047565b915061469a82615593565b604082019050919050565b60006146b2601983615047565b91506146bd826155e2565b602082019050919050565b60006146d5601583615047565b91506146e08261560b565b602082019050919050565b60006146f8602683615047565b915061470382615634565b604082019050919050565b600061471b602c83615047565b915061472682615683565b604082019050919050565b600061473e600f83615047565b9150614749826156d2565b602082019050919050565b6000614761603883615047565b915061476c826156fb565b604082019050919050565b6000614784602083615047565b915061478f8261574a565b602082019050919050565b60006147a7602a83615047565b91506147b282615773565b604082019050919050565b60006147ca601983615047565b91506147d5826157c2565b602082019050919050565b60006147ed601983615047565b91506147f8826157eb565b602082019050919050565b6000614810601983615047565b915061481b82615814565b602082019050919050565b6000614833600883615047565b915061483e8261583d565b602082019050919050565b6000614856602083615047565b915061486182615866565b602082019050919050565b6000614879601b83615047565b91506148848261588f565b602082019050919050565b600061489c602c83615047565b91506148a7826158b8565b604082019050919050565b60006148bf600583615058565b91506148ca82615907565b600582019050919050565b60006148e2602c83615047565b91506148ed82615930565b604082019050919050565b6000614905602083615047565b91506149108261597f565b602082019050919050565b6000614928602983615047565b9150614933826159a8565b604082019050919050565b600061494b602183615047565b9150614956826159f7565b604082019050919050565b600061496e603183615047565b915061497982615a46565b604082019050919050565b6000614991602d83615047565b915061499c82615a95565b604082019050919050565b60006149b4601d83615047565b91506149bf82615ae4565b602082019050919050565b60006149d7601683615047565b91506149e282615b0d565b602082019050919050565b60006149fa601783615047565b9150614a0582615b36565b602082019050919050565b614a19816151e2565b82525050565b614a28816151e2565b82525050565b6000614a3a82846144f2565b915081905092915050565b6000614a51828561455c565b9150614a5d828461455c565b9150614a68826148b2565b91508190509392505050565b6000602082019050614a89600083018461443d565b92915050565b6000608082019050614aa4600083018761443d565b614ab1602083018661443d565b614abe6040830185614a1f565b8181036060830152614ad081846144b9565b905095945050505050565b60006020820190508181036000830152614af5818461444c565b905092915050565b6000602082019050614b1260008301846144aa565b92915050565b60006020820190508181036000830152614b328184614523565b905092915050565b60006020820190508181036000830152614b538161458d565b9050919050565b60006020820190508181036000830152614b73816145b0565b9050919050565b60006020820190508181036000830152614b93816145d3565b9050919050565b60006020820190508181036000830152614bb3816145f6565b9050919050565b60006020820190508181036000830152614bd381614619565b9050919050565b60006020820190508181036000830152614bf38161463c565b9050919050565b60006020820190508181036000830152614c138161465f565b9050919050565b60006020820190508181036000830152614c3381614682565b9050919050565b60006020820190508181036000830152614c53816146a5565b9050919050565b60006020820190508181036000830152614c73816146c8565b9050919050565b60006020820190508181036000830152614c93816146eb565b9050919050565b60006020820190508181036000830152614cb38161470e565b9050919050565b60006020820190508181036000830152614cd381614731565b9050919050565b60006020820190508181036000830152614cf381614754565b9050919050565b60006020820190508181036000830152614d1381614777565b9050919050565b60006020820190508181036000830152614d338161479a565b9050919050565b60006020820190508181036000830152614d53816147bd565b9050919050565b60006020820190508181036000830152614d73816147e0565b9050919050565b60006020820190508181036000830152614d9381614803565b9050919050565b60006020820190508181036000830152614db381614826565b9050919050565b60006020820190508181036000830152614dd381614849565b9050919050565b60006020820190508181036000830152614df38161486c565b9050919050565b60006020820190508181036000830152614e138161488f565b9050919050565b60006020820190508181036000830152614e33816148d5565b9050919050565b60006020820190508181036000830152614e53816148f8565b9050919050565b60006020820190508181036000830152614e738161491b565b9050919050565b60006020820190508181036000830152614e938161493e565b9050919050565b60006020820190508181036000830152614eb381614961565b9050919050565b60006020820190508181036000830152614ed381614984565b9050919050565b60006020820190508181036000830152614ef3816149a7565b9050919050565b60006020820190508181036000830152614f13816149ca565b9050919050565b60006020820190508181036000830152614f33816149ed565b9050919050565b6000602082019050614f4f6000830184614a1f565b92915050565b6000614f5f614f70565b9050614f6b828261528a565b919050565b6000604051905090565b600067ffffffffffffffff821115614f9557614f946153c2565b5b614f9e826153f1565b9050602081019050919050565b600067ffffffffffffffff821115614fc657614fc56153c2565b5b614fcf826153f1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061506e826151e2565b9150615079836151e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150ae576150ad615335565b5b828201905092915050565b60006150c4826151e2565b91506150cf836151e2565b9250826150df576150de615364565b5b828204905092915050565b60006150f5826151e2565b9150615100836151e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561513957615138615335565b5b828202905092915050565b600061514f826151e2565b915061515a836151e2565b92508282101561516d5761516c615335565b5b828203905092915050565b6000615183826151c2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152195780820151818401526020810190506151fe565b83811115615228576000848401525b50505050565b6000615239826151e2565b9150600082141561524d5761524c615335565b5b600182039050919050565b6000600282049050600182168061527057607f821691505b6020821081141561528457615283615393565b5b50919050565b615293826153f1565b810181811067ffffffffffffffff821117156152b2576152b16153c2565b5b80604052505050565b60006152c6826151e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152f9576152f8615335565b5b600182019050919050565b600061530f826151e2565b915061531a836151e2565b92508261532a57615329615364565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b7f546865207072652d73616c6520686173204e4f5420737461727465642c20706c60008201527f6561736520776169742e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6b656e206e6f742065786973742e00000000000000000000000000000000600082015250565b7f45746865722073656e74206973206e6f742073756666696369656e742e000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f576974686472617720556e7375636365737366756c0000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752061726520747279696e6720746f206d696e7420746f6f206d616e792e600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f43616c6c65722063616e6e6f7420626520636f6e747261637400000000000000600082015250565b7f457863656564696e672070726573616c6520737570706c792e00000000000000600082015250565b7f4e6f74207175616c696669656420666f722070726573616c6500000000000000600082015250565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45786365656465642070726573616c6520616c6c6f636174696f6e0000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865207075626c69632073616c6520686173204e4f5420737461727465642c60008201527f20706c6561736520776169742e00000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f457863656564696e6720746f74616c20737570706c7900000000000000000000600082015250565b7f4e6f207265736572766564206e696e6a6173206c656674000000000000000000600082015250565b615b6881615178565b8114615b7357600080fd5b50565b615b7f8161518a565b8114615b8a57600080fd5b50565b615b9681615196565b8114615ba157600080fd5b50565b615bad816151e2565b8114615bb857600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d16c5d76dd60b30485138469b1739e52b47aa447ecc71408adad2f0ec3131cea64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

105:6806:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;523:188:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4431:90:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7052:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6610:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5799:149:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1686:514;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6120:200:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7900:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5897:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;562:22:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5407:77;;;;;;;;;;;;;:::i;:::-;;772:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6179:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8266:149:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6392:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;590:20:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5688:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;458:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3267:802;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;537:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5490:78;;;;;;;;;;;;;:::i;:::-;;4202:167:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;315:37:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5731:87:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6602:110:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;187:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3934:211:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:13;;;;;;;;;;;;;:::i;:::-;;1018:346:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;397:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6074:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4075:512;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6399:197;;;:::i;:::-;;966:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4585:94:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;709:56:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;659:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;234:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6275:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7328:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1370:310:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;274:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8481:282:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5954:114:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2206:1055;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;358:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4593:659;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;617:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5574:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5315:86;;;;;;;;;;;;;:::i;:::-;;7684:154:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;523:188:3;608:4;631:36;655:11;631:23;:36::i;:::-;:73;;;;671:20;:33;692:11;671:33;;;;;;;;;;;;;;;;;;;;;;;;;;;631:73;624:80;;523:188;;;:::o;4431:90:4:-;4477:13;4509:5;4502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4431:90;:::o;7052:209::-;7120:7;7147:16;7155:7;7147;:16::i;:::-;7139:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7230:15;:24;7246:7;7230:24;;;;;;;;;;;;;;;;;;;;;7223:31;;7052:209;;;:::o;6610:381::-;6690:13;6706:16;6714:7;6706;:16::i;:::-;6690:32;;6746:5;6740:11;;:2;:11;;;;6732:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;6824:5;6808:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;6833:37;6850:5;6857:12;:10;:12::i;:::-;6833:16;:37::i;:::-;6808:62;6800:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;6963:21;6972:2;6976:7;6963:8;:21::i;:::-;6610:381;;;:::o;5799:149:16:-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5909:32:16::1;5922:7;5931:9;5909:12;:32::i;:::-;5799:149:::0;;:::o;1686:514::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;224:4:16::1;1783:9;;:16;;1767:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;1759:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2001:14;;1981:9;;:16;;:34;;1973:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2059:9;2054:140;2078:9;;:16;;2074:1;:20;2054:140;;;2115:14;;:16;;;;;;;;;:::i;:::-;;;;;;2145:38;2155:9;;2165:1;2155:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2169:13;:11;:13::i;:::-;2145:9;:38::i;:::-;2096:3;;;;;:::i;:::-;;;;2054:140;;;;1686:514:::0;;:::o;6120:200:4:-;6173:7;6292:21;:12;:19;:21::i;:::-;6285:28;;6120:200;:::o;7900:300::-;8059:41;8078:12;:10;:12::i;:::-;8092:7;8059:18;:41::i;:::-;8051:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8165:28;8175:4;8181:2;8185:7;8165:9;:28::i;:::-;7900:300;;;:::o;5897:152::-;5986:7;6012:30;6036:5;6012:13;:20;6026:5;6012:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;6005:37;;5897:152;;;;:::o;562:22:16:-;;;;;;;;;;;;;:::o;5407:77::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5470:7:16::1;;;;;;;;;;;5469:8;5459:7;;:18;;;;;;;;;;;;;;;;;;5407:77::o:0;772:127::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6179:90::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6254:8:16::1;6244:7;:18;;;;6179:90:::0;:::o;8266:149:4:-;8369:39;8386:4;8392:2;8396:7;8369:39;;;;;;;;;;;;:16;:39::i;:::-;8266:149;;;:::o;6392:161::-;6459:7;6479:15;6500:22;6516:5;6500:12;:15;;:22;;;;:::i;:::-;6478:44;;;6539:7;6532:14;;;6392:161;;;:::o;590:20:16:-;;;;;;;;;;;;;:::o;5688:105::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5762:24:16::1;5774:11;5762;:24::i;:::-;5688:105:::0;:::o;458:72::-;488:42;458:72;:::o;3267:802::-;3328:4;3344:21;3368:13;:11;:13::i;:::-;3344:37;;3399:10;;;;;;;;;;;3391:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3484:7;;3477:3;:14;;3469:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3595:14;;224:4;3582:27;;;;:::i;:::-;3575:3;3559:13;:19;;;;:::i;:::-;:50;;3538:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;3694:9;;3688:3;:15;;;;:::i;:::-;3675:9;:28;;3667:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3756:23;3768:10;3756:11;:23::i;:::-;3755:24;3747:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3826:9;3821:220;3845:3;3841:1;:7;3821:220;;;3869:21;:33;3891:10;3869:33;;;;;;;;;;;;;;;;:35;;;;;;;;;:::i;:::-;;;;;;3918:18;3939:13;:11;:13::i;:::-;3918:34;;224:4;3970:10;:23;3966:64;;;3995:35;4005:12;:10;:12::i;:::-;4019:10;3995:9;:35::i;:::-;3966:64;3821:220;3850:3;;;;;:::i;:::-;;;;3821:220;;;;4058:4;4051:11;;;3267:802;;;:::o;537:19::-;;;;;;;;;;;;;:::o;5490:78::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5553:8:16::1;;;;;;;;;;;5552:9;5541:8;;:20;;;;;;;;;;;;;;;;;;5490:78::o:0;4202:167:4:-;4266:7;4292:70;4309:7;4292:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;4285:77;;4202:167;;;:::o;315:37:16:-;;;;:::o;5731:87:4:-;5771:13;5803:8;5796:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5731:87;:::o;6602:110:16:-;6663:4;6686:12;:19;6699:5;6686:19;;;;;;;;;;;;;;;;;;;;;;;;;6679:26;;6602:110;;;:::o;187:41::-;224:4;187:41;:::o;3934:211:4:-;3998:7;4042:1;4025:19;;:5;:19;;;;4017:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;4109:29;:13;:20;4123:5;4109:20;;;;;;;;;;;;;;;:27;:29::i;:::-;4102:36;;3934:211;;;:::o;1598:92:13:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;1018:346:16:-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1106:9:16::1;1101:257;1125:7;;:14;;1121:1;:18;1101:257;;;1160:13;1176:7;;1184:1;1176:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1160:26;;1225:1;1208:19;;:5;:19;;;;1200:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1267:12;:19;1280:5;1267:19;;;;;;;;;;;;;;;;;;;;;;;;;1266:20;1258:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1343:4;1321:12;:19;1334:5;1321:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;1101:257;1141:3;;;;;:::i;:::-;;;;1101:257;;;;1018:346:::0;;:::o;397:26::-;;;;:::o;6074:99::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6157:9:16::1;6145;:21;;;;6074:99:::0;:::o;4075:512::-;4161:16;4193:18;4214:17;4224:6;4214:9;:17::i;:::-;4193:38;;4259:1;4245:10;:15;4241:340;;;4334:1;4320:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4313:23;;;;;4241:340;4367:23;4407:10;4393:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4367:51;;4437:9;4432:112;4452:10;4448:1;:14;4432:112;;;4499:30;4519:6;4527:1;4499:19;:30::i;:::-;4487:6;4494:1;4487:9;;;;;;;;;;;;;;;;;;;;;:42;;;;;4464:3;;;;;:::i;:::-;;;;4432:112;;;;4564:6;4557:13;;;;4075:512;;;;:::o;6399:197::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;488:42:16::1;6502:17;;:40;6520:21;6502:40;;;;;;;;;;;;;;;;;;;;;;;6481:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;6399:197::o:0;966:85:13:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;4585:94:4:-;4633:13;4665:7;4658:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4585:94;:::o;709:56:16:-;;;;;;;;;;;;;;;;;:::o;659:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;234:34::-;;;;:::o;6275:118::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6371:15:16::1;6354:14;:32;;;;6275:118:::0;:::o;7328:290:4:-;7442:12;:10;:12::i;:::-;7430:24;;:8;:24;;;;7422:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;7540:8;7495:18;:32;7514:12;:10;:12::i;:::-;7495:32;;;;;;;;;;;;;;;:42;7528:8;7495:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7592:8;7563:48;;7578:12;:10;:12::i;:::-;7563:48;;;7602:8;7563:48;;;;;;:::i;:::-;;;;;;;;7328:290;;:::o;1370:310:16:-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1483:9:16::1;1478:196;1502:7;;:14;;1498:1;:18;1478:196;;;1537:13;1553:7;;1561:1;1553:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1537:26;;1602:1;1585:19;;:5;:19;;;;1577:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1658:5;1636:12;:19;1649:5;1636:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;1478:196;1518:3;;;;;:::i;:::-;;;;1478:196;;;;1370:310:::0;;:::o;274:35::-;;;;:::o;8481:282:4:-;8612:41;8631:12;:10;:12::i;:::-;8645:7;8612:18;:41::i;:::-;8604:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8717:39;8731:4;8737:2;8741:7;8750:5;8717:13;:39::i;:::-;8481:282;;;;:::o;5954:114:16:-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6047:14:16::1;6031:13;:30;;;;5954:114:::0;:::o;2206:1055::-;2264:4;2280:21;2304:13;:11;:13::i;:::-;2280:37;;2335:7;;;;;;;;;;;2327:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2407:12;:24;2420:10;2407:24;;;;;;;;;;;;;;;;;;;;;;;;;2399:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2535:14;;2528:3;2492:21;:33;2514:10;2492:33;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:57;;2471:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;2669:14;;224:4;2656:27;;;;:::i;:::-;2649:3;2633:13;:19;;;;:::i;:::-;:50;;2612:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;2785:13;;2778:3;2762:13;:19;;;;:::i;:::-;:36;;2741:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2892:3;2880:9;;:15;;;;:::i;:::-;2867:9;:28;;2859:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2948:23;2960:10;2948:11;:23::i;:::-;2947:24;2939:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3018:9;3013:220;3037:3;3033:1;:7;3013:220;;;3061:21;:33;3083:10;3061:33;;;;;;;;;;;;;;;;:35;;;;;;;;;:::i;:::-;;;;;;3110:18;3131:13;:11;:13::i;:::-;3110:34;;224:4;3162:10;:23;3158:64;;;3187:35;3197:12;:10;:12::i;:::-;3211:10;3187:9;:35::i;:::-;3158:64;3013:220;3042:3;;;;;:::i;:::-;;;;3013:220;;;;3250:4;3243:11;;;2206:1055;;;:::o;358:33::-;;;;:::o;4593:659::-;4690:13;4737;:11;:13::i;:::-;4727:7;:23;4719:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4831:8;;;;;;;;;;;4826:57;;4862:10;4855:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4826:57;4893:23;4919:16;:25;4936:7;4919:25;;;;;;;;;;;4893:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5024:1;5004:9;4998:23;:27;4994:74;;;5048:9;5041:16;;;;;4994:74;5089:1;5078:12;;;;;:::i;:::-;;;5205:9;:7;:9::i;:::-;5216:18;:7;:16;:18::i;:::-;5188:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5174:71;;;4593:659;;;;:::o;617:35::-;;;;:::o;5574:108::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5664:11:16::1;5651:10;:24;;;;;;;;;;;;:::i;:::-;;5574:108:::0;:::o;5315:86::-;1189:12:13;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5384:10:16::1;;;;;;;;;;;5383:11;5370:10;;:24;;;;;;;;;;;;;;;;;;5315:86::o:0;7684:154:4:-;7773:4;7796:18;:25;7815:5;7796:25;;;;;;;;;;;;;;;:35;7822:8;7796:35;;;;;;;;;;;;;;;;;;;;;;;;;7789:42;;7684:154;;;;:::o;1839:189:13:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;10197:117:4:-;10254:4;10277:30;10299:7;10277:12;:21;;:30;;;;:::i;:::-;10270:37;;10197:117;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;15140:155:4:-;15232:2;15205:15;:24;15221:7;15205:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;15280:7;15276:2;15249:39;;15258:16;15266:7;15258;:16::i;:::-;15249:39;;;;;;;;;;;;15140:155;;:::o;13453:218::-;13552:16;13560:7;13552;:16::i;:::-;13544:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13655:9;13627:16;:25;13644:7;13627:25;;;;;;;;;;;:37;;;;;;;;;;;;:::i;:::-;;13453:218;;:::o;11132:108::-;11207:26;11217:2;11221:7;11207:26;;;;;;;;;;;;:9;:26::i;:::-;11132:108;;:::o;5618:121:6:-;5687:7;5713:19;5721:3;:10;;5713:7;:19::i;:::-;5706:26;;5618:121;;;:::o;10472:329:4:-;10557:4;10581:16;10589:7;10581;:16::i;:::-;10573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10656:13;10672:16;10680:7;10672;:16::i;:::-;10656:32;;10717:5;10706:16;;:7;:16;;;:51;;;;10750:7;10726:31;;:20;10738:7;10726:11;:20::i;:::-;:31;;;10706:51;:87;;;;10761:32;10778:5;10785:7;10761:16;:32::i;:::-;10706:87;10698:96;;;10472:329;;;;:::o;12747:559::-;12864:4;12844:24;;:16;12852:7;12844;:16::i;:::-;:24;;;12836:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;12946:1;12932:16;;:2;:16;;;;12924:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13000:39;13021:4;13027:2;13031:7;13000:20;:39::i;:::-;13101:29;13118:1;13122:7;13101:8;:29::i;:::-;13141:35;13168:7;13141:13;:19;13155:4;13141:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;13186:30;13208:7;13186:13;:17;13200:2;13186:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;13227:29;13244:7;13253:2;13227:12;:16;;:29;;;;;:::i;:::-;;13291:7;13287:2;13272:27;;13281:4;13272:27;;;;;;;;;;;;12747:559;;;:::o;9072:135:7:-;9143:7;9177:22;9181:3;:10;;9193:5;9177:3;:22::i;:::-;9169:31;;9162:38;;9072:135;;;;:::o;6076:233:6:-;6156:7;6165;6185:11;6198:13;6215:22;6219:3;:10;;6231:5;6215:3;:22::i;:::-;6184:53;;;;6263:3;6255:12;;6293:5;6285:14;;6247:55;;;;;;6076:233;;;;;:::o;13894:98:4:-;13977:8;13966;:19;;;;;;;;;;;;:::i;:::-;;13894:98;:::o;6718:191:16:-;6777:4;6793:12;6859:5;6847:18;6838:27;;6900:1;6892:5;:9;;;6884:18;;;6718:191;;;:::o;7329:241:6:-;7466:7;7516:44;7521:3;:10;;7541:3;7533:12;;7547;7516:4;:44::i;:::-;7508:53;;7485:78;;7329:241;;;;;:::o;8618:112:7:-;8678:7;8704:19;8712:3;:10;;8704:7;:19::i;:::-;8697:26;;8618:112;;;:::o;2034:169:13:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2034:169;;:::o;9625:269:4:-;9738:28;9748:4;9754:2;9758:7;9738:9;:28::i;:::-;9784:48;9807:4;9813:2;9817:7;9826:5;9784:22;:48::i;:::-;9776:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;9625:269;;;;:::o;275:703:15:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;5386:149:6:-;5470:4;5493:35;5503:3;:10;;5523:3;5515:12;;5493:9;:35::i;:::-;5486:42;;5386:149;;;;:::o;11461:247:4:-;11556:18;11562:2;11566:7;11556:5;:18::i;:::-;11592:54;11623:1;11627:2;11631:7;11640:5;11592:22;:54::i;:::-;11584:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;11461:247;;;:::o;2490:107:6:-;2546:7;2572:18;:3;:9;;:16;:18::i;:::-;2565:25;;2490:107;;;:::o;15891:93:4:-;;;;:::o;8177:135:7:-;8247:4;8270:35;8278:3;:10;;8298:5;8290:14;;8270:7;:35::i;:::-;8263:42;;8177:135;;;;:::o;7880:129::-;7947:4;7970:32;7975:3;:10;;7995:5;7987:14;;7970:4;:32::i;:::-;7963:39;;7880:129;;;;:::o;4795:213:6:-;4914:4;4937:64;4942:3;:10;;4962:3;4954:12;;4992:5;4976:23;;4968:32;;4937:4;:64::i;:::-;4930:71;;4795:213;;;;;:::o;4328:118:7:-;4395:7;4421:3;:11;;4433:5;4421:18;;;;;;;;;;;;;;;;;;;;;;;;4414:25;;4328:118;;;;:::o;2950:175:6:-;3017:7;3026;3045:11;3059:19;3072:5;3059:3;:9;;:12;;:19;;;;:::i;:::-;3045:33;;3096:3;3101;:11;;:16;3113:3;3101:16;;;;;;;;;;;;3088:30;;;;;2950:175;;;;;:::o;4216:270::-;4340:7;4359:13;4375:3;:11;;:16;4387:3;4375:16;;;;;;;;;;;;4359:32;;4418:1;4409:10;;:5;:10;;:33;;;;4423:19;4433:3;4438;4423:9;:19::i;:::-;4409:33;4444:12;4401:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4474:5;4467:12;;;4216:270;;;;;:::o;3879:107:7:-;3935:7;3961:3;:11;;:18;;;;3954:25;;3879:107;;;:::o;14545:589:4:-;14665:4;14690:15;:2;:13;;;:15::i;:::-;14685:58;;14728:4;14721:11;;;;14685:58;14752:23;14778:246;14830:45;;;14889:12;:10;:12::i;:::-;14915:4;14933:7;14954:5;14794:175;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14778:246;;;;;;;;;;;;;;;;;:2;:15;;;;:246;;;;;:::i;:::-;14752:272;;15034:13;15061:10;15050:32;;;;;;;;;;;;:::i;:::-;15034:48;;1007:10;15110:16;;15100:26;;;:6;:26;;;;15092:35;;;;14545:589;;;;;;;:::o;2276:124:6:-;2347:4;2370:23;2389:3;2370;:9;;:18;;:23;;;;:::i;:::-;2363:30;;2276:124;;;;:::o;12030:393:4:-;12123:1;12109:16;;:2;:16;;;;12101:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;12181:16;12189:7;12181;:16::i;:::-;12180:17;12172:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;12241:45;12270:1;12274:2;12278:7;12241:20;:45::i;:::-;12297:30;12319:7;12297:13;:17;12311:2;12297:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;12338:29;12355:7;12364:2;12338:12;:16;;:29;;;;;:::i;:::-;;12408:7;12404:2;12383:33;;12400:1;12383:33;;;;;;;;;;;;12030:393;;:::o;5406:115:7:-;5469:7;5495:19;5503:3;:10;;5495:7;:19::i;:::-;5488:26;;5406:115;;;:::o;2202:1388::-;2268:4;2384:18;2405:3;:12;;:19;2418:5;2405:19;;;;;;;;;;;;2384:40;;2453:1;2439:10;:15;2435:1149;;2808:21;2845:1;2832:10;:14;;;;:::i;:::-;2808:38;;2860:17;2901:1;2880:3;:11;;:18;;;;:22;;;;:::i;:::-;2860:42;;2934:13;2921:9;:26;2917:398;;2967:17;2987:3;:11;;2999:9;2987:22;;;;;;;;;;;;;;;;;;;;;;;;2967:42;;3138:9;3109:3;:11;;3121:13;3109:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3247:10;3221:3;:12;;:23;3234:9;3221:23;;;;;;;;;;;:36;;;;2917:398;;3393:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3485:3;:12;;:19;3498:5;3485:19;;;;;;;;;;;3478:26;;;3526:4;3519:11;;;;;;;2435:1149;3568:5;3561:12;;;2202:1388;;;;;:::o;1630:404::-;1693:4;1714:21;1724:3;1729:5;1714:9;:21::i;:::-;1709:319;;1751:3;:11;;1768:5;1751:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1931:3;:11;;:18;;;;1909:3;:12;;:19;1922:5;1909:19;;;;;;;;;;;:40;;;;1970:4;1963:11;;;;1709:319;2012:5;2005:12;;1630:404;;;;;:::o;1693:188:6:-;1799:4;1834:5;1815:3;:11;;:16;1827:3;1815:16;;;;;;;;;;;:24;;;;1856:18;1870:3;1856;:9;;:13;;:18;;;;:::i;:::-;1849:25;;1693:188;;;;;:::o;5863:129:7:-;5937:7;5963:22;5967:3;:10;;5979:5;5963:3;:22::i;:::-;5956:29;;5863:129;;;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;3461:223::-;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;;3461:223;;;;;:::o;5187:138:7:-;5267:4;5290:28;5300:3;:10;;5312:5;5290:9;:28::i;:::-;5283:35;;5187:138;;;;:::o;3671:127::-;3744:4;3790:1;3767:3;:12;;:19;3780:5;3767:19;;;;;;;;;;;;:24;;3760:31;;3671:127;;;;:::o;4686:123::-;4756:4;4779:23;4784:3;:10;;4796:5;4779:4;:23::i;:::-;4772:30;;4686:123;;;;:::o;4548:500:0:-;4713:12;4770:5;4745:21;:30;;4737:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;4836:18;4847:6;4836:10;:18::i;:::-;4828:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4900:12;4914:23;4941:6;:11;;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:52;5007:7;5016:10;5028:12;4989:17;:52::i;:::-;4982:59;;;;4548:500;;;;;;:::o;6950:692::-;7096:12;7124:7;7120:516;;;7154:10;7147:17;;;;7120:516;7285:1;7265:10;:17;:21;7261:365;;;7459:10;7453:17;7519:15;7506:10;7502:2;7498:19;7491:44;7408:145;7598:12;7591:20;;;;;;;;;;;:::i;:::-;;;;;;;;6950:692;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:17:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1426:5;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;1580:5;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;1739:5;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;2031:5;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;2300:5;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:262::-;2458:6;2507:2;2495:9;2486:7;2482:23;2478:32;2475:2;;;2523:1;2520;2513:12;2475:2;2566:1;2591:53;2636:7;2627:6;2616:9;2612:22;2591:53;:::i;:::-;2581:63;;2537:117;2465:196;;;;:::o;2667:407::-;2735:6;2743;2792:2;2780:9;2771:7;2767:23;2763:32;2760:2;;;2808:1;2805;2798:12;2760:2;2851:1;2876:53;2921:7;2912:6;2901:9;2897:22;2876:53;:::i;:::-;2866:63;;2822:117;2978:2;3004:53;3049:7;3040:6;3029:9;3025:22;3004:53;:::i;:::-;2994:63;;2949:118;2750:324;;;;;:::o;3080:552::-;3157:6;3165;3173;3222:2;3210:9;3201:7;3197:23;3193:32;3190:2;;;3238:1;3235;3228:12;3190:2;3281:1;3306:53;3351:7;3342:6;3331:9;3327:22;3306:53;:::i;:::-;3296:63;;3252:117;3408:2;3434:53;3479:7;3470:6;3459:9;3455:22;3434:53;:::i;:::-;3424:63;;3379:118;3536:2;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3507:118;3180:452;;;;;:::o;3638:809::-;3733:6;3741;3749;3757;3806:3;3794:9;3785:7;3781:23;3777:33;3774:2;;;3823:1;3820;3813:12;3774:2;3866:1;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3837:117;3993:2;4019:53;4064:7;4055:6;4044:9;4040:22;4019:53;:::i;:::-;4009:63;;3964:118;4121:2;4147:53;4192:7;4183:6;4172:9;4168:22;4147:53;:::i;:::-;4137:63;;4092:118;4277:2;4266:9;4262:18;4249:32;4308:18;4300:6;4297:30;4294:2;;;4340:1;4337;4330:12;4294:2;4368:62;4422:7;4413:6;4402:9;4398:22;4368:62;:::i;:::-;4358:72;;4220:220;3764:683;;;;;;;:::o;4453:401::-;4518:6;4526;4575:2;4563:9;4554:7;4550:23;4546:32;4543:2;;;4591:1;4588;4581:12;4543:2;4634:1;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4605:117;4761:2;4787:50;4829:7;4820:6;4809:9;4805:22;4787:50;:::i;:::-;4777:60;;4732:115;4533:321;;;;;:::o;4860:407::-;4928:6;4936;4985:2;4973:9;4964:7;4960:23;4956:32;4953:2;;;5001:1;4998;4991:12;4953:2;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4943:324;;;;;:::o;5273:425::-;5359:6;5367;5416:2;5404:9;5395:7;5391:23;5387:32;5384:2;;;5432:1;5429;5422:12;5384:2;5503:1;5492:9;5488:17;5475:31;5533:18;5525:6;5522:30;5519:2;;;5565:1;5562;5555:12;5519:2;5601:80;5673:7;5664:6;5653:9;5649:22;5601:80;:::i;:::-;5583:98;;;;5446:245;5374:324;;;;;:::o;5704:260::-;5762:6;5811:2;5799:9;5790:7;5786:23;5782:32;5779:2;;;5827:1;5824;5817:12;5779:2;5870:1;5895:52;5939:7;5930:6;5919:9;5915:22;5895:52;:::i;:::-;5885:62;;5841:116;5769:195;;;;:::o;5970:282::-;6039:6;6088:2;6076:9;6067:7;6063:23;6059:32;6056:2;;;6104:1;6101;6094:12;6056:2;6147:1;6172:63;6227:7;6218:6;6207:9;6203:22;6172:63;:::i;:::-;6162:73;;6118:127;6046:206;;;;:::o;6258:375::-;6327:6;6376:2;6364:9;6355:7;6351:23;6347:32;6344:2;;;6392:1;6389;6382:12;6344:2;6463:1;6452:9;6448:17;6435:31;6493:18;6485:6;6482:30;6479:2;;;6525:1;6522;6515:12;6479:2;6553:63;6608:7;6599:6;6588:9;6584:22;6553:63;:::i;:::-;6543:73;;6406:220;6334:299;;;;:::o;6639:262::-;6698:6;6747:2;6735:9;6726:7;6722:23;6718:32;6715:2;;;6763:1;6760;6753:12;6715:2;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6705:196;;;;:::o;6907:520::-;6985:6;6993;7042:2;7030:9;7021:7;7017:23;7013:32;7010:2;;;7058:1;7055;7048:12;7010:2;7101:1;7126:53;7171:7;7162:6;7151:9;7147:22;7126:53;:::i;:::-;7116:63;;7072:117;7256:2;7245:9;7241:18;7228:32;7287:18;7279:6;7276:30;7273:2;;;7319:1;7316;7309:12;7273:2;7347:63;7402:7;7393:6;7382:9;7378:22;7347:63;:::i;:::-;7337:73;;7199:221;7000:427;;;;;:::o;7433:179::-;7502:10;7523:46;7565:3;7557:6;7523:46;:::i;:::-;7601:4;7596:3;7592:14;7578:28;;7513:99;;;;:::o;7618:118::-;7705:24;7723:5;7705:24;:::i;:::-;7700:3;7693:37;7683:53;;:::o;7772:732::-;7891:3;7920:54;7968:5;7920:54;:::i;:::-;7990:86;8069:6;8064:3;7990:86;:::i;:::-;7983:93;;8100:56;8150:5;8100:56;:::i;:::-;8179:7;8210:1;8195:284;8220:6;8217:1;8214:13;8195:284;;;8296:6;8290:13;8323:63;8382:3;8367:13;8323:63;:::i;:::-;8316:70;;8409:60;8462:6;8409:60;:::i;:::-;8399:70;;8255:224;8242:1;8239;8235:9;8230:14;;8195:284;;;8199:14;8495:3;8488:10;;7896:608;;;;;;;:::o;8510:109::-;8591:21;8606:5;8591:21;:::i;:::-;8586:3;8579:34;8569:50;;:::o;8625:360::-;8711:3;8739:38;8771:5;8739:38;:::i;:::-;8793:70;8856:6;8851:3;8793:70;:::i;:::-;8786:77;;8872:52;8917:6;8912:3;8905:4;8898:5;8894:16;8872:52;:::i;:::-;8949:29;8971:6;8949:29;:::i;:::-;8944:3;8940:39;8933:46;;8715:270;;;;;:::o;8991:373::-;9095:3;9123:38;9155:5;9123:38;:::i;:::-;9177:88;9258:6;9253:3;9177:88;:::i;:::-;9170:95;;9274:52;9319:6;9314:3;9307:4;9300:5;9296:16;9274:52;:::i;:::-;9351:6;9346:3;9342:16;9335:23;;9099:265;;;;;:::o;9370:364::-;9458:3;9486:39;9519:5;9486:39;:::i;:::-;9541:71;9605:6;9600:3;9541:71;:::i;:::-;9534:78;;9621:52;9666:6;9661:3;9654:4;9647:5;9643:16;9621:52;:::i;:::-;9698:29;9720:6;9698:29;:::i;:::-;9693:3;9689:39;9682:46;;9462:272;;;;;:::o;9740:377::-;9846:3;9874:39;9907:5;9874:39;:::i;:::-;9929:89;10011:6;10006:3;9929:89;:::i;:::-;9922:96;;10027:52;10072:6;10067:3;10060:4;10053:5;10049:16;10027:52;:::i;:::-;10104:6;10099:3;10095:16;10088:23;;9850:267;;;;;:::o;10123:366::-;10265:3;10286:67;10350:2;10345:3;10286:67;:::i;:::-;10279:74;;10362:93;10451:3;10362:93;:::i;:::-;10480:2;10475:3;10471:12;10464:19;;10269:220;;;:::o;10495:366::-;10637:3;10658:67;10722:2;10717:3;10658:67;:::i;:::-;10651:74;;10734:93;10823:3;10734:93;:::i;:::-;10852:2;10847:3;10843:12;10836:19;;10641:220;;;:::o;10867:366::-;11009:3;11030:67;11094:2;11089:3;11030:67;:::i;:::-;11023:74;;11106:93;11195:3;11106:93;:::i;:::-;11224:2;11219:3;11215:12;11208:19;;11013:220;;;:::o;11239:366::-;11381:3;11402:67;11466:2;11461:3;11402:67;:::i;:::-;11395:74;;11478:93;11567:3;11478:93;:::i;:::-;11596:2;11591:3;11587:12;11580:19;;11385:220;;;:::o;11611:366::-;11753:3;11774:67;11838:2;11833:3;11774:67;:::i;:::-;11767:74;;11850:93;11939:3;11850:93;:::i;:::-;11968:2;11963:3;11959:12;11952:19;;11757:220;;;:::o;11983:366::-;12125:3;12146:67;12210:2;12205:3;12146:67;:::i;:::-;12139:74;;12222:93;12311:3;12222:93;:::i;:::-;12340:2;12335:3;12331:12;12324:19;;12129:220;;;:::o;12355:366::-;12497:3;12518:67;12582:2;12577:3;12518:67;:::i;:::-;12511:74;;12594:93;12683:3;12594:93;:::i;:::-;12712:2;12707:3;12703:12;12696:19;;12501:220;;;:::o;12727:366::-;12869:3;12890:67;12954:2;12949:3;12890:67;:::i;:::-;12883:74;;12966:93;13055:3;12966:93;:::i;:::-;13084:2;13079:3;13075:12;13068:19;;12873:220;;;:::o;13099:366::-;13241:3;13262:67;13326:2;13321:3;13262:67;:::i;:::-;13255:74;;13338:93;13427:3;13338:93;:::i;:::-;13456:2;13451:3;13447:12;13440:19;;13245:220;;;:::o;13471:366::-;13613:3;13634:67;13698:2;13693:3;13634:67;:::i;:::-;13627:74;;13710:93;13799:3;13710:93;:::i;:::-;13828:2;13823:3;13819:12;13812:19;;13617:220;;;:::o;13843:366::-;13985:3;14006:67;14070:2;14065:3;14006:67;:::i;:::-;13999:74;;14082:93;14171:3;14082:93;:::i;:::-;14200:2;14195:3;14191:12;14184:19;;13989:220;;;:::o;14215:366::-;14357:3;14378:67;14442:2;14437:3;14378:67;:::i;:::-;14371:74;;14454:93;14543:3;14454:93;:::i;:::-;14572:2;14567:3;14563:12;14556:19;;14361:220;;;:::o;14587:366::-;14729:3;14750:67;14814:2;14809:3;14750:67;:::i;:::-;14743:74;;14826:93;14915:3;14826:93;:::i;:::-;14944:2;14939:3;14935:12;14928:19;;14733:220;;;:::o;14959:366::-;15101:3;15122:67;15186:2;15181:3;15122:67;:::i;:::-;15115:74;;15198:93;15287:3;15198:93;:::i;:::-;15316:2;15311:3;15307:12;15300:19;;15105:220;;;:::o;15331:366::-;15473:3;15494:67;15558:2;15553:3;15494:67;:::i;:::-;15487:74;;15570:93;15659:3;15570:93;:::i;:::-;15688:2;15683:3;15679:12;15672:19;;15477:220;;;:::o;15703:366::-;15845:3;15866:67;15930:2;15925:3;15866:67;:::i;:::-;15859:74;;15942:93;16031:3;15942:93;:::i;:::-;16060:2;16055:3;16051:12;16044:19;;15849:220;;;:::o;16075:366::-;16217:3;16238:67;16302:2;16297:3;16238:67;:::i;:::-;16231:74;;16314:93;16403:3;16314:93;:::i;:::-;16432:2;16427:3;16423:12;16416:19;;16221:220;;;:::o;16447:366::-;16589:3;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16686:93;16775:3;16686:93;:::i;:::-;16804:2;16799:3;16795:12;16788:19;;16593:220;;;:::o;16819:366::-;16961:3;16982:67;17046:2;17041:3;16982:67;:::i;:::-;16975:74;;17058:93;17147:3;17058:93;:::i;:::-;17176:2;17171:3;17167:12;17160:19;;16965:220;;;:::o;17191:365::-;17333:3;17354:66;17418:1;17413:3;17354:66;:::i;:::-;17347:73;;17429:93;17518:3;17429:93;:::i;:::-;17547:2;17542:3;17538:12;17531:19;;17337:219;;;:::o;17562:366::-;17704:3;17725:67;17789:2;17784:3;17725:67;:::i;:::-;17718:74;;17801:93;17890:3;17801:93;:::i;:::-;17919:2;17914:3;17910:12;17903:19;;17708:220;;;:::o;17934:366::-;18076:3;18097:67;18161:2;18156:3;18097:67;:::i;:::-;18090:74;;18173:93;18262:3;18173:93;:::i;:::-;18291:2;18286:3;18282:12;18275:19;;18080:220;;;:::o;18306:366::-;18448:3;18469:67;18533:2;18528:3;18469:67;:::i;:::-;18462:74;;18545:93;18634:3;18545:93;:::i;:::-;18663:2;18658:3;18654:12;18647:19;;18452:220;;;:::o;18678:400::-;18838:3;18859:84;18941:1;18936:3;18859:84;:::i;:::-;18852:91;;18952:93;19041:3;18952:93;:::i;:::-;19070:1;19065:3;19061:11;19054:18;;18842:236;;;:::o;19084:366::-;19226:3;19247:67;19311:2;19306:3;19247:67;:::i;:::-;19240:74;;19323:93;19412:3;19323:93;:::i;:::-;19441:2;19436:3;19432:12;19425:19;;19230:220;;;:::o;19456:366::-;19598:3;19619:67;19683:2;19678:3;19619:67;:::i;:::-;19612:74;;19695:93;19784:3;19695:93;:::i;:::-;19813:2;19808:3;19804:12;19797:19;;19602:220;;;:::o;19828:366::-;19970:3;19991:67;20055:2;20050:3;19991:67;:::i;:::-;19984:74;;20067:93;20156:3;20067:93;:::i;:::-;20185:2;20180:3;20176:12;20169:19;;19974:220;;;:::o;20200:366::-;20342:3;20363:67;20427:2;20422:3;20363:67;:::i;:::-;20356:74;;20439:93;20528:3;20439:93;:::i;:::-;20557:2;20552:3;20548:12;20541:19;;20346:220;;;:::o;20572:366::-;20714:3;20735:67;20799:2;20794:3;20735:67;:::i;:::-;20728:74;;20811:93;20900:3;20811:93;:::i;:::-;20929:2;20924:3;20920:12;20913:19;;20718:220;;;:::o;20944:366::-;21086:3;21107:67;21171:2;21166:3;21107:67;:::i;:::-;21100:74;;21183:93;21272:3;21183:93;:::i;:::-;21301:2;21296:3;21292:12;21285:19;;21090:220;;;:::o;21316:366::-;21458:3;21479:67;21543:2;21538:3;21479:67;:::i;:::-;21472:74;;21555:93;21644:3;21555:93;:::i;:::-;21673:2;21668:3;21664:12;21657:19;;21462:220;;;:::o;21688:366::-;21830:3;21851:67;21915:2;21910:3;21851:67;:::i;:::-;21844:74;;21927:93;22016:3;21927:93;:::i;:::-;22045:2;22040:3;22036:12;22029:19;;21834:220;;;:::o;22060:366::-;22202:3;22223:67;22287:2;22282:3;22223:67;:::i;:::-;22216:74;;22299:93;22388:3;22299:93;:::i;:::-;22417:2;22412:3;22408:12;22401:19;;22206:220;;;:::o;22432:108::-;22509:24;22527:5;22509:24;:::i;:::-;22504:3;22497:37;22487:53;;:::o;22546:118::-;22633:24;22651:5;22633:24;:::i;:::-;22628:3;22621:37;22611:53;;:::o;22670:271::-;22800:3;22822:93;22911:3;22902:6;22822:93;:::i;:::-;22815:100;;22932:3;22925:10;;22804:137;;;;:::o;22947:701::-;23228:3;23250:95;23341:3;23332:6;23250:95;:::i;:::-;23243:102;;23362:95;23453:3;23444:6;23362:95;:::i;:::-;23355:102;;23474:148;23618:3;23474:148;:::i;:::-;23467:155;;23639:3;23632:10;;23232:416;;;;;:::o;23654:222::-;23747:4;23785:2;23774:9;23770:18;23762:26;;23798:71;23866:1;23855:9;23851:17;23842:6;23798:71;:::i;:::-;23752:124;;;;:::o;23882:640::-;24077:4;24115:3;24104:9;24100:19;24092:27;;24129:71;24197:1;24186:9;24182:17;24173:6;24129:71;:::i;:::-;24210:72;24278:2;24267:9;24263:18;24254:6;24210:72;:::i;:::-;24292;24360:2;24349:9;24345:18;24336:6;24292:72;:::i;:::-;24411:9;24405:4;24401:20;24396:2;24385:9;24381:18;24374:48;24439:76;24510:4;24501:6;24439:76;:::i;:::-;24431:84;;24082:440;;;;;;;:::o;24528:373::-;24671:4;24709:2;24698:9;24694:18;24686:26;;24758:9;24752:4;24748:20;24744:1;24733:9;24729:17;24722:47;24786:108;24889:4;24880:6;24786:108;:::i;:::-;24778:116;;24676:225;;;;:::o;24907:210::-;24994:4;25032:2;25021:9;25017:18;25009:26;;25045:65;25107:1;25096:9;25092:17;25083:6;25045:65;:::i;:::-;24999:118;;;;:::o;25123:313::-;25236:4;25274:2;25263:9;25259:18;25251:26;;25323:9;25317:4;25313:20;25309:1;25298:9;25294:17;25287:47;25351:78;25424:4;25415:6;25351:78;:::i;:::-;25343:86;;25241:195;;;;:::o;25442:419::-;25608:4;25646:2;25635:9;25631:18;25623:26;;25695:9;25689:4;25685:20;25681:1;25670:9;25666:17;25659:47;25723:131;25849:4;25723:131;:::i;:::-;25715:139;;25613:248;;;:::o;25867:419::-;26033:4;26071:2;26060:9;26056:18;26048:26;;26120:9;26114:4;26110:20;26106:1;26095:9;26091:17;26084:47;26148:131;26274:4;26148:131;:::i;:::-;26140:139;;26038:248;;;:::o;26292:419::-;26458:4;26496:2;26485:9;26481:18;26473:26;;26545:9;26539:4;26535:20;26531:1;26520:9;26516:17;26509:47;26573:131;26699:4;26573:131;:::i;:::-;26565:139;;26463:248;;;:::o;26717:419::-;26883:4;26921:2;26910:9;26906:18;26898:26;;26970:9;26964:4;26960:20;26956:1;26945:9;26941:17;26934:47;26998:131;27124:4;26998:131;:::i;:::-;26990:139;;26888:248;;;:::o;27142:419::-;27308:4;27346:2;27335:9;27331:18;27323:26;;27395:9;27389:4;27385:20;27381:1;27370:9;27366:17;27359:47;27423:131;27549:4;27423:131;:::i;:::-;27415:139;;27313:248;;;:::o;27567:419::-;27733:4;27771:2;27760:9;27756:18;27748:26;;27820:9;27814:4;27810:20;27806:1;27795:9;27791:17;27784:47;27848:131;27974:4;27848:131;:::i;:::-;27840:139;;27738:248;;;:::o;27992:419::-;28158:4;28196:2;28185:9;28181:18;28173:26;;28245:9;28239:4;28235:20;28231:1;28220:9;28216:17;28209:47;28273:131;28399:4;28273:131;:::i;:::-;28265:139;;28163:248;;;:::o;28417:419::-;28583:4;28621:2;28610:9;28606:18;28598:26;;28670:9;28664:4;28660:20;28656:1;28645:9;28641:17;28634:47;28698:131;28824:4;28698:131;:::i;:::-;28690:139;;28588:248;;;:::o;28842:419::-;29008:4;29046:2;29035:9;29031:18;29023:26;;29095:9;29089:4;29085:20;29081:1;29070:9;29066:17;29059:47;29123:131;29249:4;29123:131;:::i;:::-;29115:139;;29013:248;;;:::o;29267:419::-;29433:4;29471:2;29460:9;29456:18;29448:26;;29520:9;29514:4;29510:20;29506:1;29495:9;29491:17;29484:47;29548:131;29674:4;29548:131;:::i;:::-;29540:139;;29438:248;;;:::o;29692:419::-;29858:4;29896:2;29885:9;29881:18;29873:26;;29945:9;29939:4;29935:20;29931:1;29920:9;29916:17;29909:47;29973:131;30099:4;29973:131;:::i;:::-;29965:139;;29863:248;;;:::o;30117:419::-;30283:4;30321:2;30310:9;30306:18;30298:26;;30370:9;30364:4;30360:20;30356:1;30345:9;30341:17;30334:47;30398:131;30524:4;30398:131;:::i;:::-;30390:139;;30288:248;;;:::o;30542:419::-;30708:4;30746:2;30735:9;30731:18;30723:26;;30795:9;30789:4;30785:20;30781:1;30770:9;30766:17;30759:47;30823:131;30949:4;30823:131;:::i;:::-;30815:139;;30713:248;;;:::o;30967:419::-;31133:4;31171:2;31160:9;31156:18;31148:26;;31220:9;31214:4;31210:20;31206:1;31195:9;31191:17;31184:47;31248:131;31374:4;31248:131;:::i;:::-;31240:139;;31138:248;;;:::o;31392:419::-;31558:4;31596:2;31585:9;31581:18;31573:26;;31645:9;31639:4;31635:20;31631:1;31620:9;31616:17;31609:47;31673:131;31799:4;31673:131;:::i;:::-;31665:139;;31563:248;;;:::o;31817:419::-;31983:4;32021:2;32010:9;32006:18;31998:26;;32070:9;32064:4;32060:20;32056:1;32045:9;32041:17;32034:47;32098:131;32224:4;32098:131;:::i;:::-;32090:139;;31988:248;;;:::o;32242:419::-;32408:4;32446:2;32435:9;32431:18;32423:26;;32495:9;32489:4;32485:20;32481:1;32470:9;32466:17;32459:47;32523:131;32649:4;32523:131;:::i;:::-;32515:139;;32413:248;;;:::o;32667:419::-;32833:4;32871:2;32860:9;32856:18;32848:26;;32920:9;32914:4;32910:20;32906:1;32895:9;32891:17;32884:47;32948:131;33074:4;32948:131;:::i;:::-;32940:139;;32838:248;;;:::o;33092:419::-;33258:4;33296:2;33285:9;33281:18;33273:26;;33345:9;33339:4;33335:20;33331:1;33320:9;33316:17;33309:47;33373:131;33499:4;33373:131;:::i;:::-;33365:139;;33263:248;;;:::o;33517:419::-;33683:4;33721:2;33710:9;33706:18;33698:26;;33770:9;33764:4;33760:20;33756:1;33745:9;33741:17;33734:47;33798:131;33924:4;33798:131;:::i;:::-;33790:139;;33688:248;;;:::o;33942:419::-;34108:4;34146:2;34135:9;34131:18;34123:26;;34195:9;34189:4;34185:20;34181:1;34170:9;34166:17;34159:47;34223:131;34349:4;34223:131;:::i;:::-;34215:139;;34113:248;;;:::o;34367:419::-;34533:4;34571:2;34560:9;34556:18;34548:26;;34620:9;34614:4;34610:20;34606:1;34595:9;34591:17;34584:47;34648:131;34774:4;34648:131;:::i;:::-;34640:139;;34538:248;;;:::o;34792:419::-;34958:4;34996:2;34985:9;34981:18;34973:26;;35045:9;35039:4;35035:20;35031:1;35020:9;35016:17;35009:47;35073:131;35199:4;35073:131;:::i;:::-;35065:139;;34963:248;;;:::o;35217:419::-;35383:4;35421:2;35410:9;35406:18;35398:26;;35470:9;35464:4;35460:20;35456:1;35445:9;35441:17;35434:47;35498:131;35624:4;35498:131;:::i;:::-;35490:139;;35388:248;;;:::o;35642:419::-;35808:4;35846:2;35835:9;35831:18;35823:26;;35895:9;35889:4;35885:20;35881:1;35870:9;35866:17;35859:47;35923:131;36049:4;35923:131;:::i;:::-;35915:139;;35813:248;;;:::o;36067:419::-;36233:4;36271:2;36260:9;36256:18;36248:26;;36320:9;36314:4;36310:20;36306:1;36295:9;36291:17;36284:47;36348:131;36474:4;36348:131;:::i;:::-;36340:139;;36238:248;;;:::o;36492:419::-;36658:4;36696:2;36685:9;36681:18;36673:26;;36745:9;36739:4;36735:20;36731:1;36720:9;36716:17;36709:47;36773:131;36899:4;36773:131;:::i;:::-;36765:139;;36663:248;;;:::o;36917:419::-;37083:4;37121:2;37110:9;37106:18;37098:26;;37170:9;37164:4;37160:20;37156:1;37145:9;37141:17;37134:47;37198:131;37324:4;37198:131;:::i;:::-;37190:139;;37088:248;;;:::o;37342:419::-;37508:4;37546:2;37535:9;37531:18;37523:26;;37595:9;37589:4;37585:20;37581:1;37570:9;37566:17;37559:47;37623:131;37749:4;37623:131;:::i;:::-;37615:139;;37513:248;;;:::o;37767:419::-;37933:4;37971:2;37960:9;37956:18;37948:26;;38020:9;38014:4;38010:20;38006:1;37995:9;37991:17;37984:47;38048:131;38174:4;38048:131;:::i;:::-;38040:139;;37938:248;;;:::o;38192:419::-;38358:4;38396:2;38385:9;38381:18;38373:26;;38445:9;38439:4;38435:20;38431:1;38420:9;38416:17;38409:47;38473:131;38599:4;38473:131;:::i;:::-;38465:139;;38363:248;;;:::o;38617:419::-;38783:4;38821:2;38810:9;38806:18;38798:26;;38870:9;38864:4;38860:20;38856:1;38845:9;38841:17;38834:47;38898:131;39024:4;38898:131;:::i;:::-;38890:139;;38788:248;;;:::o;39042:222::-;39135:4;39173:2;39162:9;39158:18;39150:26;;39186:71;39254:1;39243:9;39239:17;39230:6;39186:71;:::i;:::-;39140:124;;;;:::o;39270:129::-;39304:6;39331:20;;:::i;:::-;39321:30;;39360:33;39388:4;39380:6;39360:33;:::i;:::-;39311:88;;;:::o;39405:75::-;39438:6;39471:2;39465:9;39455:19;;39445:35;:::o;39486:307::-;39547:4;39637:18;39629:6;39626:30;39623:2;;;39659:18;;:::i;:::-;39623:2;39697:29;39719:6;39697:29;:::i;:::-;39689:37;;39781:4;39775;39771:15;39763:23;;39552:241;;;:::o;39799:308::-;39861:4;39951:18;39943:6;39940:30;39937:2;;;39973:18;;:::i;:::-;39937:2;40011:29;40033:6;40011:29;:::i;:::-;40003:37;;40095:4;40089;40085:15;40077:23;;39866:241;;;:::o;40113:132::-;40180:4;40203:3;40195:11;;40233:4;40228:3;40224:14;40216:22;;40185:60;;;:::o;40251:114::-;40318:6;40352:5;40346:12;40336:22;;40325:40;;;:::o;40371:98::-;40422:6;40456:5;40450:12;40440:22;;40429:40;;;:::o;40475:99::-;40527:6;40561:5;40555:12;40545:22;;40534:40;;;:::o;40580:113::-;40650:4;40682;40677:3;40673:14;40665:22;;40655:38;;;:::o;40699:184::-;40798:11;40832:6;40827:3;40820:19;40872:4;40867:3;40863:14;40848:29;;40810:73;;;;:::o;40889:168::-;40972:11;41006:6;41001:3;40994:19;41046:4;41041:3;41037:14;41022:29;;40984:73;;;;:::o;41063:147::-;41164:11;41201:3;41186:18;;41176:34;;;;:::o;41216:169::-;41300:11;41334:6;41329:3;41322:19;41374:4;41369:3;41365:14;41350:29;;41312:73;;;;:::o;41391:148::-;41493:11;41530:3;41515:18;;41505:34;;;;:::o;41545:305::-;41585:3;41604:20;41622:1;41604:20;:::i;:::-;41599:25;;41638:20;41656:1;41638:20;:::i;:::-;41633:25;;41792:1;41724:66;41720:74;41717:1;41714:81;41711:2;;;41798:18;;:::i;:::-;41711:2;41842:1;41839;41835:9;41828:16;;41589:261;;;;:::o;41856:185::-;41896:1;41913:20;41931:1;41913:20;:::i;:::-;41908:25;;41947:20;41965:1;41947:20;:::i;:::-;41942:25;;41986:1;41976:2;;41991:18;;:::i;:::-;41976:2;42033:1;42030;42026:9;42021:14;;41898:143;;;;:::o;42047:348::-;42087:7;42110:20;42128:1;42110:20;:::i;:::-;42105:25;;42144:20;42162:1;42144:20;:::i;:::-;42139:25;;42332:1;42264:66;42260:74;42257:1;42254:81;42249:1;42242:9;42235:17;42231:105;42228:2;;;42339:18;;:::i;:::-;42228:2;42387:1;42384;42380:9;42369:20;;42095:300;;;;:::o;42401:191::-;42441:4;42461:20;42479:1;42461:20;:::i;:::-;42456:25;;42495:20;42513:1;42495:20;:::i;:::-;42490:25;;42534:1;42531;42528:8;42525:2;;;42539:18;;:::i;:::-;42525:2;42584:1;42581;42577:9;42569:17;;42446:146;;;;:::o;42598:96::-;42635:7;42664:24;42682:5;42664:24;:::i;:::-;42653:35;;42643:51;;;:::o;42700:90::-;42734:7;42777:5;42770:13;42763:21;42752:32;;42742:48;;;:::o;42796:149::-;42832:7;42872:66;42865:5;42861:78;42850:89;;42840:105;;;:::o;42951:126::-;42988:7;43028:42;43021:5;43017:54;43006:65;;42996:81;;;:::o;43083:77::-;43120:7;43149:5;43138:16;;43128:32;;;:::o;43166:154::-;43250:6;43245:3;43240;43227:30;43312:1;43303:6;43298:3;43294:16;43287:27;43217:103;;;:::o;43326:307::-;43394:1;43404:113;43418:6;43415:1;43412:13;43404:113;;;43503:1;43498:3;43494:11;43488:18;43484:1;43479:3;43475:11;43468:39;43440:2;43437:1;43433:10;43428:15;;43404:113;;;43535:6;43532:1;43529:13;43526:2;;;43615:1;43606:6;43601:3;43597:16;43590:27;43526:2;43375:258;;;;:::o;43639:171::-;43678:3;43701:24;43719:5;43701:24;:::i;:::-;43692:33;;43747:4;43740:5;43737:15;43734:2;;;43755:18;;:::i;:::-;43734:2;43802:1;43795:5;43791:13;43784:20;;43682:128;;;:::o;43816:320::-;43860:6;43897:1;43891:4;43887:12;43877:22;;43944:1;43938:4;43934:12;43965:18;43955:2;;44021:4;44013:6;44009:17;43999:27;;43955:2;44083;44075:6;44072:14;44052:18;44049:38;44046:2;;;44102:18;;:::i;:::-;44046:2;43867:269;;;;:::o;44142:281::-;44225:27;44247:4;44225:27;:::i;:::-;44217:6;44213:40;44355:6;44343:10;44340:22;44319:18;44307:10;44304:34;44301:62;44298:2;;;44366:18;;:::i;:::-;44298:2;44406:10;44402:2;44395:22;44185:238;;;:::o;44429:233::-;44468:3;44491:24;44509:5;44491:24;:::i;:::-;44482:33;;44537:66;44530:5;44527:77;44524:2;;;44607:18;;:::i;:::-;44524:2;44654:1;44647:5;44643:13;44636:20;;44472:190;;;:::o;44668:176::-;44700:1;44717:20;44735:1;44717:20;:::i;:::-;44712:25;;44751:20;44769:1;44751:20;:::i;:::-;44746:25;;44790:1;44780:2;;44795:18;;:::i;:::-;44780:2;44836:1;44833;44829:9;44824:14;;44702:142;;;;:::o;44850:180::-;44898:77;44895:1;44888:88;44995:4;44992:1;44985:15;45019:4;45016:1;45009:15;45036:180;45084:77;45081:1;45074:88;45181:4;45178:1;45171:15;45205:4;45202:1;45195:15;45222:180;45270:77;45267:1;45260:88;45367:4;45364:1;45357:15;45391:4;45388:1;45381:15;45408:180;45456:77;45453:1;45446:88;45553:4;45550:1;45543:15;45577:4;45574:1;45567:15;45594:102;45635:6;45686:2;45682:7;45677:2;45670:5;45666:14;45662:28;45652:38;;45642:54;;;:::o;45702:162::-;45842:14;45838:1;45830:6;45826:14;45819:38;45808:56;:::o;45870:229::-;46010:34;46006:1;45998:6;45994:14;45987:58;46079:12;46074:2;46066:6;46062:15;46055:37;45976:123;:::o;46105:237::-;46245:34;46241:1;46233:6;46229:14;46222:58;46314:20;46309:2;46301:6;46297:15;46290:45;46211:131;:::o;46348:225::-;46488:34;46484:1;46476:6;46472:14;46465:58;46557:8;46552:2;46544:6;46540:15;46533:33;46454:119;:::o;46579:178::-;46719:30;46715:1;46707:6;46703:14;46696:54;46685:72;:::o;46763:166::-;46903:18;46899:1;46891:6;46887:14;46880:42;46869:60;:::o;46935:179::-;47075:31;47071:1;47063:6;47059:14;47052:55;47041:73;:::o;47120:223::-;47260:34;47256:1;47248:6;47244:14;47237:58;47329:6;47324:2;47316:6;47312:15;47305:31;47226:117;:::o;47349:175::-;47489:27;47485:1;47477:6;47473:14;47466:51;47455:69;:::o;47530:171::-;47670:23;47666:1;47658:6;47654:14;47647:47;47636:65;:::o;47707:225::-;47847:34;47843:1;47835:6;47831:14;47824:58;47916:8;47911:2;47903:6;47899:15;47892:33;47813:119;:::o;47938:231::-;48078:34;48074:1;48066:6;48062:14;48055:58;48147:14;48142:2;48134:6;48130:15;48123:39;48044:125;:::o;48175:165::-;48315:17;48311:1;48303:6;48299:14;48292:41;48281:59;:::o;48346:243::-;48486:34;48482:1;48474:6;48470:14;48463:58;48555:26;48550:2;48542:6;48538:15;48531:51;48452:137;:::o;48595:182::-;48735:34;48731:1;48723:6;48719:14;48712:58;48701:76;:::o;48783:229::-;48923:34;48919:1;48911:6;48907:14;48900:58;48992:12;48987:2;48979:6;48975:15;48968:37;48889:123;:::o;49018:175::-;49158:27;49154:1;49146:6;49142:14;49135:51;49124:69;:::o;49199:175::-;49339:27;49335:1;49327:6;49323:14;49316:51;49305:69;:::o;49380:175::-;49520:27;49516:1;49508:6;49504:14;49497:51;49486:69;:::o;49561:158::-;49701:10;49697:1;49689:6;49685:14;49678:34;49667:52;:::o;49725:182::-;49865:34;49861:1;49853:6;49849:14;49842:58;49831:76;:::o;49913:177::-;50053:29;50049:1;50041:6;50037:14;50030:53;50019:71;:::o;50096:231::-;50236:34;50232:1;50224:6;50220:14;50213:58;50305:14;50300:2;50292:6;50288:15;50281:39;50202:125;:::o;50333:155::-;50473:7;50469:1;50461:6;50457:14;50450:31;50439:49;:::o;50494:231::-;50634:34;50630:1;50622:6;50618:14;50611:58;50703:14;50698:2;50690:6;50686:15;50679:39;50600:125;:::o;50731:182::-;50871:34;50867:1;50859:6;50855:14;50848:58;50837:76;:::o;50919:228::-;51059:34;51055:1;51047:6;51043:14;51036:58;51128:11;51123:2;51115:6;51111:15;51104:36;51025:122;:::o;51153:220::-;51293:34;51289:1;51281:6;51277:14;51270:58;51362:3;51357:2;51349:6;51345:15;51338:28;51259:114;:::o;51379:236::-;51519:34;51515:1;51507:6;51503:14;51496:58;51588:19;51583:2;51575:6;51571:15;51564:44;51485:130;:::o;51621:232::-;51761:34;51757:1;51749:6;51745:14;51738:58;51830:15;51825:2;51817:6;51813:15;51806:40;51727:126;:::o;51859:179::-;51999:31;51995:1;51987:6;51983:14;51976:55;51965:73;:::o;52044:172::-;52184:24;52180:1;52172:6;52168:14;52161:48;52150:66;:::o;52222:173::-;52362:25;52358:1;52350:6;52346:14;52339:49;52328:67;:::o;52401:122::-;52474:24;52492:5;52474:24;:::i;:::-;52467:5;52464:35;52454:2;;52513:1;52510;52503:12;52454:2;52444:79;:::o;52529:116::-;52599:21;52614:5;52599:21;:::i;:::-;52592:5;52589:32;52579:2;;52635:1;52632;52625:12;52579:2;52569:76;:::o;52651:120::-;52723:23;52740:5;52723:23;:::i;:::-;52716:5;52713:34;52703:2;;52761:1;52758;52751:12;52703:2;52693:78;:::o;52777:122::-;52850:24;52868:5;52850:24;:::i;:::-;52843:5;52840:35;52830:2;;52889:1;52886;52879:12;52830:2;52820:79;:::o

Swarm Source

ipfs://d16c5d76dd60b30485138469b1739e52b47aa447ecc71408adad2f0ec3131cea
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.