ETH Price: $3,467.51 (+2.26%)
Gas: 7 Gwei

Token

Apymon Monsters (APYM)
 

Overview

Max Total Supply

4,457 APYM

Holders

886

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 APYM
0x9db75457d1049951110249412c58b90f80c2db9e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Creature

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 16: Creature.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;

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

interface IEGG {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

interface ICryptoPunk {
    function transferPunk(address to, uint256 punkIndex) external;
}

interface ILink is IERC20 {
    function transferAndCall(
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool success);
}

contract VRFRequestIDBase {
    function makeVRFInputSeed(
        bytes32 _keyHash,
        uint256 _userSeed,
        address _requester,
        uint256 _nonce
    ) internal pure returns (uint256) {
        return
            uint256(
                keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))
            );
    }

    function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
    }
}

interface LinkTokenInterface {
    function allowance(address owner, address spender)
        external
        view
        returns (uint256 remaining);

    function approve(address spender, uint256 value)
        external
        returns (bool success);

    function balanceOf(address owner) external view returns (uint256 balance);

    function decimals() external view returns (uint8 decimalPlaces);

    function decreaseApproval(address spender, uint256 addedValue)
        external
        returns (bool success);

    function increaseApproval(address spender, uint256 subtractedValue)
        external;

    function name() external view returns (string memory tokenName);

    function symbol() external view returns (string memory tokenSymbol);

    function totalSupply() external view returns (uint256 totalTokensIssued);

    function transfer(address to, uint256 value)
        external
        returns (bool success);

    function transferAndCall(
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool success);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool success);
}

abstract contract VRFConsumerBase is VRFRequestIDBase {
    using SafeMath for uint256;

    function fulfillRandomness(bytes32 requestId, uint256 randomness)
        internal
        virtual;

    function requestRandomness(
        bytes32 _keyHash,
        uint256 _fee,
        uint256 _seed
    ) internal returns (bytes32 requestId) {
        LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, _seed));
        uint256 vRFSeed =
            makeVRFInputSeed(_keyHash, _seed, address(this), nonces[_keyHash]);
        nonces[_keyHash] = nonces[_keyHash].add(1);
        return makeRequestId(_keyHash, vRFSeed);
    }

    LinkTokenInterface internal immutable LINK;

    address private immutable vrfCoordinator;
    /* keyHash */
    /* nonce */
    mapping(bytes32 => uint256) private nonces;

    constructor(address _vrfCoordinator, address _link) {
        vrfCoordinator = _vrfCoordinator;
        LINK = LinkTokenInterface(_link);
    }

    function rawFulfillRandomness(bytes32 requestId, uint256 randomness)
        external
    {
        require(
            msg.sender == vrfCoordinator,
            "Only VRFCoordinator can fulfill"
        );
        fulfillRandomness(requestId, randomness);
    }
}

contract RandomNumberConsumer is VRFConsumerBase {
    bytes32 internal keyHash;
    uint256 internal fee;

    bool private progress = false;
    uint256 private randomNumber = 0;
    address private distributer;

    modifier onlyDistributer() {
        require(distributer == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * Constructor inherits VRFConsumerBase
     *
     * Network: Mainnet
     * Chainlink VRF Coordinator address: 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
     * LINK token address:                0x514910771AF9Ca656af840dff83E8264EcF986CA
     * Key Hash: 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445
     */
    constructor(address _distributer)
        VRFConsumerBase(
            0xf0d54349aDdcf704F77AE15b96510dEA15cb7952, // VRF Coordinator
            0x514910771AF9Ca656af840dff83E8264EcF986CA // LINK Token
        )
    {
        keyHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;
        fee = 2 * 10**18; // 2 LINK
        distributer = _distributer;
    }

    /**
     * Requests randomness from a user-provided seed
     */
    function getRandomNumber(uint256 userProvidedSeed)
        public
        onlyDistributer
        returns (bytes32 requestId)
    {
        require(
            LINK.balanceOf(address(this)) >= fee,
            "Not enough LINK"
        );
        require(!progress, "now getting an random number.");
        randomNumber = 0;
        progress = true;
        return requestRandomness(keyHash, fee, userProvidedSeed);
    }

    /**
     * Callback function used by VRF Coordinator
     */
    function fulfillRandomness(bytes32 requestId, uint256 randomness)
        internal
        override
    {
        requestId = 0;
        progress = false;
        randomNumber = randomness;
    }

    function checkRandomNumber()
        external
        view
        onlyDistributer
        returns (uint256)
    {
        if (progress) return 0;
        return randomNumber;
    }
}

contract Creature is ERC721, Ownable {
    using SafeMath for uint256;

    RandomNumberConsumer public rnGenerator;
    uint256 public _randomCallCount = 0;
    uint256 public _prevRandomCallCount = 0;

    uint256 public _punkRandomIndex1 = 6500;
    uint256 public _punkRandomIndex2 = 6500;
    uint256 public _creatureStartIndex = 6500;

    string public APYMON_MONSTER_PROVENANCE = "";

    bool public hasMintStarted = false;
    IEGG public _iEgg;

    bool public _punkDistributed1 = false;
    bool public _punkDistributed2 = false;
    uint16[] private _indexArray1;
    uint16[] private _indexArray2;
    uint16 public _initializedCount1 = 0;
    uint16 public _initializedCount2 = 0;

    // Mapping from egg ID -> minted
    mapping(uint256 => bool) public _minted;

    event WithdrawPunk(address indexed owner, uint256 id);

    ICryptoPunk public _cryptoPunk =
        ICryptoPunk(0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB);

    constructor() ERC721("Apymon Monsters", "APYM") {
        rnGenerator = new RandomNumberConsumer(address(this));
        _iEgg = IEGG(0x9C008A22D71B6182029b694B0311486e4C0e53DB);
    }

    function initialize1(uint16 count) external onlyOwner {
        require(count > 0, "count should be greater than 0.");
        uint16 endIndex =
            _initializedCount1 + count > 6400
                ? 6400
                : _initializedCount1 + count;
        for (uint16 i = _initializedCount1; i < endIndex; i++)
            _indexArray1.push(i);
        _initializedCount1 = endIndex;
    }

    function initialize2(uint16 count) external onlyOwner {
        require(count > 0, "count should be greater than 0.");
        uint16 endIndex =
            _initializedCount2 + count > 400 ? 400 : _initializedCount2 + count;
        for (uint16 i = _initializedCount2; i < endIndex; i++)
            _indexArray2.push(i);
        _initializedCount2 = endIndex;
    }

    function getCreatureStartIndexByVRF() external onlyOwner {
        rnGenerator.getRandomNumber(_randomCallCount);
        _randomCallCount = _randomCallCount + 1;
    }

    function setCreatureStartIndex() external onlyOwner {
        require(_creatureStartIndex == 6500, "start index was already set.");
        require(
            _prevRandomCallCount != _randomCallCount,
            "Please generate random number."
        );
        require(
            rnGenerator.checkRandomNumber() != 0,
            "Please wait until random number generated."
        );

        _prevRandomCallCount = _randomCallCount;
        _creatureStartIndex = rnGenerator.checkRandomNumber().mod(6400);
    }

    function getRandomNumberByVRF() external onlyOwner {
        rnGenerator.getRandomNumber(_randomCallCount);
        _randomCallCount = _randomCallCount + 1;
    }

    function pickPunkRandomIndex() external onlyOwner {
        require(
            _punkRandomIndex1 == 6500 || _punkRandomIndex2 == 6500,
            "You already picked all punk random index."
        );
        require(
            _prevRandomCallCount != _randomCallCount,
            "Please generate random number."
        );
        require(
            rnGenerator.checkRandomNumber() != 0,
            "Please wait until random number generated."
        );

        _prevRandomCallCount = _randomCallCount;
        uint256 randomNumber = rnGenerator.checkRandomNumber();

        if (_punkRandomIndex1 == 6500)
            _punkRandomIndex1 = randomNumber.mod(6400);
        else _punkRandomIndex2 = randomNumber.mod(400);
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    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 index; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    /**
     * @dev Changes the base URI if we want to move things in the future (Callable by owner only)
     */
    function setBaseURI(string memory baseURI) external onlyOwner {
        _setBaseURI(baseURI);
    }

    function setProvenance(string memory _provenance) external onlyOwner {
        APYMON_MONSTER_PROVENANCE = _provenance;
    }

    function givePunk(address to, uint256 punkId) internal {
        require(punkId > 0, "Invalid punk id");

        _cryptoPunk.transferPunk(to, punkId);
        emit WithdrawPunk(to, punkId);
    }

    function getRandomNumber() private view returns (uint256) {
        uint256 randomNumber =
            uint256(
                keccak256(
                    abi.encodePacked(
                        blockhash(block.number),
                        block.timestamp,
                        block.number,
                        block.difficulty,
                        block.gaslimit,
                        msg.sender,
                        totalSupply()
                    )
                )
            );
        return randomNumber;
    }

    function mintCreature(uint256 eggId) external {
        require(hasMintStarted, "Minting hasn't started.");

        require(_iEgg.ownerOf(eggId) == msg.sender, "Invalid minter.");

        require(!_minted[eggId], "Already minted for this egg id.");

        _minted[eggId] = true;

        if (!_punkDistributed1 || !_punkDistributed2) {
            uint256 randomNumber = getRandomNumber();

            if (!_punkDistributed1) {
                uint256 index1 = randomNumber.mod(_indexArray1.length);
                if (_indexArray1[index1] == _punkRandomIndex1) {
                    givePunk(msg.sender, 7207);
                    _punkDistributed1 = true;
                }

                _indexArray1[index1] = _indexArray1[_indexArray1.length - 1];
                _indexArray1.pop();
            }

            if (!_punkDistributed2 && eggId >= 6000) {
                uint256 index2 = randomNumber.mod(_indexArray2.length);
                if (_indexArray2[index2] == _punkRandomIndex2) {
                    givePunk(msg.sender, 7006);
                    _punkDistributed2 = true;
                }
                _indexArray2[index2] = _indexArray2[_indexArray2.length - 1];
                _indexArray2.pop();
            }
        }

        uint256 mintIndex = totalSupply();
        _safeMint(msg.sender, mintIndex);
    }

    function startMint() public onlyOwner {
        require(
            _initializedCount1 == 6400 && _initializedCount2 == 400,
            "Please initialize all."
        );
        hasMintStarted = true;
    }

    function pauseMint() public onlyOwner {
        hasMintStarted = false;
    }

    function withdrawPunkToOwner(uint256 id) external onlyOwner {
        givePunk(owner(), id);
    }
}

File 1 of 16: 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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @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);
    }

    /**
     * @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);
    }

    /**
     * @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);
        require(isContract(target));

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 16: 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 4 of 16: 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 5 of 16: 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;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            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) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        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 6 of 16: 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 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

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

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

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

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

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

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, 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) private _tokenURIs;

    // 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 virtual 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 virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).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(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, 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 virtual returns (string memory) {
        return _baseURI;
    }

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual 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 virtual 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 = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || ERC721.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 virtual 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 virtual 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 virtual 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 virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `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 Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId); // internal owner

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

        // Clear approvals
        _approve(address(0), tokenId);

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

        emit Transfer(owner, address(0), 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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        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");
        _tokenURIs[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(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

    /**
     * @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 16: 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 9 of 16: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
}

File 10 of 16: 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 16: 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 16: 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 16: 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 16: 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 15 of 16: 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, 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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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 16: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"WithdrawPunk","type":"event"},{"inputs":[],"name":"APYMON_MONSTER_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_creatureStartIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cryptoPunk","outputs":[{"internalType":"contract ICryptoPunk","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_iEgg","outputs":[{"internalType":"contract IEGG","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_initializedCount1","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_initializedCount2","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_prevRandomCallCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_punkDistributed1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_punkDistributed2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_punkRandomIndex1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_punkRandomIndex2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_randomCallCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreatureStartIndexByVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRandomNumberByVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasMintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"count","type":"uint16"}],"name":"initialize1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"count","type":"uint16"}],"name":"initialize2","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":"uint256","name":"eggId","type":"uint256"}],"name":"mintCreature","outputs":[],"stateMutability":"nonpayable","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":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pickPunkRandomIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rnGenerator","outputs":[{"internalType":"contract RandomNumberConsumer","name":"","type":"address"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setCreatureStartIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","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":[{"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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"withdrawPunkToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d556000600e55611964600f556119646010556119646011556040518060200160405280600081525060129080519060200190620000479291906200049d565b506000601360006101000a81548160ff0219169083151502179055506000601360156101000a81548160ff0219169083151502179055506000601360166101000a81548160ff0219169083151502179055506000601660006101000a81548161ffff021916908361ffff1602179055506000601660026101000a81548161ffff021916908361ffff16021790555073b47e3cd837ddf8e4c57f05d70ab865de6e193bbb601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013757600080fd5b506040518060400160405280600f81526020017f4170796d6f6e204d6f6e737465727300000000000000000000000000000000008152506040518060400160405280600481526020017f4150594d00000000000000000000000000000000000000000000000000000000815250620001bc6301ffc9a760e01b620003bd60201b60201c565b8160079080519060200190620001d49291906200049d565b508060089080519060200190620001ed9291906200049d565b50620002066380ac58cd60e01b620003bd60201b60201c565b6200021e635b5e139f60e01b620003bd60201b60201c565b6200023663780e9d6360e01b620003bd60201b60201c565b505060006200024a6200049560201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35030604051620002f8906200052e565b62000304919062000593565b604051809103906000f08015801562000321573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739c008a22d71b6182029b694b0311486e4c0e53db601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006a5565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000429576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042090620005b0565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054620004ab9062000617565b90600052602060002090601f016020900481019282620004cf57600085556200051b565b82601f10620004ea57805160ff19168380011785556200051b565b828001600101855582156200051b579182015b828111156200051a578251825591602001919060010190620004fd565b5b5090506200052a91906200053c565b5090565b610e9d80620062fb83390190565b5b80821115620005575760008160009055506001016200053d565b5090565b6200056681620005e3565b82525050565b60006200057b601c83620005d2565b915062000588826200067c565b602082019050919050565b6000602082019050620005aa60008301846200055b565b92915050565b60006020820190508181036000830152620005cb816200056c565b9050919050565b600082825260208201905092915050565b6000620005f082620005f7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200063057607f821691505b602082108114156200064757620006466200064d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b615c4680620006b56000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063610231fe11610182578063b164bf5e116100e9578063d1b288b6116100a2578063f2fde38b1161007c578063f2fde38b1461082e578063f79b803f1461084a578063fc7239671461087a578063ffe630b514610884576102bb565b8063d1b288b6146107c2578063e8a5dc87146107e0578063e985e9c5146107fe576102bb565b8063b164bf5e14610714578063b88d4fde14610732578063c87b56dd1461074e578063cc567e7b1461077e578063cd85cdb51461079c578063cff9a51e146107a6576102bb565b8063715018a61161013b578063715018a6146106645780638462151c1461066e5780638da5cb5b1461069e57806395d89b41146106bc578063a22cb465146106da578063ad3c38d6146106f6576102bb565b8063610231fe146105a05780636352211e146105aa578063668e2117146105da57806367768ceb146105f85780636c0360eb1461061657806370a0823114610634576102bb565b806323b872dd1161022657806342842e0e116101df57806342842e0e146104cc5780634d3d4457146104e85780634f558e79146105065780634f6ccce71461053657806355f804b314610566578063580208a414610582576102bb565b806323b872dd146104205780632b1255d71461043c5780632be095611461045a5780632f745c59146104645780633beb9327146104945780633dccb61f146104b0576102bb565b80631406d68e116102785780631406d68e1461039657806318160ddd146103b4578063191beda5146103d25780631fa9aaa3146103f057806320a27900146103fa5780632207bb5d14610404576102bb565b806301ffc9a7146102c057806306fdde03146102f0578063081812fc1461030e578063095ea7b31461033e5780630d6fa22b1461035a578063101c778c14610378575b600080fd5b6102da60048036038101906102d59190614383565b6108a0565b6040516102e79190614b94565b60405180910390f35b6102f8610907565b6040516103059190614c00565b60405180910390f35b6103286004803603810190610323919061443f565b610999565b6040516103359190614ae2565b60405180910390f35b6103586004803603810190610353919061431e565b610a1e565b005b610362610b36565b60405161036f9190614f7d565b60405180910390f35b610380610b3c565b60405161038d9190614bca565b60405180910390f35b61039e610b62565b6040516103ab9190614f7d565b60405180910390f35b6103bc610b68565b6040516103c99190614f7d565b60405180910390f35b6103da610b79565b6040516103e79190614c00565b60405180910390f35b6103f8610c07565b005b610402610d4a565b005b61041e6004803603810190610419919061443f565b610e8d565b005b61043a60048036038101906104359190614218565b610f1d565b005b610444610f7d565b6040516104519190614f7d565b60405180910390f35b610462610f83565b005b61047e6004803603810190610479919061431e565b611095565b60405161048b9190614f7d565b60405180910390f35b6104ae60048036038101906104a9919061443f565b6110f0565b005b6104ca60048036038101906104c59190614416565b611750565b005b6104e660048036038101906104e19190614218565b611909565b005b6104f0611929565b6040516104fd9190614be5565b60405180910390f35b610520600480360381019061051b919061443f565b61194f565b60405161052d9190614b94565b60405180910390f35b610550600480360381019061054b919061443f565b611961565b60405161055d9190614f7d565b60405180910390f35b610580600480360381019061057b91906143d5565b611984565b005b61058a611a0c565b6040516105979190614f62565b60405180910390f35b6105a8611a20565b005b6105c460048036038101906105bf919061443f565b611d12565b6040516105d19190614ae2565b60405180910390f35b6105e2611d49565b6040516105ef9190614b94565b60405180910390f35b610600611d5c565b60405161060d9190614b94565b60405180910390f35b61061e611d6f565b60405161062b9190614c00565b60405180910390f35b61064e6004803603810190610649919061418a565b611e01565b60405161065b9190614f7d565b60405180910390f35b61066c611ec0565b005b6106886004803603810190610683919061418a565b611ffd565b6040516106959190614b72565b60405180910390f35b6106a6612179565b6040516106b39190614ae2565b60405180910390f35b6106c46121a3565b6040516106d19190614c00565b60405180910390f35b6106f460048036038101906106ef91906142e2565b612235565b005b6106fe6123b6565b60405161070b9190614b94565b60405180910390f35b61071c6123c9565b6040516107299190614f7d565b60405180910390f35b61074c60048036038101906107479190614267565b6123cf565b005b6107686004803603810190610763919061443f565b612431565b6040516107759190614c00565b60405180910390f35b6107866125a4565b6040516107939190614f62565b60405180910390f35b6107a46125b8565b005b6107c060048036038101906107bb9190614416565b612651565b005b6107ca61280a565b6040516107d79190614f7d565b60405180910390f35b6107e8612810565b6040516107f59190614baf565b60405180910390f35b610818600480360381019061081391906141dc565b612836565b6040516108259190614b94565b60405180910390f35b6108486004803603810190610843919061418a565b6128ca565b005b610864600480360381019061085f919061443f565b612a76565b6040516108719190614b94565b60405180910390f35b610882612a96565b005b61089e600480360381019061089991906143d5565b612d47565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054610916906152d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610942906152d3565b801561098f5780601f106109645761010080835404028352916020019161098f565b820191906000526020600020905b81548152906001019060200180831161097257829003601f168201915b5050505050905090565b60006109a482612ddd565b6109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90614e02565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2982611d12565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190614ea2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab9612dfa565b73ffffffffffffffffffffffffffffffffffffffff161480610ae85750610ae781610ae2612dfa565b612836565b5b610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90614d62565b60405180910390fd5b610b318383612e02565b505050565b60105481565b601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6000610b746002612ebb565b905090565b60128054610b86906152d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb2906152d3565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b505050505081565b610c0f612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610c2d612179565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90614e22565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b37217a4600d546040518263ffffffff1660e01b8152600401610ce09190614f7d565b602060405180830381600087803b158015610cfa57600080fd5b505af1158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061435a565b506001600d54610d4291906150de565b600d81905550565b610d52612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610d70612179565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614e22565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b37217a4600d546040518263ffffffff1660e01b8152600401610e239190614f7d565b602060405180830381600087803b158015610e3d57600080fd5b505af1158015610e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e75919061435a565b506001600d54610e8591906150de565b600d81905550565b610e95612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610eb3612179565b73ffffffffffffffffffffffffffffffffffffffff1614610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090614e22565b60405180910390fd5b610f1a610f14612179565b82612ed0565b50565b610f2e610f28612dfa565b82612ff4565b610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490614ee2565b60405180910390fd5b610f788383836130d2565b505050565b60115481565b610f8b612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610fa9612179565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614e22565b60405180910390fd5b611900601660009054906101000a900461ffff1661ffff161480156110395750610190601660029054906101000a900461ffff1661ffff16145b611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90614d42565b60405180910390fd5b6001601360006101000a81548160ff021916908315150217905550565b60006110e882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132e990919063ffffffff16565b905092915050565b601360009054906101000a900460ff1661113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690614dc2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016111b19190614f7d565b60206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120191906141b3565b73ffffffffffffffffffffffffffffffffffffffff1614611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90614f22565b60405180910390fd5b6017600082815260200190815260200160002060009054906101000a900460ff16156112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90614f42565b60405180910390fd5b60016017600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601360159054906101000a900460ff16158061130d5750601360169054906101000a900460ff16155b1561173657600061131c613303565b9050601360159054906101000a900460ff1661152157600061134c6014805490508361334d90919063ffffffff16565b9050600f546014828154811061138b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1614156113e1576113c533611c27612ed0565b6001601360156101000a81548160ff0219169083151502179055505b601460016014805490506113f59190615165565b8154811061142c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff166014828154811061148a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060148054806114f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055505b601360169054906101000a900460ff1615801561154057506117708210155b1561173457600061155f6015805490508361334d90919063ffffffff16565b90506010546015828154811061159e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1614156115f4576115d833611b5e612ed0565b6001601360166101000a81548160ff0219169083151502179055505b601560016015805490506116089190615165565b8154811061163f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff166015828154811061169d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506015805480611704577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055505b505b6000611740610b68565b905061174c3382613363565b5050565b611758612dfa565b73ffffffffffffffffffffffffffffffffffffffff16611776612179565b73ffffffffffffffffffffffffffffffffffffffff16146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c390614e22565b60405180910390fd5b60008161ffff1611611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614c42565b60405180910390fd5b600061019082601660029054906101000a900461ffff1661183491906150a6565b61ffff161161185e5781601660029054906101000a900461ffff1661185991906150a6565b611862565b6101905b90506000601660029054906101000a900461ffff1690505b8161ffff168161ffff1610156118e75760158190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555080806118df90615336565b91505061187a565b5080601660026101000a81548161ffff021916908361ffff1602179055505050565b611924838383604051806020016040528060008152506123cf565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061195a82612ddd565b9050919050565b60008061197883600261338190919063ffffffff16565b50905080915050919050565b61198c612dfa565b73ffffffffffffffffffffffffffffffffffffffff166119aa612179565b73ffffffffffffffffffffffffffffffffffffffff1614611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614e22565b60405180910390fd5b611a09816133ad565b50565b601660029054906101000a900461ffff1681565b611a28612dfa565b73ffffffffffffffffffffffffffffffffffffffff16611a46612179565b73ffffffffffffffffffffffffffffffffffffffff1614611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390614e22565b60405180910390fd5b611964600f541480611ab15750611964601054145b611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614de2565b60405180910390fd5b600d54600e541415611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90614e42565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614468565b1415611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1190614f02565b60405180910390fd5b600d54600e819055506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190614468565b9050611964600f541415611cf357611ce86119008261334d90919063ffffffff16565b600f81905550611d0f565b611d086101908261334d90919063ffffffff16565b6010819055505b50565b6000611d4282604051806060016040528060298152602001615be86029913960026133c79092919063ffffffff16565b9050919050565b601360169054906101000a900460ff1681565b601360009054906101000a900460ff1681565b6060600a8054611d7e906152d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611daa906152d3565b8015611df75780601f10611dcc57610100808354040283529160200191611df7565b820191906000526020600020905b815481529060010190602001808311611dda57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6990614d82565b60405180910390fd5b611eb9600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206133e6565b9050919050565b611ec8612dfa565b73ffffffffffffffffffffffffffffffffffffffff16611ee6612179565b73ffffffffffffffffffffffffffffffffffffffff1614611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3390614e22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061200a83611e01565b9050600081141561208d57600067ffffffffffffffff811115612056577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120845781602001602082028036833780820191505090505b50915050612174565b60008167ffffffffffffffff8111156120cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120fd5781602001602082028036833780820191505090505b50905060005b8281101561216d576121158582611095565b82828151811061214e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061216590615361565b915050612103565b5080925050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600880546121b2906152d3565b80601f01602080910402602001604051908101604052809291908181526020018280546121de906152d3565b801561222b5780601f106122005761010080835404028352916020019161222b565b820191906000526020600020905b81548152906001019060200180831161220e57829003601f168201915b5050505050905090565b61223d612dfa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290614ce2565b60405180910390fd5b80600660006122b8612dfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612365612dfa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123aa9190614b94565b60405180910390a35050565b601360159054906101000a900460ff1681565b600e5481565b6123e06123da612dfa565b83612ff4565b61241f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241690614ee2565b60405180910390fd5b61242b848484846133fb565b50505050565b606061243c82612ddd565b61247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290614e82565b60405180910390fd5b600060096000848152602001908152602001600020805461249b906152d3565b80601f01602080910402602001604051908101604052809291908181526020018280546124c7906152d3565b80156125145780601f106124e957610100808354040283529160200191612514565b820191906000526020600020905b8154815290600101906020018083116124f757829003601f168201915b505050505090506000612525611d6f565b905060008151141561253b57819250505061259f565b600082511115612570578082604051602001612558929190614abe565b6040516020818303038152906040529250505061259f565b8061257a85613457565b60405160200161258b929190614abe565b604051602081830303815290604052925050505b919050565b601660009054906101000a900461ffff1681565b6125c0612dfa565b73ffffffffffffffffffffffffffffffffffffffff166125de612179565b73ffffffffffffffffffffffffffffffffffffffff1614612634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262b90614e22565b60405180910390fd5b6000601360006101000a81548160ff021916908315150217905550565b612659612dfa565b73ffffffffffffffffffffffffffffffffffffffff16612677612179565b73ffffffffffffffffffffffffffffffffffffffff16146126cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c490614e22565b60405180910390fd5b60008161ffff1611612714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270b90614c42565b60405180910390fd5b600061190082601660009054906101000a900461ffff1661273591906150a6565b61ffff161161275f5781601660009054906101000a900461ffff1661275a91906150a6565b612763565b6119005b90506000601660009054906101000a900461ffff1690505b8161ffff168161ffff1610156127e85760148190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555080806127e090615336565b91505061277b565b5080601660006101000a81548161ffff021916908361ffff1602179055505050565b600f5481565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128d2612dfa565b73ffffffffffffffffffffffffffffffffffffffff166128f0612179565b73ffffffffffffffffffffffffffffffffffffffff1614612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d90614e22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ad90614c82565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60176020528060005260406000206000915054906101000a900460ff1681565b612a9e612dfa565b73ffffffffffffffffffffffffffffffffffffffff16612abc612179565b73ffffffffffffffffffffffffffffffffffffffff1614612b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0990614e22565b60405180910390fd5b61196460115414612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90614d02565b60405180910390fd5b600d54600e541415612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9690614e42565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015612c0957600080fd5b505afa158015612c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c419190614468565b1415612c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7990614f02565b60405180910390fd5b600d54600e81905550612d3f611900600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d319190614468565b61334d90919063ffffffff16565b601181905550565b612d4f612dfa565b73ffffffffffffffffffffffffffffffffffffffff16612d6d612179565b73ffffffffffffffffffffffffffffffffffffffff1614612dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dba90614e22565b60405180910390fd5b8060129080519060200190612dd9929190613f5a565b5050565b6000612df382600261360490919063ffffffff16565b9050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e7583611d12565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ec98260000161361e565b9050919050565b60008111612f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0a90614ec2565b60405180910390fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b72a2ec83836040518363ffffffff1660e01b8152600401612f70929190614b49565b600060405180830381600087803b158015612f8a57600080fd5b505af1158015612f9e573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff167fda1a6ce12dffcebdb813f46b35bb45a3e21df8ad38b0ba2d93772eb8e5175eea82604051612fe89190614f7d565b60405180910390a25050565b6000612fff82612ddd565b61303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614d22565b60405180910390fd5b600061304983611d12565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806130b857508373ffffffffffffffffffffffffffffffffffffffff166130a084610999565b73ffffffffffffffffffffffffffffffffffffffff16145b806130c957506130c88185612836565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130f282611d12565b73ffffffffffffffffffffffffffffffffffffffff1614613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f90614e62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131af90614cc2565b60405180910390fd5b6131c3838383613633565b6131ce600082612e02565b61321f81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061363890919063ffffffff16565b5061327181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061365290919063ffffffff16565b506132888183600261366c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006132f883600001836136a1565b60001c905092915050565b60008043404243444533613315610b68565b60405160200161332b9796959493929190614a26565b6040516020818303038152906040528051906020012060001c90508091505090565b6000818361335b91906153e2565b905092915050565b61337d82826040518060200160405280600081525061373b565b5050565b6000806000806133948660000186613796565b915091508160001c8160001c9350935050509250929050565b80600a90805190602001906133c3929190613f5a565b5050565b60006133da846000018460001b846137d6565b60001c90509392505050565b60006133f482600001613857565b9050919050565b6134068484846130d2565b61341284848484613868565b613451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344890614c62565b60405180910390fd5b50505050565b6060600082141561349f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135ff565b600082905060005b600082146134d15780806134ba90615361565b915050600a826134ca9190615134565b91506134a7565b60008167ffffffffffffffff811115613513577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135455781602001600182028036833780820191505090505b5090505b600085146135f85760018261355e9190615165565b9150600a8561356d91906153e2565b603061357991906150de565b60f81b8183815181106135b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135f19190615134565b9450613549565b8093505050505b919050565b6000613616836000018360001b6139cc565b905092915050565b600061362c826000016139ec565b9050919050565b505050565b600061364a836000018360001b613a01565b905092915050565b6000613664836000018360001b613b7f565b905092915050565b6000613698846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613bef565b90509392505050565b6000818360000180549050116136ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e390614c22565b60405180910390fd5b826000018281548110613728577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b6137458383613c2a565b6137526000848484613868565b613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890614c62565b60405180910390fd5b505050565b60008060006137b18486600001613db890919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b81141580613809575061380885856139cc565b5b839061384b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138429190614c00565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b60006138898473ffffffffffffffffffffffffffffffffffffffff16613dcf565b61389657600190506139c4565b600061395d63150b7a0260e01b6138ab612dfa565b8887876040516024016138c19493929190614afd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615bb6603291398773ffffffffffffffffffffffffffffffffffffffff16613de29092919063ffffffff16565b905060008180602001905181019061397591906143ac565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60006139e48284600001613dfa90919063ffffffff16565b905092915050565b60006139fa82600001613857565b9050919050565b60008083600101600084815260200190815260200160002054905060008114613b73576000600182613a339190615165565b9050600060018660000180549050613a4b9190615165565b90506000866000018281548110613a8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550838760010160008381526020019081526020016000208190555086600001805480613b37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613b79565b60009150505b92915050565b6000613b8b8383613e11565b613be4578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613be9565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550613c218385600001613e3490919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9190614da2565b60405180910390fd5b613ca381612ddd565b15613ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cda90614ca2565b60405180910390fd5b613cef60008383613633565b613d4081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061365290919063ffffffff16565b50613d578183600261366c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613dc783600001836136a1565b905092915050565b600080823b905060008111915050919050565b6060613df18484600085613e4b565b90509392505050565b6000613e098360000183613e11565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613e438360000183613b7f565b905092915050565b606082471015613e5a57600080fd5b613e6385613dcf565b613e6c57600080fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e959190614aa7565b60006040518083038185875af1925050503d8060008114613ed2576040519150601f19603f3d011682016040523d82523d6000602084013e613ed7565b606091505b5091509150613ee7828286613ef3565b92505050949350505050565b60608315613f0357829050613f53565b600083511115613f165782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4a9190614c00565b60405180910390fd5b9392505050565b828054613f66906152d3565b90600052602060002090601f016020900481019282613f885760008555613fcf565b82601f10613fa157805160ff1916838001178555613fcf565b82800160010185558215613fcf579182015b82811115613fce578251825591602001919060010190613fb3565b5b509050613fdc9190613fe0565b5090565b5b80821115613ff9576000816000905550600101613fe1565b5090565b600061401061400b84614fbd565b614f98565b90508281526020810184848401111561402857600080fd5b614033848285615291565b509392505050565b600061404e61404984614fee565b614f98565b90508281526020810184848401111561406657600080fd5b614071848285615291565b509392505050565b60008135905061408881615b2b565b92915050565b60008151905061409d81615b2b565b92915050565b6000813590506140b281615b42565b92915050565b6000815190506140c781615b59565b92915050565b6000813590506140dc81615b70565b92915050565b6000815190506140f181615b70565b92915050565b600082601f83011261410857600080fd5b8135614118848260208601613ffd565b91505092915050565b600082601f83011261413257600080fd5b813561414284826020860161403b565b91505092915050565b60008135905061415a81615b87565b92915050565b60008135905061416f81615b9e565b92915050565b60008151905061418481615b9e565b92915050565b60006020828403121561419c57600080fd5b60006141aa84828501614079565b91505092915050565b6000602082840312156141c557600080fd5b60006141d38482850161408e565b91505092915050565b600080604083850312156141ef57600080fd5b60006141fd85828601614079565b925050602061420e85828601614079565b9150509250929050565b60008060006060848603121561422d57600080fd5b600061423b86828701614079565b935050602061424c86828701614079565b925050604061425d86828701614160565b9150509250925092565b6000806000806080858703121561427d57600080fd5b600061428b87828801614079565b945050602061429c87828801614079565b93505060406142ad87828801614160565b925050606085013567ffffffffffffffff8111156142ca57600080fd5b6142d6878288016140f7565b91505092959194509250565b600080604083850312156142f557600080fd5b600061430385828601614079565b9250506020614314858286016140a3565b9150509250929050565b6000806040838503121561433157600080fd5b600061433f85828601614079565b925050602061435085828601614160565b9150509250929050565b60006020828403121561436c57600080fd5b600061437a848285016140b8565b91505092915050565b60006020828403121561439557600080fd5b60006143a3848285016140cd565b91505092915050565b6000602082840312156143be57600080fd5b60006143cc848285016140e2565b91505092915050565b6000602082840312156143e757600080fd5b600082013567ffffffffffffffff81111561440157600080fd5b61440d84828501614121565b91505092915050565b60006020828403121561442857600080fd5b60006144368482850161414b565b91505092915050565b60006020828403121561445157600080fd5b600061445f84828501614160565b91505092915050565b60006020828403121561447a57600080fd5b600061448884828501614175565b91505092915050565b600061449d83836149f1565b60208301905092915050565b6144b281615199565b82525050565b6144c96144c482615199565b6153aa565b82525050565b60006144da8261502f565b6144e4818561505d565b93506144ef8361501f565b8060005b838110156145205781516145078882614491565b975061451283615050565b9250506001810190506144f3565b5085935050505092915050565b614536816151ab565b82525050565b61454d614548826151b7565b6153bc565b82525050565b600061455e8261503a565b614568818561506e565b93506145788185602086016152a0565b614581816154cf565b840191505092915050565b60006145978261503a565b6145a1818561507f565b93506145b18185602086016152a0565b80840191505092915050565b6145c681615225565b82525050565b6145d581615249565b82525050565b6145e48161526d565b82525050565b60006145f582615045565b6145ff818561508a565b935061460f8185602086016152a0565b614618816154cf565b840191505092915050565b600061462e82615045565b614638818561509b565b93506146488185602086016152a0565b80840191505092915050565b600061466160228361508a565b915061466c826154ed565b604082019050919050565b6000614684601f8361508a565b915061468f8261553c565b602082019050919050565b60006146a760328361508a565b91506146b282615565565b604082019050919050565b60006146ca60268361508a565b91506146d5826155b4565b604082019050919050565b60006146ed601c8361508a565b91506146f882615603565b602082019050919050565b600061471060248361508a565b915061471b8261562c565b604082019050919050565b600061473360198361508a565b915061473e8261567b565b602082019050919050565b6000614756601c8361508a565b9150614761826156a4565b602082019050919050565b6000614779602c8361508a565b9150614784826156cd565b604082019050919050565b600061479c60168361508a565b91506147a78261571c565b602082019050919050565b60006147bf60388361508a565b91506147ca82615745565b604082019050919050565b60006147e2602a8361508a565b91506147ed82615794565b604082019050919050565b600061480560208361508a565b9150614810826157e3565b602082019050919050565b600061482860178361508a565b91506148338261580c565b602082019050919050565b600061484b60298361508a565b915061485682615835565b604082019050919050565b600061486e602c8361508a565b915061487982615884565b604082019050919050565b600061489160208361508a565b915061489c826158d3565b602082019050919050565b60006148b4601e8361508a565b91506148bf826158fc565b602082019050919050565b60006148d760298361508a565b91506148e282615925565b604082019050919050565b60006148fa602f8361508a565b915061490582615974565b604082019050919050565b600061491d60218361508a565b9150614928826159c3565b604082019050919050565b6000614940600f8361508a565b915061494b82615a12565b602082019050919050565b600061496360318361508a565b915061496e82615a3b565b604082019050919050565b6000614986602a8361508a565b915061499182615a8a565b604082019050919050565b60006149a9600f8361508a565b91506149b482615ad9565b602082019050919050565b60006149cc601f8361508a565b91506149d782615b02565b602082019050919050565b6149eb816151ed565b82525050565b6149fa8161521b565b82525050565b614a098161521b565b82525050565b614a20614a1b8261521b565b6153d8565b82525050565b6000614a32828a61453c565b602082019150614a428289614a0f565b602082019150614a528288614a0f565b602082019150614a628287614a0f565b602082019150614a728286614a0f565b602082019150614a8282856144b8565b601482019150614a928284614a0f565b60208201915081905098975050505050505050565b6000614ab3828461458c565b915081905092915050565b6000614aca8285614623565b9150614ad68284614623565b91508190509392505050565b6000602082019050614af760008301846144a9565b92915050565b6000608082019050614b1260008301876144a9565b614b1f60208301866144a9565b614b2c6040830185614a00565b8181036060830152614b3e8184614553565b905095945050505050565b6000604082019050614b5e60008301856144a9565b614b6b6020830184614a00565b9392505050565b60006020820190508181036000830152614b8c81846144cf565b905092915050565b6000602082019050614ba9600083018461452d565b92915050565b6000602082019050614bc460008301846145bd565b92915050565b6000602082019050614bdf60008301846145cc565b92915050565b6000602082019050614bfa60008301846145db565b92915050565b60006020820190508181036000830152614c1a81846145ea565b905092915050565b60006020820190508181036000830152614c3b81614654565b9050919050565b60006020820190508181036000830152614c5b81614677565b9050919050565b60006020820190508181036000830152614c7b8161469a565b9050919050565b60006020820190508181036000830152614c9b816146bd565b9050919050565b60006020820190508181036000830152614cbb816146e0565b9050919050565b60006020820190508181036000830152614cdb81614703565b9050919050565b60006020820190508181036000830152614cfb81614726565b9050919050565b60006020820190508181036000830152614d1b81614749565b9050919050565b60006020820190508181036000830152614d3b8161476c565b9050919050565b60006020820190508181036000830152614d5b8161478f565b9050919050565b60006020820190508181036000830152614d7b816147b2565b9050919050565b60006020820190508181036000830152614d9b816147d5565b9050919050565b60006020820190508181036000830152614dbb816147f8565b9050919050565b60006020820190508181036000830152614ddb8161481b565b9050919050565b60006020820190508181036000830152614dfb8161483e565b9050919050565b60006020820190508181036000830152614e1b81614861565b9050919050565b60006020820190508181036000830152614e3b81614884565b9050919050565b60006020820190508181036000830152614e5b816148a7565b9050919050565b60006020820190508181036000830152614e7b816148ca565b9050919050565b60006020820190508181036000830152614e9b816148ed565b9050919050565b60006020820190508181036000830152614ebb81614910565b9050919050565b60006020820190508181036000830152614edb81614933565b9050919050565b60006020820190508181036000830152614efb81614956565b9050919050565b60006020820190508181036000830152614f1b81614979565b9050919050565b60006020820190508181036000830152614f3b8161499c565b9050919050565b60006020820190508181036000830152614f5b816149bf565b9050919050565b6000602082019050614f7760008301846149e2565b92915050565b6000602082019050614f926000830184614a00565b92915050565b6000614fa2614fb3565b9050614fae8282615305565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd857614fd76154a0565b5b614fe1826154cf565b9050602081019050919050565b600067ffffffffffffffff821115615009576150086154a0565b5b615012826154cf565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150b1826151ed565b91506150bc836151ed565b92508261ffff038211156150d3576150d2615413565b5b828201905092915050565b60006150e98261521b565b91506150f48361521b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561512957615128615413565b5b828201905092915050565b600061513f8261521b565b915061514a8361521b565b92508261515a57615159615442565b5b828204905092915050565b60006151708261521b565b915061517b8361521b565b92508282101561518e5761518d615413565b5b828203905092915050565b60006151a4826151fb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061523082615237565b9050919050565b6000615242826151fb565b9050919050565b60006152548261525b565b9050919050565b6000615266826151fb565b9050919050565b60006152788261527f565b9050919050565b600061528a826151fb565b9050919050565b82818337600083830152505050565b60005b838110156152be5780820151818401526020810190506152a3565b838111156152cd576000848401525b50505050565b600060028204905060018216806152eb57607f821691505b602082108114156152ff576152fe615471565b5b50919050565b61530e826154cf565b810181811067ffffffffffffffff8211171561532d5761532c6154a0565b5b80604052505050565b6000615341826151ed565b915061ffff82141561535657615355615413565b5b600182019050919050565b600061536c8261521b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561539f5761539e615413565b5b600182019050919050565b60006153b5826153c6565b9050919050565b6000819050919050565b60006153d1826154e0565b9050919050565b6000819050919050565b60006153ed8261521b565b91506153f88361521b565b92508261540857615407615442565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f636f756e742073686f756c642062652067726561746572207468616e20302e00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f737461727420696e6465782077617320616c7265616479207365742e00000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f506c6561736520696e697469616c697a6520616c6c2e00000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e74696e67206861736e277420737461727465642e000000000000000000600082015250565b7f596f7520616c7265616479207069636b656420616c6c2070756e6b2072616e6460008201527f6f6d20696e6465782e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506c656173652067656e65726174652072616e646f6d206e756d6265722e0000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642070756e6b2069640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f506c65617365207761697420756e74696c2072616e646f6d206e756d6265722060008201527f67656e6572617465642e00000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7465722e0000000000000000000000000000000000600082015250565b7f416c7265616479206d696e74656420666f722074686973206567672069642e00600082015250565b615b3481615199565b8114615b3f57600080fd5b50565b615b4b816151ab565b8114615b5657600080fd5b50565b615b62816151b7565b8114615b6d57600080fd5b50565b615b79816151c1565b8114615b8457600080fd5b50565b615b90816151ed565b8114615b9b57600080fd5b50565b615ba78161521b565b8114615bb257600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d85b14b29cf6954f310a11a5d4960033f2dbd7db8db6d8f0994dc9fc5cd6a07964736f6c6343000801003360c06040526000600360006101000a81548160ff021916908315150217905550600060045534801561003057600080fd5b50604051610e9d380380610e9d83398181016040528101906100529190610181565b73f0d54349addcf704f77ae15b96510dea15cb795273514910771af9ca656af840dff83e8264ecf986ca8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050507faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af44560001b600181905550671bc16d674ec8000060028190555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101f3565b60008151905061017b816101dc565b92915050565b60006020828403121561019357600080fd5b60006101a18482850161016c565b91505092915050565b60006101b5826101bc565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6101e5816101aa565b81146101f057600080fd5b50565b60805160601c60a05160601c610c7261022b6000396000818160b201526104790152600081816101e3015261043d0152610c726000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806394985ddd14610046578063b37217a414610062578063d31cf18614610092575b600080fd5b610060600480360381019061005b91906106a0565b6100b0565b005b61007c600480360381019061007791906106dc565b61014c565b60405161008991906108d3565b60405180910390f35b61009a610354565b6040516100a791906109dc565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461013e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101359061099c565b60405180910390fd5b610148828261040d565b5050565b60003373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146101de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d59061097c565b60405180910390fd5b6002547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161023a919061087a565b60206040518083038186803b15801561025257600080fd5b505afa158015610266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028a9190610705565b10156102cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c29061095c565b60405180910390fd5b600360009054906101000a900460ff161561031b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610312906109bc565b60405180910390fd5b60006004819055506001600360006101000a81548160ff02191690831515021790555061034d60015460025484610439565b9050919050565b60003373ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103dd9061097c565b60405180910390fd5b600360009054906101000a900460ff1615610404576000905061040a565b60045490505b90565b6000801b91506000600360006101000a81548160ff021916908315150217905550806004819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008587866040516020016104ac9291906108ee565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016104d993929190610895565b602060405180830381600087803b1580156104f357600080fd5b505af1158015610507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052b9190610677565b50600061054c8584306000808a81526020019081526020016000205461059e565b90506105746001600080888152602001908152602001600020546105da90919063ffffffff16565b6000808781526020019081526020016000208190555061059485826105f0565b9150509392505050565b6000848484846040516020016105b79493929190610917565b6040516020818303038152906040528051906020012060001c9050949350505050565b600081836105e89190610a24565b905092915050565b6000828260405160200161060592919061084e565b60405160208183030381529060405280519060200120905092915050565b60008151905061063281610bf7565b92915050565b60008135905061064781610c0e565b92915050565b60008135905061065c81610c25565b92915050565b60008151905061067181610c25565b92915050565b60006020828403121561068957600080fd5b600061069784828501610623565b91505092915050565b600080604083850312156106b357600080fd5b60006106c185828601610638565b92505060206106d28582860161064d565b9150509250929050565b6000602082840312156106ee57600080fd5b60006106fc8482850161064d565b91505092915050565b60006020828403121561071757600080fd5b600061072584828501610662565b91505092915050565b61073781610a7a565b82525050565b61074681610a98565b82525050565b61075d61075882610a98565b610aff565b82525050565b600061076e826109f7565b6107788185610a02565b9350610788818560208601610acc565b61079181610b42565b840191505092915050565b60006107a9600f83610a13565b91506107b482610b53565b602082019050919050565b60006107cc602083610a13565b91506107d782610b7c565b602082019050919050565b60006107ef601f83610a13565b91506107fa82610ba5565b602082019050919050565b6000610812601d83610a13565b915061081d82610bce565b602082019050919050565b61083181610ac2565b82525050565b61084861084382610ac2565b610b09565b82525050565b600061085a828561074c565b60208201915061086a8284610837565b6020820191508190509392505050565b600060208201905061088f600083018461072e565b92915050565b60006060820190506108aa600083018661072e565b6108b76020830185610828565b81810360408301526108c98184610763565b9050949350505050565b60006020820190506108e8600083018461073d565b92915050565b6000604082019050610903600083018561073d565b6109106020830184610828565b9392505050565b600060808201905061092c600083018761073d565b6109396020830186610828565b610946604083018561072e565b6109536060830184610828565b95945050505050565b600060208201905081810360008301526109758161079c565b9050919050565b60006020820190508181036000830152610995816107bf565b9050919050565b600060208201905081810360008301526109b5816107e2565b9050919050565b600060208201905081810360008301526109d581610805565b9050919050565b60006020820190506109f16000830184610828565b92915050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610a2f82610ac2565b9150610a3a83610ac2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610a6f57610a6e610b13565b5b828201905092915050565b6000610a8582610aa2565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015610aea578082015181840152602081019050610acf565b83811115610af9576000848401525b50505050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f756768204c494e4b0000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b7f6e6f772067657474696e6720616e2072616e646f6d206e756d6265722e000000600082015250565b610c0081610a8c565b8114610c0b57600080fd5b50565b610c1781610a98565b8114610c2257600080fd5b50565b610c2e81610ac2565b8114610c3957600080fd5b5056fea2646970667358221220181b2d783baa450ee42d521e7b199d17731bb0d93dabf91b69ebc224dab2e8c964736f6c63430008010033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063610231fe11610182578063b164bf5e116100e9578063d1b288b6116100a2578063f2fde38b1161007c578063f2fde38b1461082e578063f79b803f1461084a578063fc7239671461087a578063ffe630b514610884576102bb565b8063d1b288b6146107c2578063e8a5dc87146107e0578063e985e9c5146107fe576102bb565b8063b164bf5e14610714578063b88d4fde14610732578063c87b56dd1461074e578063cc567e7b1461077e578063cd85cdb51461079c578063cff9a51e146107a6576102bb565b8063715018a61161013b578063715018a6146106645780638462151c1461066e5780638da5cb5b1461069e57806395d89b41146106bc578063a22cb465146106da578063ad3c38d6146106f6576102bb565b8063610231fe146105a05780636352211e146105aa578063668e2117146105da57806367768ceb146105f85780636c0360eb1461061657806370a0823114610634576102bb565b806323b872dd1161022657806342842e0e116101df57806342842e0e146104cc5780634d3d4457146104e85780634f558e79146105065780634f6ccce71461053657806355f804b314610566578063580208a414610582576102bb565b806323b872dd146104205780632b1255d71461043c5780632be095611461045a5780632f745c59146104645780633beb9327146104945780633dccb61f146104b0576102bb565b80631406d68e116102785780631406d68e1461039657806318160ddd146103b4578063191beda5146103d25780631fa9aaa3146103f057806320a27900146103fa5780632207bb5d14610404576102bb565b806301ffc9a7146102c057806306fdde03146102f0578063081812fc1461030e578063095ea7b31461033e5780630d6fa22b1461035a578063101c778c14610378575b600080fd5b6102da60048036038101906102d59190614383565b6108a0565b6040516102e79190614b94565b60405180910390f35b6102f8610907565b6040516103059190614c00565b60405180910390f35b6103286004803603810190610323919061443f565b610999565b6040516103359190614ae2565b60405180910390f35b6103586004803603810190610353919061431e565b610a1e565b005b610362610b36565b60405161036f9190614f7d565b60405180910390f35b610380610b3c565b60405161038d9190614bca565b60405180910390f35b61039e610b62565b6040516103ab9190614f7d565b60405180910390f35b6103bc610b68565b6040516103c99190614f7d565b60405180910390f35b6103da610b79565b6040516103e79190614c00565b60405180910390f35b6103f8610c07565b005b610402610d4a565b005b61041e6004803603810190610419919061443f565b610e8d565b005b61043a60048036038101906104359190614218565b610f1d565b005b610444610f7d565b6040516104519190614f7d565b60405180910390f35b610462610f83565b005b61047e6004803603810190610479919061431e565b611095565b60405161048b9190614f7d565b60405180910390f35b6104ae60048036038101906104a9919061443f565b6110f0565b005b6104ca60048036038101906104c59190614416565b611750565b005b6104e660048036038101906104e19190614218565b611909565b005b6104f0611929565b6040516104fd9190614be5565b60405180910390f35b610520600480360381019061051b919061443f565b61194f565b60405161052d9190614b94565b60405180910390f35b610550600480360381019061054b919061443f565b611961565b60405161055d9190614f7d565b60405180910390f35b610580600480360381019061057b91906143d5565b611984565b005b61058a611a0c565b6040516105979190614f62565b60405180910390f35b6105a8611a20565b005b6105c460048036038101906105bf919061443f565b611d12565b6040516105d19190614ae2565b60405180910390f35b6105e2611d49565b6040516105ef9190614b94565b60405180910390f35b610600611d5c565b60405161060d9190614b94565b60405180910390f35b61061e611d6f565b60405161062b9190614c00565b60405180910390f35b61064e6004803603810190610649919061418a565b611e01565b60405161065b9190614f7d565b60405180910390f35b61066c611ec0565b005b6106886004803603810190610683919061418a565b611ffd565b6040516106959190614b72565b60405180910390f35b6106a6612179565b6040516106b39190614ae2565b60405180910390f35b6106c46121a3565b6040516106d19190614c00565b60405180910390f35b6106f460048036038101906106ef91906142e2565b612235565b005b6106fe6123b6565b60405161070b9190614b94565b60405180910390f35b61071c6123c9565b6040516107299190614f7d565b60405180910390f35b61074c60048036038101906107479190614267565b6123cf565b005b6107686004803603810190610763919061443f565b612431565b6040516107759190614c00565b60405180910390f35b6107866125a4565b6040516107939190614f62565b60405180910390f35b6107a46125b8565b005b6107c060048036038101906107bb9190614416565b612651565b005b6107ca61280a565b6040516107d79190614f7d565b60405180910390f35b6107e8612810565b6040516107f59190614baf565b60405180910390f35b610818600480360381019061081391906141dc565b612836565b6040516108259190614b94565b60405180910390f35b6108486004803603810190610843919061418a565b6128ca565b005b610864600480360381019061085f919061443f565b612a76565b6040516108719190614b94565b60405180910390f35b610882612a96565b005b61089e600480360381019061089991906143d5565b612d47565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054610916906152d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610942906152d3565b801561098f5780601f106109645761010080835404028352916020019161098f565b820191906000526020600020905b81548152906001019060200180831161097257829003601f168201915b5050505050905090565b60006109a482612ddd565b6109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da90614e02565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2982611d12565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190614ea2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab9612dfa565b73ffffffffffffffffffffffffffffffffffffffff161480610ae85750610ae781610ae2612dfa565b612836565b5b610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90614d62565b60405180910390fd5b610b318383612e02565b505050565b60105481565b601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6000610b746002612ebb565b905090565b60128054610b86906152d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb2906152d3565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b505050505081565b610c0f612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610c2d612179565b73ffffffffffffffffffffffffffffffffffffffff1614610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90614e22565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b37217a4600d546040518263ffffffff1660e01b8152600401610ce09190614f7d565b602060405180830381600087803b158015610cfa57600080fd5b505af1158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d32919061435a565b506001600d54610d4291906150de565b600d81905550565b610d52612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610d70612179565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614e22565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b37217a4600d546040518263ffffffff1660e01b8152600401610e239190614f7d565b602060405180830381600087803b158015610e3d57600080fd5b505af1158015610e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e75919061435a565b506001600d54610e8591906150de565b600d81905550565b610e95612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610eb3612179565b73ffffffffffffffffffffffffffffffffffffffff1614610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090614e22565b60405180910390fd5b610f1a610f14612179565b82612ed0565b50565b610f2e610f28612dfa565b82612ff4565b610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490614ee2565b60405180910390fd5b610f788383836130d2565b505050565b60115481565b610f8b612dfa565b73ffffffffffffffffffffffffffffffffffffffff16610fa9612179565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614e22565b60405180910390fd5b611900601660009054906101000a900461ffff1661ffff161480156110395750610190601660029054906101000a900461ffff1661ffff16145b611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90614d42565b60405180910390fd5b6001601360006101000a81548160ff021916908315150217905550565b60006110e882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132e990919063ffffffff16565b905092915050565b601360009054906101000a900460ff1661113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690614dc2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016111b19190614f7d565b60206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120191906141b3565b73ffffffffffffffffffffffffffffffffffffffff1614611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90614f22565b60405180910390fd5b6017600082815260200190815260200160002060009054906101000a900460ff16156112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90614f42565b60405180910390fd5b60016017600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601360159054906101000a900460ff16158061130d5750601360169054906101000a900460ff16155b1561173657600061131c613303565b9050601360159054906101000a900460ff1661152157600061134c6014805490508361334d90919063ffffffff16565b9050600f546014828154811061138b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1614156113e1576113c533611c27612ed0565b6001601360156101000a81548160ff0219169083151502179055505b601460016014805490506113f59190615165565b8154811061142c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff166014828154811061148a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060148054806114f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055505b601360169054906101000a900460ff1615801561154057506117708210155b1561173457600061155f6015805490508361334d90919063ffffffff16565b90506010546015828154811061159e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1614156115f4576115d833611b5e612ed0565b6001601360166101000a81548160ff0219169083151502179055505b601560016015805490506116089190615165565b8154811061163f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff166015828154811061169d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506015805480611704577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055505b505b6000611740610b68565b905061174c3382613363565b5050565b611758612dfa565b73ffffffffffffffffffffffffffffffffffffffff16611776612179565b73ffffffffffffffffffffffffffffffffffffffff16146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c390614e22565b60405180910390fd5b60008161ffff1611611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614c42565b60405180910390fd5b600061019082601660029054906101000a900461ffff1661183491906150a6565b61ffff161161185e5781601660029054906101000a900461ffff1661185991906150a6565b611862565b6101905b90506000601660029054906101000a900461ffff1690505b8161ffff168161ffff1610156118e75760158190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555080806118df90615336565b91505061187a565b5080601660026101000a81548161ffff021916908361ffff1602179055505050565b611924838383604051806020016040528060008152506123cf565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061195a82612ddd565b9050919050565b60008061197883600261338190919063ffffffff16565b50905080915050919050565b61198c612dfa565b73ffffffffffffffffffffffffffffffffffffffff166119aa612179565b73ffffffffffffffffffffffffffffffffffffffff1614611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614e22565b60405180910390fd5b611a09816133ad565b50565b601660029054906101000a900461ffff1681565b611a28612dfa565b73ffffffffffffffffffffffffffffffffffffffff16611a46612179565b73ffffffffffffffffffffffffffffffffffffffff1614611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390614e22565b60405180910390fd5b611964600f541480611ab15750611964601054145b611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614de2565b60405180910390fd5b600d54600e541415611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90614e42565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614468565b1415611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1190614f02565b60405180910390fd5b600d54600e819055506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190614468565b9050611964600f541415611cf357611ce86119008261334d90919063ffffffff16565b600f81905550611d0f565b611d086101908261334d90919063ffffffff16565b6010819055505b50565b6000611d4282604051806060016040528060298152602001615be86029913960026133c79092919063ffffffff16565b9050919050565b601360169054906101000a900460ff1681565b601360009054906101000a900460ff1681565b6060600a8054611d7e906152d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611daa906152d3565b8015611df75780601f10611dcc57610100808354040283529160200191611df7565b820191906000526020600020905b815481529060010190602001808311611dda57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6990614d82565b60405180910390fd5b611eb9600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206133e6565b9050919050565b611ec8612dfa565b73ffffffffffffffffffffffffffffffffffffffff16611ee6612179565b73ffffffffffffffffffffffffffffffffffffffff1614611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3390614e22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061200a83611e01565b9050600081141561208d57600067ffffffffffffffff811115612056577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120845781602001602082028036833780820191505090505b50915050612174565b60008167ffffffffffffffff8111156120cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120fd5781602001602082028036833780820191505090505b50905060005b8281101561216d576121158582611095565b82828151811061214e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061216590615361565b915050612103565b5080925050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600880546121b2906152d3565b80601f01602080910402602001604051908101604052809291908181526020018280546121de906152d3565b801561222b5780601f106122005761010080835404028352916020019161222b565b820191906000526020600020905b81548152906001019060200180831161220e57829003601f168201915b5050505050905090565b61223d612dfa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290614ce2565b60405180910390fd5b80600660006122b8612dfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612365612dfa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123aa9190614b94565b60405180910390a35050565b601360159054906101000a900460ff1681565b600e5481565b6123e06123da612dfa565b83612ff4565b61241f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241690614ee2565b60405180910390fd5b61242b848484846133fb565b50505050565b606061243c82612ddd565b61247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290614e82565b60405180910390fd5b600060096000848152602001908152602001600020805461249b906152d3565b80601f01602080910402602001604051908101604052809291908181526020018280546124c7906152d3565b80156125145780601f106124e957610100808354040283529160200191612514565b820191906000526020600020905b8154815290600101906020018083116124f757829003601f168201915b505050505090506000612525611d6f565b905060008151141561253b57819250505061259f565b600082511115612570578082604051602001612558929190614abe565b6040516020818303038152906040529250505061259f565b8061257a85613457565b60405160200161258b929190614abe565b604051602081830303815290604052925050505b919050565b601660009054906101000a900461ffff1681565b6125c0612dfa565b73ffffffffffffffffffffffffffffffffffffffff166125de612179565b73ffffffffffffffffffffffffffffffffffffffff1614612634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262b90614e22565b60405180910390fd5b6000601360006101000a81548160ff021916908315150217905550565b612659612dfa565b73ffffffffffffffffffffffffffffffffffffffff16612677612179565b73ffffffffffffffffffffffffffffffffffffffff16146126cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c490614e22565b60405180910390fd5b60008161ffff1611612714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270b90614c42565b60405180910390fd5b600061190082601660009054906101000a900461ffff1661273591906150a6565b61ffff161161275f5781601660009054906101000a900461ffff1661275a91906150a6565b612763565b6119005b90506000601660009054906101000a900461ffff1690505b8161ffff168161ffff1610156127e85760148190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff16021790555080806127e090615336565b91505061277b565b5080601660006101000a81548161ffff021916908361ffff1602179055505050565b600f5481565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128d2612dfa565b73ffffffffffffffffffffffffffffffffffffffff166128f0612179565b73ffffffffffffffffffffffffffffffffffffffff1614612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d90614e22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ad90614c82565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60176020528060005260406000206000915054906101000a900460ff1681565b612a9e612dfa565b73ffffffffffffffffffffffffffffffffffffffff16612abc612179565b73ffffffffffffffffffffffffffffffffffffffff1614612b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0990614e22565b60405180910390fd5b61196460115414612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90614d02565b60405180910390fd5b600d54600e541415612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9690614e42565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015612c0957600080fd5b505afa158015612c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c419190614468565b1415612c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7990614f02565b60405180910390fd5b600d54600e81905550612d3f611900600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d31cf1866040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d319190614468565b61334d90919063ffffffff16565b601181905550565b612d4f612dfa565b73ffffffffffffffffffffffffffffffffffffffff16612d6d612179565b73ffffffffffffffffffffffffffffffffffffffff1614612dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dba90614e22565b60405180910390fd5b8060129080519060200190612dd9929190613f5a565b5050565b6000612df382600261360490919063ffffffff16565b9050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e7583611d12565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ec98260000161361e565b9050919050565b60008111612f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0a90614ec2565b60405180910390fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b72a2ec83836040518363ffffffff1660e01b8152600401612f70929190614b49565b600060405180830381600087803b158015612f8a57600080fd5b505af1158015612f9e573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff167fda1a6ce12dffcebdb813f46b35bb45a3e21df8ad38b0ba2d93772eb8e5175eea82604051612fe89190614f7d565b60405180910390a25050565b6000612fff82612ddd565b61303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614d22565b60405180910390fd5b600061304983611d12565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806130b857508373ffffffffffffffffffffffffffffffffffffffff166130a084610999565b73ffffffffffffffffffffffffffffffffffffffff16145b806130c957506130c88185612836565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130f282611d12565b73ffffffffffffffffffffffffffffffffffffffff1614613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f90614e62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131af90614cc2565b60405180910390fd5b6131c3838383613633565b6131ce600082612e02565b61321f81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061363890919063ffffffff16565b5061327181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061365290919063ffffffff16565b506132888183600261366c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006132f883600001836136a1565b60001c905092915050565b60008043404243444533613315610b68565b60405160200161332b9796959493929190614a26565b6040516020818303038152906040528051906020012060001c90508091505090565b6000818361335b91906153e2565b905092915050565b61337d82826040518060200160405280600081525061373b565b5050565b6000806000806133948660000186613796565b915091508160001c8160001c9350935050509250929050565b80600a90805190602001906133c3929190613f5a565b5050565b60006133da846000018460001b846137d6565b60001c90509392505050565b60006133f482600001613857565b9050919050565b6134068484846130d2565b61341284848484613868565b613451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344890614c62565b60405180910390fd5b50505050565b6060600082141561349f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135ff565b600082905060005b600082146134d15780806134ba90615361565b915050600a826134ca9190615134565b91506134a7565b60008167ffffffffffffffff811115613513577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135455781602001600182028036833780820191505090505b5090505b600085146135f85760018261355e9190615165565b9150600a8561356d91906153e2565b603061357991906150de565b60f81b8183815181106135b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135f19190615134565b9450613549565b8093505050505b919050565b6000613616836000018360001b6139cc565b905092915050565b600061362c826000016139ec565b9050919050565b505050565b600061364a836000018360001b613a01565b905092915050565b6000613664836000018360001b613b7f565b905092915050565b6000613698846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613bef565b90509392505050565b6000818360000180549050116136ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e390614c22565b60405180910390fd5b826000018281548110613728577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b6137458383613c2a565b6137526000848484613868565b613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890614c62565b60405180910390fd5b505050565b60008060006137b18486600001613db890919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b81141580613809575061380885856139cc565b5b839061384b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138429190614c00565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b60006138898473ffffffffffffffffffffffffffffffffffffffff16613dcf565b61389657600190506139c4565b600061395d63150b7a0260e01b6138ab612dfa565b8887876040516024016138c19493929190614afd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615bb6603291398773ffffffffffffffffffffffffffffffffffffffff16613de29092919063ffffffff16565b905060008180602001905181019061397591906143ac565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60006139e48284600001613dfa90919063ffffffff16565b905092915050565b60006139fa82600001613857565b9050919050565b60008083600101600084815260200190815260200160002054905060008114613b73576000600182613a339190615165565b9050600060018660000180549050613a4b9190615165565b90506000866000018281548110613a8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550838760010160008381526020019081526020016000208190555086600001805480613b37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613b79565b60009150505b92915050565b6000613b8b8383613e11565b613be4578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613be9565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550613c218385600001613e3490919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9190614da2565b60405180910390fd5b613ca381612ddd565b15613ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cda90614ca2565b60405180910390fd5b613cef60008383613633565b613d4081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061365290919063ffffffff16565b50613d578183600261366c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613dc783600001836136a1565b905092915050565b600080823b905060008111915050919050565b6060613df18484600085613e4b565b90509392505050565b6000613e098360000183613e11565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613e438360000183613b7f565b905092915050565b606082471015613e5a57600080fd5b613e6385613dcf565b613e6c57600080fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e959190614aa7565b60006040518083038185875af1925050503d8060008114613ed2576040519150601f19603f3d011682016040523d82523d6000602084013e613ed7565b606091505b5091509150613ee7828286613ef3565b92505050949350505050565b60608315613f0357829050613f53565b600083511115613f165782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4a9190614c00565b60405180910390fd5b9392505050565b828054613f66906152d3565b90600052602060002090601f016020900481019282613f885760008555613fcf565b82601f10613fa157805160ff1916838001178555613fcf565b82800160010185558215613fcf579182015b82811115613fce578251825591602001919060010190613fb3565b5b509050613fdc9190613fe0565b5090565b5b80821115613ff9576000816000905550600101613fe1565b5090565b600061401061400b84614fbd565b614f98565b90508281526020810184848401111561402857600080fd5b614033848285615291565b509392505050565b600061404e61404984614fee565b614f98565b90508281526020810184848401111561406657600080fd5b614071848285615291565b509392505050565b60008135905061408881615b2b565b92915050565b60008151905061409d81615b2b565b92915050565b6000813590506140b281615b42565b92915050565b6000815190506140c781615b59565b92915050565b6000813590506140dc81615b70565b92915050565b6000815190506140f181615b70565b92915050565b600082601f83011261410857600080fd5b8135614118848260208601613ffd565b91505092915050565b600082601f83011261413257600080fd5b813561414284826020860161403b565b91505092915050565b60008135905061415a81615b87565b92915050565b60008135905061416f81615b9e565b92915050565b60008151905061418481615b9e565b92915050565b60006020828403121561419c57600080fd5b60006141aa84828501614079565b91505092915050565b6000602082840312156141c557600080fd5b60006141d38482850161408e565b91505092915050565b600080604083850312156141ef57600080fd5b60006141fd85828601614079565b925050602061420e85828601614079565b9150509250929050565b60008060006060848603121561422d57600080fd5b600061423b86828701614079565b935050602061424c86828701614079565b925050604061425d86828701614160565b9150509250925092565b6000806000806080858703121561427d57600080fd5b600061428b87828801614079565b945050602061429c87828801614079565b93505060406142ad87828801614160565b925050606085013567ffffffffffffffff8111156142ca57600080fd5b6142d6878288016140f7565b91505092959194509250565b600080604083850312156142f557600080fd5b600061430385828601614079565b9250506020614314858286016140a3565b9150509250929050565b6000806040838503121561433157600080fd5b600061433f85828601614079565b925050602061435085828601614160565b9150509250929050565b60006020828403121561436c57600080fd5b600061437a848285016140b8565b91505092915050565b60006020828403121561439557600080fd5b60006143a3848285016140cd565b91505092915050565b6000602082840312156143be57600080fd5b60006143cc848285016140e2565b91505092915050565b6000602082840312156143e757600080fd5b600082013567ffffffffffffffff81111561440157600080fd5b61440d84828501614121565b91505092915050565b60006020828403121561442857600080fd5b60006144368482850161414b565b91505092915050565b60006020828403121561445157600080fd5b600061445f84828501614160565b91505092915050565b60006020828403121561447a57600080fd5b600061448884828501614175565b91505092915050565b600061449d83836149f1565b60208301905092915050565b6144b281615199565b82525050565b6144c96144c482615199565b6153aa565b82525050565b60006144da8261502f565b6144e4818561505d565b93506144ef8361501f565b8060005b838110156145205781516145078882614491565b975061451283615050565b9250506001810190506144f3565b5085935050505092915050565b614536816151ab565b82525050565b61454d614548826151b7565b6153bc565b82525050565b600061455e8261503a565b614568818561506e565b93506145788185602086016152a0565b614581816154cf565b840191505092915050565b60006145978261503a565b6145a1818561507f565b93506145b18185602086016152a0565b80840191505092915050565b6145c681615225565b82525050565b6145d581615249565b82525050565b6145e48161526d565b82525050565b60006145f582615045565b6145ff818561508a565b935061460f8185602086016152a0565b614618816154cf565b840191505092915050565b600061462e82615045565b614638818561509b565b93506146488185602086016152a0565b80840191505092915050565b600061466160228361508a565b915061466c826154ed565b604082019050919050565b6000614684601f8361508a565b915061468f8261553c565b602082019050919050565b60006146a760328361508a565b91506146b282615565565b604082019050919050565b60006146ca60268361508a565b91506146d5826155b4565b604082019050919050565b60006146ed601c8361508a565b91506146f882615603565b602082019050919050565b600061471060248361508a565b915061471b8261562c565b604082019050919050565b600061473360198361508a565b915061473e8261567b565b602082019050919050565b6000614756601c8361508a565b9150614761826156a4565b602082019050919050565b6000614779602c8361508a565b9150614784826156cd565b604082019050919050565b600061479c60168361508a565b91506147a78261571c565b602082019050919050565b60006147bf60388361508a565b91506147ca82615745565b604082019050919050565b60006147e2602a8361508a565b91506147ed82615794565b604082019050919050565b600061480560208361508a565b9150614810826157e3565b602082019050919050565b600061482860178361508a565b91506148338261580c565b602082019050919050565b600061484b60298361508a565b915061485682615835565b604082019050919050565b600061486e602c8361508a565b915061487982615884565b604082019050919050565b600061489160208361508a565b915061489c826158d3565b602082019050919050565b60006148b4601e8361508a565b91506148bf826158fc565b602082019050919050565b60006148d760298361508a565b91506148e282615925565b604082019050919050565b60006148fa602f8361508a565b915061490582615974565b604082019050919050565b600061491d60218361508a565b9150614928826159c3565b604082019050919050565b6000614940600f8361508a565b915061494b82615a12565b602082019050919050565b600061496360318361508a565b915061496e82615a3b565b604082019050919050565b6000614986602a8361508a565b915061499182615a8a565b604082019050919050565b60006149a9600f8361508a565b91506149b482615ad9565b602082019050919050565b60006149cc601f8361508a565b91506149d782615b02565b602082019050919050565b6149eb816151ed565b82525050565b6149fa8161521b565b82525050565b614a098161521b565b82525050565b614a20614a1b8261521b565b6153d8565b82525050565b6000614a32828a61453c565b602082019150614a428289614a0f565b602082019150614a528288614a0f565b602082019150614a628287614a0f565b602082019150614a728286614a0f565b602082019150614a8282856144b8565b601482019150614a928284614a0f565b60208201915081905098975050505050505050565b6000614ab3828461458c565b915081905092915050565b6000614aca8285614623565b9150614ad68284614623565b91508190509392505050565b6000602082019050614af760008301846144a9565b92915050565b6000608082019050614b1260008301876144a9565b614b1f60208301866144a9565b614b2c6040830185614a00565b8181036060830152614b3e8184614553565b905095945050505050565b6000604082019050614b5e60008301856144a9565b614b6b6020830184614a00565b9392505050565b60006020820190508181036000830152614b8c81846144cf565b905092915050565b6000602082019050614ba9600083018461452d565b92915050565b6000602082019050614bc460008301846145bd565b92915050565b6000602082019050614bdf60008301846145cc565b92915050565b6000602082019050614bfa60008301846145db565b92915050565b60006020820190508181036000830152614c1a81846145ea565b905092915050565b60006020820190508181036000830152614c3b81614654565b9050919050565b60006020820190508181036000830152614c5b81614677565b9050919050565b60006020820190508181036000830152614c7b8161469a565b9050919050565b60006020820190508181036000830152614c9b816146bd565b9050919050565b60006020820190508181036000830152614cbb816146e0565b9050919050565b60006020820190508181036000830152614cdb81614703565b9050919050565b60006020820190508181036000830152614cfb81614726565b9050919050565b60006020820190508181036000830152614d1b81614749565b9050919050565b60006020820190508181036000830152614d3b8161476c565b9050919050565b60006020820190508181036000830152614d5b8161478f565b9050919050565b60006020820190508181036000830152614d7b816147b2565b9050919050565b60006020820190508181036000830152614d9b816147d5565b9050919050565b60006020820190508181036000830152614dbb816147f8565b9050919050565b60006020820190508181036000830152614ddb8161481b565b9050919050565b60006020820190508181036000830152614dfb8161483e565b9050919050565b60006020820190508181036000830152614e1b81614861565b9050919050565b60006020820190508181036000830152614e3b81614884565b9050919050565b60006020820190508181036000830152614e5b816148a7565b9050919050565b60006020820190508181036000830152614e7b816148ca565b9050919050565b60006020820190508181036000830152614e9b816148ed565b9050919050565b60006020820190508181036000830152614ebb81614910565b9050919050565b60006020820190508181036000830152614edb81614933565b9050919050565b60006020820190508181036000830152614efb81614956565b9050919050565b60006020820190508181036000830152614f1b81614979565b9050919050565b60006020820190508181036000830152614f3b8161499c565b9050919050565b60006020820190508181036000830152614f5b816149bf565b9050919050565b6000602082019050614f7760008301846149e2565b92915050565b6000602082019050614f926000830184614a00565b92915050565b6000614fa2614fb3565b9050614fae8282615305565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd857614fd76154a0565b5b614fe1826154cf565b9050602081019050919050565b600067ffffffffffffffff821115615009576150086154a0565b5b615012826154cf565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150b1826151ed565b91506150bc836151ed565b92508261ffff038211156150d3576150d2615413565b5b828201905092915050565b60006150e98261521b565b91506150f48361521b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561512957615128615413565b5b828201905092915050565b600061513f8261521b565b915061514a8361521b565b92508261515a57615159615442565b5b828204905092915050565b60006151708261521b565b915061517b8361521b565b92508282101561518e5761518d615413565b5b828203905092915050565b60006151a4826151fb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061523082615237565b9050919050565b6000615242826151fb565b9050919050565b60006152548261525b565b9050919050565b6000615266826151fb565b9050919050565b60006152788261527f565b9050919050565b600061528a826151fb565b9050919050565b82818337600083830152505050565b60005b838110156152be5780820151818401526020810190506152a3565b838111156152cd576000848401525b50505050565b600060028204905060018216806152eb57607f821691505b602082108114156152ff576152fe615471565b5b50919050565b61530e826154cf565b810181811067ffffffffffffffff8211171561532d5761532c6154a0565b5b80604052505050565b6000615341826151ed565b915061ffff82141561535657615355615413565b5b600182019050919050565b600061536c8261521b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561539f5761539e615413565b5b600182019050919050565b60006153b5826153c6565b9050919050565b6000819050919050565b60006153d1826154e0565b9050919050565b6000819050919050565b60006153ed8261521b565b91506153f88361521b565b92508261540857615407615442565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f636f756e742073686f756c642062652067726561746572207468616e20302e00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f737461727420696e6465782077617320616c7265616479207365742e00000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f506c6561736520696e697469616c697a6520616c6c2e00000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e74696e67206861736e277420737461727465642e000000000000000000600082015250565b7f596f7520616c7265616479207069636b656420616c6c2070756e6b2072616e6460008201527f6f6d20696e6465782e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506c656173652067656e65726174652072616e646f6d206e756d6265722e0000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642070756e6b2069640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f506c65617365207761697420756e74696c2072616e646f6d206e756d6265722060008201527f67656e6572617465642e00000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7465722e0000000000000000000000000000000000600082015250565b7f416c7265616479206d696e74656420666f722074686973206567672069642e00600082015250565b615b3481615199565b8114615b3f57600080fd5b50565b615b4b816151ab565b8114615b5657600080fd5b50565b615b62816151b7565b8114615b6d57600080fd5b50565b615b79816151c1565b8114615b8457600080fd5b50565b615b90816151ed565b8114615b9b57600080fd5b50565b615ba78161521b565b8114615bb257600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d85b14b29cf6954f310a11a5d4960033f2dbd7db8db6d8f0994dc9fc5cd6a07964736f6c63430008010033

Deployed Bytecode Sourcemap

5550:7033:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1353:148:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4523:98:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7228:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6772:395;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5803:39:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5987:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5671:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6266:208:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5896:44:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7468:168;;;:::i;:::-;;8170:162;;;:::i;:::-;;12483:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8092:300:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5848:41:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12184:210;;;:::i;:::-;;6035:160:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10833:1345:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7095:367;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8458:149:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5626:39:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9081:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6546:169:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9839:99:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6209:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8338:737;;;:::i;:::-;;4286:175:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6054:37:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5947:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5861:95:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4011:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:13;;;:::i;:::-;;9187:532:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1061:85:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4685:102:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7512:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6011:37:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5712:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8673:282:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4853:776;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6167:36:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12400:77;;;:::i;:::-;;6688:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5758:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6395:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7868:162:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6289:39:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7642:522;;;:::i;:::-;;9944:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1353:148:3;1438:4;1461:20;:33;1482:11;1461:33;;;;;;;;;;;;;;;;;;;;;;;;;;;1454:40;;1353:148;;;:::o;4523:98:4:-;4577:13;4609:5;4602:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4523:98;:::o;7228:217::-;7304:7;7331:16;7339:7;7331;:16::i;:::-;7323:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7414:15;:24;7430:7;7414:24;;;;;;;;;;;;;;;;;;;;;7407:31;;7228:217;;;:::o;6772:395::-;6852:13;6868:23;6883:7;6868:14;:23::i;:::-;6852:39;;6915:5;6909:11;;:2;:11;;;;6901:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;6993:5;6977:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;7002:44;7026:5;7033:12;:10;:12::i;:::-;7002:23;:44::i;:::-;6977:69;6969:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;7139:21;7148:2;7152:7;7139:8;:21::i;:::-;6772:395;;;:::o;5803:39:2:-;;;;:::o;5987:17::-;;;;;;;;;;;;;:::o;5671:35::-;;;;:::o;6266:208:4:-;6327:7;6446:21;:12;:19;:21::i;:::-;6439:28;;6266:208;:::o;5896:44:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7468:168::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7535:11:2::1;;;;;;;;;;;:27;;;7563:16;;7535:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7628:1;7609:16;;:20;;;;:::i;:::-;7590:16;:39;;;;7468:168::o:0;8170:162::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8231:11:2::1;;;;;;;;;;;:27;;;8259:16;;8231:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8324:1;8305:16;;:20;;;;:::i;:::-;8286:16;:39;;;;8170:162::o:0;12483:98::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12553:21:2::1;12562:7;:5;:7::i;:::-;12571:2;12553:8;:21::i;:::-;12483:98:::0;:::o;8092:300:4:-;8251:41;8270:12;:10;:12::i;:::-;8284:7;8251:18;:41::i;:::-;8243:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8357:28;8367:4;8373:2;8377:7;8357:9;:28::i;:::-;8092:300;;;:::o;5848:41:2:-;;;;:::o;12184:210::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12275:4:2::1;12253:18;;;;;;;;;;;:26;;;:55;;;;;12305:3;12283:18;;;;;;;;;;;:25;;;12253:55;12232:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;12383:4;12366:14;;:21;;;;;;;;;;;;;;;;;;12184:210::o:0;6035:160:4:-;6132:7;6158:30;6182:5;6158:13;:20;6172:5;6158:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;6151:37;;6035:160;;;;:::o;10833:1345:2:-;10897:14;;;;;;;;;;;10889:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;10982:10;10958:34;;:5;;;;;;;;;;;:13;;;10972:5;10958:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;;10950:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;11032:7;:14;11040:5;11032:14;;;;;;;;;;;;;;;;;;;;;11031:15;11023:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;11110:4;11093:7;:14;11101:5;11093:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11130:17;;;;;;;;;;;11129:18;:40;;;;11152:17;;;;;;;;;;;11151:18;11129:40;11125:961;;;11185:20;11208:17;:15;:17::i;:::-;11185:40;;11245:17;;;;;;;;;;;11240:403;;11282:14;11299:37;11316:12;:19;;;;11299:12;:16;;:37;;;;:::i;:::-;11282:54;;11382:17;;11358:12;11371:6;11358:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;11354:160;;;11423:26;11432:10;11444:4;11423:8;:26::i;:::-;11491:4;11471:17;;:24;;;;;;;;;;;;;;;;;;11354:160;11555:12;11590:1;11568:12;:19;;;;:23;;;;:::i;:::-;11555:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11532:12;11545:6;11532:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;11610:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11240:403;;11662:17;;;;;;;;;;;11661:18;:35;;;;;11692:4;11683:5;:13;;11661:35;11657:419;;;11716:14;11733:37;11750:12;:19;;;;11733:12;:16;;:37;;;;:::i;:::-;11716:54;;11816:17;;11792:12;11805:6;11792:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;11788:160;;;11857:26;11866:10;11878:4;11857:8;:26::i;:::-;11925:4;11905:17;;:24;;;;;;;;;;;;;;;;;;11788:160;11988:12;12023:1;12001:12;:19;;;;:23;;;;:::i;:::-;11988:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11965:12;11978:6;11965:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12043:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11657:419;;11125:961;;12096:17;12116:13;:11;:13::i;:::-;12096:33;;12139:32;12149:10;12161:9;12139;:32::i;:::-;10833:1345;;:::o;7095:367::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7175:1:2::1;7167:5;:9;;;7159:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;7222:15;7281:3;7273:5;7252:18;;;;;;;;;;;:26;;;;:::i;:::-;:32;;;:67;;7314:5;7293:18;;;;;;;;;;;:26;;;;:::i;:::-;7252:67;;;7287:3;7252:67;7222:97;;7334:8;7345:18;;;;;;;;;;;7334:29;;7329:87;7369:8;7365:12;;:1;:12;;;7329:87;;;7396:12;7414:1;7396:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7379:3;;;;;:::i;:::-;;;;7329:87;;;;7447:8;7426:18;;:29;;;;;;;;;;;;;;;;;;1343:1:13;7095:367:2::0;:::o;8458:149:4:-;8561:39;8578:4;8584:2;8588:7;8561:39;;;;;;;;;;;;:16;:39::i;:::-;8458:149;;;:::o;5626:39:2:-;;;;;;;;;;;;;:::o;9081:100::-;9135:4;9158:16;9166:7;9158;:16::i;:::-;9151:23;;9081:100;;;:::o;6546:169:4:-;6621:7;6641:15;6662:22;6678:5;6662:12;:15;;:22;;;;:::i;:::-;6640:44;;;6701:7;6694:14;;;6546:169;;;:::o;9839:99:2:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9911:20:2::1;9923:7;9911:11;:20::i;:::-;9839:99:::0;:::o;6209:36::-;;;;;;;;;;;;;:::o;8338:737::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8440:4:2::1;8419:17;;:25;:54;;;;8469:4;8448:17;;:25;8419:54;8398:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;8595:16;;8571:20;;:40;;8550:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;8733:1;8698:11;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;8677:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;8836:16;;8813:20;:39;;;;8862:20;8885:11;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8862:54;;8952:4;8931:17;;:25;8927:141;;;8990:22;9007:4;8990:12;:16;;:22;;;;:::i;:::-;8970:17;:42;;;;8927:141;;;9047:21;9064:3;9047:12;:16;;:21;;;;:::i;:::-;9027:17;:41;;;;8927:141;1343:1:13;8338:737:2:o:0;4286:175:4:-;4358:7;4384:70;4401:7;4384:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;4377:77;;4286:175;;;:::o;6054:37:2:-;;;;;;;;;;;;;:::o;5947:34::-;;;;;;;;;;;;;:::o;5861:95:4:-;5909:13;5941:8;5934:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5861:95;:::o;4011:218::-;4083:7;4127:1;4110:19;;:5;:19;;;;4102:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;4193:29;:13;:20;4207:5;4193:20;;;;;;;;;;;;;;;:27;:29::i;:::-;4186:36;;4011:218;;;:::o;1693:145:13:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;9187:532:2:-;9273:16;9305:18;9326:17;9336:6;9326:9;:17::i;:::-;9305:38;;9371:1;9357:10;:15;9353:360;;;9446:1;9432:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9425:23;;;;;9353:360;9479:23;9519:10;9505:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9479:51;;9549:13;9544:132;9572:10;9564:5;:18;9544:132;;;9627:34;9647:6;9655:5;9627:19;:34::i;:::-;9611:6;9618:5;9611:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;9584:7;;;;;:::i;:::-;;;;9544:132;;;;9696:6;9689:13;;;;9187:532;;;;:::o;1061:85:13:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;4685:102:4:-;4741:13;4773:7;4766:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4685:102;:::o;7512:290::-;7626:12;:10;:12::i;:::-;7614:24;;:8;:24;;;;7606:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;7724:8;7679:18;:32;7698:12;:10;:12::i;:::-;7679:32;;;;;;;;;;;;;;;:42;7712:8;7679:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7776:8;7747:48;;7762:12;:10;:12::i;:::-;7747:48;;;7786:8;7747:48;;;;;;:::i;:::-;;;;;;;;7512:290;;:::o;6011:37:2:-;;;;;;;;;;;;;:::o;5712:39::-;;;;:::o;8673:282:4:-;8804:41;8823:12;:10;:12::i;:::-;8837:7;8804:18;:41::i;:::-;8796:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8909:39;8923:4;8929:2;8933:7;8942:5;8909:13;:39::i;:::-;8673:282;;;;:::o;4853:776::-;4926:13;4959:16;4967:7;4959;:16::i;:::-;4951:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5038:23;5064:10;:19;5075:7;5064:19;;;;;;;;;;;5038:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5093:18;5114:9;:7;:9::i;:::-;5093:30;;5218:1;5202:4;5196:18;:23;5192:70;;;5242:9;5235:16;;;;;;5192:70;5390:1;5370:9;5364:23;:27;5360:106;;;5438:4;5444:9;5421:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5407:48;;;;;;5360:106;5596:4;5602:18;:7;:16;:18::i;:::-;5579:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5565:57;;;;4853:776;;;;:::o;6167:36:2:-;;;;;;;;;;;;;:::o;12400:77::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12465:5:2::1;12448:14;;:22;;;;;;;;;;;;;;;;;;12400:77::o:0;6688:401::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6768:1:2::1;6760:5;:9;;;6752:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;6815:15;6874:4;6866:5;6845:18;;;;;;;;;;;:26;;;;:::i;:::-;:33;;;:101;;6941:5;6920:18;;;;;;;;;;;:26;;;;:::i;:::-;6845:101;;;6897:4;6845:101;6815:131;;6961:8;6972:18;;;;;;;;;;;6961:29;;6956:87;6996:8;6992:12;;:1;:12;;;6956:87;;;7023:12;7041:1;7023:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7006:3;;;;;:::i;:::-;;;;6956:87;;;;7074:8;7053:18;;:29;;;;;;;;;;;;;;;;;;1343:1:13;6688:401:2::0;:::o;5758:39::-;;;;:::o;6395:96::-;;;;;;;;;;;;;:::o;7868:162:4:-;7965:4;7988:18;:25;8007:5;7988:25;;;;;;;;;;;;;;;:35;8014:8;7988:35;;;;;;;;;;;;;;;;;;;;;;;;;7981:42;;7868:162;;;;:::o;1987:240:13:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;6289:39:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;7642:522::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7735:4:2::1;7712:19;;:27;7704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7827:16;;7803:20;;:40;;7782:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;7965:1;7930:11;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;7909:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;8068:16;;8045:20;:39;;;;8116:41;8152:4;8116:11;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;:41;;;;:::i;:::-;8094:19;:63;;;;7642:522::o:0;9944:125::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10051:11:2::1;10023:25;:39;;;;;;;;;;;;:::i;:::-;;9944:125:::0;:::o;10389::4:-;10454:4;10477:30;10499:7;10477:12;:21;;:30;;;;:::i;:::-;10470:37;;10389:125;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;16124:180:4:-;16216:2;16189:15;:24;16205:7;16189:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;16271:7;16267:2;16233:46;;16242:23;16257:7;16242:14;:23::i;:::-;16233:46;;;;;;;;;;;;16124:180;;:::o;5520:121:5:-;5589:7;5615:19;5623:3;:10;;5615:7;:19::i;:::-;5608:26;;5520:121;;;:::o;10075:196:2:-;10157:1;10148:6;:10;10140:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;10189:11;;;;;;;;;;;:24;;;10214:2;10218:6;10189:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10253:2;10240:24;;;10257:6;10240:24;;;;;;:::i;:::-;;;;;;;;10075:196;;:::o;10672:351:4:-;10765:4;10789:16;10797:7;10789;:16::i;:::-;10781:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10864:13;10880:23;10895:7;10880:14;:23::i;:::-;10864:39;;10932:5;10921:16;;:7;:16;;;:51;;;;10965:7;10941:31;;:20;10953:7;10941:11;:20::i;:::-;:31;;;10921:51;:94;;;;10976:39;11000:5;11007:7;10976:23;:39::i;:::-;10921:94;10913:103;;;10672:351;;;;:::o;13712:584::-;13836:4;13809:31;;:23;13824:7;13809:14;:23::i;:::-;:31;;;13801:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13936:1;13922:16;;:2;:16;;;;13914:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13990:39;14011:4;14017:2;14021:7;13990:20;:39::i;:::-;14091:29;14108:1;14112:7;14091:8;:29::i;:::-;14131:35;14158:7;14131:13;:19;14145:4;14131:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;14176:30;14198:7;14176:13;:17;14190:2;14176:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;14217:29;14234:7;14243:2;14217:12;:16;;:29;;;;;:::i;:::-;;14281:7;14277:2;14262:27;;14271:4;14262:27;;;;;;;;;;;;13712:584;;;:::o;9251:135:6:-;9322:7;9356:22;9360:3;:10;;9372:5;9356:3;:22::i;:::-;9348:31;;9341:38;;9251:135;;;;:::o;10277:550:2:-;10326:7;10345:20;10488:12;10478:23;10527:15;10568:12;10606:16;10648:14;10688:10;10724:13;:11;:13::i;:::-;10436:323;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10405:372;;;;;;10380:411;;10345:446;;10808:12;10801:19;;;10277:550;:::o;2294:96:14:-;2352:7;2382:1;2378;:5;;;;:::i;:::-;2371:12;;2294:96;;;;:::o;11353:108:4:-;11428:26;11438:2;11442:7;11428:26;;;;;;;;;;;;:9;:26::i;:::-;11353:108;;:::o;5969:233:5:-;6049:7;6058;6078:11;6091:13;6108:22;6112:3;:10;;6124:5;6108:3;:22::i;:::-;6077:53;;;;6156:3;6148:12;;6186:5;6178:14;;6140:55;;;;;;5969:233;;;;;:::o;14878:98:4:-;14961:8;14950;:19;;;;;;;;;;;;:::i;:::-;;14878:98;:::o;7222:211:5:-;7329:7;7379:44;7384:3;:10;;7404:3;7396:12;;7410;7379:4;:44::i;:::-;7371:53;;7348:78;;7222:211;;;;;:::o;8807:112:6:-;8867:7;8893:19;8901:3;:10;;8893:7;:19::i;:::-;8886:26;;8807:112;;;:::o;9817:269:4:-;9930:28;9940:4;9946:2;9950:7;9930:9;:28::i;:::-;9976:48;9999:4;10005:2;10009:7;10018:5;9976:22;:48::i;:::-;9968:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;9817:269;;;;:::o;210:703:15:-;266:13;492:1;483:5;:10;479:51;;;509:10;;;;;;;;;;;;;;;;;;;;;479:51;539:12;554:5;539:20;;569:14;593:75;608:1;600:4;:9;593:75;;625:8;;;;;:::i;:::-;;;;655:2;647:10;;;;;:::i;:::-;;;593:75;;;677:19;709:6;699:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;677:39;;726:150;742:1;733:5;:10;726:150;;769:1;759:11;;;;;:::i;:::-;;;835:2;827:5;:10;;;;:::i;:::-;814:2;:24;;;;:::i;:::-;801:39;;784:6;791;784:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;863:2;854:11;;;;;:::i;:::-;;;726:150;;;899:6;885:21;;;;;210:703;;;;:::o;5288:149:5:-;5372:4;5395:35;5405:3;:10;;5425:3;5417:12;;5395:9;:35::i;:::-;5388:42;;5288:149;;;;:::o;2462:107::-;2518:7;2544:18;:3;:9;;:16;:18::i;:::-;2537:25;;2462:107;;;:::o;16900:93:4:-;;;;:::o;8366:135:6:-;8436:4;8459:35;8467:3;:10;;8487:5;8479:14;;8459:7;:35::i;:::-;8452:42;;8366:135;;;;:::o;8069:129::-;8136:4;8159:32;8164:3;:10;;8184:5;8176:14;;8159:4;:32::i;:::-;8152:39;;8069:129;;;;:::o;4727:183:5:-;4816:4;4839:64;4844:3;:10;;4864:3;4856:12;;4894:5;4878:23;;4870:32;;4839:4;:64::i;:::-;4832:71;;4727:183;;;;;:::o;4453:201:6:-;4520:7;4568:5;4547:3;:11;;:18;;;;:26;4539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4629:3;:11;;4641:5;4629:18;;;;;;;;;;;;;;;;;;;;;;;;4622:25;;4453:201;;;;:::o;11682:247:4:-;11777:18;11783:2;11787:7;11777:5;:18::i;:::-;11813:54;11844:1;11848:2;11852:7;11861:5;11813:22;:54::i;:::-;11805:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;11682:247;;;:::o;2912:175:5:-;2979:7;2988;3007:11;3021:19;3034:5;3021:3;:9;;:12;;:19;;;;:::i;:::-;3007:33;;3058:3;3063;:11;;:16;3075:3;3063:16;;;;;;;;;;;;3050:30;;;;;2912:175;;;;;:::o;4178:240::-;4272:7;4291:13;4307:3;:11;;:16;4319:3;4307:16;;;;;;;;;;;;4291:32;;4350:1;4341:10;;:5;:10;;:33;;;;4355:19;4365:3;4370;4355:9;:19::i;:::-;4341:33;4376:12;4333:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4406:5;4399:12;;;4178:240;;;;;:::o;4014:107:6:-;4070:7;4096:3;:11;;:18;;;;4089:25;;4014:107;;;:::o;15529:589:4:-;15649:4;15674:15;:2;:13;;;:15::i;:::-;15669:58;;15712:4;15705:11;;;;15669:58;15736:23;15762:246;15814:45;;;15873:12;:10;:12::i;:::-;15899:4;15917:7;15938:5;15778:175;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15762:246;;;;;;;;;;;;;;;;;:2;:15;;;;:246;;;;;:::i;:::-;15736:272;;16018:13;16045:10;16034:32;;;;;;;;;;;;:::i;:::-;16018:48;;1091:10;16094:16;;16084:26;;;:6;:26;;;;16076:35;;;;15529:589;;;;;;;:::o;2248:124:5:-;2319:4;2342:23;2361:3;2342;:9;;:18;;:23;;;;:::i;:::-;2335:30;;2248:124;;;;:::o;5614:115:6:-;5677:7;5703:19;5711:3;:10;;5703:7;:19::i;:::-;5696:26;;5614:115;;;:::o;2204:1521::-;2270:4;2386:18;2407:3;:12;;:19;2420:5;2407:19;;;;;;;;;;;;2386:40;;2455:1;2441:10;:15;2437:1282;;2798:21;2835:1;2822:10;:14;;;;:::i;:::-;2798:38;;2850:17;2891:1;2870:3;:11;;:18;;;;:22;;;;:::i;:::-;2850:42;;3132:17;3152:3;:11;;3164:9;3152:22;;;;;;;;;;;;;;;;;;;;;;;;3132:42;;3295:9;3266:3;:11;;3278:13;3266:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3396:10;3370:3;:12;;:23;3383:9;3370:23;;;;;;;;;;;:36;;;;3528:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3620:3;:12;;:19;3633:5;3620:19;;;;;;;;;;;3613:26;;;3661:4;3654:11;;;;;;;;2437:1282;3703:5;3696:12;;;2204:1521;;;;;:::o;1632:404::-;1695:4;1716:21;1726:3;1731:5;1716:9;:21::i;:::-;1711:319;;1753:3;:11;;1770:5;1753:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1933:3;:11;;:18;;;;1911:3;:12;;:19;1924:5;1911:19;;;;;;;;;;;:40;;;;1972:4;1965:11;;;;1711:319;2014:5;2007:12;;1632:404;;;;;:::o;1695:158:5:-;1771:4;1806:5;1787:3;:11;;:16;1799:3;1787:16;;;;;;;;;;;:24;;;;1828:18;1842:3;1828;:9;;:13;;:18;;;;:::i;:::-;1821:25;;1695:158;;;;;:::o;12251:393:4:-;12344:1;12330:16;;:2;:16;;;;12322:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;12402:16;12410:7;12402;:16::i;:::-;12401:17;12393:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;12462:45;12491:1;12495:2;12499:7;12462:20;:45::i;:::-;12518:30;12540:7;12518:13;:17;12532:2;12518:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;12559:29;12576:7;12585:2;12559:12;:16;;:29;;;;;:::i;:::-;;12629:7;12625:2;12604:33;;12621:1;12604:33;;;;;;;;;;;;12251:393;;:::o;6061:129:6:-;6135:7;6161:22;6165:3;:10;;6177:5;6161:3;:22::i;:::-;6154:29;;6061:129;;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;2231:193::-;2334:12;2365:52;2387:6;2395:4;2401:1;2404:12;2365:21;:52::i;:::-;2358:59;;2231:193;;;;;:::o;5395:138:6:-;5475:4;5498:28;5508:3;:10;;5520:5;5498:9;:28::i;:::-;5491:35;;5395:138;;;;:::o;3806:127::-;3879:4;3925:1;3902:3;:12;;:19;3915:5;3902:19;;;;;;;;;;;;:24;;3895:31;;3806:127;;;;:::o;4894:123::-;4964:4;4987:23;4992:3;:10;;5004:5;4987:4;:23::i;:::-;4980:30;;4894:123;;;;:::o;3213:448:0:-;3340:12;3397:5;3372:21;:30;;3364:39;;;;;;3421:18;3432:6;3421:10;:18::i;:::-;3413:27;;;;;;3511:12;3525:23;3552:6;:11;;3572:5;3580:4;3552:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3510:75;;;;3602:52;3620:7;3629:10;3641:12;3602:17;:52::i;:::-;3595:59;;;;3213:448;;;;;;:::o;3667:725::-;3782:12;3810:7;3806:580;;;3840:10;3833:17;;;;3806:580;3971:1;3951:10;:17;:21;3947:429;;;4209:10;4203:17;4269:15;4256:10;4252:2;4248:19;4241:44;4158:145;4348:12;4341:20;;;;;;;;;;;:::i;:::-;;;;;;;;3667:725;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:16:-;;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::-;;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::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1001:133::-;;1082:6;1069:20;1060:29;;1098:30;1122:5;1098:30;:::i;:::-;1050:84;;;;:::o;1140:143::-;;1228:6;1222:13;1213:22;;1244:33;1271:5;1244:33;:::i;:::-;1203:80;;;;:::o;1289:137::-;;1372:6;1359:20;1350:29;;1388:32;1414:5;1388:32;:::i;:::-;1340:86;;;;:::o;1432:141::-;;1519:6;1513:13;1504:22;;1535:32;1561:5;1535:32;:::i;:::-;1494:79;;;;:::o;1592:271::-;;1696:3;1689:4;1681:6;1677:17;1673:27;1663:2;;1714:1;1711;1704:12;1663:2;1754:6;1741:20;1779:78;1853:3;1845:6;1838:4;1830:6;1826:17;1779:78;:::i;:::-;1770:87;;1653:210;;;;;:::o;1883:273::-;;1988:3;1981:4;1973:6;1969:17;1965:27;1955:2;;2006:1;2003;1996:12;1955:2;2046:6;2033:20;2071:79;2146:3;2138:6;2131:4;2123:6;2119:17;2071:79;:::i;:::-;2062:88;;1945:211;;;;;:::o;2162:137::-;;2245:6;2232:20;2223:29;;2261:32;2287:5;2261:32;:::i;:::-;2213:86;;;;:::o;2305:139::-;;2389:6;2376:20;2367:29;;2405:33;2432:5;2405:33;:::i;:::-;2357:87;;;;:::o;2450:143::-;;2538:6;2532:13;2523:22;;2554:33;2581:5;2554:33;:::i;:::-;2513:80;;;;:::o;2599:262::-;;2707:2;2695:9;2686:7;2682:23;2678:32;2675:2;;;2723:1;2720;2713:12;2675:2;2766:1;2791:53;2836:7;2827:6;2816:9;2812:22;2791:53;:::i;:::-;2781:63;;2737:117;2665:196;;;;:::o;2867:284::-;;2986:2;2974:9;2965:7;2961:23;2957:32;2954:2;;;3002:1;2999;2992:12;2954:2;3045:1;3070:64;3126:7;3117:6;3106:9;3102:22;3070:64;:::i;:::-;3060:74;;3016:128;2944:207;;;;:::o;3157:407::-;;;3282:2;3270:9;3261:7;3257:23;3253:32;3250:2;;;3298:1;3295;3288:12;3250:2;3341:1;3366:53;3411:7;3402:6;3391:9;3387:22;3366:53;:::i;:::-;3356:63;;3312:117;3468:2;3494:53;3539:7;3530:6;3519:9;3515:22;3494:53;:::i;:::-;3484:63;;3439:118;3240:324;;;;;:::o;3570:552::-;;;;3712:2;3700:9;3691:7;3687:23;3683:32;3680:2;;;3728:1;3725;3718:12;3680:2;3771:1;3796:53;3841:7;3832:6;3821:9;3817:22;3796:53;:::i;:::-;3786:63;;3742:117;3898:2;3924:53;3969:7;3960:6;3949:9;3945:22;3924:53;:::i;:::-;3914:63;;3869:118;4026:2;4052:53;4097:7;4088:6;4077:9;4073:22;4052:53;:::i;:::-;4042:63;;3997:118;3670:452;;;;;:::o;4128:809::-;;;;;4296:3;4284:9;4275:7;4271:23;4267:33;4264:2;;;4313:1;4310;4303:12;4264:2;4356:1;4381:53;4426:7;4417:6;4406:9;4402:22;4381:53;:::i;:::-;4371:63;;4327:117;4483:2;4509:53;4554:7;4545:6;4534:9;4530:22;4509:53;:::i;:::-;4499:63;;4454:118;4611:2;4637:53;4682:7;4673:6;4662:9;4658:22;4637:53;:::i;:::-;4627:63;;4582:118;4767:2;4756:9;4752:18;4739:32;4798:18;4790:6;4787:30;4784:2;;;4830:1;4827;4820:12;4784:2;4858:62;4912:7;4903:6;4892:9;4888:22;4858:62;:::i;:::-;4848:72;;4710:220;4254:683;;;;;;;:::o;4943:401::-;;;5065:2;5053:9;5044:7;5040:23;5036:32;5033:2;;;5081:1;5078;5071:12;5033:2;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;5251:2;5277:50;5319:7;5310:6;5299:9;5295:22;5277:50;:::i;:::-;5267:60;;5222:115;5023:321;;;;;:::o;5350:407::-;;;5475:2;5463:9;5454:7;5450:23;5446:32;5443:2;;;5491:1;5488;5481:12;5443:2;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5433:324;;;;;:::o;5763:284::-;;5882:2;5870:9;5861:7;5857:23;5853:32;5850:2;;;5898:1;5895;5888:12;5850:2;5941:1;5966:64;6022:7;6013:6;6002:9;5998:22;5966:64;:::i;:::-;5956:74;;5912:128;5840:207;;;;:::o;6053:260::-;;6160:2;6148:9;6139:7;6135:23;6131:32;6128:2;;;6176:1;6173;6166:12;6128:2;6219:1;6244:52;6288:7;6279:6;6268:9;6264:22;6244:52;:::i;:::-;6234:62;;6190:116;6118:195;;;;:::o;6319:282::-;;6437:2;6425:9;6416:7;6412:23;6408:32;6405:2;;;6453:1;6450;6443:12;6405:2;6496:1;6521:63;6576:7;6567:6;6556:9;6552:22;6521:63;:::i;:::-;6511:73;;6467:127;6395:206;;;;:::o;6607:375::-;;6725:2;6713:9;6704:7;6700:23;6696:32;6693:2;;;6741:1;6738;6731:12;6693:2;6812:1;6801:9;6797:17;6784:31;6842:18;6834:6;6831:30;6828:2;;;6874:1;6871;6864:12;6828:2;6902:63;6957:7;6948:6;6937:9;6933:22;6902:63;:::i;:::-;6892:73;;6755:220;6683:299;;;;:::o;6988:260::-;;7095:2;7083:9;7074:7;7070:23;7066:32;7063:2;;;7111:1;7108;7101:12;7063:2;7154:1;7179:52;7223:7;7214:6;7203:9;7199:22;7179:52;:::i;:::-;7169:62;;7125:116;7053:195;;;;:::o;7254:262::-;;7362:2;7350:9;7341:7;7337:23;7333:32;7330:2;;;7378:1;7375;7368:12;7330:2;7421:1;7446:53;7491:7;7482:6;7471:9;7467:22;7446:53;:::i;:::-;7436:63;;7392:117;7320:196;;;;:::o;7522:284::-;;7641:2;7629:9;7620:7;7616:23;7612:32;7609:2;;;7657:1;7654;7647:12;7609:2;7700:1;7725:64;7781:7;7772:6;7761:9;7757:22;7725:64;:::i;:::-;7715:74;;7671:128;7599:207;;;;:::o;7812:179::-;;7902:46;7944:3;7936:6;7902:46;:::i;:::-;7980:4;7975:3;7971:14;7957:28;;7892:99;;;;:::o;7997:118::-;8084:24;8102:5;8084:24;:::i;:::-;8079:3;8072:37;8062:53;;:::o;8121:157::-;8226:45;8246:24;8264:5;8246:24;:::i;:::-;8226:45;:::i;:::-;8221:3;8214:58;8204:74;;:::o;8314:732::-;;8462:54;8510:5;8462:54;:::i;:::-;8532:86;8611:6;8606:3;8532:86;:::i;:::-;8525:93;;8642:56;8692:5;8642:56;:::i;:::-;8721:7;8752:1;8737:284;8762:6;8759:1;8756:13;8737:284;;;8838:6;8832:13;8865:63;8924:3;8909:13;8865:63;:::i;:::-;8858:70;;8951:60;9004:6;8951:60;:::i;:::-;8941:70;;8797:224;8784:1;8781;8777:9;8772:14;;8737:284;;;8741:14;9037:3;9030:10;;8438:608;;;;;;;:::o;9052:109::-;9133:21;9148:5;9133:21;:::i;:::-;9128:3;9121:34;9111:50;;:::o;9167:157::-;9272:45;9292:24;9310:5;9292:24;:::i;:::-;9272:45;:::i;:::-;9267:3;9260:58;9250:74;;:::o;9330:360::-;;9444:38;9476:5;9444:38;:::i;:::-;9498:70;9561:6;9556:3;9498:70;:::i;:::-;9491:77;;9577:52;9622:6;9617:3;9610:4;9603:5;9599:16;9577:52;:::i;:::-;9654:29;9676:6;9654:29;:::i;:::-;9649:3;9645:39;9638:46;;9420:270;;;;;:::o;9696:373::-;;9828:38;9860:5;9828:38;:::i;:::-;9882:88;9963:6;9958:3;9882:88;:::i;:::-;9875:95;;9979:52;10024:6;10019:3;10012:4;10005:5;10001:16;9979:52;:::i;:::-;10056:6;10051:3;10047:16;10040:23;;9804:265;;;;;:::o;10075:169::-;10181:56;10231:5;10181:56;:::i;:::-;10176:3;10169:69;10159:85;;:::o;10250:155::-;10349:49;10392:5;10349:49;:::i;:::-;10344:3;10337:62;10327:78;;:::o;10411:187::-;10526:65;10585:5;10526:65;:::i;:::-;10521:3;10514:78;10504:94;;:::o;10604:364::-;;10720:39;10753:5;10720:39;:::i;:::-;10775:71;10839:6;10834:3;10775:71;:::i;:::-;10768:78;;10855:52;10900:6;10895:3;10888:4;10881:5;10877:16;10855:52;:::i;:::-;10932:29;10954:6;10932:29;:::i;:::-;10927:3;10923:39;10916:46;;10696:272;;;;;:::o;10974:377::-;;11108:39;11141:5;11108:39;:::i;:::-;11163:89;11245:6;11240:3;11163:89;:::i;:::-;11156:96;;11261:52;11306:6;11301:3;11294:4;11287:5;11283:16;11261:52;:::i;:::-;11338:6;11333:3;11329:16;11322:23;;11084:267;;;;;:::o;11357:366::-;;11520:67;11584:2;11579:3;11520:67;:::i;:::-;11513:74;;11596:93;11685:3;11596:93;:::i;:::-;11714:2;11709:3;11705:12;11698:19;;11503:220;;;:::o;11729:366::-;;11892:67;11956:2;11951:3;11892:67;:::i;:::-;11885:74;;11968:93;12057:3;11968:93;:::i;:::-;12086:2;12081:3;12077:12;12070:19;;11875:220;;;:::o;12101:366::-;;12264:67;12328:2;12323:3;12264:67;:::i;:::-;12257:74;;12340:93;12429:3;12340:93;:::i;:::-;12458:2;12453:3;12449:12;12442:19;;12247:220;;;:::o;12473:366::-;;12636:67;12700:2;12695:3;12636:67;:::i;:::-;12629:74;;12712:93;12801:3;12712:93;:::i;:::-;12830:2;12825:3;12821:12;12814:19;;12619:220;;;:::o;12845:366::-;;13008:67;13072:2;13067:3;13008:67;:::i;:::-;13001:74;;13084:93;13173:3;13084:93;:::i;:::-;13202:2;13197:3;13193:12;13186:19;;12991:220;;;:::o;13217:366::-;;13380:67;13444:2;13439:3;13380:67;:::i;:::-;13373:74;;13456:93;13545:3;13456:93;:::i;:::-;13574:2;13569:3;13565:12;13558:19;;13363:220;;;:::o;13589:366::-;;13752:67;13816:2;13811:3;13752:67;:::i;:::-;13745:74;;13828:93;13917:3;13828:93;:::i;:::-;13946:2;13941:3;13937:12;13930:19;;13735:220;;;:::o;13961:366::-;;14124:67;14188:2;14183:3;14124:67;:::i;:::-;14117:74;;14200:93;14289:3;14200:93;:::i;:::-;14318:2;14313:3;14309:12;14302:19;;14107:220;;;:::o;14333:366::-;;14496:67;14560:2;14555:3;14496:67;:::i;:::-;14489:74;;14572:93;14661:3;14572:93;:::i;:::-;14690:2;14685:3;14681:12;14674:19;;14479:220;;;:::o;14705:366::-;;14868:67;14932:2;14927:3;14868:67;:::i;:::-;14861:74;;14944:93;15033:3;14944:93;:::i;:::-;15062:2;15057:3;15053:12;15046:19;;14851:220;;;:::o;15077:366::-;;15240:67;15304:2;15299:3;15240:67;:::i;:::-;15233:74;;15316:93;15405:3;15316:93;:::i;:::-;15434:2;15429:3;15425:12;15418:19;;15223:220;;;:::o;15449:366::-;;15612:67;15676:2;15671:3;15612:67;:::i;:::-;15605:74;;15688:93;15777:3;15688:93;:::i;:::-;15806:2;15801:3;15797:12;15790:19;;15595:220;;;:::o;15821:366::-;;15984:67;16048:2;16043:3;15984:67;:::i;:::-;15977:74;;16060:93;16149:3;16060:93;:::i;:::-;16178:2;16173:3;16169:12;16162:19;;15967:220;;;:::o;16193:366::-;;16356:67;16420:2;16415:3;16356:67;:::i;:::-;16349:74;;16432:93;16521:3;16432:93;:::i;:::-;16550:2;16545:3;16541:12;16534:19;;16339:220;;;:::o;16565:366::-;;16728:67;16792:2;16787:3;16728:67;:::i;:::-;16721:74;;16804:93;16893:3;16804:93;:::i;:::-;16922:2;16917:3;16913:12;16906:19;;16711:220;;;:::o;16937:366::-;;17100:67;17164:2;17159:3;17100:67;:::i;:::-;17093:74;;17176:93;17265:3;17176:93;:::i;:::-;17294:2;17289:3;17285:12;17278:19;;17083:220;;;:::o;17309:366::-;;17472:67;17536:2;17531:3;17472:67;:::i;:::-;17465:74;;17548:93;17637:3;17548:93;:::i;:::-;17666:2;17661:3;17657:12;17650:19;;17455:220;;;:::o;17681:366::-;;17844:67;17908:2;17903:3;17844:67;:::i;:::-;17837:74;;17920:93;18009:3;17920:93;:::i;:::-;18038:2;18033:3;18029:12;18022:19;;17827:220;;;:::o;18053:366::-;;18216:67;18280:2;18275:3;18216:67;:::i;:::-;18209:74;;18292:93;18381:3;18292:93;:::i;:::-;18410:2;18405:3;18401:12;18394:19;;18199:220;;;:::o;18425:366::-;;18588:67;18652:2;18647:3;18588:67;:::i;:::-;18581:74;;18664:93;18753:3;18664:93;:::i;:::-;18782:2;18777:3;18773:12;18766:19;;18571:220;;;:::o;18797:366::-;;18960:67;19024:2;19019:3;18960:67;:::i;:::-;18953:74;;19036:93;19125:3;19036:93;:::i;:::-;19154:2;19149:3;19145:12;19138:19;;18943:220;;;:::o;19169:366::-;;19332:67;19396:2;19391:3;19332:67;:::i;:::-;19325:74;;19408:93;19497:3;19408:93;:::i;:::-;19526:2;19521:3;19517:12;19510:19;;19315:220;;;:::o;19541:366::-;;19704:67;19768:2;19763:3;19704:67;:::i;:::-;19697:74;;19780:93;19869:3;19780:93;:::i;:::-;19898:2;19893:3;19889:12;19882:19;;19687:220;;;:::o;19913:366::-;;20076:67;20140:2;20135:3;20076:67;:::i;:::-;20069:74;;20152:93;20241:3;20152:93;:::i;:::-;20270:2;20265:3;20261:12;20254:19;;20059:220;;;:::o;20285:366::-;;20448:67;20512:2;20507:3;20448:67;:::i;:::-;20441:74;;20524:93;20613:3;20524:93;:::i;:::-;20642:2;20637:3;20633:12;20626:19;;20431:220;;;:::o;20657:366::-;;20820:67;20884:2;20879:3;20820:67;:::i;:::-;20813:74;;20896:93;20985:3;20896:93;:::i;:::-;21014:2;21009:3;21005:12;20998:19;;20803:220;;;:::o;21029:115::-;21114:23;21131:5;21114:23;:::i;:::-;21109:3;21102:36;21092:52;;:::o;21150:108::-;21227:24;21245:5;21227:24;:::i;:::-;21222:3;21215:37;21205:53;;:::o;21264:118::-;21351:24;21369:5;21351:24;:::i;:::-;21346:3;21339:37;21329:53;;:::o;21388:157::-;21493:45;21513:24;21531:5;21513:24;:::i;:::-;21493:45;:::i;:::-;21488:3;21481:58;21471:74;;:::o;21551:1102::-;;21846:75;21917:3;21908:6;21846:75;:::i;:::-;21946:2;21941:3;21937:12;21930:19;;21959:75;22030:3;22021:6;21959:75;:::i;:::-;22059:2;22054:3;22050:12;22043:19;;22072:75;22143:3;22134:6;22072:75;:::i;:::-;22172:2;22167:3;22163:12;22156:19;;22185:75;22256:3;22247:6;22185:75;:::i;:::-;22285:2;22280:3;22276:12;22269:19;;22298:75;22369:3;22360:6;22298:75;:::i;:::-;22398:2;22393:3;22389:12;22382:19;;22411:75;22482:3;22473:6;22411:75;:::i;:::-;22511:2;22506:3;22502:12;22495:19;;22524:75;22595:3;22586:6;22524:75;:::i;:::-;22624:2;22619:3;22615:12;22608:19;;22644:3;22637:10;;21835:818;;;;;;;;;;:::o;22659:271::-;;22811:93;22900:3;22891:6;22811:93;:::i;:::-;22804:100;;22921:3;22914:10;;22793:137;;;;:::o;22936:435::-;;23138:95;23229:3;23220:6;23138:95;:::i;:::-;23131:102;;23250:95;23341:3;23332:6;23250:95;:::i;:::-;23243:102;;23362:3;23355:10;;23120:251;;;;;:::o;23377:222::-;;23508:2;23497:9;23493:18;23485:26;;23521:71;23589:1;23578:9;23574:17;23565:6;23521:71;:::i;:::-;23475:124;;;;:::o;23605:640::-;;23838:3;23827:9;23823:19;23815:27;;23852:71;23920:1;23909:9;23905:17;23896:6;23852:71;:::i;:::-;23933:72;24001:2;23990:9;23986:18;23977:6;23933:72;:::i;:::-;24015;24083:2;24072:9;24068:18;24059:6;24015:72;:::i;:::-;24134:9;24128:4;24124:20;24119:2;24108:9;24104:18;24097:48;24162:76;24233:4;24224:6;24162:76;:::i;:::-;24154:84;;23805:440;;;;;;;:::o;24251:332::-;;24410:2;24399:9;24395:18;24387:26;;24423:71;24491:1;24480:9;24476:17;24467:6;24423:71;:::i;:::-;24504:72;24572:2;24561:9;24557:18;24548:6;24504:72;:::i;:::-;24377:206;;;;;:::o;24589:373::-;;24770:2;24759:9;24755:18;24747:26;;24819:9;24813:4;24809:20;24805:1;24794:9;24790:17;24783:47;24847:108;24950:4;24941:6;24847:108;:::i;:::-;24839:116;;24737:225;;;;:::o;24968:210::-;;25093:2;25082:9;25078:18;25070:26;;25106:65;25168:1;25157:9;25153:17;25144:6;25106:65;:::i;:::-;25060:118;;;;:::o;25184:260::-;;25334:2;25323:9;25319:18;25311:26;;25347:90;25434:1;25423:9;25419:17;25410:6;25347:90;:::i;:::-;25301:143;;;;:::o;25450:246::-;;25593:2;25582:9;25578:18;25570:26;;25606:83;25686:1;25675:9;25671:17;25662:6;25606:83;:::i;:::-;25560:136;;;;:::o;25702:278::-;;25861:2;25850:9;25846:18;25838:26;;25874:99;25970:1;25959:9;25955:17;25946:6;25874:99;:::i;:::-;25828:152;;;;:::o;25986:313::-;;26137:2;26126:9;26122:18;26114:26;;26186:9;26180:4;26176:20;26172:1;26161:9;26157:17;26150:47;26214:78;26287:4;26278:6;26214:78;:::i;:::-;26206:86;;26104:195;;;;:::o;26305:419::-;;26509:2;26498:9;26494:18;26486:26;;26558:9;26552:4;26548:20;26544:1;26533:9;26529:17;26522:47;26586:131;26712:4;26586:131;:::i;:::-;26578:139;;26476:248;;;:::o;26730:419::-;;26934:2;26923:9;26919:18;26911:26;;26983:9;26977:4;26973:20;26969:1;26958:9;26954:17;26947:47;27011:131;27137:4;27011:131;:::i;:::-;27003:139;;26901:248;;;:::o;27155:419::-;;27359:2;27348:9;27344:18;27336:26;;27408:9;27402:4;27398:20;27394:1;27383:9;27379:17;27372:47;27436:131;27562:4;27436:131;:::i;:::-;27428:139;;27326:248;;;:::o;27580:419::-;;27784:2;27773:9;27769:18;27761:26;;27833:9;27827:4;27823:20;27819:1;27808:9;27804:17;27797:47;27861:131;27987:4;27861:131;:::i;:::-;27853:139;;27751:248;;;:::o;28005:419::-;;28209:2;28198:9;28194:18;28186:26;;28258:9;28252:4;28248:20;28244:1;28233:9;28229:17;28222:47;28286:131;28412:4;28286:131;:::i;:::-;28278:139;;28176:248;;;:::o;28430:419::-;;28634:2;28623:9;28619:18;28611:26;;28683:9;28677:4;28673:20;28669:1;28658:9;28654:17;28647:47;28711:131;28837:4;28711:131;:::i;:::-;28703:139;;28601:248;;;:::o;28855:419::-;;29059:2;29048:9;29044:18;29036:26;;29108:9;29102:4;29098:20;29094:1;29083:9;29079:17;29072:47;29136:131;29262:4;29136:131;:::i;:::-;29128:139;;29026:248;;;:::o;29280:419::-;;29484:2;29473:9;29469:18;29461:26;;29533:9;29527:4;29523:20;29519:1;29508:9;29504:17;29497:47;29561:131;29687:4;29561:131;:::i;:::-;29553:139;;29451:248;;;:::o;29705:419::-;;29909:2;29898:9;29894:18;29886:26;;29958:9;29952:4;29948:20;29944:1;29933:9;29929:17;29922:47;29986:131;30112:4;29986:131;:::i;:::-;29978:139;;29876:248;;;:::o;30130:419::-;;30334:2;30323:9;30319:18;30311:26;;30383:9;30377:4;30373:20;30369:1;30358:9;30354:17;30347:47;30411:131;30537:4;30411:131;:::i;:::-;30403:139;;30301:248;;;:::o;30555:419::-;;30759:2;30748:9;30744:18;30736:26;;30808:9;30802:4;30798:20;30794:1;30783:9;30779:17;30772:47;30836:131;30962:4;30836:131;:::i;:::-;30828:139;;30726:248;;;:::o;30980:419::-;;31184:2;31173:9;31169:18;31161:26;;31233:9;31227:4;31223:20;31219:1;31208:9;31204:17;31197:47;31261:131;31387:4;31261:131;:::i;:::-;31253:139;;31151:248;;;:::o;31405:419::-;;31609:2;31598:9;31594:18;31586:26;;31658:9;31652:4;31648:20;31644:1;31633:9;31629:17;31622:47;31686:131;31812:4;31686:131;:::i;:::-;31678:139;;31576:248;;;:::o;31830:419::-;;32034:2;32023:9;32019:18;32011:26;;32083:9;32077:4;32073:20;32069:1;32058:9;32054:17;32047:47;32111:131;32237:4;32111:131;:::i;:::-;32103:139;;32001:248;;;:::o;32255:419::-;;32459:2;32448:9;32444:18;32436:26;;32508:9;32502:4;32498:20;32494:1;32483:9;32479:17;32472:47;32536:131;32662:4;32536:131;:::i;:::-;32528:139;;32426:248;;;:::o;32680:419::-;;32884:2;32873:9;32869:18;32861:26;;32933:9;32927:4;32923:20;32919:1;32908:9;32904:17;32897:47;32961:131;33087:4;32961:131;:::i;:::-;32953:139;;32851:248;;;:::o;33105:419::-;;33309:2;33298:9;33294:18;33286:26;;33358:9;33352:4;33348:20;33344:1;33333:9;33329:17;33322:47;33386:131;33512:4;33386:131;:::i;:::-;33378:139;;33276:248;;;:::o;33530:419::-;;33734:2;33723:9;33719:18;33711:26;;33783:9;33777:4;33773:20;33769:1;33758:9;33754:17;33747:47;33811:131;33937:4;33811:131;:::i;:::-;33803:139;;33701:248;;;:::o;33955:419::-;;34159:2;34148:9;34144:18;34136:26;;34208:9;34202:4;34198:20;34194:1;34183:9;34179:17;34172:47;34236:131;34362:4;34236:131;:::i;:::-;34228:139;;34126:248;;;:::o;34380:419::-;;34584:2;34573:9;34569:18;34561:26;;34633:9;34627:4;34623:20;34619:1;34608:9;34604:17;34597:47;34661:131;34787:4;34661:131;:::i;:::-;34653:139;;34551:248;;;:::o;34805:419::-;;35009:2;34998:9;34994:18;34986:26;;35058:9;35052:4;35048:20;35044:1;35033:9;35029:17;35022:47;35086:131;35212:4;35086:131;:::i;:::-;35078:139;;34976:248;;;:::o;35230:419::-;;35434:2;35423:9;35419:18;35411:26;;35483:9;35477:4;35473:20;35469:1;35458:9;35454:17;35447:47;35511:131;35637:4;35511:131;:::i;:::-;35503:139;;35401:248;;;:::o;35655:419::-;;35859:2;35848:9;35844:18;35836:26;;35908:9;35902:4;35898:20;35894:1;35883:9;35879:17;35872:47;35936:131;36062:4;35936:131;:::i;:::-;35928:139;;35826:248;;;:::o;36080:419::-;;36284:2;36273:9;36269:18;36261:26;;36333:9;36327:4;36323:20;36319:1;36308:9;36304:17;36297:47;36361:131;36487:4;36361:131;:::i;:::-;36353:139;;36251:248;;;:::o;36505:419::-;;36709:2;36698:9;36694:18;36686:26;;36758:9;36752:4;36748:20;36744:1;36733:9;36729:17;36722:47;36786:131;36912:4;36786:131;:::i;:::-;36778:139;;36676:248;;;:::o;36930:419::-;;37134:2;37123:9;37119:18;37111:26;;37183:9;37177:4;37173:20;37169:1;37158:9;37154:17;37147:47;37211:131;37337:4;37211:131;:::i;:::-;37203:139;;37101:248;;;:::o;37355:218::-;;37484:2;37473:9;37469:18;37461:26;;37497:69;37563:1;37552:9;37548:17;37539:6;37497:69;:::i;:::-;37451:122;;;;:::o;37579:222::-;;37710:2;37699:9;37695:18;37687:26;;37723:71;37791:1;37780:9;37776:17;37767:6;37723:71;:::i;:::-;37677:124;;;;:::o;37807:129::-;;37868:20;;:::i;:::-;37858:30;;37897:33;37925:4;37917:6;37897:33;:::i;:::-;37848:88;;;:::o;37942:75::-;;38008:2;38002:9;37992:19;;37982:35;:::o;38023:307::-;;38174:18;38166:6;38163:30;38160:2;;;38196:18;;:::i;:::-;38160:2;38234:29;38256:6;38234:29;:::i;:::-;38226:37;;38318:4;38312;38308:15;38300:23;;38089:241;;;:::o;38336:308::-;;38488:18;38480:6;38477:30;38474:2;;;38510:18;;:::i;:::-;38474:2;38548:29;38570:6;38548:29;:::i;:::-;38540:37;;38632:4;38626;38622:15;38614:23;;38403:241;;;:::o;38650:132::-;;38740:3;38732:11;;38770:4;38765:3;38761:14;38753:22;;38722:60;;;:::o;38788:114::-;;38889:5;38883:12;38873:22;;38862:40;;;:::o;38908:98::-;;38993:5;38987:12;38977:22;;38966:40;;;:::o;39012:99::-;;39098:5;39092:12;39082:22;;39071:40;;;:::o;39117:113::-;;39219:4;39214:3;39210:14;39202:22;;39192:38;;;:::o;39236:184::-;;39369:6;39364:3;39357:19;39409:4;39404:3;39400:14;39385:29;;39347:73;;;;:::o;39426:168::-;;39543:6;39538:3;39531:19;39583:4;39578:3;39574:14;39559:29;;39521:73;;;;:::o;39600:147::-;;39738:3;39723:18;;39713:34;;;;:::o;39753:169::-;;39871:6;39866:3;39859:19;39911:4;39906:3;39902:14;39887:29;;39849:73;;;;:::o;39928:148::-;;40067:3;40052:18;;40042:34;;;;:::o;40082:242::-;;40140:19;40157:1;40140:19;:::i;:::-;40135:24;;40173:19;40190:1;40173:19;:::i;:::-;40168:24;;40266:1;40258:6;40254:14;40251:1;40248:21;40245:2;;;40272:18;;:::i;:::-;40245:2;40316:1;40313;40309:9;40302:16;;40125:199;;;;:::o;40330:305::-;;40389:20;40407:1;40389:20;:::i;:::-;40384:25;;40423:20;40441:1;40423:20;:::i;:::-;40418:25;;40577:1;40509:66;40505:74;40502:1;40499:81;40496:2;;;40583:18;;:::i;:::-;40496:2;40627:1;40624;40620:9;40613:16;;40374:261;;;;:::o;40641:185::-;;40698:20;40716:1;40698:20;:::i;:::-;40693:25;;40732:20;40750:1;40732:20;:::i;:::-;40727:25;;40771:1;40761:2;;40776:18;;:::i;:::-;40761:2;40818:1;40815;40811:9;40806:14;;40683:143;;;;:::o;40832:191::-;;40892:20;40910:1;40892:20;:::i;:::-;40887:25;;40926:20;40944:1;40926:20;:::i;:::-;40921:25;;40965:1;40962;40959:8;40956:2;;;40970:18;;:::i;:::-;40956:2;41015:1;41012;41008:9;41000:17;;40877:146;;;;:::o;41029:96::-;;41095:24;41113:5;41095:24;:::i;:::-;41084:35;;41074:51;;;:::o;41131:90::-;;41208:5;41201:13;41194:21;41183:32;;41173:48;;;:::o;41227:77::-;;41293:5;41282:16;;41272:32;;;:::o;41310:149::-;;41386:66;41379:5;41375:78;41364:89;;41354:105;;;:::o;41465:89::-;;41541:6;41534:5;41530:18;41519:29;;41509:45;;;:::o;41560:126::-;;41637:42;41630:5;41626:54;41615:65;;41605:81;;;:::o;41692:77::-;;41758:5;41747:16;;41737:32;;;:::o;41775:164::-;;41877:56;41927:5;41877:56;:::i;:::-;41864:69;;41854:85;;;:::o;41945:132::-;;42047:24;42065:5;42047:24;:::i;:::-;42034:37;;42024:53;;;:::o;42083:150::-;;42178:49;42221:5;42178:49;:::i;:::-;42165:62;;42155:78;;;:::o;42239:125::-;;42334:24;42352:5;42334:24;:::i;:::-;42321:37;;42311:53;;;:::o;42370:182::-;;42481:65;42540:5;42481:65;:::i;:::-;42468:78;;42458:94;;;:::o;42558:141::-;;42669:24;42687:5;42669:24;:::i;:::-;42656:37;;42646:53;;;:::o;42705:154::-;42789:6;42784:3;42779;42766:30;42851:1;42842:6;42837:3;42833:16;42826:27;42756:103;;;:::o;42865:307::-;42933:1;42943:113;42957:6;42954:1;42951:13;42943:113;;;43042:1;43037:3;43033:11;43027:18;43023:1;43018:3;43014:11;43007:39;42979:2;42976:1;42972:10;42967:15;;42943:113;;;43074:6;43071:1;43068:13;43065:2;;;43154:1;43145:6;43140:3;43136:16;43129:27;43065:2;42914:258;;;;:::o;43178:320::-;;43259:1;43253:4;43249:12;43239:22;;43306:1;43300:4;43296:12;43327:18;43317:2;;43383:4;43375:6;43371:17;43361:27;;43317:2;43445;43437:6;43434:14;43414:18;43411:38;43408:2;;;43464:18;;:::i;:::-;43408:2;43229:269;;;;:::o;43504:281::-;43587:27;43609:4;43587:27;:::i;:::-;43579:6;43575:40;43717:6;43705:10;43702:22;43681:18;43669:10;43666:34;43663:62;43660:2;;;43728:18;;:::i;:::-;43660:2;43768:10;43764:2;43757:22;43547:238;;;:::o;43791:171::-;;43852:23;43869:5;43852:23;:::i;:::-;43843:32;;43897:6;43890:5;43887:17;43884:2;;;43907:18;;:::i;:::-;43884:2;43954:1;43947:5;43943:13;43936:20;;43833:129;;;:::o;43968:233::-;;44030:24;44048:5;44030:24;:::i;:::-;44021:33;;44076:66;44069:5;44066:77;44063:2;;;44146:18;;:::i;:::-;44063:2;44193:1;44186:5;44182:13;44175:20;;44011:190;;;:::o;44207:100::-;;44275:26;44295:5;44275:26;:::i;:::-;44264:37;;44254:53;;;:::o;44313:79::-;;44381:5;44370:16;;44360:32;;;:::o;44398:94::-;;44466:20;44480:5;44466:20;:::i;:::-;44455:31;;44445:47;;;:::o;44498:79::-;;44566:5;44555:16;;44545:32;;;:::o;44583:176::-;;44632:20;44650:1;44632:20;:::i;:::-;44627:25;;44666:20;44684:1;44666:20;:::i;:::-;44661:25;;44705:1;44695:2;;44710:18;;:::i;:::-;44695:2;44751:1;44748;44744:9;44739:14;;44617:142;;;;:::o;44765:180::-;44813:77;44810:1;44803:88;44910:4;44907:1;44900:15;44934:4;44931:1;44924:15;44951:180;44999:77;44996:1;44989:88;45096:4;45093:1;45086:15;45120:4;45117:1;45110:15;45137:180;45185:77;45182:1;45175:88;45282:4;45279:1;45272:15;45306:4;45303:1;45296:15;45323:180;45371:77;45368:1;45361:88;45468:4;45465:1;45458:15;45492:4;45489:1;45482:15;45509:102;;45601:2;45597:7;45592:2;45585:5;45581:14;45577:28;45567:38;;45557:54;;;:::o;45617:94::-;;45698:5;45694:2;45690:14;45669:35;;45659:52;;;:::o;45717:221::-;45857:34;45853:1;45845:6;45841:14;45834:58;45926:4;45921:2;45913:6;45909:15;45902:29;45823:115;:::o;45944:181::-;46084:33;46080:1;46072:6;46068:14;46061:57;46050:75;:::o;46131:237::-;46271:34;46267:1;46259:6;46255:14;46248:58;46340:20;46335:2;46327:6;46323:15;46316:45;46237:131;:::o;46374:225::-;46514:34;46510:1;46502:6;46498:14;46491:58;46583:8;46578:2;46570:6;46566:15;46559:33;46480:119;:::o;46605:178::-;46745:30;46741:1;46733:6;46729:14;46722:54;46711:72;:::o;46789:223::-;46929:34;46925:1;46917:6;46913:14;46906:58;46998:6;46993:2;46985:6;46981:15;46974:31;46895:117;:::o;47018:175::-;47158:27;47154:1;47146:6;47142:14;47135:51;47124:69;:::o;47199:178::-;47339:30;47335:1;47327:6;47323:14;47316:54;47305:72;:::o;47383:231::-;47523:34;47519:1;47511:6;47507:14;47500:58;47592:14;47587:2;47579:6;47575:15;47568:39;47489:125;:::o;47620:172::-;47760:24;47756:1;47748:6;47744:14;47737:48;47726:66;:::o;47798:243::-;47938:34;47934:1;47926:6;47922:14;47915:58;48007:26;48002:2;47994:6;47990:15;47983:51;47904:137;:::o;48047:229::-;48187:34;48183:1;48175:6;48171:14;48164:58;48256:12;48251:2;48243:6;48239:15;48232:37;48153:123;:::o;48282:182::-;48422:34;48418:1;48410:6;48406:14;48399:58;48388:76;:::o;48470:173::-;48610:25;48606:1;48598:6;48594:14;48587:49;48576:67;:::o;48649:228::-;48789:34;48785:1;48777:6;48773:14;48766:58;48858:11;48853:2;48845:6;48841:15;48834:36;48755:122;:::o;48883:231::-;49023:34;49019:1;49011:6;49007:14;49000:58;49092:14;49087:2;49079:6;49075:15;49068:39;48989:125;:::o;49120:182::-;49260:34;49256:1;49248:6;49244:14;49237:58;49226:76;:::o;49308:180::-;49448:32;49444:1;49436:6;49432:14;49425:56;49414:74;:::o;49494:228::-;49634:34;49630:1;49622:6;49618:14;49611:58;49703:11;49698:2;49690:6;49686:15;49679:36;49600:122;:::o;49728:234::-;49868:34;49864:1;49856:6;49852:14;49845:58;49937:17;49932:2;49924:6;49920:15;49913:42;49834:128;:::o;49968:220::-;50108:34;50104:1;50096:6;50092:14;50085:58;50177:3;50172:2;50164:6;50160:15;50153:28;50074:114;:::o;50194:165::-;50334:17;50330:1;50322:6;50318:14;50311:41;50300:59;:::o;50365:236::-;50505:34;50501:1;50493:6;50489:14;50482:58;50574:19;50569:2;50561:6;50557:15;50550:44;50471:130;:::o;50607:229::-;50747:34;50743:1;50735:6;50731:14;50724:58;50816:12;50811:2;50803:6;50799:15;50792:37;50713:123;:::o;50842:165::-;50982:17;50978:1;50970:6;50966:14;50959:41;50948:59;:::o;51013:181::-;51153:33;51149:1;51141:6;51137:14;51130:57;51119:75;:::o;51200:122::-;51273:24;51291:5;51273:24;:::i;:::-;51266:5;51263:35;51253:2;;51312:1;51309;51302:12;51253:2;51243:79;:::o;51328:116::-;51398:21;51413:5;51398:21;:::i;:::-;51391:5;51388:32;51378:2;;51434:1;51431;51424:12;51378:2;51368:76;:::o;51450:122::-;51523:24;51541:5;51523:24;:::i;:::-;51516:5;51513:35;51503:2;;51562:1;51559;51552:12;51503:2;51493:79;:::o;51578:120::-;51650:23;51667:5;51650:23;:::i;:::-;51643:5;51640:34;51630:2;;51688:1;51685;51678:12;51630:2;51620:78;:::o;51704:120::-;51776:23;51793:5;51776:23;:::i;:::-;51769:5;51766:34;51756:2;;51814:1;51811;51804:12;51756:2;51746:78;:::o;51830:122::-;51903:24;51921:5;51903:24;:::i;:::-;51896:5;51893:35;51883:2;;51942:1;51939;51932:12;51883:2;51873:79;:::o

Swarm Source

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