ETH Price: $3,113.27 (+0.31%)

Token

Frenzy Ducks (FD)
 

Overview

Max Total Supply

517 FD

Holders

346

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FD
0xf87e931acb11ad20756bc628e54631fb82649dbf
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:
FrenzyDucks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 24: FrenzyDucks.sol
pragma solidity ^0.8.0;
// SPDX-License-Identifier: MIT

import "./SafeMath.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./ERC2981Royalties.sol";

contract FrenzyDucks is ERC721Enumerable, Ownable, ERC2981Royalties {
    using SafeMath for uint;
    string baseURI;
    uint public MAX_FRENZYDUCKS = 5000;
    uint public MAX_SALE = 5;
    uint public MAX_PER_WALET = 5;
    
    address communityAddress = 0x6EEa57e0D7Bf99571af3DD7a1D861bA62D7665B2;
    address frenzyducksAddress = 0x30564f2D0896B00186450B0F7989D7Ae7af51975;
    address devAddress = 0xA7b5Cf34dDb26A5e8efb8a652c9C7f5aEfB160b8;
    address marketingAddress = 0x279e5f77b3b6d6e17df1749B42426c1a1c2143dA;
    uint public price = 50000000000000000;

    mapping(address => bool) private whitelisted;
    
    bool public preSaleStarted = true;
    bool public preSaleOver = false;
    bool public saleStarted = false;
    
    event FrenzyDucksMinted(uint indexed tokenId, address indexed owner);
    
    constructor(string memory name, string memory symbol, string memory baseURI_) ERC721(name, symbol) {
        baseURI = baseURI_;
        _setRoyalties(frenzyducksAddress, 750);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC2981Base) returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function mintTo(address _to) internal {
        uint mintIndex = totalSupply().add(1);
        _safeMint(_to, mintIndex);
        emit FrenzyDucksMinted(mintIndex, _to);
    }
    
    function mint(uint _quantity) external payable  {
        require(saleStarted, "Sale hasn't started.");
        require(_quantity > 0, "Quantity cannot be zero.");
        require(_quantity <= MAX_SALE, "Quantity cannot be bigger than MAX_BUYING.");
        require(_quantity + balanceOf(msg.sender) <= MAX_PER_WALET, "Quantity cannot be bigger than MAX_PER_WALET.");
        require(totalSupply().add(_quantity) <= MAX_FRENZYDUCKS, "Sold out.");
        require(msg.value >= price.mul(_quantity) || msg.sender == owner(), "Ether value sent is below the price.");
        
        for (uint i = 0; i < _quantity; i++) {
            mintTo(msg.sender);
        }
    }
    
    function preMint(uint _quantity) external payable  {
        require(preSaleStarted, "Presale hasn't started.");
        require(!preSaleOver, "Presale is over.");
        require(_quantity > 0, "Quantity cannot be zero.");
        require(_quantity <= MAX_SALE, "Quantity cannot be bigger than MAX_SALE.");
        require(_quantity + balanceOf(msg.sender) <= MAX_PER_WALET, "Quantity cannot be bigger than MAX_PER_WALET.");
        require(totalSupply().add(_quantity) <= MAX_FRENZYDUCKS, "Sold out");
        require(msg.value >= price.mul(_quantity) || msg.sender == owner(), "Ether value sent is below the price.");
        
        for (uint i = 0; i < _quantity; i++) {
            mintTo(msg.sender);
        }
    }
    
    function mintByOwner(address _to, uint256 _quantity) public onlyOwner {
        require(_quantity > 0, "Quantity cannot be zero.");
        require(_quantity <= MAX_SALE, "Quantity cannot be bigger than MAX_SALE.");
        require(totalSupply().add(_quantity) <= MAX_FRENZYDUCKS, "Sold out.");
        
        for (uint i = 0; i < _quantity; i++) {
            mintTo(_to);
        }
    }
    
    function multiMintByOwner(address[] memory _mintAddressList, uint256[] memory _quantityList) external onlyOwner {
        require (_mintAddressList.length == _quantityList.length, "The length should be same");

        for (uint256 i = 0; i < _mintAddressList.length; i += 1) {
            mintByOwner(_mintAddressList[i], _quantityList[i]);
        }
    }

    function tokensOfOwner(address _owner) public view returns(uint[] memory ) {
        uint tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint[](0);
        } else {
            uint[] memory result = new uint[](tokenCount);
            for (uint i = 0; i < tokenCount; i++) {
                result[i] = tokenOfOwnerByIndex(_owner, i);
            }
            return result;
        }
    }
    
    function setBaseURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function setPrice(uint _price) external onlyOwner {
        price = _price;
    }
    
    function setMaxFrenzyDucks(uint _maxFrenzyDucks) external onlyOwner {
        MAX_FRENZYDUCKS = _maxFrenzyDucks;
    }
    
    function setMaxSale(uint _maxSale, uint _maxFrenzyDucksPerWallet) external onlyOwner {
        MAX_SALE = _maxSale;
        MAX_PER_WALET = _maxFrenzyDucksPerWallet;
    }
    
    function startSale() external onlyOwner {
        require(!saleStarted, "Sale already active.");
        
        MAX_PER_WALET = 10;
        MAX_SALE = 10;
        price = 60000000000000000;
        saleStarted = true;
        preSaleStarted = false;
        preSaleOver = true;
    }

    function pauseSale() external onlyOwner {
        require(saleStarted, "Sale is not active.");
        
        saleStarted = false;
    }
    
    function startPreSale() external onlyOwner {
        require(!preSaleOver, "Presale is over, cannot start again.");
        require(!preSaleStarted, "Presale already active.");
        
        preSaleStarted = true;
    }

    function pausePreSale() external onlyOwner {
        require(preSaleStarted, "Presale is not active.");
        preSaleStarted = false;
    }

    function burn(uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(owner == msg.sender, "Only the owner of NFT can transfer or burn it");
        super._burn(tokenId);
    }

    function withdraw() public onlyOwner {        
        uint256 balance = address(this).balance;
        payable(communityAddress).transfer( (balance * 5) / 100 );
        payable(marketingAddress).transfer( (balance * 5) / 100 );
        payable(devAddress).transfer( (balance * 75) / 1000 );
        payable(frenzyducksAddress).transfer( (balance * 825) / 1000 );
    }
}

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // 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 24: 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 3 of 24: EnumerableMap.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./EnumerableSet.sol";

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

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

    struct Map {
        // Storage of keys
        EnumerableSet.Bytes32Set _keys;

        mapping (bytes32 => bytes32) _values;
    }

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

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

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

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

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

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

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

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

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

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

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

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

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

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

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

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

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

File 4 of 24: 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 5 of 24: ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping (uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor (string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155).interfaceId
            || interfaceId == type(IERC1155MetadataURI).interfaceId
            || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        _balances[id][from] = fromBalance - amount;
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            _balances[id][from] = fromBalance - amount;
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address account, uint256 id, uint256 amount) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        _balances[id][account] = accountBalance - amount;

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        internal
        virtual
    { }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 6 of 24: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 24: ERC2981Base.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC165.sol";
import "./IERC2981Royalties.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

   
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

File 8 of 24: ERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import './ERC2981Base.sol';

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981Royalties is ERC2981Base {
    RoyaltyInfo private _royalties;

    /// @dev Sets token royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setRoyalties(address recipient, uint256 value) internal {
        require(value <= 10000, 'ERC2981Royalties: Too high');
        _royalties = RoyaltyInfo(recipient, uint24(value));
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties;
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}

File 9 of 24: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.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 {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC721).interfaceId
            || interfaceId == type(IERC721Metadata).interfaceId
            || super.supportsInterface(interfaceId);
    }

    /**
     * @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 _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 baseURI = _baseURI();
        return bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @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 || 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 _owners[tokenId] != address(0);
    }

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

        _balances[to] += 1;
        _owners[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);

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

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

        _balances[owner] -= 1;
        delete _owners[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");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @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()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @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 10 of 24: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId
            || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

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

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

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

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

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

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 12 of 24: IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

File 13 of 24: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 14 of 24: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

File 15 of 24: 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 16 of 24: IERC2981Royalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

File 17 of 24: 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 18 of 24: 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 19 of 24: 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 20 of 24: 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 21 of 24: Math.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute.
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

File 22 of 24: 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 23 of 24: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. 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 24 of 24: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"FrenzyDucksMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FRENZYDUCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_mintAddressList","type":"address[]"},{"internalType":"uint256[]","name":"_quantityList","type":"uint256[]"}],"name":"multiMintByOwner","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":"pausePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFrenzyDucks","type":"uint256"}],"name":"setMaxFrenzyDucks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSale","type":"uint256"},{"internalType":"uint256","name":"_maxFrenzyDucksPerWallet","type":"uint256"}],"name":"setMaxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611388600d556005600e556005600f55736eea57e0d7bf99571af3dd7a1d861ba62d7665b2601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507330564f2d0896b00186450b0f7989d7ae7af51975601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a7b5cf34ddb26a5e8efb8a652c9c7f5aefb160b8601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073279e5f77b3b6d6e17df1749b42426c1a1c2143da601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066b1a2bc2ec500006014556001601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff021916908315150217905550348015620001d157600080fd5b5060405162006487380380620064878339818101604052810190620001f7919062000559565b82828160009080519060200190620002119291906200042b565b5080600190805190602001906200022a9291906200042b565b50505060006200023f6200033660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600c9080519060200190620002f69291906200042b565b506200032d601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102ee6200033e60201b60201c565b50505062000819565b600033905090565b61271081111562000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037d9062000639565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff16815250600b60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff1602179055509050505050565b828054620004399062000701565b90600052602060002090601f0160209004810192826200045d5760008555620004a9565b82601f106200047857805160ff1916838001178555620004a9565b82800160010185558215620004a9579182015b82811115620004a85782518255916020019190600101906200048b565b5b509050620004b89190620004bc565b5090565b5b80821115620004d7576000816000905550600101620004bd565b5090565b6000620004f2620004ec8462000684565b6200065b565b905082815260208101848484011115620005115762000510620007d0565b5b6200051e848285620006cb565b509392505050565b600082601f8301126200053e576200053d620007cb565b5b815162000550848260208601620004db565b91505092915050565b600080600060608486031215620005755762000574620007da565b5b600084015167ffffffffffffffff811115620005965762000595620007d5565b5b620005a48682870162000526565b935050602084015167ffffffffffffffff811115620005c857620005c7620007d5565b5b620005d68682870162000526565b925050604084015167ffffffffffffffff811115620005fa57620005f9620007d5565b5b620006088682870162000526565b9150509250925092565b600062000621601a83620006ba565b91506200062e82620007f0565b602082019050919050565b60006020820190508181036000830152620006548162000612565b9050919050565b6000620006676200067a565b905062000675828262000737565b919050565b6000604051905090565b600067ffffffffffffffff821115620006a257620006a16200079c565b5b620006ad82620007df565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620006eb578082015181840152602081019050620006ce565b83811115620006fb576000848401525b50505050565b600060028204905060018216806200071a57607f821691505b602082108114156200073157620007306200076d565b5b50919050565b6200074282620007df565b810181811067ffffffffffffffff821117156200076457620007636200079c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b615c5e80620008296000396000f3fe6080604052600436106102515760003560e01c8063637e53331161013957806395d89b41116100b6578063b66a0e5d1161007a578063b66a0e5d1461085b578063b88d4fde14610872578063c4ac9ea21461089b578063c87b56dd146108c6578063e985e9c514610903578063f2fde38b1461094057610251565b806395d89b4114610795578063a035b1fe146107c0578063a0712d68146107eb578063a22cb46514610807578063a9dc9d251461083057610251565b80638462151c116100fd5780638462151c146106bf5780638ad433ac146106fc5780638da5cb5b14610718578063914053e71461074357806391b7f5ed1461076c57610251565b8063637e5333146105ec578063690cf0d1146106155780636bb6bf8b1461064057806370a082311461066b578063715018a6146106a857610251565b80633bdf4bda116101d25780634f6ccce7116101965780634f6ccce7146104f057806355367ba91461052d57806355dd574c1461054457806355f804b31461055b5780635c474f9e146105845780636352211e146105af57610251565b80633bdf4bda146104475780633ccfd60b1461047057806342842e0e1461048757806342966c68146104b05780634357da58146104d957610251565b806318160ddd1161021957806318160ddd1461034f57806323b872dd1461037a5780632a55205a146103a35780632f745c59146103e15780633542aee21461041e57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb578063136f3cfc14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190614136565b610969565b60405161028a919061493a565b60405180910390f35b34801561029f57600080fd5b506102a86109e3565b6040516102b59190614955565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906141d9565b610a75565b6040516102f29190614888565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061407e565b610afa565b005b34801561033057600080fd5b50610339610c12565b6040516103469190614dd7565b60405180910390f35b34801561035b57600080fd5b50610364610c18565b6040516103719190614dd7565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190613f68565b610c25565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190614206565b610c85565b6040516103d89291906148ef565b60405180910390f35b3480156103ed57600080fd5b506104086004803603810190610403919061407e565b610d45565b6040516104159190614dd7565b60405180910390f35b34801561042a57600080fd5b506104456004803603810190610440919061407e565b610dea565b005b34801561045357600080fd5b5061046e600480360381019061046991906141d9565b610f78565b005b34801561047c57600080fd5b50610485610ffe565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613f68565b611289565b005b3480156104bc57600080fd5b506104d760048036038101906104d291906141d9565b6112a9565b005b3480156104e557600080fd5b506104ee611331565b005b3480156104fc57600080fd5b50610517600480360381019061051291906141d9565b611419565b6040516105249190614dd7565b60405180910390f35b34801561053957600080fd5b5061054261148a565b005b34801561055057600080fd5b50610559611572565b005b34801561056757600080fd5b50610582600480360381019061057d9190614190565b6116ab565b005b34801561059057600080fd5b50610599611741565b6040516105a6919061493a565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d191906141d9565b611754565b6040516105e39190614888565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190614206565b611806565b005b34801561062157600080fd5b5061062a611894565b604051610637919061493a565b60405180910390f35b34801561064c57600080fd5b506106556118a7565b604051610662919061493a565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190613efb565b6118ba565b60405161069f9190614dd7565b60405180910390f35b3480156106b457600080fd5b506106bd611972565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190613efb565b611aaf565b6040516106f39190614918565b60405180910390f35b610716600480360381019061071191906141d9565b611bb9565b005b34801561072457600080fd5b5061072d611e55565b60405161073a9190614888565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906140be565b611e7f565b005b34801561077857600080fd5b50610793600480360381019061078e91906141d9565b611fa2565b005b3480156107a157600080fd5b506107aa612028565b6040516107b79190614955565b60405180910390f35b3480156107cc57600080fd5b506107d56120ba565b6040516107e29190614dd7565b60405180910390f35b610805600480360381019061080091906141d9565b6120c0565b005b34801561081357600080fd5b5061082e6004803603810190610829919061403e565b61230c565b005b34801561083c57600080fd5b5061084561248d565b6040516108529190614dd7565b60405180910390f35b34801561086757600080fd5b50610870612493565b005b34801561087e57600080fd5b5061089960048036038101906108949190613fbb565b6125d0565b005b3480156108a757600080fd5b506108b0612632565b6040516108bd9190614dd7565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906141d9565b612638565b6040516108fa9190614955565b60405180910390f35b34801561090f57600080fd5b5061092a60048036038101906109259190613f28565b6126df565b604051610937919061493a565b60405180910390f35b34801561094c57600080fd5b5061096760048036038101906109629190613efb565b612773565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109dc57506109db8261291f565b5b9050919050565b6060600080546109f290615118565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90615118565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b5050505050905090565b6000610a8082612999565b610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab690614c17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0582611754565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90614cb7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b95612a05565b73ffffffffffffffffffffffffffffffffffffffff161480610bc45750610bc381610bbe612a05565b6126df565b5b610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90614b17565b60405180910390fd5b610c0d8383612a0d565b505050565b600e5481565b6000600880549050905090565b610c36610c30612a05565b82612ac6565b610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90614d17565b60405180910390fd5b610c80838383612ba4565b505050565b6000806000600b6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610d319190614fd4565b610d3b9190614fa3565b9150509250929050565b6000610d50836118ba565b8210610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d88906149f7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610df2612a05565b73ffffffffffffffffffffffffffffffffffffffff16610e10611e55565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d90614c37565b60405180910390fd5b60008111610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614cd7565b60405180910390fd5b600e54811115610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee5906149d7565b60405180910390fd5b600d54610f0b82610efd610c18565b612e0090919063ffffffff16565b1115610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390614d57565b60405180910390fd5b60005b81811015610f7357610f6083612e16565b8080610f6b9061517b565b915050610f4f565b505050565b610f80612a05565b73ffffffffffffffffffffffffffffffffffffffff16610f9e611e55565b73ffffffffffffffffffffffffffffffffffffffff1614610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90614c37565b60405180910390fd5b80600d8190555050565b611006612a05565b73ffffffffffffffffffffffffffffffffffffffff16611024611e55565b73ffffffffffffffffffffffffffffffffffffffff161461107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c37565b60405180910390fd5b6000479050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60646005846110ca9190614fd4565b6110d49190614fa3565b9081150290604051600060405180830381858888f193505050501580156110ff573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460058461114b9190614fd4565b6111559190614fa3565b9081150290604051600060405180830381858888f19350505050158015611180573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8604b846111cd9190614fd4565b6111d79190614fa3565b9081150290604051600060405180830381858888f19350505050158015611202573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610339846112509190614fd4565b61125a9190614fa3565b9081150290604051600060405180830381858888f19350505050158015611285573d6000803e3d6000fd5b5050565b6112a4838383604051806020016040528060008152506125d0565b505050565b60006112b482611754565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614bf7565b60405180910390fd5b61132d82612e87565b5050565b611339612a05565b73ffffffffffffffffffffffffffffffffffffffff16611357611e55565b73ffffffffffffffffffffffffffffffffffffffff16146113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a490614c37565b60405180910390fd5b601660009054906101000a900460ff166113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f390614d97565b60405180910390fd5b6000601660006101000a81548160ff021916908315150217905550565b6000611423610c18565b8210611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90614d77565b60405180910390fd5b60088281548110611478576114776152b1565b5b90600052602060002001549050919050565b611492612a05565b73ffffffffffffffffffffffffffffffffffffffff166114b0611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614c37565b60405180910390fd5b601660029054906101000a900460ff16611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c90614c97565b60405180910390fd5b6000601660026101000a81548160ff021916908315150217905550565b61157a612a05565b73ffffffffffffffffffffffffffffffffffffffff16611598611e55565b73ffffffffffffffffffffffffffffffffffffffff16146115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590614c37565b60405180910390fd5b601660019054906101000a900460ff161561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614b57565b60405180910390fd5b601660009054906101000a900460ff161561168e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611685906149b7565b60405180910390fd5b6001601660006101000a81548160ff021916908315150217905550565b6116b3612a05565b73ffffffffffffffffffffffffffffffffffffffff166116d1611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90614c37565b60405180910390fd5b80600c908051906020019061173d929190613bd3565b5050565b601660029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490614b97565b60405180910390fd5b80915050919050565b61180e612a05565b73ffffffffffffffffffffffffffffffffffffffff1661182c611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990614c37565b60405180910390fd5b81600e8190555080600f819055505050565b601660009054906101000a900460ff1681565b601660019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290614b77565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61197a612a05565b73ffffffffffffffffffffffffffffffffffffffff16611998611e55565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590614c37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000611abc836118ba565b90506000811415611b1957600067ffffffffffffffff811115611ae257611ae16152e0565b5b604051908082528060200260200182016040528015611b105781602001602082028036833780820191505090505b50915050611bb4565b60008167ffffffffffffffff811115611b3557611b346152e0565b5b604051908082528060200260200182016040528015611b635781602001602082028036833780820191505090505b50905060005b82811015611bad57611b7b8582610d45565b828281518110611b8e57611b8d6152b1565b5b6020026020010181815250508080611ba59061517b565b915050611b69565b5080925050505b919050565b601660009054906101000a900460ff16611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90614ad7565b60405180910390fd5b601660019054906101000a900460ff1615611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614b37565b60405180910390fd5b60008111611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9290614cd7565b60405180910390fd5b600e54811115611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd7906149d7565b60405180910390fd5b600f54611cec336118ba565b82611cf79190614f4d565b1115611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90614db7565b60405180910390fd5b600d54611d5582611d47610c18565b612e0090919063ffffffff16565b1115611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90614d37565b60405180910390fd5b611dab81601454612f9890919063ffffffff16565b34101580611deb5750611dbc611e55565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190614cf7565b60405180910390fd5b60005b81811015611e5157611e3e33612e16565b8080611e499061517b565b915050611e2d565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e87612a05565b73ffffffffffffffffffffffffffffffffffffffff16611ea5611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290614c37565b60405180910390fd5b8051825114611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690614bb7565b60405180910390fd5b60005b8251811015611f9d57611f89838281518110611f6157611f606152b1565b5b6020026020010151838381518110611f7c57611f7b6152b1565b5b6020026020010151610dea565b600181611f969190614f4d565b9050611f42565b505050565b611faa612a05565b73ffffffffffffffffffffffffffffffffffffffff16611fc8611e55565b73ffffffffffffffffffffffffffffffffffffffff161461201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590614c37565b60405180910390fd5b8060148190555050565b60606001805461203790615118565b80601f016020809104026020016040519081016040528092919081815260200182805461206390615118565b80156120b05780601f10612085576101008083540402835291602001916120b0565b820191906000526020600020905b81548152906001019060200180831161209357829003601f168201915b5050505050905090565b60145481565b601660029054906101000a900460ff1661210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614997565b60405180910390fd5b60008111612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990614cd7565b60405180910390fd5b600e54811115612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90614a77565b60405180910390fd5b600f546121a3336118ba565b826121ae9190614f4d565b11156121ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e690614db7565b60405180910390fd5b600d5461220c826121fe610c18565b612e0090919063ffffffff16565b111561224d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224490614d57565b60405180910390fd5b61226281601454612f9890919063ffffffff16565b341015806122a25750612273611e55565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d890614cf7565b60405180910390fd5b60005b81811015612308576122f533612e16565b80806123009061517b565b9150506122e4565b5050565b612314612a05565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237990614ab7565b60405180910390fd5b806005600061238f612a05565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661243c612a05565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612481919061493a565b60405180910390a35050565b600d5481565b61249b612a05565b73ffffffffffffffffffffffffffffffffffffffff166124b9611e55565b73ffffffffffffffffffffffffffffffffffffffff161461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614c37565b60405180910390fd5b601660029054906101000a900460ff161561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690614977565b60405180910390fd5b600a600f81905550600a600e8190555066d529ae9e8600006014819055506001601660026101000a81548160ff0219169083151502179055506000601660006101000a81548160ff0219169083151502179055506001601660016101000a81548160ff021916908315150217905550565b6125e16125db612a05565b83612ac6565b612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261790614d17565b60405180910390fd5b61262c84848484612fae565b50505050565b600f5481565b606061264382612999565b612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614c77565b60405180910390fd5b600061268c61300a565b905060008151116126ac57604051806020016040528060008152506126d7565b806126b68461309c565b6040516020016126c7929190614864565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61277b612a05565b73ffffffffffffffffffffffffffffffffffffffff16612799611e55565b73ffffffffffffffffffffffffffffffffffffffff16146127ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e690614c37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561285f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285690614a37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129925750612991826131fd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a8083611754565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ad182612999565b612b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0790614af7565b60405180910390fd5b6000612b1b83611754565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b8a57508373ffffffffffffffffffffffffffffffffffffffff16612b7284610a75565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b9b5750612b9a81856126df565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bc482611754565b73ffffffffffffffffffffffffffffffffffffffff1614612c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1190614c57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614a97565b60405180910390fd5b612c95838383613277565b612ca0600082612a0d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cf0919061502e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d479190614f4d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612e0e9190614f4d565b905092915050565b6000612e336001612e25610c18565b612e0090919063ffffffff16565b9050612e3f828261338b565b8173ffffffffffffffffffffffffffffffffffffffff16817fade44088f434e3d43dc50ac93f56697611c5b05f5791bafbbb76daf5dcda1d6760405160405180910390a35050565b6000612e9282611754565b9050612ea081600084613277565b612eab600083612a0d565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612efb919061502e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008183612fa69190614fd4565b905092915050565b612fb9848484612ba4565b612fc5848484846133a9565b613004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffb90614a17565b60405180910390fd5b50505050565b6060600c805461301990615118565b80601f016020809104026020016040519081016040528092919081815260200182805461304590615118565b80156130925780601f1061306757610100808354040283529160200191613092565b820191906000526020600020905b81548152906001019060200180831161307557829003601f168201915b5050505050905090565b606060008214156130e4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131f8565b600082905060005b600082146131165780806130ff9061517b565b915050600a8261310f9190614fa3565b91506130ec565b60008167ffffffffffffffff811115613132576131316152e0565b5b6040519080825280601f01601f1916602001820160405280156131645781602001600182028036833780820191505090505b5090505b600085146131f15760018261317d919061502e565b9150600a8561318c91906151c4565b60306131989190614f4d565b60f81b8183815181106131ae576131ad6152b1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131ea9190614fa3565b9450613168565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613270575061326f82613540565b5b9050919050565b613282838383613622565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c5576132c081613627565b613304565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613303576133028382613670565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334757613342816137dd565b613386565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133855761338482826138ae565b5b5b505050565b6133a582826040518060200160405280600081525061392d565b5050565b60006133ca8473ffffffffffffffffffffffffffffffffffffffff16613988565b15613533578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133f3612a05565b8786866040518563ffffffff1660e01b815260040161341594939291906148a3565b602060405180830381600087803b15801561342f57600080fd5b505af192505050801561346057506040513d601f19601f8201168201806040525081019061345d9190614163565b60015b6134e3573d8060008114613490576040519150601f19603f3d011682016040523d82523d6000602084013e613495565b606091505b506000815114156134db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d290614a17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613538565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061360b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061361b575061361a8261399b565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161367d846118ba565b613687919061502e565b905060006007600084815260200190815260200160002054905081811461376c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137f1919061502e565b9050600060096000848152602001908152602001600020549050600060088381548110613821576138206152b1565b5b906000526020600020015490508060088381548110613843576138426152b1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061389257613891615282565b5b6001900381819060005260206000200160009055905550505050565b60006138b9836118ba565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6139378383613a05565b61394460008484846133a9565b613983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397a90614a17565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6c90614bd7565b60405180910390fd5b613a7e81612999565b15613abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab590614a57565b60405180910390fd5b613aca60008383613277565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b1a9190614f4d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613bdf90615118565b90600052602060002090601f016020900481019282613c015760008555613c48565b82601f10613c1a57805160ff1916838001178555613c48565b82800160010185558215613c48579182015b82811115613c47578251825591602001919060010190613c2c565b5b509050613c559190613c59565b5090565b5b80821115613c72576000816000905550600101613c5a565b5090565b6000613c89613c8484614e17565b614df2565b90508083825260208201905082856020860282011115613cac57613cab615314565b5b60005b85811015613cdc5781613cc28882613dda565b845260208401935060208301925050600181019050613caf565b5050509392505050565b6000613cf9613cf484614e43565b614df2565b90508083825260208201905082856020860282011115613d1c57613d1b615314565b5b60005b85811015613d4c5781613d328882613ee6565b845260208401935060208301925050600181019050613d1f565b5050509392505050565b6000613d69613d6484614e6f565b614df2565b905082815260208101848484011115613d8557613d84615319565b5b613d908482856150d6565b509392505050565b6000613dab613da684614ea0565b614df2565b905082815260208101848484011115613dc757613dc6615319565b5b613dd28482856150d6565b509392505050565b600081359050613de981615bcc565b92915050565b600082601f830112613e0457613e0361530f565b5b8135613e14848260208601613c76565b91505092915050565b600082601f830112613e3257613e3161530f565b5b8135613e42848260208601613ce6565b91505092915050565b600081359050613e5a81615be3565b92915050565b600081359050613e6f81615bfa565b92915050565b600081519050613e8481615bfa565b92915050565b600082601f830112613e9f57613e9e61530f565b5b8135613eaf848260208601613d56565b91505092915050565b600082601f830112613ecd57613ecc61530f565b5b8135613edd848260208601613d98565b91505092915050565b600081359050613ef581615c11565b92915050565b600060208284031215613f1157613f10615323565b5b6000613f1f84828501613dda565b91505092915050565b60008060408385031215613f3f57613f3e615323565b5b6000613f4d85828601613dda565b9250506020613f5e85828601613dda565b9150509250929050565b600080600060608486031215613f8157613f80615323565b5b6000613f8f86828701613dda565b9350506020613fa086828701613dda565b9250506040613fb186828701613ee6565b9150509250925092565b60008060008060808587031215613fd557613fd4615323565b5b6000613fe387828801613dda565b9450506020613ff487828801613dda565b935050604061400587828801613ee6565b925050606085013567ffffffffffffffff8111156140265761402561531e565b5b61403287828801613e8a565b91505092959194509250565b6000806040838503121561405557614054615323565b5b600061406385828601613dda565b925050602061407485828601613e4b565b9150509250929050565b6000806040838503121561409557614094615323565b5b60006140a385828601613dda565b92505060206140b485828601613ee6565b9150509250929050565b600080604083850312156140d5576140d4615323565b5b600083013567ffffffffffffffff8111156140f3576140f261531e565b5b6140ff85828601613def565b925050602083013567ffffffffffffffff8111156141205761411f61531e565b5b61412c85828601613e1d565b9150509250929050565b60006020828403121561414c5761414b615323565b5b600061415a84828501613e60565b91505092915050565b60006020828403121561417957614178615323565b5b600061418784828501613e75565b91505092915050565b6000602082840312156141a6576141a5615323565b5b600082013567ffffffffffffffff8111156141c4576141c361531e565b5b6141d084828501613eb8565b91505092915050565b6000602082840312156141ef576141ee615323565b5b60006141fd84828501613ee6565b91505092915050565b6000806040838503121561421d5761421c615323565b5b600061422b85828601613ee6565b925050602061423c85828601613ee6565b9150509250929050565b60006142528383614846565b60208301905092915050565b61426781615062565b82525050565b600061427882614ee1565b6142828185614f0f565b935061428d83614ed1565b8060005b838110156142be5781516142a58882614246565b97506142b083614f02565b925050600181019050614291565b5085935050505092915050565b6142d481615074565b82525050565b60006142e582614eec565b6142ef8185614f20565b93506142ff8185602086016150e5565b61430881615328565b840191505092915050565b600061431e82614ef7565b6143288185614f31565b93506143388185602086016150e5565b61434181615328565b840191505092915050565b600061435782614ef7565b6143618185614f42565b93506143718185602086016150e5565b80840191505092915050565b600061438a601483614f31565b915061439582615339565b602082019050919050565b60006143ad601483614f31565b91506143b882615362565b602082019050919050565b60006143d0601783614f31565b91506143db8261538b565b602082019050919050565b60006143f3602883614f31565b91506143fe826153b4565b604082019050919050565b6000614416602b83614f31565b915061442182615403565b604082019050919050565b6000614439603283614f31565b915061444482615452565b604082019050919050565b600061445c602683614f31565b9150614467826154a1565b604082019050919050565b600061447f601c83614f31565b915061448a826154f0565b602082019050919050565b60006144a2602a83614f31565b91506144ad82615519565b604082019050919050565b60006144c5602483614f31565b91506144d082615568565b604082019050919050565b60006144e8601983614f31565b91506144f3826155b7565b602082019050919050565b600061450b601783614f31565b9150614516826155e0565b602082019050919050565b600061452e602c83614f31565b915061453982615609565b604082019050919050565b6000614551603883614f31565b915061455c82615658565b604082019050919050565b6000614574601083614f31565b915061457f826156a7565b602082019050919050565b6000614597602483614f31565b91506145a2826156d0565b604082019050919050565b60006145ba602a83614f31565b91506145c58261571f565b604082019050919050565b60006145dd602983614f31565b91506145e88261576e565b604082019050919050565b6000614600601983614f31565b915061460b826157bd565b602082019050919050565b6000614623602083614f31565b915061462e826157e6565b602082019050919050565b6000614646602d83614f31565b91506146518261580f565b604082019050919050565b6000614669602c83614f31565b91506146748261585e565b604082019050919050565b600061468c602083614f31565b9150614697826158ad565b602082019050919050565b60006146af602983614f31565b91506146ba826158d6565b604082019050919050565b60006146d2602f83614f31565b91506146dd82615925565b604082019050919050565b60006146f5601383614f31565b915061470082615974565b602082019050919050565b6000614718602183614f31565b91506147238261599d565b604082019050919050565b600061473b601883614f31565b9150614746826159ec565b602082019050919050565b600061475e602483614f31565b915061476982615a15565b604082019050919050565b6000614781603183614f31565b915061478c82615a64565b604082019050919050565b60006147a4600883614f31565b91506147af82615ab3565b602082019050919050565b60006147c7600983614f31565b91506147d282615adc565b602082019050919050565b60006147ea602c83614f31565b91506147f582615b05565b604082019050919050565b600061480d601683614f31565b915061481882615b54565b602082019050919050565b6000614830602d83614f31565b915061483b82615b7d565b604082019050919050565b61484f816150cc565b82525050565b61485e816150cc565b82525050565b6000614870828561434c565b915061487c828461434c565b91508190509392505050565b600060208201905061489d600083018461425e565b92915050565b60006080820190506148b8600083018761425e565b6148c5602083018661425e565b6148d26040830185614855565b81810360608301526148e481846142da565b905095945050505050565b6000604082019050614904600083018561425e565b6149116020830184614855565b9392505050565b60006020820190508181036000830152614932818461426d565b905092915050565b600060208201905061494f60008301846142cb565b92915050565b6000602082019050818103600083015261496f8184614313565b905092915050565b600060208201905081810360008301526149908161437d565b9050919050565b600060208201905081810360008301526149b0816143a0565b9050919050565b600060208201905081810360008301526149d0816143c3565b9050919050565b600060208201905081810360008301526149f0816143e6565b9050919050565b60006020820190508181036000830152614a1081614409565b9050919050565b60006020820190508181036000830152614a308161442c565b9050919050565b60006020820190508181036000830152614a508161444f565b9050919050565b60006020820190508181036000830152614a7081614472565b9050919050565b60006020820190508181036000830152614a9081614495565b9050919050565b60006020820190508181036000830152614ab0816144b8565b9050919050565b60006020820190508181036000830152614ad0816144db565b9050919050565b60006020820190508181036000830152614af0816144fe565b9050919050565b60006020820190508181036000830152614b1081614521565b9050919050565b60006020820190508181036000830152614b3081614544565b9050919050565b60006020820190508181036000830152614b5081614567565b9050919050565b60006020820190508181036000830152614b708161458a565b9050919050565b60006020820190508181036000830152614b90816145ad565b9050919050565b60006020820190508181036000830152614bb0816145d0565b9050919050565b60006020820190508181036000830152614bd0816145f3565b9050919050565b60006020820190508181036000830152614bf081614616565b9050919050565b60006020820190508181036000830152614c1081614639565b9050919050565b60006020820190508181036000830152614c308161465c565b9050919050565b60006020820190508181036000830152614c508161467f565b9050919050565b60006020820190508181036000830152614c70816146a2565b9050919050565b60006020820190508181036000830152614c90816146c5565b9050919050565b60006020820190508181036000830152614cb0816146e8565b9050919050565b60006020820190508181036000830152614cd08161470b565b9050919050565b60006020820190508181036000830152614cf08161472e565b9050919050565b60006020820190508181036000830152614d1081614751565b9050919050565b60006020820190508181036000830152614d3081614774565b9050919050565b60006020820190508181036000830152614d5081614797565b9050919050565b60006020820190508181036000830152614d70816147ba565b9050919050565b60006020820190508181036000830152614d90816147dd565b9050919050565b60006020820190508181036000830152614db081614800565b9050919050565b60006020820190508181036000830152614dd081614823565b9050919050565b6000602082019050614dec6000830184614855565b92915050565b6000614dfc614e0d565b9050614e08828261514a565b919050565b6000604051905090565b600067ffffffffffffffff821115614e3257614e316152e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e5e57614e5d6152e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e8a57614e896152e0565b5b614e9382615328565b9050602081019050919050565b600067ffffffffffffffff821115614ebb57614eba6152e0565b5b614ec482615328565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f58826150cc565b9150614f63836150cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f9857614f976151f5565b5b828201905092915050565b6000614fae826150cc565b9150614fb9836150cc565b925082614fc957614fc8615224565b5b828204905092915050565b6000614fdf826150cc565b9150614fea836150cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615023576150226151f5565b5b828202905092915050565b6000615039826150cc565b9150615044836150cc565b925082821015615057576150566151f5565b5b828203905092915050565b600061506d826150ac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151035780820151818401526020810190506150e8565b83811115615112576000848401525b50505050565b6000600282049050600182168061513057607f821691505b6020821081141561514457615143615253565b5b50919050565b61515382615328565b810181811067ffffffffffffffff82111715615172576151716152e0565b5b80604052505050565b6000615186826150cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151b9576151b86151f5565b5b600182019050919050565b60006151cf826150cc565b91506151da836150cc565b9250826151ea576151e9615224565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53616c6520616c7265616479206163746976652e000000000000000000000000600082015250565b7f53616c65206861736e277420737461727465642e000000000000000000000000600082015250565b7f50726573616c6520616c7265616479206163746976652e000000000000000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f53414c452e000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f425559494e472e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c65206861736e277420737461727465642e000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c65206973206f7665722e00000000000000000000000000000000600082015250565b7f50726573616c65206973206f7665722c2063616e6e6f7420737461727420616760008201527f61696e2e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f546865206c656e6774682073686f756c642062652073616d6500000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f6e6c7920746865206f776e6572206f66204e46542063616e207472616e736660008201527f6572206f72206275726e20697400000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f2e0000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963652e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f5045525f57414c45542e00000000000000000000000000000000000000602082015250565b615bd581615062565b8114615be057600080fd5b50565b615bec81615074565b8114615bf757600080fd5b50565b615c0381615080565b8114615c0e57600080fd5b50565b615c1a816150cc565b8114615c2557600080fd5b5056fea264697066735822122011be078dbb64865c2199d32618b4a5dc14deb80fb08bb609e3010e817ba5045f64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c4672656e7a79204475636b73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024644000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d664c3375474a3377594d5a4e6e36686d46434c476a387a596d345373347067637278314c77556b6159634e702f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c8063637e53331161013957806395d89b41116100b6578063b66a0e5d1161007a578063b66a0e5d1461085b578063b88d4fde14610872578063c4ac9ea21461089b578063c87b56dd146108c6578063e985e9c514610903578063f2fde38b1461094057610251565b806395d89b4114610795578063a035b1fe146107c0578063a0712d68146107eb578063a22cb46514610807578063a9dc9d251461083057610251565b80638462151c116100fd5780638462151c146106bf5780638ad433ac146106fc5780638da5cb5b14610718578063914053e71461074357806391b7f5ed1461076c57610251565b8063637e5333146105ec578063690cf0d1146106155780636bb6bf8b1461064057806370a082311461066b578063715018a6146106a857610251565b80633bdf4bda116101d25780634f6ccce7116101965780634f6ccce7146104f057806355367ba91461052d57806355dd574c1461054457806355f804b31461055b5780635c474f9e146105845780636352211e146105af57610251565b80633bdf4bda146104475780633ccfd60b1461047057806342842e0e1461048757806342966c68146104b05780634357da58146104d957610251565b806318160ddd1161021957806318160ddd1461034f57806323b872dd1461037a5780632a55205a146103a35780632f745c59146103e15780633542aee21461041e57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb578063136f3cfc14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190614136565b610969565b60405161028a919061493a565b60405180910390f35b34801561029f57600080fd5b506102a86109e3565b6040516102b59190614955565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906141d9565b610a75565b6040516102f29190614888565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061407e565b610afa565b005b34801561033057600080fd5b50610339610c12565b6040516103469190614dd7565b60405180910390f35b34801561035b57600080fd5b50610364610c18565b6040516103719190614dd7565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190613f68565b610c25565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190614206565b610c85565b6040516103d89291906148ef565b60405180910390f35b3480156103ed57600080fd5b506104086004803603810190610403919061407e565b610d45565b6040516104159190614dd7565b60405180910390f35b34801561042a57600080fd5b506104456004803603810190610440919061407e565b610dea565b005b34801561045357600080fd5b5061046e600480360381019061046991906141d9565b610f78565b005b34801561047c57600080fd5b50610485610ffe565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613f68565b611289565b005b3480156104bc57600080fd5b506104d760048036038101906104d291906141d9565b6112a9565b005b3480156104e557600080fd5b506104ee611331565b005b3480156104fc57600080fd5b50610517600480360381019061051291906141d9565b611419565b6040516105249190614dd7565b60405180910390f35b34801561053957600080fd5b5061054261148a565b005b34801561055057600080fd5b50610559611572565b005b34801561056757600080fd5b50610582600480360381019061057d9190614190565b6116ab565b005b34801561059057600080fd5b50610599611741565b6040516105a6919061493a565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d191906141d9565b611754565b6040516105e39190614888565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190614206565b611806565b005b34801561062157600080fd5b5061062a611894565b604051610637919061493a565b60405180910390f35b34801561064c57600080fd5b506106556118a7565b604051610662919061493a565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d9190613efb565b6118ba565b60405161069f9190614dd7565b60405180910390f35b3480156106b457600080fd5b506106bd611972565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190613efb565b611aaf565b6040516106f39190614918565b60405180910390f35b610716600480360381019061071191906141d9565b611bb9565b005b34801561072457600080fd5b5061072d611e55565b60405161073a9190614888565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906140be565b611e7f565b005b34801561077857600080fd5b50610793600480360381019061078e91906141d9565b611fa2565b005b3480156107a157600080fd5b506107aa612028565b6040516107b79190614955565b60405180910390f35b3480156107cc57600080fd5b506107d56120ba565b6040516107e29190614dd7565b60405180910390f35b610805600480360381019061080091906141d9565b6120c0565b005b34801561081357600080fd5b5061082e6004803603810190610829919061403e565b61230c565b005b34801561083c57600080fd5b5061084561248d565b6040516108529190614dd7565b60405180910390f35b34801561086757600080fd5b50610870612493565b005b34801561087e57600080fd5b5061089960048036038101906108949190613fbb565b6125d0565b005b3480156108a757600080fd5b506108b0612632565b6040516108bd9190614dd7565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906141d9565b612638565b6040516108fa9190614955565b60405180910390f35b34801561090f57600080fd5b5061092a60048036038101906109259190613f28565b6126df565b604051610937919061493a565b60405180910390f35b34801561094c57600080fd5b5061096760048036038101906109629190613efb565b612773565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109dc57506109db8261291f565b5b9050919050565b6060600080546109f290615118565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90615118565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b5050505050905090565b6000610a8082612999565b610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab690614c17565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0582611754565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90614cb7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b95612a05565b73ffffffffffffffffffffffffffffffffffffffff161480610bc45750610bc381610bbe612a05565b6126df565b5b610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90614b17565b60405180910390fd5b610c0d8383612a0d565b505050565b600e5481565b6000600880549050905090565b610c36610c30612a05565b82612ac6565b610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90614d17565b60405180910390fd5b610c80838383612ba4565b505050565b6000806000600b6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610d319190614fd4565b610d3b9190614fa3565b9150509250929050565b6000610d50836118ba565b8210610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d88906149f7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610df2612a05565b73ffffffffffffffffffffffffffffffffffffffff16610e10611e55565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d90614c37565b60405180910390fd5b60008111610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614cd7565b60405180910390fd5b600e54811115610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee5906149d7565b60405180910390fd5b600d54610f0b82610efd610c18565b612e0090919063ffffffff16565b1115610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390614d57565b60405180910390fd5b60005b81811015610f7357610f6083612e16565b8080610f6b9061517b565b915050610f4f565b505050565b610f80612a05565b73ffffffffffffffffffffffffffffffffffffffff16610f9e611e55565b73ffffffffffffffffffffffffffffffffffffffff1614610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90614c37565b60405180910390fd5b80600d8190555050565b611006612a05565b73ffffffffffffffffffffffffffffffffffffffff16611024611e55565b73ffffffffffffffffffffffffffffffffffffffff161461107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c37565b60405180910390fd5b6000479050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60646005846110ca9190614fd4565b6110d49190614fa3565b9081150290604051600060405180830381858888f193505050501580156110ff573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460058461114b9190614fd4565b6111559190614fa3565b9081150290604051600060405180830381858888f19350505050158015611180573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8604b846111cd9190614fd4565b6111d79190614fa3565b9081150290604051600060405180830381858888f19350505050158015611202573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610339846112509190614fd4565b61125a9190614fa3565b9081150290604051600060405180830381858888f19350505050158015611285573d6000803e3d6000fd5b5050565b6112a4838383604051806020016040528060008152506125d0565b505050565b60006112b482611754565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614bf7565b60405180910390fd5b61132d82612e87565b5050565b611339612a05565b73ffffffffffffffffffffffffffffffffffffffff16611357611e55565b73ffffffffffffffffffffffffffffffffffffffff16146113ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a490614c37565b60405180910390fd5b601660009054906101000a900460ff166113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f390614d97565b60405180910390fd5b6000601660006101000a81548160ff021916908315150217905550565b6000611423610c18565b8210611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90614d77565b60405180910390fd5b60088281548110611478576114776152b1565b5b90600052602060002001549050919050565b611492612a05565b73ffffffffffffffffffffffffffffffffffffffff166114b0611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614c37565b60405180910390fd5b601660029054906101000a900460ff16611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c90614c97565b60405180910390fd5b6000601660026101000a81548160ff021916908315150217905550565b61157a612a05565b73ffffffffffffffffffffffffffffffffffffffff16611598611e55565b73ffffffffffffffffffffffffffffffffffffffff16146115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590614c37565b60405180910390fd5b601660019054906101000a900460ff161561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614b57565b60405180910390fd5b601660009054906101000a900460ff161561168e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611685906149b7565b60405180910390fd5b6001601660006101000a81548160ff021916908315150217905550565b6116b3612a05565b73ffffffffffffffffffffffffffffffffffffffff166116d1611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90614c37565b60405180910390fd5b80600c908051906020019061173d929190613bd3565b5050565b601660029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490614b97565b60405180910390fd5b80915050919050565b61180e612a05565b73ffffffffffffffffffffffffffffffffffffffff1661182c611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990614c37565b60405180910390fd5b81600e8190555080600f819055505050565b601660009054906101000a900460ff1681565b601660019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290614b77565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61197a612a05565b73ffffffffffffffffffffffffffffffffffffffff16611998611e55565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590614c37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000611abc836118ba565b90506000811415611b1957600067ffffffffffffffff811115611ae257611ae16152e0565b5b604051908082528060200260200182016040528015611b105781602001602082028036833780820191505090505b50915050611bb4565b60008167ffffffffffffffff811115611b3557611b346152e0565b5b604051908082528060200260200182016040528015611b635781602001602082028036833780820191505090505b50905060005b82811015611bad57611b7b8582610d45565b828281518110611b8e57611b8d6152b1565b5b6020026020010181815250508080611ba59061517b565b915050611b69565b5080925050505b919050565b601660009054906101000a900460ff16611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90614ad7565b60405180910390fd5b601660019054906101000a900460ff1615611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614b37565b60405180910390fd5b60008111611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9290614cd7565b60405180910390fd5b600e54811115611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd7906149d7565b60405180910390fd5b600f54611cec336118ba565b82611cf79190614f4d565b1115611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90614db7565b60405180910390fd5b600d54611d5582611d47610c18565b612e0090919063ffffffff16565b1115611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90614d37565b60405180910390fd5b611dab81601454612f9890919063ffffffff16565b34101580611deb5750611dbc611e55565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190614cf7565b60405180910390fd5b60005b81811015611e5157611e3e33612e16565b8080611e499061517b565b915050611e2d565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e87612a05565b73ffffffffffffffffffffffffffffffffffffffff16611ea5611e55565b73ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290614c37565b60405180910390fd5b8051825114611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690614bb7565b60405180910390fd5b60005b8251811015611f9d57611f89838281518110611f6157611f606152b1565b5b6020026020010151838381518110611f7c57611f7b6152b1565b5b6020026020010151610dea565b600181611f969190614f4d565b9050611f42565b505050565b611faa612a05565b73ffffffffffffffffffffffffffffffffffffffff16611fc8611e55565b73ffffffffffffffffffffffffffffffffffffffff161461201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590614c37565b60405180910390fd5b8060148190555050565b60606001805461203790615118565b80601f016020809104026020016040519081016040528092919081815260200182805461206390615118565b80156120b05780601f10612085576101008083540402835291602001916120b0565b820191906000526020600020905b81548152906001019060200180831161209357829003601f168201915b5050505050905090565b60145481565b601660029054906101000a900460ff1661210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614997565b60405180910390fd5b60008111612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990614cd7565b60405180910390fd5b600e54811115612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90614a77565b60405180910390fd5b600f546121a3336118ba565b826121ae9190614f4d565b11156121ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e690614db7565b60405180910390fd5b600d5461220c826121fe610c18565b612e0090919063ffffffff16565b111561224d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224490614d57565b60405180910390fd5b61226281601454612f9890919063ffffffff16565b341015806122a25750612273611e55565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d890614cf7565b60405180910390fd5b60005b81811015612308576122f533612e16565b80806123009061517b565b9150506122e4565b5050565b612314612a05565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237990614ab7565b60405180910390fd5b806005600061238f612a05565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661243c612a05565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612481919061493a565b60405180910390a35050565b600d5481565b61249b612a05565b73ffffffffffffffffffffffffffffffffffffffff166124b9611e55565b73ffffffffffffffffffffffffffffffffffffffff161461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614c37565b60405180910390fd5b601660029054906101000a900460ff161561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690614977565b60405180910390fd5b600a600f81905550600a600e8190555066d529ae9e8600006014819055506001601660026101000a81548160ff0219169083151502179055506000601660006101000a81548160ff0219169083151502179055506001601660016101000a81548160ff021916908315150217905550565b6125e16125db612a05565b83612ac6565b612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261790614d17565b60405180910390fd5b61262c84848484612fae565b50505050565b600f5481565b606061264382612999565b612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614c77565b60405180910390fd5b600061268c61300a565b905060008151116126ac57604051806020016040528060008152506126d7565b806126b68461309c565b6040516020016126c7929190614864565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61277b612a05565b73ffffffffffffffffffffffffffffffffffffffff16612799611e55565b73ffffffffffffffffffffffffffffffffffffffff16146127ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e690614c37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561285f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285690614a37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129925750612991826131fd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a8083611754565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ad182612999565b612b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0790614af7565b60405180910390fd5b6000612b1b83611754565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b8a57508373ffffffffffffffffffffffffffffffffffffffff16612b7284610a75565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b9b5750612b9a81856126df565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bc482611754565b73ffffffffffffffffffffffffffffffffffffffff1614612c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1190614c57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614a97565b60405180910390fd5b612c95838383613277565b612ca0600082612a0d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cf0919061502e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d479190614f4d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612e0e9190614f4d565b905092915050565b6000612e336001612e25610c18565b612e0090919063ffffffff16565b9050612e3f828261338b565b8173ffffffffffffffffffffffffffffffffffffffff16817fade44088f434e3d43dc50ac93f56697611c5b05f5791bafbbb76daf5dcda1d6760405160405180910390a35050565b6000612e9282611754565b9050612ea081600084613277565b612eab600083612a0d565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612efb919061502e565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008183612fa69190614fd4565b905092915050565b612fb9848484612ba4565b612fc5848484846133a9565b613004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffb90614a17565b60405180910390fd5b50505050565b6060600c805461301990615118565b80601f016020809104026020016040519081016040528092919081815260200182805461304590615118565b80156130925780601f1061306757610100808354040283529160200191613092565b820191906000526020600020905b81548152906001019060200180831161307557829003601f168201915b5050505050905090565b606060008214156130e4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131f8565b600082905060005b600082146131165780806130ff9061517b565b915050600a8261310f9190614fa3565b91506130ec565b60008167ffffffffffffffff811115613132576131316152e0565b5b6040519080825280601f01601f1916602001820160405280156131645781602001600182028036833780820191505090505b5090505b600085146131f15760018261317d919061502e565b9150600a8561318c91906151c4565b60306131989190614f4d565b60f81b8183815181106131ae576131ad6152b1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131ea9190614fa3565b9450613168565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613270575061326f82613540565b5b9050919050565b613282838383613622565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c5576132c081613627565b613304565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613303576133028382613670565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561334757613342816137dd565b613386565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133855761338482826138ae565b5b5b505050565b6133a582826040518060200160405280600081525061392d565b5050565b60006133ca8473ffffffffffffffffffffffffffffffffffffffff16613988565b15613533578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133f3612a05565b8786866040518563ffffffff1660e01b815260040161341594939291906148a3565b602060405180830381600087803b15801561342f57600080fd5b505af192505050801561346057506040513d601f19601f8201168201806040525081019061345d9190614163565b60015b6134e3573d8060008114613490576040519150601f19603f3d011682016040523d82523d6000602084013e613495565b606091505b506000815114156134db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d290614a17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613538565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061360b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061361b575061361a8261399b565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161367d846118ba565b613687919061502e565b905060006007600084815260200190815260200160002054905081811461376c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137f1919061502e565b9050600060096000848152602001908152602001600020549050600060088381548110613821576138206152b1565b5b906000526020600020015490508060088381548110613843576138426152b1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061389257613891615282565b5b6001900381819060005260206000200160009055905550505050565b60006138b9836118ba565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6139378383613a05565b61394460008484846133a9565b613983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397a90614a17565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6c90614bd7565b60405180910390fd5b613a7e81612999565b15613abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab590614a57565b60405180910390fd5b613aca60008383613277565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b1a9190614f4d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613bdf90615118565b90600052602060002090601f016020900481019282613c015760008555613c48565b82601f10613c1a57805160ff1916838001178555613c48565b82800160010185558215613c48579182015b82811115613c47578251825591602001919060010190613c2c565b5b509050613c559190613c59565b5090565b5b80821115613c72576000816000905550600101613c5a565b5090565b6000613c89613c8484614e17565b614df2565b90508083825260208201905082856020860282011115613cac57613cab615314565b5b60005b85811015613cdc5781613cc28882613dda565b845260208401935060208301925050600181019050613caf565b5050509392505050565b6000613cf9613cf484614e43565b614df2565b90508083825260208201905082856020860282011115613d1c57613d1b615314565b5b60005b85811015613d4c5781613d328882613ee6565b845260208401935060208301925050600181019050613d1f565b5050509392505050565b6000613d69613d6484614e6f565b614df2565b905082815260208101848484011115613d8557613d84615319565b5b613d908482856150d6565b509392505050565b6000613dab613da684614ea0565b614df2565b905082815260208101848484011115613dc757613dc6615319565b5b613dd28482856150d6565b509392505050565b600081359050613de981615bcc565b92915050565b600082601f830112613e0457613e0361530f565b5b8135613e14848260208601613c76565b91505092915050565b600082601f830112613e3257613e3161530f565b5b8135613e42848260208601613ce6565b91505092915050565b600081359050613e5a81615be3565b92915050565b600081359050613e6f81615bfa565b92915050565b600081519050613e8481615bfa565b92915050565b600082601f830112613e9f57613e9e61530f565b5b8135613eaf848260208601613d56565b91505092915050565b600082601f830112613ecd57613ecc61530f565b5b8135613edd848260208601613d98565b91505092915050565b600081359050613ef581615c11565b92915050565b600060208284031215613f1157613f10615323565b5b6000613f1f84828501613dda565b91505092915050565b60008060408385031215613f3f57613f3e615323565b5b6000613f4d85828601613dda565b9250506020613f5e85828601613dda565b9150509250929050565b600080600060608486031215613f8157613f80615323565b5b6000613f8f86828701613dda565b9350506020613fa086828701613dda565b9250506040613fb186828701613ee6565b9150509250925092565b60008060008060808587031215613fd557613fd4615323565b5b6000613fe387828801613dda565b9450506020613ff487828801613dda565b935050604061400587828801613ee6565b925050606085013567ffffffffffffffff8111156140265761402561531e565b5b61403287828801613e8a565b91505092959194509250565b6000806040838503121561405557614054615323565b5b600061406385828601613dda565b925050602061407485828601613e4b565b9150509250929050565b6000806040838503121561409557614094615323565b5b60006140a385828601613dda565b92505060206140b485828601613ee6565b9150509250929050565b600080604083850312156140d5576140d4615323565b5b600083013567ffffffffffffffff8111156140f3576140f261531e565b5b6140ff85828601613def565b925050602083013567ffffffffffffffff8111156141205761411f61531e565b5b61412c85828601613e1d565b9150509250929050565b60006020828403121561414c5761414b615323565b5b600061415a84828501613e60565b91505092915050565b60006020828403121561417957614178615323565b5b600061418784828501613e75565b91505092915050565b6000602082840312156141a6576141a5615323565b5b600082013567ffffffffffffffff8111156141c4576141c361531e565b5b6141d084828501613eb8565b91505092915050565b6000602082840312156141ef576141ee615323565b5b60006141fd84828501613ee6565b91505092915050565b6000806040838503121561421d5761421c615323565b5b600061422b85828601613ee6565b925050602061423c85828601613ee6565b9150509250929050565b60006142528383614846565b60208301905092915050565b61426781615062565b82525050565b600061427882614ee1565b6142828185614f0f565b935061428d83614ed1565b8060005b838110156142be5781516142a58882614246565b97506142b083614f02565b925050600181019050614291565b5085935050505092915050565b6142d481615074565b82525050565b60006142e582614eec565b6142ef8185614f20565b93506142ff8185602086016150e5565b61430881615328565b840191505092915050565b600061431e82614ef7565b6143288185614f31565b93506143388185602086016150e5565b61434181615328565b840191505092915050565b600061435782614ef7565b6143618185614f42565b93506143718185602086016150e5565b80840191505092915050565b600061438a601483614f31565b915061439582615339565b602082019050919050565b60006143ad601483614f31565b91506143b882615362565b602082019050919050565b60006143d0601783614f31565b91506143db8261538b565b602082019050919050565b60006143f3602883614f31565b91506143fe826153b4565b604082019050919050565b6000614416602b83614f31565b915061442182615403565b604082019050919050565b6000614439603283614f31565b915061444482615452565b604082019050919050565b600061445c602683614f31565b9150614467826154a1565b604082019050919050565b600061447f601c83614f31565b915061448a826154f0565b602082019050919050565b60006144a2602a83614f31565b91506144ad82615519565b604082019050919050565b60006144c5602483614f31565b91506144d082615568565b604082019050919050565b60006144e8601983614f31565b91506144f3826155b7565b602082019050919050565b600061450b601783614f31565b9150614516826155e0565b602082019050919050565b600061452e602c83614f31565b915061453982615609565b604082019050919050565b6000614551603883614f31565b915061455c82615658565b604082019050919050565b6000614574601083614f31565b915061457f826156a7565b602082019050919050565b6000614597602483614f31565b91506145a2826156d0565b604082019050919050565b60006145ba602a83614f31565b91506145c58261571f565b604082019050919050565b60006145dd602983614f31565b91506145e88261576e565b604082019050919050565b6000614600601983614f31565b915061460b826157bd565b602082019050919050565b6000614623602083614f31565b915061462e826157e6565b602082019050919050565b6000614646602d83614f31565b91506146518261580f565b604082019050919050565b6000614669602c83614f31565b91506146748261585e565b604082019050919050565b600061468c602083614f31565b9150614697826158ad565b602082019050919050565b60006146af602983614f31565b91506146ba826158d6565b604082019050919050565b60006146d2602f83614f31565b91506146dd82615925565b604082019050919050565b60006146f5601383614f31565b915061470082615974565b602082019050919050565b6000614718602183614f31565b91506147238261599d565b604082019050919050565b600061473b601883614f31565b9150614746826159ec565b602082019050919050565b600061475e602483614f31565b915061476982615a15565b604082019050919050565b6000614781603183614f31565b915061478c82615a64565b604082019050919050565b60006147a4600883614f31565b91506147af82615ab3565b602082019050919050565b60006147c7600983614f31565b91506147d282615adc565b602082019050919050565b60006147ea602c83614f31565b91506147f582615b05565b604082019050919050565b600061480d601683614f31565b915061481882615b54565b602082019050919050565b6000614830602d83614f31565b915061483b82615b7d565b604082019050919050565b61484f816150cc565b82525050565b61485e816150cc565b82525050565b6000614870828561434c565b915061487c828461434c565b91508190509392505050565b600060208201905061489d600083018461425e565b92915050565b60006080820190506148b8600083018761425e565b6148c5602083018661425e565b6148d26040830185614855565b81810360608301526148e481846142da565b905095945050505050565b6000604082019050614904600083018561425e565b6149116020830184614855565b9392505050565b60006020820190508181036000830152614932818461426d565b905092915050565b600060208201905061494f60008301846142cb565b92915050565b6000602082019050818103600083015261496f8184614313565b905092915050565b600060208201905081810360008301526149908161437d565b9050919050565b600060208201905081810360008301526149b0816143a0565b9050919050565b600060208201905081810360008301526149d0816143c3565b9050919050565b600060208201905081810360008301526149f0816143e6565b9050919050565b60006020820190508181036000830152614a1081614409565b9050919050565b60006020820190508181036000830152614a308161442c565b9050919050565b60006020820190508181036000830152614a508161444f565b9050919050565b60006020820190508181036000830152614a7081614472565b9050919050565b60006020820190508181036000830152614a9081614495565b9050919050565b60006020820190508181036000830152614ab0816144b8565b9050919050565b60006020820190508181036000830152614ad0816144db565b9050919050565b60006020820190508181036000830152614af0816144fe565b9050919050565b60006020820190508181036000830152614b1081614521565b9050919050565b60006020820190508181036000830152614b3081614544565b9050919050565b60006020820190508181036000830152614b5081614567565b9050919050565b60006020820190508181036000830152614b708161458a565b9050919050565b60006020820190508181036000830152614b90816145ad565b9050919050565b60006020820190508181036000830152614bb0816145d0565b9050919050565b60006020820190508181036000830152614bd0816145f3565b9050919050565b60006020820190508181036000830152614bf081614616565b9050919050565b60006020820190508181036000830152614c1081614639565b9050919050565b60006020820190508181036000830152614c308161465c565b9050919050565b60006020820190508181036000830152614c508161467f565b9050919050565b60006020820190508181036000830152614c70816146a2565b9050919050565b60006020820190508181036000830152614c90816146c5565b9050919050565b60006020820190508181036000830152614cb0816146e8565b9050919050565b60006020820190508181036000830152614cd08161470b565b9050919050565b60006020820190508181036000830152614cf08161472e565b9050919050565b60006020820190508181036000830152614d1081614751565b9050919050565b60006020820190508181036000830152614d3081614774565b9050919050565b60006020820190508181036000830152614d5081614797565b9050919050565b60006020820190508181036000830152614d70816147ba565b9050919050565b60006020820190508181036000830152614d90816147dd565b9050919050565b60006020820190508181036000830152614db081614800565b9050919050565b60006020820190508181036000830152614dd081614823565b9050919050565b6000602082019050614dec6000830184614855565b92915050565b6000614dfc614e0d565b9050614e08828261514a565b919050565b6000604051905090565b600067ffffffffffffffff821115614e3257614e316152e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e5e57614e5d6152e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e8a57614e896152e0565b5b614e9382615328565b9050602081019050919050565b600067ffffffffffffffff821115614ebb57614eba6152e0565b5b614ec482615328565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f58826150cc565b9150614f63836150cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f9857614f976151f5565b5b828201905092915050565b6000614fae826150cc565b9150614fb9836150cc565b925082614fc957614fc8615224565b5b828204905092915050565b6000614fdf826150cc565b9150614fea836150cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615023576150226151f5565b5b828202905092915050565b6000615039826150cc565b9150615044836150cc565b925082821015615057576150566151f5565b5b828203905092915050565b600061506d826150ac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151035780820151818401526020810190506150e8565b83811115615112576000848401525b50505050565b6000600282049050600182168061513057607f821691505b6020821081141561514457615143615253565b5b50919050565b61515382615328565b810181811067ffffffffffffffff82111715615172576151716152e0565b5b80604052505050565b6000615186826150cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151b9576151b86151f5565b5b600182019050919050565b60006151cf826150cc565b91506151da836150cc565b9250826151ea576151e9615224565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53616c6520616c7265616479206163746976652e000000000000000000000000600082015250565b7f53616c65206861736e277420737461727465642e000000000000000000000000600082015250565b7f50726573616c6520616c7265616479206163746976652e000000000000000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f53414c452e000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f425559494e472e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c65206861736e277420737461727465642e000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c65206973206f7665722e00000000000000000000000000000000600082015250565b7f50726573616c65206973206f7665722c2063616e6e6f7420737461727420616760008201527f61696e2e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f546865206c656e6774682073686f756c642062652073616d6500000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f6e6c7920746865206f776e6572206f66204e46542063616e207472616e736660008201527f6572206f72206275726e20697400000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f2e0000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963652e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f5045525f57414c45542e00000000000000000000000000000000000000602082015250565b615bd581615062565b8114615be057600080fd5b50565b615bec81615074565b8114615bf757600080fd5b50565b615c0381615080565b8114615c0e57600080fd5b50565b615c1a816150cc565b8114615c2557600080fd5b5056fea264697066735822122011be078dbb64865c2199d32618b4a5dc14deb80fb08bb609e3010e817ba5045f64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c4672656e7a79204475636b73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024644000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d664c3375474a3377594d5a4e6e36686d46434c476a387a596d345373347067637278314c77556b6159634e702f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Frenzy Ducks
Arg [1] : symbol (string): FD
Arg [2] : baseURI_ (string): https://ipfs.io/ipfs/QmfL3uGJ3wYMZNn6hmFCLGj8zYm4Ss4pgcrx1LwUkaYcNp/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 4672656e7a79204475636b730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 4644000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d664c3375474a337759
Arg [9] : 4d5a4e6e36686d46434c476a387a596d345373347067637278314c77556b6159
Arg [10] : 634e702f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

173:6096:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1186:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2343:98:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3755:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3306:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;336:24:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1546:111:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4619:300:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;730:312:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1222:253:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3056:391:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4564:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5897:370;;;;;;;;;;;;;:::i;:::-;;4985:149:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5687:204:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5540:141;;;;;;;;;;;;;:::i;:::-;;1729:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5164:138:10;;;;;;;;;;;;;:::i;:::-;;5312:222;;;;;;;;;;;;;:::i;:::-;;4261:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;877:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2046:235:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4692:171:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;801:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;840:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1784:205:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:21;;;;;;;;;;;;;:::i;:::-;;3820:431:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2322:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1061:85:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:357:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4473:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2505:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;702:37:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1645:667;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4039:290:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;296:34:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4873:285;;;;;;;;;;;;;:::i;:::-;;5200:282:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;366:29:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2673:353:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4395:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:21;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1186:264:10;1302:4;1356:35;1341:50;;;:11;:50;;;;:102;;;;1407:36;1431:11;1407:23;:36::i;:::-;1341:102;1322:121;;1186:264;;;:::o;2343:98:6:-;2397:13;2429:5;2422:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:98;:::o;3755:217::-;3831:7;3858:16;3866:7;3858;:16::i;:::-;3850:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3941:15;:24;3957:7;3941:24;;;;;;;;;;;;;;;;;;;;;3934:31;;3755:217;;;:::o;3306:388::-;3386:13;3402:23;3417:7;3402:14;:23::i;:::-;3386:39;;3449:5;3443:11;;:2;:11;;;;3435:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3527:5;3511:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3536:37;3553:5;3560:12;:10;:12::i;:::-;3536:16;:37::i;:::-;3511:62;3503:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;3666:21;3675:2;3679:7;3666:8;:21::i;:::-;3376:318;3306:388;;:::o;336:24:10:-;;;;:::o;1546:111:7:-;1607:7;1633:10;:17;;;;1626:24;;1546:111;:::o;4619:300:6:-;4778:41;4797:12;:10;:12::i;:::-;4811:7;4778:18;:41::i;:::-;4770:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4884:28;4894:4;4900:2;4904:7;4884:9;:28::i;:::-;4619:300;;;:::o;730:312:5:-;839:16;857:21;894:28;925:10;894:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;956:9;:19;;;945:30;;1030:5;1010:9;:16;;;1002:24;;:5;:24;;;;:::i;:::-;1001:34;;;;:::i;:::-;985:50;;884:158;730:312;;;;;:::o;1222:253:7:-;1319:7;1354:23;1371:5;1354:16;:23::i;:::-;1346:5;:31;1338:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1442:12;:19;1455:5;1442:19;;;;;;;;;;;;;;;:26;1462:5;1442:26;;;;;;;;;;;;1435:33;;1222:253;;;;:::o;3056:391:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3156:1:10::1;3144:9;:13;3136:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3217:8;;3204:9;:21;;3196:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3320:15;;3288:28;3306:9;3288:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:47;;3280:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3373:6;3368:73;3389:9;3385:1;:13;3368:73;;;3419:11;3426:3;3419:6;:11::i;:::-;3400:3;;;;;:::i;:::-;;;;3368:73;;;;3056:391:::0;;:::o;4564:118::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4660:15:10::1;4642;:33;;;;4564:118:::0;:::o;5897:370::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5952:15:10::1;5970:21;5952:39;;6009:16;;;;;;;;;;;6001:34;;:57;6053:3;6048:1;6038:7;:11;;;;:::i;:::-;6037:19;;;;:::i;:::-;6001:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6076:16;;;;;;;;;;;6068:34;;:57;6120:3;6115:1;6105:7;:11;;;;:::i;:::-;6104:19;;;;:::i;:::-;6068:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6143:10;;;;;;;;;;;6135:28;;:53;6182:4;6176:2;6166:7;:12;;;;:::i;:::-;6165:21;;;;:::i;:::-;6135:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6206:18;;;;;;;;;;;6198:36;;:62;6254:4;6247:3;6237:7;:13;;;;:::i;:::-;6236:22;;;;:::i;:::-;6198:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5934:333;5897:370::o:0;4985:149:6:-;5088:39;5105:4;5111:2;5115:7;5088:39;;;;;;;;;;;;:16;:39::i;:::-;4985:149;;;:::o;5687:204:10:-;5735:13;5751:16;5759:7;5751;:16::i;:::-;5735:32;;5794:10;5785:19;;:5;:19;;;5777:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;5864:20;5876:7;5864:11;:20::i;:::-;5725:166;5687:204;:::o;5540:141::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5601:14:10::1;;;;;;;;;;;5593:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;5669:5;5652:14;;:22;;;;;;;;;;;;;;;;;;5540:141::o:0;1729:230:7:-;1804:7;1839:30;:28;:30::i;:::-;1831:5;:38;1823:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1935:10;1946:5;1935:17;;;;;;;;:::i;:::-;;;;;;;;;;1928:24;;1729:230;;;:::o;5164:138:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5222:11:10::1;;;;;;;;;;;5214:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;5290:5;5276:11;;:19;;;;;;;;;;;;;;;;;;5164:138::o:0;5312:222::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5374:11:10::1;;;;;;;;;;;5373:12;5365:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;5445:14;;;;;;;;;;;5444:15;5436:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;5523:4;5506:14;;:21;;;;;;;;;;;;;;;;;;5312:222::o:0;4261:90::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4340:4:10::1;4330:7;:14;;;;;;;;;;;;:::i;:::-;;4261:90:::0;:::o;877:31::-;;;;;;;;;;;;;:::o;2046:235:6:-;2118:7;2137:13;2153:7;:16;2161:7;2153:16;;;;;;;;;;;;;;;;;;;;;2137:32;;2204:1;2187:19;;:5;:19;;;;2179:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2269:5;2262:12;;;2046:235;;;:::o;4692:171:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4798:8:10::1;4787;:19;;;;4832:24;4816:13;:40;;;;4692:171:::0;;:::o;801:33::-;;;;;;;;;;;;;:::o;840:31::-;;;;;;;;;;;;;:::o;1784:205:6:-;1856:7;1900:1;1883:19;;:5;:19;;;;1875:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1966:9;:16;1976:5;1966:16;;;;;;;;;;;;;;;;1959:23;;1784:205;;;:::o;1693:145:21:-;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;3820:431:10:-;3879:13;3905:15;3923:17;3933:6;3923:9;:17::i;:::-;3905:35;;3968:1;3954:10;:15;3950:295;;;4003:1;3992:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3985:20;;;;;3950:295;4036:20;4070:10;4059:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4036:45;;4100:6;4095:113;4116:10;4112:1;:14;4095:113;;;4163:30;4183:6;4191:1;4163:19;:30::i;:::-;4151:6;4158:1;4151:9;;;;;;;;:::i;:::-;;;;;;;:42;;;;;4128:3;;;;;:::i;:::-;;;;4095:113;;;;4228:6;4221:13;;;;3820:431;;;;:::o;2322:724::-;2391:14;;;;;;;;;;;2383:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2452:11;;;;;;;;;;;2451:12;2443:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2514:1;2502:9;:13;2494:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2575:8;;2562:9;:21;;2554:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:13;;2658:21;2668:10;2658:9;:21::i;:::-;2646:9;:33;;;;:::i;:::-;:50;;2638:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2796:15;;2764:28;2782:9;2764:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:47;;2756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2855:20;2865:9;2855:5;;:9;;:20;;;;:::i;:::-;2842:9;:33;;:58;;;;2893:7;:5;:7::i;:::-;2879:21;;:10;:21;;;2842:58;2834:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2965:6;2960:80;2981:9;2977:1;:13;2960:80;;;3011:18;3018:10;3011:6;:18::i;:::-;2992:3;;;;;:::i;:::-;;;;2960:80;;;;2322:724;:::o;1061:85:21:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;3457:357:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3615:13:10::1;:20;3588:16;:23;:47;3579:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;3681:9;3676:132;3700:16;:23;3696:1;:27;3676:132;;;3747:50;3759:16;3776:1;3759:19;;;;;;;;:::i;:::-;;;;;;;;3780:13;3794:1;3780:16;;;;;;;;:::i;:::-;;;;;;;;3747:11;:50::i;:::-;3730:1;3725:6;;;;;:::i;:::-;;;3676:132;;;;3457:357:::0;;:::o;4473:81::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4541:6:10::1;4533:5;:14;;;;4473:81:::0;:::o;2505:102:6:-;2561:13;2593:7;2586:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2505:102;:::o;702:37:10:-;;;;:::o;1645:667::-;1711:11;;;;;;;;;;;1703:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1777:1;1765:9;:13;1757:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1838:8;;1825:9;:21;;1817:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1948:13;;1923:21;1933:10;1923:9;:21::i;:::-;1911:9;:33;;;;:::i;:::-;:50;;1903:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2061:15;;2029:28;2047:9;2029:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:47;;2021:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2121:20;2131:9;2121:5;;:9;;:20;;;;:::i;:::-;2108:9;:33;;:58;;;;2159:7;:5;:7::i;:::-;2145:21;;:10;:21;;;2108:58;2100:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2231:6;2226:80;2247:9;2243:1;:13;2226:80;;;2277:18;2284:10;2277:6;:18::i;:::-;2258:3;;;;;:::i;:::-;;;;2226:80;;;;1645:667;:::o;4039:290:6:-;4153:12;:10;:12::i;:::-;4141:24;;:8;:24;;;;4133:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4251:8;4206:18;:32;4225:12;:10;:12::i;:::-;4206:32;;;;;;;;;;;;;;;:42;4239:8;4206:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4303:8;4274:48;;4289:12;:10;:12::i;:::-;4274:48;;;4313:8;4274:48;;;;;;:::i;:::-;;;;;;;;4039:290;;:::o;296:34:10:-;;;;:::o;4873:285::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4932:11:10::1;;;;;;;;;;;4931:12;4923:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;5003:2;4987:13;:18;;;;5026:2;5015:8;:13;;;;5046:17;5038:5;:25;;;;5087:4;5073:11;;:18;;;;;;;;;;;;;;;;;;5118:5;5101:14;;:22;;;;;;;;;;;;;;;;;;5147:4;5133:11;;:18;;;;;;;;;;;;;;;;;;4873:285::o:0;5200:282:6:-;5331:41;5350:12;:10;:12::i;:::-;5364:7;5331:18;:41::i;:::-;5323:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5436:39;5450:4;5456:2;5460:7;5469:5;5436:13;:39::i;:::-;5200:282;;;;:::o;366:29:10:-;;;;:::o;2673:353:6:-;2746:13;2779:16;2787:7;2779;:16::i;:::-;2771:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2858:21;2882:10;:8;:10::i;:::-;2858:34;;2933:1;2915:7;2909:21;:25;:110;;;;;;;;;;;;;;;;;2973:7;2982:18;:7;:16;:18::i;:::-;2956:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2909:110;2902:117;;;2673:353;;;:::o;4395:162::-;4492:4;4515:18;:25;4534:5;4515:25;;;;;;;;;;;;;;;:35;4541:8;4515:35;;;;;;;;;;;;;;;;;;;;;;;;;4508:42;;4395:162;;;;:::o;1987:240:21:-;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;341:273:4:-;466:4;520:35;505:50;;;:11;:50;;;;:102;;;;571:36;595:11;571:23;:36::i;:::-;505:102;486:121;;341:273;;;:::o;6916:125:6:-;6981:4;7032:1;7004:30;;:7;:16;7012:7;7004:16;;;;;;;;;;;;;;;;;;;;;:30;;;;6997:37;;6916:125;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;10673:171:6:-;10774:2;10747:15;:24;10763:7;10747:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10829:7;10825:2;10791:46;;10800:23;10815:7;10800:14;:23::i;:::-;10791:46;;;;;;;;;;;;10673:171;;:::o;7199:344::-;7292:4;7316:16;7324:7;7316;:16::i;:::-;7308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7391:13;7407:23;7422:7;7407:14;:23::i;:::-;7391:39;;7459:5;7448:16;;:7;:16;;;:51;;;;7492:7;7468:31;;:20;7480:7;7468:11;:20::i;:::-;:31;;;7448:51;:87;;;;7503:32;7520:5;7527:7;7503:16;:32::i;:::-;7448:87;7440:96;;;7199:344;;;;:::o;10032:530::-;10156:4;10129:31;;:23;10144:7;10129:14;:23::i;:::-;:31;;;10121:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10238:1;10224:16;;:2;:16;;;;10216:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10292:39;10313:4;10319:2;10323:7;10292:20;:39::i;:::-;10393:29;10410:1;10414:7;10393:8;:29::i;:::-;10452:1;10433:9;:15;10443:4;10433:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10480:1;10463:9;:13;10473:2;10463:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10510:2;10491:7;:16;10499:7;10491:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10547:7;10543:2;10528:27;;10537:4;10528:27;;;;;;;;;;;;10032:530;;;:::o;2672:96:22:-;2730:7;2760:1;2756;:5;;;;:::i;:::-;2749:12;;2672:96;;;;:::o;1460:175:10:-;1508:14;1525:20;1543:1;1525:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;1508:37;;1555:25;1565:3;1570:9;1555;:25::i;:::-;1624:3;1595:33;;1613:9;1595:33;;;;;;;;;;1498:137;1460:175;:::o;9360:348:6:-;9419:13;9435:23;9450:7;9435:14;:23::i;:::-;9419:39;;9469:48;9490:5;9505:1;9509:7;9469:20;:48::i;:::-;9555:29;9572:1;9576:7;9555:8;:29::i;:::-;9615:1;9595:9;:16;9605:5;9595:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9633:7;:16;9641:7;9633:16;;;;;;;;;;;;9626:23;;;;;;;;;;;9693:7;9689:1;9665:36;;9674:5;9665:36;;;;;;;;;;;;9409:299;9360:348;:::o;3382:96:22:-;3440:7;3470:1;3466;:5;;;;:::i;:::-;3459:12;;3382:96;;;;:::o;6344:269:6:-;6457:28;6467:4;6473:2;6477:7;6457:9;:28::i;:::-;6503:48;6526:4;6532:2;6536:7;6545:5;6503:22;:48::i;:::-;6495:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6344:269;;;;:::o;4361:106:10:-;4421:13;4453:7;4446:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4361:106;:::o;271:703:23:-;327:13;553:1;544:5;:10;540:51;;;570:10;;;;;;;;;;;;;;;;;;;;;540:51;600:12;615:5;600:20;;630:14;654:75;669:1;661:4;:9;654:75;;686:8;;;;;:::i;:::-;;;;716:2;708:10;;;;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;787:150;803:1;794:5;:10;787:150;;830:1;820:11;;;;;:::i;:::-;;;896:2;888:5;:10;;;;:::i;:::-;875:2;:24;;;;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;909:234:7:-;1011:4;1049:35;1034:50;;;:11;:50;;;;:102;;;;1100:36;1124:11;1100:23;:36::i;:::-;1034:102;1027:109;;909:234;;;:::o;2555:542::-;2664:45;2691:4;2697:2;2701:7;2664:26;:45::i;:::-;2740:1;2724:18;;:4;:18;;;2720:183;;;2758:40;2790:7;2758:31;:40::i;:::-;2720:183;;;2827:2;2819:10;;:4;:10;;;2815:88;;2845:47;2878:4;2884:7;2845:32;:47::i;:::-;2815:88;2720:183;2930:1;2916:16;;:2;:16;;;2912:179;;;2948:45;2985:7;2948:36;:45::i;:::-;2912:179;;;3020:4;3014:10;;:2;:10;;;3010:81;;3040:40;3068:2;3072:7;3040:27;:40::i;:::-;3010:81;2912:179;2555:542;;;:::o;7873:108:6:-;7948:26;7958:2;7962:7;7948:26;;;;;;;;;;;;:9;:26::i;:::-;7873:108;;:::o;11397:824::-;11517:4;11541:15;:2;:13;;;:15::i;:::-;11537:678;;;11592:2;11576:36;;;11613:12;:10;:12::i;:::-;11627:4;11633:7;11642:5;11576:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11572:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11836:1;11819:6;:13;:18;11815:334;;;11861:60;;;;;;;;;;:::i;:::-;;;;;;;;11815:334;12101:6;12095:13;12086:6;12082:2;12078:15;12071:38;11572:591;11708:45;;;11698:55;;;:6;:55;;;;11691:62;;;;;11537:678;12200:4;12193:11;;11397:824;;;;;;;:::o;1437:288::-;1539:4;1577:25;1562:40;;;:11;:40;;;;:104;;;;1633:33;1618:48;;;:11;:48;;;;1562:104;:156;;;;1682:36;1706:11;1682:23;:36::i;:::-;1562:156;1555:163;;1437:288;;;:::o;12817:93::-;;;;:::o;3803:161:7:-;3906:10;:17;;;;3879:15;:24;3895:7;3879:24;;;;;;;;;;;:44;;;;3933:10;3949:7;3933:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3803:161;:::o;4581:970::-;4843:22;4893:1;4868:22;4885:4;4868:16;:22::i;:::-;:26;;;;:::i;:::-;4843:51;;4904:18;4925:17;:26;4943:7;4925:26;;;;;;;;;;;;4904:47;;5069:14;5055:10;:28;5051:323;;5099:19;5121:12;:18;5134:4;5121:18;;;;;;;;;;;;;;;:34;5140:14;5121:34;;;;;;;;;;;;5099:56;;5203:11;5170:12;:18;5183:4;5170:18;;;;;;;;;;;;;;;:30;5189:10;5170:30;;;;;;;;;;;:44;;;;5319:10;5286:17;:30;5304:11;5286:30;;;;;;;;;;;:43;;;;5085:289;5051:323;5467:17;:26;5485:7;5467:26;;;;;;;;;;;5460:33;;;5510:12;:18;5523:4;5510:18;;;;;;;;;;;;;;;:34;5529:14;5510:34;;;;;;;;;;;5503:41;;;4662:889;;4581:970;;:::o;5839:1061::-;6088:22;6133:1;6113:10;:17;;;;:21;;;;:::i;:::-;6088:46;;6144:18;6165:15;:24;6181:7;6165:24;;;;;;;;;;;;6144:45;;6511:19;6533:10;6544:14;6533:26;;;;;;;;:::i;:::-;;;;;;;;;;6511:48;;6595:11;6570:10;6581;6570:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6705:10;6674:15;:28;6690:11;6674:28;;;;;;;;;;;:41;;;;6843:15;:24;6859:7;6843:24;;;;;;;;;;;6836:31;;;6877:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5910:990;;;5839:1061;:::o;3391:217::-;3475:14;3492:20;3509:2;3492:16;:20::i;:::-;3475:37;;3549:7;3522:12;:16;3535:2;3522:16;;;;;;;;;;;;;;;:24;3539:6;3522:24;;;;;;;;;;;:34;;;;3595:6;3566:17;:26;3584:7;3566:26;;;;;;;;;;;:35;;;;3465:143;3391:217;;:::o;8202:247:6:-;8297:18;8303:2;8307:7;8297:5;:18::i;:::-;8333:54;8364:1;8368:2;8372:7;8381:5;8333:22;:54::i;:::-;8325:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;8202:247;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8771:372:6:-;8864:1;8850:16;;:2;:16;;;;8842:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8922:16;8930:7;8922;:16::i;:::-;8921:17;8913:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;8982:45;9011:1;9015:2;9019:7;8982:20;:45::i;:::-;9055:1;9038:9;:13;9048:2;9038:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9085:2;9066:7;:16;9074:7;9066:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9128:7;9124:2;9103:33;;9120:1;9103:33;;;;;;;;;;;;8771:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:24:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:894::-;8014:6;8022;8071:2;8059:9;8050:7;8046:23;8042:32;8039:119;;;8077:79;;:::i;:::-;8039:119;8225:1;8214:9;8210:17;8197:31;8255:18;8247:6;8244:30;8241:117;;;8277:79;;:::i;:::-;8241:117;8382:78;8452:7;8443:6;8432:9;8428:22;8382:78;:::i;:::-;8372:88;;8168:302;8537:2;8526:9;8522:18;8509:32;8568:18;8560:6;8557:30;8554:117;;;8590:79;;:::i;:::-;8554:117;8695:78;8765:7;8756:6;8745:9;8741:22;8695:78;:::i;:::-;8685:88;;8480:303;7896:894;;;;;:::o;8796:327::-;8854:6;8903:2;8891:9;8882:7;8878:23;8874:32;8871:119;;;8909:79;;:::i;:::-;8871:119;9029:1;9054:52;9098:7;9089:6;9078:9;9074:22;9054:52;:::i;:::-;9044:62;;9000:116;8796:327;;;;:::o;9129:349::-;9198:6;9247:2;9235:9;9226:7;9222:23;9218:32;9215:119;;;9253:79;;:::i;:::-;9215:119;9373:1;9398:63;9453:7;9444:6;9433:9;9429:22;9398:63;:::i;:::-;9388:73;;9344:127;9129:349;;;;:::o;9484:509::-;9553:6;9602:2;9590:9;9581:7;9577:23;9573:32;9570:119;;;9608:79;;:::i;:::-;9570:119;9756:1;9745:9;9741:17;9728:31;9786:18;9778:6;9775:30;9772:117;;;9808:79;;:::i;:::-;9772:117;9913:63;9968:7;9959:6;9948:9;9944:22;9913:63;:::i;:::-;9903:73;;9699:287;9484:509;;;;:::o;9999:329::-;10058:6;10107:2;10095:9;10086:7;10082:23;10078:32;10075:119;;;10113:79;;:::i;:::-;10075:119;10233:1;10258:53;10303:7;10294:6;10283:9;10279:22;10258:53;:::i;:::-;10248:63;;10204:117;9999:329;;;;:::o;10334:474::-;10402:6;10410;10459:2;10447:9;10438:7;10434:23;10430:32;10427:119;;;10465:79;;:::i;:::-;10427:119;10585:1;10610:53;10655:7;10646:6;10635:9;10631:22;10610:53;:::i;:::-;10600:63;;10556:117;10712:2;10738:53;10783:7;10774:6;10763:9;10759:22;10738:53;:::i;:::-;10728:63;;10683:118;10334:474;;;;;:::o;10814:179::-;10883:10;10904:46;10946:3;10938:6;10904:46;:::i;:::-;10982:4;10977:3;10973:14;10959:28;;10814:179;;;;:::o;10999:118::-;11086:24;11104:5;11086:24;:::i;:::-;11081:3;11074:37;10999:118;;:::o;11153:732::-;11272:3;11301:54;11349:5;11301:54;:::i;:::-;11371:86;11450:6;11445:3;11371:86;:::i;:::-;11364:93;;11481:56;11531:5;11481:56;:::i;:::-;11560:7;11591:1;11576:284;11601:6;11598:1;11595:13;11576:284;;;11677:6;11671:13;11704:63;11763:3;11748:13;11704:63;:::i;:::-;11697:70;;11790:60;11843:6;11790:60;:::i;:::-;11780:70;;11636:224;11623:1;11620;11616:9;11611:14;;11576:284;;;11580:14;11876:3;11869:10;;11277:608;;;11153:732;;;;:::o;11891:109::-;11972:21;11987:5;11972:21;:::i;:::-;11967:3;11960:34;11891:109;;:::o;12006:360::-;12092:3;12120:38;12152:5;12120:38;:::i;:::-;12174:70;12237:6;12232:3;12174:70;:::i;:::-;12167:77;;12253:52;12298:6;12293:3;12286:4;12279:5;12275:16;12253:52;:::i;:::-;12330:29;12352:6;12330:29;:::i;:::-;12325:3;12321:39;12314:46;;12096:270;12006:360;;;;:::o;12372:364::-;12460:3;12488:39;12521:5;12488:39;:::i;:::-;12543:71;12607:6;12602:3;12543:71;:::i;:::-;12536:78;;12623:52;12668:6;12663:3;12656:4;12649:5;12645:16;12623:52;:::i;:::-;12700:29;12722:6;12700:29;:::i;:::-;12695:3;12691:39;12684:46;;12464:272;12372:364;;;;:::o;12742:377::-;12848:3;12876:39;12909:5;12876:39;:::i;:::-;12931:89;13013:6;13008:3;12931:89;:::i;:::-;12924:96;;13029:52;13074:6;13069:3;13062:4;13055:5;13051:16;13029:52;:::i;:::-;13106:6;13101:3;13097:16;13090:23;;12852:267;12742:377;;;;:::o;13125:366::-;13267:3;13288:67;13352:2;13347:3;13288:67;:::i;:::-;13281:74;;13364:93;13453:3;13364:93;:::i;:::-;13482:2;13477:3;13473:12;13466:19;;13125:366;;;:::o;13497:::-;13639:3;13660:67;13724:2;13719:3;13660:67;:::i;:::-;13653:74;;13736:93;13825:3;13736:93;:::i;:::-;13854:2;13849:3;13845:12;13838:19;;13497:366;;;:::o;13869:::-;14011:3;14032:67;14096:2;14091:3;14032:67;:::i;:::-;14025:74;;14108:93;14197:3;14108:93;:::i;:::-;14226:2;14221:3;14217:12;14210:19;;13869:366;;;:::o;14241:::-;14383:3;14404:67;14468:2;14463:3;14404:67;:::i;:::-;14397:74;;14480:93;14569:3;14480:93;:::i;:::-;14598:2;14593:3;14589:12;14582:19;;14241:366;;;:::o;14613:::-;14755:3;14776:67;14840:2;14835:3;14776:67;:::i;:::-;14769:74;;14852:93;14941:3;14852:93;:::i;:::-;14970:2;14965:3;14961:12;14954:19;;14613:366;;;:::o;14985:::-;15127:3;15148:67;15212:2;15207:3;15148:67;:::i;:::-;15141:74;;15224:93;15313:3;15224:93;:::i;:::-;15342:2;15337:3;15333:12;15326:19;;14985:366;;;:::o;15357:::-;15499:3;15520:67;15584:2;15579:3;15520:67;:::i;:::-;15513:74;;15596:93;15685:3;15596:93;:::i;:::-;15714:2;15709:3;15705:12;15698:19;;15357:366;;;:::o;15729:::-;15871:3;15892:67;15956:2;15951:3;15892:67;:::i;:::-;15885:74;;15968:93;16057:3;15968:93;:::i;:::-;16086:2;16081:3;16077:12;16070:19;;15729:366;;;:::o;16101:::-;16243:3;16264:67;16328:2;16323:3;16264:67;:::i;:::-;16257:74;;16340:93;16429:3;16340:93;:::i;:::-;16458:2;16453:3;16449:12;16442:19;;16101:366;;;:::o;16473:::-;16615:3;16636:67;16700:2;16695:3;16636:67;:::i;:::-;16629:74;;16712:93;16801:3;16712:93;:::i;:::-;16830:2;16825:3;16821:12;16814:19;;16473:366;;;:::o;16845:::-;16987:3;17008:67;17072:2;17067:3;17008:67;:::i;:::-;17001:74;;17084:93;17173:3;17084:93;:::i;:::-;17202:2;17197:3;17193:12;17186:19;;16845:366;;;:::o;17217:::-;17359:3;17380:67;17444:2;17439:3;17380:67;:::i;:::-;17373:74;;17456:93;17545:3;17456:93;:::i;:::-;17574:2;17569:3;17565:12;17558:19;;17217:366;;;:::o;17589:::-;17731:3;17752:67;17816:2;17811:3;17752:67;:::i;:::-;17745:74;;17828:93;17917:3;17828:93;:::i;:::-;17946:2;17941:3;17937:12;17930:19;;17589:366;;;:::o;17961:::-;18103:3;18124:67;18188:2;18183:3;18124:67;:::i;:::-;18117:74;;18200:93;18289:3;18200:93;:::i;:::-;18318:2;18313:3;18309:12;18302:19;;17961:366;;;:::o;18333:::-;18475:3;18496:67;18560:2;18555:3;18496:67;:::i;:::-;18489:74;;18572:93;18661:3;18572:93;:::i;:::-;18690:2;18685:3;18681:12;18674:19;;18333:366;;;:::o;18705:::-;18847:3;18868:67;18932:2;18927:3;18868:67;:::i;:::-;18861:74;;18944:93;19033:3;18944:93;:::i;:::-;19062:2;19057:3;19053:12;19046:19;;18705:366;;;:::o;19077:::-;19219:3;19240:67;19304:2;19299:3;19240:67;:::i;:::-;19233:74;;19316:93;19405:3;19316:93;:::i;:::-;19434:2;19429:3;19425:12;19418:19;;19077:366;;;:::o;19449:::-;19591:3;19612:67;19676:2;19671:3;19612:67;:::i;:::-;19605:74;;19688:93;19777:3;19688:93;:::i;:::-;19806:2;19801:3;19797:12;19790:19;;19449:366;;;:::o;19821:::-;19963:3;19984:67;20048:2;20043:3;19984:67;:::i;:::-;19977:74;;20060:93;20149:3;20060:93;:::i;:::-;20178:2;20173:3;20169:12;20162:19;;19821:366;;;:::o;20193:::-;20335:3;20356:67;20420:2;20415:3;20356:67;:::i;:::-;20349:74;;20432:93;20521:3;20432:93;:::i;:::-;20550:2;20545:3;20541:12;20534:19;;20193:366;;;:::o;20565:::-;20707:3;20728:67;20792:2;20787:3;20728:67;:::i;:::-;20721:74;;20804:93;20893:3;20804:93;:::i;:::-;20922:2;20917:3;20913:12;20906:19;;20565:366;;;:::o;20937:::-;21079:3;21100:67;21164:2;21159:3;21100:67;:::i;:::-;21093:74;;21176:93;21265:3;21176:93;:::i;:::-;21294:2;21289:3;21285:12;21278:19;;20937:366;;;:::o;21309:::-;21451:3;21472:67;21536:2;21531:3;21472:67;:::i;:::-;21465:74;;21548:93;21637:3;21548:93;:::i;:::-;21666:2;21661:3;21657:12;21650:19;;21309:366;;;:::o;21681:::-;21823:3;21844:67;21908:2;21903:3;21844:67;:::i;:::-;21837:74;;21920:93;22009:3;21920:93;:::i;:::-;22038:2;22033:3;22029:12;22022:19;;21681:366;;;:::o;22053:::-;22195:3;22216:67;22280:2;22275:3;22216:67;:::i;:::-;22209:74;;22292:93;22381:3;22292:93;:::i;:::-;22410:2;22405:3;22401:12;22394:19;;22053:366;;;:::o;22425:::-;22567:3;22588:67;22652:2;22647:3;22588:67;:::i;:::-;22581:74;;22664:93;22753:3;22664:93;:::i;:::-;22782:2;22777:3;22773:12;22766:19;;22425:366;;;:::o;22797:::-;22939:3;22960:67;23024:2;23019:3;22960:67;:::i;:::-;22953:74;;23036:93;23125:3;23036:93;:::i;:::-;23154:2;23149:3;23145:12;23138:19;;22797:366;;;:::o;23169:::-;23311:3;23332:67;23396:2;23391:3;23332:67;:::i;:::-;23325:74;;23408:93;23497:3;23408:93;:::i;:::-;23526:2;23521:3;23517:12;23510:19;;23169:366;;;:::o;23541:::-;23683:3;23704:67;23768:2;23763:3;23704:67;:::i;:::-;23697:74;;23780:93;23869:3;23780:93;:::i;:::-;23898:2;23893:3;23889:12;23882:19;;23541:366;;;:::o;23913:::-;24055:3;24076:67;24140:2;24135:3;24076:67;:::i;:::-;24069:74;;24152:93;24241:3;24152:93;:::i;:::-;24270:2;24265:3;24261:12;24254:19;;23913:366;;;:::o;24285:365::-;24427:3;24448:66;24512:1;24507:3;24448:66;:::i;:::-;24441:73;;24523:93;24612:3;24523:93;:::i;:::-;24641:2;24636:3;24632:12;24625:19;;24285:365;;;:::o;24656:::-;24798:3;24819:66;24883:1;24878:3;24819:66;:::i;:::-;24812:73;;24894:93;24983:3;24894:93;:::i;:::-;25012:2;25007:3;25003:12;24996:19;;24656:365;;;:::o;25027:366::-;25169:3;25190:67;25254:2;25249:3;25190:67;:::i;:::-;25183:74;;25266:93;25355:3;25266:93;:::i;:::-;25384:2;25379:3;25375:12;25368:19;;25027:366;;;:::o;25399:::-;25541:3;25562:67;25626:2;25621:3;25562:67;:::i;:::-;25555:74;;25638:93;25727:3;25638:93;:::i;:::-;25756:2;25751:3;25747:12;25740:19;;25399:366;;;:::o;25771:::-;25913:3;25934:67;25998:2;25993:3;25934:67;:::i;:::-;25927:74;;26010:93;26099:3;26010:93;:::i;:::-;26128:2;26123:3;26119:12;26112:19;;25771:366;;;:::o;26143:108::-;26220:24;26238:5;26220:24;:::i;:::-;26215:3;26208:37;26143:108;;:::o;26257:118::-;26344:24;26362:5;26344:24;:::i;:::-;26339:3;26332:37;26257:118;;:::o;26381:435::-;26561:3;26583:95;26674:3;26665:6;26583:95;:::i;:::-;26576:102;;26695:95;26786:3;26777:6;26695:95;:::i;:::-;26688:102;;26807:3;26800:10;;26381:435;;;;;:::o;26822:222::-;26915:4;26953:2;26942:9;26938:18;26930:26;;26966:71;27034:1;27023:9;27019:17;27010:6;26966:71;:::i;:::-;26822:222;;;;:::o;27050:640::-;27245:4;27283:3;27272:9;27268:19;27260:27;;27297:71;27365:1;27354:9;27350:17;27341:6;27297:71;:::i;:::-;27378:72;27446:2;27435:9;27431:18;27422:6;27378:72;:::i;:::-;27460;27528:2;27517:9;27513:18;27504:6;27460:72;:::i;:::-;27579:9;27573:4;27569:20;27564:2;27553:9;27549:18;27542:48;27607:76;27678:4;27669:6;27607:76;:::i;:::-;27599:84;;27050:640;;;;;;;:::o;27696:332::-;27817:4;27855:2;27844:9;27840:18;27832:26;;27868:71;27936:1;27925:9;27921:17;27912:6;27868:71;:::i;:::-;27949:72;28017:2;28006:9;28002:18;27993:6;27949:72;:::i;:::-;27696:332;;;;;:::o;28034:373::-;28177:4;28215:2;28204:9;28200:18;28192:26;;28264:9;28258:4;28254:20;28250:1;28239:9;28235:17;28228:47;28292:108;28395:4;28386:6;28292:108;:::i;:::-;28284:116;;28034:373;;;;:::o;28413:210::-;28500:4;28538:2;28527:9;28523:18;28515:26;;28551:65;28613:1;28602:9;28598:17;28589:6;28551:65;:::i;:::-;28413:210;;;;:::o;28629:313::-;28742:4;28780:2;28769:9;28765:18;28757:26;;28829:9;28823:4;28819:20;28815:1;28804:9;28800:17;28793:47;28857:78;28930:4;28921:6;28857:78;:::i;:::-;28849:86;;28629:313;;;;:::o;28948:419::-;29114:4;29152:2;29141:9;29137:18;29129:26;;29201:9;29195:4;29191:20;29187:1;29176:9;29172:17;29165:47;29229:131;29355:4;29229:131;:::i;:::-;29221:139;;28948:419;;;:::o;29373:::-;29539:4;29577:2;29566:9;29562:18;29554:26;;29626:9;29620:4;29616:20;29612:1;29601:9;29597:17;29590:47;29654:131;29780:4;29654:131;:::i;:::-;29646:139;;29373:419;;;:::o;29798:::-;29964:4;30002:2;29991:9;29987:18;29979:26;;30051:9;30045:4;30041:20;30037:1;30026:9;30022:17;30015:47;30079:131;30205:4;30079:131;:::i;:::-;30071:139;;29798:419;;;:::o;30223:::-;30389:4;30427:2;30416:9;30412:18;30404:26;;30476:9;30470:4;30466:20;30462:1;30451:9;30447:17;30440:47;30504:131;30630:4;30504:131;:::i;:::-;30496:139;;30223:419;;;:::o;30648:::-;30814:4;30852:2;30841:9;30837:18;30829:26;;30901:9;30895:4;30891:20;30887:1;30876:9;30872:17;30865:47;30929:131;31055:4;30929:131;:::i;:::-;30921:139;;30648:419;;;:::o;31073:::-;31239:4;31277:2;31266:9;31262:18;31254:26;;31326:9;31320:4;31316:20;31312:1;31301:9;31297:17;31290:47;31354:131;31480:4;31354:131;:::i;:::-;31346:139;;31073:419;;;:::o;31498:::-;31664:4;31702:2;31691:9;31687:18;31679:26;;31751:9;31745:4;31741:20;31737:1;31726:9;31722:17;31715:47;31779:131;31905:4;31779:131;:::i;:::-;31771:139;;31498:419;;;:::o;31923:::-;32089:4;32127:2;32116:9;32112:18;32104:26;;32176:9;32170:4;32166:20;32162:1;32151:9;32147:17;32140:47;32204:131;32330:4;32204:131;:::i;:::-;32196:139;;31923:419;;;:::o;32348:::-;32514:4;32552:2;32541:9;32537:18;32529:26;;32601:9;32595:4;32591:20;32587:1;32576:9;32572:17;32565:47;32629:131;32755:4;32629:131;:::i;:::-;32621:139;;32348:419;;;:::o;32773:::-;32939:4;32977:2;32966:9;32962:18;32954:26;;33026:9;33020:4;33016:20;33012:1;33001:9;32997:17;32990:47;33054:131;33180:4;33054:131;:::i;:::-;33046:139;;32773:419;;;:::o;33198:::-;33364:4;33402:2;33391:9;33387:18;33379:26;;33451:9;33445:4;33441:20;33437:1;33426:9;33422:17;33415:47;33479:131;33605:4;33479:131;:::i;:::-;33471:139;;33198:419;;;:::o;33623:::-;33789:4;33827:2;33816:9;33812:18;33804:26;;33876:9;33870:4;33866:20;33862:1;33851:9;33847:17;33840:47;33904:131;34030:4;33904:131;:::i;:::-;33896:139;;33623:419;;;:::o;34048:::-;34214:4;34252:2;34241:9;34237:18;34229:26;;34301:9;34295:4;34291:20;34287:1;34276:9;34272:17;34265:47;34329:131;34455:4;34329:131;:::i;:::-;34321:139;;34048:419;;;:::o;34473:::-;34639:4;34677:2;34666:9;34662:18;34654:26;;34726:9;34720:4;34716:20;34712:1;34701:9;34697:17;34690:47;34754:131;34880:4;34754:131;:::i;:::-;34746:139;;34473:419;;;:::o;34898:::-;35064:4;35102:2;35091:9;35087:18;35079:26;;35151:9;35145:4;35141:20;35137:1;35126:9;35122:17;35115:47;35179:131;35305:4;35179:131;:::i;:::-;35171:139;;34898:419;;;:::o;35323:::-;35489:4;35527:2;35516:9;35512:18;35504:26;;35576:9;35570:4;35566:20;35562:1;35551:9;35547:17;35540:47;35604:131;35730:4;35604:131;:::i;:::-;35596:139;;35323:419;;;:::o;35748:::-;35914:4;35952:2;35941:9;35937:18;35929:26;;36001:9;35995:4;35991:20;35987:1;35976:9;35972:17;35965:47;36029:131;36155:4;36029:131;:::i;:::-;36021:139;;35748:419;;;:::o;36173:::-;36339:4;36377:2;36366:9;36362:18;36354:26;;36426:9;36420:4;36416:20;36412:1;36401:9;36397:17;36390:47;36454:131;36580:4;36454:131;:::i;:::-;36446:139;;36173:419;;;:::o;36598:::-;36764:4;36802:2;36791:9;36787:18;36779:26;;36851:9;36845:4;36841:20;36837:1;36826:9;36822:17;36815:47;36879:131;37005:4;36879:131;:::i;:::-;36871:139;;36598:419;;;:::o;37023:::-;37189:4;37227:2;37216:9;37212:18;37204:26;;37276:9;37270:4;37266:20;37262:1;37251:9;37247:17;37240:47;37304:131;37430:4;37304:131;:::i;:::-;37296:139;;37023:419;;;:::o;37448:::-;37614:4;37652:2;37641:9;37637:18;37629:26;;37701:9;37695:4;37691:20;37687:1;37676:9;37672:17;37665:47;37729:131;37855:4;37729:131;:::i;:::-;37721:139;;37448:419;;;:::o;37873:::-;38039:4;38077:2;38066:9;38062:18;38054:26;;38126:9;38120:4;38116:20;38112:1;38101:9;38097:17;38090:47;38154:131;38280:4;38154:131;:::i;:::-;38146:139;;37873:419;;;:::o;38298:::-;38464:4;38502:2;38491:9;38487:18;38479:26;;38551:9;38545:4;38541:20;38537:1;38526:9;38522:17;38515:47;38579:131;38705:4;38579:131;:::i;:::-;38571:139;;38298:419;;;:::o;38723:::-;38889:4;38927:2;38916:9;38912:18;38904:26;;38976:9;38970:4;38966:20;38962:1;38951:9;38947:17;38940:47;39004:131;39130:4;39004:131;:::i;:::-;38996:139;;38723:419;;;:::o;39148:::-;39314:4;39352:2;39341:9;39337:18;39329:26;;39401:9;39395:4;39391:20;39387:1;39376:9;39372:17;39365:47;39429:131;39555:4;39429:131;:::i;:::-;39421:139;;39148:419;;;:::o;39573:::-;39739:4;39777:2;39766:9;39762:18;39754:26;;39826:9;39820:4;39816:20;39812:1;39801:9;39797:17;39790:47;39854:131;39980:4;39854:131;:::i;:::-;39846:139;;39573:419;;;:::o;39998:::-;40164:4;40202:2;40191:9;40187:18;40179:26;;40251:9;40245:4;40241:20;40237:1;40226:9;40222:17;40215:47;40279:131;40405:4;40279:131;:::i;:::-;40271:139;;39998:419;;;:::o;40423:::-;40589:4;40627:2;40616:9;40612:18;40604:26;;40676:9;40670:4;40666:20;40662:1;40651:9;40647:17;40640:47;40704:131;40830:4;40704:131;:::i;:::-;40696:139;;40423:419;;;:::o;40848:::-;41014:4;41052:2;41041:9;41037:18;41029:26;;41101:9;41095:4;41091:20;41087:1;41076:9;41072:17;41065:47;41129:131;41255:4;41129:131;:::i;:::-;41121:139;;40848:419;;;:::o;41273:::-;41439:4;41477:2;41466:9;41462:18;41454:26;;41526:9;41520:4;41516:20;41512:1;41501:9;41497:17;41490:47;41554:131;41680:4;41554:131;:::i;:::-;41546:139;;41273:419;;;:::o;41698:::-;41864:4;41902:2;41891:9;41887:18;41879:26;;41951:9;41945:4;41941:20;41937:1;41926:9;41922:17;41915:47;41979:131;42105:4;41979:131;:::i;:::-;41971:139;;41698:419;;;:::o;42123:::-;42289:4;42327:2;42316:9;42312:18;42304:26;;42376:9;42370:4;42366:20;42362:1;42351:9;42347:17;42340:47;42404:131;42530:4;42404:131;:::i;:::-;42396:139;;42123:419;;;:::o;42548:::-;42714:4;42752:2;42741:9;42737:18;42729:26;;42801:9;42795:4;42791:20;42787:1;42776:9;42772:17;42765:47;42829:131;42955:4;42829:131;:::i;:::-;42821:139;;42548:419;;;:::o;42973:::-;43139:4;43177:2;43166:9;43162:18;43154:26;;43226:9;43220:4;43216:20;43212:1;43201:9;43197:17;43190:47;43254:131;43380:4;43254:131;:::i;:::-;43246:139;;42973:419;;;:::o;43398:::-;43564:4;43602:2;43591:9;43587:18;43579:26;;43651:9;43645:4;43641:20;43637:1;43626:9;43622:17;43615:47;43679:131;43805:4;43679:131;:::i;:::-;43671:139;;43398:419;;;:::o;43823:222::-;43916:4;43954:2;43943:9;43939:18;43931:26;;43967:71;44035:1;44024:9;44020:17;44011:6;43967:71;:::i;:::-;43823:222;;;;:::o;44051:129::-;44085:6;44112:20;;:::i;:::-;44102:30;;44141:33;44169:4;44161:6;44141:33;:::i;:::-;44051:129;;;:::o;44186:75::-;44219:6;44252:2;44246:9;44236:19;;44186:75;:::o;44267:311::-;44344:4;44434:18;44426:6;44423:30;44420:56;;;44456:18;;:::i;:::-;44420:56;44506:4;44498:6;44494:17;44486:25;;44566:4;44560;44556:15;44548:23;;44267:311;;;:::o;44584:::-;44661:4;44751:18;44743:6;44740:30;44737:56;;;44773:18;;:::i;:::-;44737:56;44823:4;44815:6;44811:17;44803:25;;44883:4;44877;44873:15;44865:23;;44584:311;;;:::o;44901:307::-;44962:4;45052:18;45044:6;45041:30;45038:56;;;45074:18;;:::i;:::-;45038:56;45112:29;45134:6;45112:29;:::i;:::-;45104:37;;45196:4;45190;45186:15;45178:23;;44901:307;;;:::o;45214:308::-;45276:4;45366:18;45358:6;45355:30;45352:56;;;45388:18;;:::i;:::-;45352:56;45426:29;45448:6;45426:29;:::i;:::-;45418:37;;45510:4;45504;45500:15;45492:23;;45214:308;;;:::o;45528:132::-;45595:4;45618:3;45610:11;;45648:4;45643:3;45639:14;45631:22;;45528:132;;;:::o;45666:114::-;45733:6;45767:5;45761:12;45751:22;;45666:114;;;:::o;45786:98::-;45837:6;45871:5;45865:12;45855:22;;45786:98;;;:::o;45890:99::-;45942:6;45976:5;45970:12;45960:22;;45890:99;;;:::o;45995:113::-;46065:4;46097;46092:3;46088:14;46080:22;;45995:113;;;:::o;46114:184::-;46213:11;46247:6;46242:3;46235:19;46287:4;46282:3;46278:14;46263:29;;46114:184;;;;:::o;46304:168::-;46387:11;46421:6;46416:3;46409:19;46461:4;46456:3;46452:14;46437:29;;46304:168;;;;:::o;46478:169::-;46562:11;46596:6;46591:3;46584:19;46636:4;46631:3;46627:14;46612:29;;46478:169;;;;:::o;46653:148::-;46755:11;46792:3;46777:18;;46653:148;;;;:::o;46807:305::-;46847:3;46866:20;46884:1;46866:20;:::i;:::-;46861:25;;46900:20;46918:1;46900:20;:::i;:::-;46895:25;;47054:1;46986:66;46982:74;46979:1;46976:81;46973:107;;;47060:18;;:::i;:::-;46973:107;47104:1;47101;47097:9;47090:16;;46807:305;;;;:::o;47118:185::-;47158:1;47175:20;47193:1;47175:20;:::i;:::-;47170:25;;47209:20;47227:1;47209:20;:::i;:::-;47204:25;;47248:1;47238:35;;47253:18;;:::i;:::-;47238:35;47295:1;47292;47288:9;47283:14;;47118:185;;;;:::o;47309:348::-;47349:7;47372:20;47390:1;47372:20;:::i;:::-;47367:25;;47406:20;47424:1;47406:20;:::i;:::-;47401:25;;47594:1;47526:66;47522:74;47519:1;47516:81;47511:1;47504:9;47497:17;47493:105;47490:131;;;47601:18;;:::i;:::-;47490:131;47649:1;47646;47642:9;47631:20;;47309:348;;;;:::o;47663:191::-;47703:4;47723:20;47741:1;47723:20;:::i;:::-;47718:25;;47757:20;47775:1;47757:20;:::i;:::-;47752:25;;47796:1;47793;47790:8;47787:34;;;47801:18;;:::i;:::-;47787:34;47846:1;47843;47839:9;47831:17;;47663:191;;;;:::o;47860:96::-;47897:7;47926:24;47944:5;47926:24;:::i;:::-;47915:35;;47860:96;;;:::o;47962:90::-;47996:7;48039:5;48032:13;48025:21;48014:32;;47962:90;;;:::o;48058:149::-;48094:7;48134:66;48127:5;48123:78;48112:89;;48058:149;;;:::o;48213:126::-;48250:7;48290:42;48283:5;48279:54;48268:65;;48213:126;;;:::o;48345:77::-;48382:7;48411:5;48400:16;;48345:77;;;:::o;48428:154::-;48512:6;48507:3;48502;48489:30;48574:1;48565:6;48560:3;48556:16;48549:27;48428:154;;;:::o;48588:307::-;48656:1;48666:113;48680:6;48677:1;48674:13;48666:113;;;48765:1;48760:3;48756:11;48750:18;48746:1;48741:3;48737:11;48730:39;48702:2;48699:1;48695:10;48690:15;;48666:113;;;48797:6;48794:1;48791:13;48788:101;;;48877:1;48868:6;48863:3;48859:16;48852:27;48788:101;48637:258;48588:307;;;:::o;48901:320::-;48945:6;48982:1;48976:4;48972:12;48962:22;;49029:1;49023:4;49019:12;49050:18;49040:81;;49106:4;49098:6;49094:17;49084:27;;49040:81;49168:2;49160:6;49157:14;49137:18;49134:38;49131:84;;;49187:18;;:::i;:::-;49131:84;48952:269;48901:320;;;:::o;49227:281::-;49310:27;49332:4;49310:27;:::i;:::-;49302:6;49298:40;49440:6;49428:10;49425:22;49404:18;49392:10;49389:34;49386:62;49383:88;;;49451:18;;:::i;:::-;49383:88;49491:10;49487:2;49480:22;49270:238;49227:281;;:::o;49514:233::-;49553:3;49576:24;49594:5;49576:24;:::i;:::-;49567:33;;49622:66;49615:5;49612:77;49609:103;;;49692:18;;:::i;:::-;49609:103;49739:1;49732:5;49728:13;49721:20;;49514:233;;;:::o;49753:176::-;49785:1;49802:20;49820:1;49802:20;:::i;:::-;49797:25;;49836:20;49854:1;49836:20;:::i;:::-;49831:25;;49875:1;49865:35;;49880:18;;:::i;:::-;49865:35;49921:1;49918;49914:9;49909:14;;49753:176;;;;:::o;49935:180::-;49983:77;49980:1;49973:88;50080:4;50077:1;50070:15;50104:4;50101:1;50094:15;50121:180;50169:77;50166:1;50159:88;50266:4;50263:1;50256:15;50290:4;50287:1;50280:15;50307:180;50355:77;50352:1;50345:88;50452:4;50449:1;50442:15;50476:4;50473:1;50466:15;50493:180;50541:77;50538:1;50531:88;50638:4;50635:1;50628:15;50662:4;50659:1;50652:15;50679:180;50727:77;50724:1;50717:88;50824:4;50821:1;50814:15;50848:4;50845:1;50838:15;50865:180;50913:77;50910:1;50903:88;51010:4;51007:1;51000:15;51034:4;51031:1;51024:15;51051:117;51160:1;51157;51150:12;51174:117;51283:1;51280;51273:12;51297:117;51406:1;51403;51396:12;51420:117;51529:1;51526;51519:12;51543:117;51652:1;51649;51642:12;51666:102;51707:6;51758:2;51754:7;51749:2;51742:5;51738:14;51734:28;51724:38;;51666:102;;;:::o;51774:170::-;51914:22;51910:1;51902:6;51898:14;51891:46;51774:170;:::o;51950:::-;52090:22;52086:1;52078:6;52074:14;52067:46;51950:170;:::o;52126:173::-;52266:25;52262:1;52254:6;52250:14;52243:49;52126:173;:::o;52305:227::-;52445:34;52441:1;52433:6;52429:14;52422:58;52514:10;52509:2;52501:6;52497:15;52490:35;52305:227;:::o;52538:230::-;52678:34;52674:1;52666:6;52662:14;52655:58;52747:13;52742:2;52734:6;52730:15;52723:38;52538:230;:::o;52774:237::-;52914:34;52910:1;52902:6;52898:14;52891:58;52983:20;52978:2;52970:6;52966:15;52959:45;52774:237;:::o;53017:225::-;53157:34;53153:1;53145:6;53141:14;53134:58;53226:8;53221:2;53213:6;53209:15;53202:33;53017:225;:::o;53248:178::-;53388:30;53384:1;53376:6;53372:14;53365:54;53248:178;:::o;53432:229::-;53572:34;53568:1;53560:6;53556:14;53549:58;53641:12;53636:2;53628:6;53624:15;53617:37;53432:229;:::o;53667:223::-;53807:34;53803:1;53795:6;53791:14;53784:58;53876:6;53871:2;53863:6;53859:15;53852:31;53667:223;:::o;53896:175::-;54036:27;54032:1;54024:6;54020:14;54013:51;53896:175;:::o;54077:173::-;54217:25;54213:1;54205:6;54201:14;54194:49;54077:173;:::o;54256:231::-;54396:34;54392:1;54384:6;54380:14;54373:58;54465:14;54460:2;54452:6;54448:15;54441:39;54256:231;:::o;54493:243::-;54633:34;54629:1;54621:6;54617:14;54610:58;54702:26;54697:2;54689:6;54685:15;54678:51;54493:243;:::o;54742:166::-;54882:18;54878:1;54870:6;54866:14;54859:42;54742:166;:::o;54914:223::-;55054:34;55050:1;55042:6;55038:14;55031:58;55123:6;55118:2;55110:6;55106:15;55099:31;54914:223;:::o;55143:229::-;55283:34;55279:1;55271:6;55267:14;55260:58;55352:12;55347:2;55339:6;55335:15;55328:37;55143:229;:::o;55378:228::-;55518:34;55514:1;55506:6;55502:14;55495:58;55587:11;55582:2;55574:6;55570:15;55563:36;55378:228;:::o;55612:175::-;55752:27;55748:1;55740:6;55736:14;55729:51;55612:175;:::o;55793:182::-;55933:34;55929:1;55921:6;55917:14;55910:58;55793:182;:::o;55981:232::-;56121:34;56117:1;56109:6;56105:14;56098:58;56190:15;56185:2;56177:6;56173:15;56166:40;55981:232;:::o;56219:231::-;56359:34;56355:1;56347:6;56343:14;56336:58;56428:14;56423:2;56415:6;56411:15;56404:39;56219:231;:::o;56456:182::-;56596:34;56592:1;56584:6;56580:14;56573:58;56456:182;:::o;56644:228::-;56784:34;56780:1;56772:6;56768:14;56761:58;56853:11;56848:2;56840:6;56836:15;56829:36;56644:228;:::o;56878:234::-;57018:34;57014:1;57006:6;57002:14;56995:58;57087:17;57082:2;57074:6;57070:15;57063:42;56878:234;:::o;57118:169::-;57258:21;57254:1;57246:6;57242:14;57235:45;57118:169;:::o;57293:220::-;57433:34;57429:1;57421:6;57417:14;57410:58;57502:3;57497:2;57489:6;57485:15;57478:28;57293:220;:::o;57519:174::-;57659:26;57655:1;57647:6;57643:14;57636:50;57519:174;:::o;57699:223::-;57839:34;57835:1;57827:6;57823:14;57816:58;57908:6;57903:2;57895:6;57891:15;57884:31;57699:223;:::o;57928:236::-;58068:34;58064:1;58056:6;58052:14;58045:58;58137:19;58132:2;58124:6;58120:15;58113:44;57928:236;:::o;58170:158::-;58310:10;58306:1;58298:6;58294:14;58287:34;58170:158;:::o;58334:159::-;58474:11;58470:1;58462:6;58458:14;58451:35;58334:159;:::o;58499:231::-;58639:34;58635:1;58627:6;58623:14;58616:58;58708:14;58703:2;58695:6;58691:15;58684:39;58499:231;:::o;58736:172::-;58876:24;58872:1;58864:6;58860:14;58853:48;58736:172;:::o;58914:232::-;59054:34;59050:1;59042:6;59038:14;59031:58;59123:15;59118:2;59110:6;59106:15;59099:40;58914:232;:::o;59152:122::-;59225:24;59243:5;59225:24;:::i;:::-;59218:5;59215:35;59205:63;;59264:1;59261;59254:12;59205:63;59152:122;:::o;59280:116::-;59350:21;59365:5;59350:21;:::i;:::-;59343:5;59340:32;59330:60;;59386:1;59383;59376:12;59330:60;59280:116;:::o;59402:120::-;59474:23;59491:5;59474:23;:::i;:::-;59467:5;59464:34;59454:62;;59512:1;59509;59502:12;59454:62;59402:120;:::o;59528:122::-;59601:24;59619:5;59601:24;:::i;:::-;59594:5;59591:35;59581:63;;59640:1;59637;59630:12;59581:63;59528:122;:::o

Swarm Source

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