ETH Price: $2,492.69 (-0.79%)

Token

Devour (DEVOUR)
 

Overview

Max Total Supply

248 DEVOUR

Holders

100

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DEVOUR
0x8124adB89D059ae33A8c249B60b168727772B4f0
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:
Devour

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 15: Devour.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./MerkleProof.sol";


contract Devour is ERC721Enumerable, Ownable, ReentrancyGuard {
  // Manage minting detail and permission
  bytes32 public merkleRoot;
  uint256 public constant maxShardSupply = 600;
  uint256 public mintPrice = 0.1 ether;
  uint256 public publicMintLimit = 10;
  uint256 public wlMintLimit = 5;
  bool public publicMintEnabled = false;
  bool public whitelistMintEnabled = false;
  mapping (address => uint256) public whitelistMinted;

  // Manage addresses and URI related information
  address public oreClaimAddress;
  address public assemblerAddress;
  string public contractURI;
  string public baseTokenURI;

  // Manage balance and types information
  mapping (address => uint256) public shardBalances;
  mapping (uint256 => uint256) public devourTypes;
  uint256 public totalShardMinted;
  uint256 public totalAssembled;

  // Manage ore related information
  uint256 public orePerShard = 75;
  uint256 public orePerAssembled = 500;
  uint256 public initialOreClaimTimestamp;
  mapping (address => uint256) public lastOreClaimWeekByAddress;
  mapping (address => uint256) private _lastClaimableOreByAddress;

  constructor (
    bytes32 _merkleRoot,
    address _oreClaim,
    string memory _initialContractURI,
    string memory _initialBaseTokenURI
  ) ERC721("Devour", "DEVOUR") {
    merkleRoot = _merkleRoot;
    oreClaimAddress = _oreClaim;
    contractURI = _initialContractURI;
    baseTokenURI = _initialBaseTokenURI;
  }

  function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setAssemblerAddress(address _assembler) external onlyOwner {
    assemblerAddress = _assembler;
  }

  function setMintPrice(uint256 _price) external onlyOwner {
    mintPrice = _price;
  }

  function setWhitelistMintLimit(uint256 _limit) external onlyOwner {
    wlMintLimit = _limit;
  }

  function setPublicMintLimit(uint256 _limit) external onlyOwner {
    publicMintLimit = _limit;
  }

  function setPublicMintEnabled(bool _enabled) external onlyOwner {
    publicMintEnabled = _enabled;
  }

  function setWhitelistMintEnabled(bool _enabled) external onlyOwner {
    whitelistMintEnabled = _enabled;
  }

  function setContractURI(string memory _contractURI) external onlyOwner {
    contractURI = _contractURI;
  }

  function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner {
    baseTokenURI = _baseTokenURI;
  }

  function tokenURI(uint256 _tokenId) override public view returns (string memory) {
    require(_exists(_tokenId), "URI query for nonexistent token");

    // Return the correct metadata for assembled tokens
    if (_tokenId > maxShardSupply) {
      return string(abi.encodePacked(baseTokenURI, Strings.toString(devourTypes[_tokenId] + 1000)));  
    }

    // Otherwise return the shard metadata
    return string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId)));
  }

  function reserveMint(uint256 _count) external onlyOwner {
    uint256 currentSupply = totalShardMinted;
    require(currentSupply + _count <= maxShardSupply, "Invalid mint count");

    for (uint256 i = 0; i < _count; i++) {
      _safeMint(msg.sender, currentSupply + i + 1);
    }

    shardBalances[msg.sender] += _count;
    totalShardMinted += _count;
  }

  function whitelistMint(bytes32[] calldata _merkleProof) external payable nonReentrant {
    bytes32 node = keccak256(abi.encodePacked(msg.sender));
    uint256 currentSupply = totalShardMinted;
    uint256 price = mintPrice;

    require(whitelistMintEnabled, "Whitelist mint is closed");
    require(currentSupply < maxShardSupply, "Sold out!");
    require(MerkleProof.verify(_merkleProof, merkleRoot, node), "Not whitelisted");
    require(whitelistMinted[msg.sender] < wlMintLimit, "Whitelist mint fully claimed");
    require(msg.value >= price, "Not enough funds");

    uint256 count = msg.value / price;
    uint256 remaining = maxShardSupply - currentSupply;
    uint256 remainingWL = wlMintLimit - whitelistMinted[msg.sender];
    remaining = (remaining > remainingWL ? remainingWL : remaining);
    count = (count > remaining ? remaining : count);
    whitelistMinted[msg.sender] += count;

    for (uint256 i = 0; i < count; i++) {
      _safeMint(msg.sender, currentSupply + i + 1);
    }

    shardBalances[msg.sender] += count;
    totalShardMinted += count;

    uint256 refund = msg.value - (count * price);
    if (refund > 0) {
      payable(msg.sender).transfer(refund);
    }
  }

  function publicMint() external payable nonReentrant {
    uint256 currentSupply = totalShardMinted;
    uint256 price = mintPrice;

    require(publicMintEnabled, "Public mint is closed");
    require(currentSupply < maxShardSupply, "Sold out!");
    require(msg.value >= price, "Not enough funds");

    uint256 count = msg.value / price;
    uint256 remaining = maxShardSupply - currentSupply;
    count = (count > publicMintLimit ? publicMintLimit : count);
    count = (count > remaining ? remaining : count);

    for (uint256 i = 0; i < count; i++) {
      _safeMint(msg.sender, currentSupply + i + 1);
    }

    shardBalances[msg.sender] += count;
    totalShardMinted += count;

    uint256 refund = msg.value - (count * price);
    if (refund > 0) {
      payable(msg.sender).transfer(refund);
    }
  }

  function assemble(uint256 devourType, uint256[] calldata _tokenIds) external nonReentrant {
    require(assemblerAddress != address(0), "Assembler not set");
    require(msg.sender == assemblerAddress, "Invalid access");
    require(_tokenIds.length == 5, "Invalid token ids");

    address owner = ownerOf(_tokenIds[0]);

    // Make sure to still reward the user with any unclaimed ore before burning
    _updatePendingOre(owner, address(0));

    for (uint256 i = 0; i < _tokenIds.length; i++) {
      _burn(_tokenIds[i]);
    }

    shardBalances[owner] -= 5;
    totalAssembled++;

    // Calculate the next tokenId for the new assembled token and mint it
    uint256 nextAssembledId = maxShardSupply + totalAssembled;
    devourTypes[nextAssembledId] = devourType;
    _safeMint(owner, nextAssembledId);

    // Immediately add the weekly claimable ore for the assembled piece to prevent "lost reward"
    _lastClaimableOreByAddress[owner] += orePerAssembled;
  }

  // Helper method to return both shards and assembled pieces owned by the specified owner/account
  function tokenIdsByOwner(address _owner) external view returns (uint256[] memory, uint256[] memory) {
    uint256 totalOwned = balanceOf(_owner);
    uint256 shardOwned = shardBalances[_owner];
    uint256 assembledOwned = totalOwned - shardOwned;
    uint256[] memory shardIds = new uint256[](shardOwned);
    uint256[] memory assembledIds = new uint256[](assembledOwned);

    uint256 shardIdx = 0;
    uint256 assembledIdx = 0;
    for (uint256 i = 0; i < totalOwned; i++) {
      uint256 tokenId = tokenOfOwnerByIndex(_owner, i);
      if (tokenId <= maxShardSupply) {
        shardIds[shardIdx++] = tokenId;
      } else {
        assembledIds[assembledIdx++] = tokenId;
      }
    }

    return (shardIds, assembledIds);
  }

  function _getOreClaimWeek() internal view returns (uint256) {
    uint256 initial = initialOreClaimTimestamp;
    uint256 timestamp = block.timestamp;

    // If ore claiming has not been specified, or if it's in the future, return 0
    if (initial == 0 || timestamp < initial) {
      return 0;
    }

    // Week starts right within the the next 7 days of the initial claim timestamp
    return (timestamp - initial) / 1 weeks + 1;
  }

  function _getPendingClaimable(address _owner) internal view returns (uint256) {
    uint256 week = _getOreClaimWeek();
    uint256 lastClaimedWeek = lastOreClaimWeekByAddress[_owner];

    if (week > lastClaimedWeek) {
      // Calculate the total pending claimable ore based on the shard and assembled token counts
      uint256 elapsed = (week - lastClaimedWeek);
      uint256 shardBalance = shardBalances[_owner];
      uint256 assembledBalance = balanceOf(_owner) - shardBalance;

      return (shardBalance * elapsed * orePerShard) + (assembledBalance * elapsed * orePerAssembled);
    }

    return 0;
  }

  function _updatePendingOre(address _from, address _to) internal {
    uint256 week = _getOreClaimWeek();

    if (_from != address(0)) {
      uint256 pendingOre = _getPendingClaimable(_from);
      if (pendingOre > 0) {
        _lastClaimableOreByAddress[_from] += pendingOre;
        lastOreClaimWeekByAddress[_from] = week;
      }
    }
    if (_to != address(0)) {
      uint256 pendingOre = _getPendingClaimable(_to);
      if (pendingOre > 0) {
        _lastClaimableOreByAddress[_to] += pendingOre;
        lastOreClaimWeekByAddress[_to] = week;
      }
    }
  }

  function _updateShardBalance(address _from, address _to) internal {
    if (_from != address(0)) {
      shardBalances[_from]--;
    }
    if (_to != address(0)) {
      shardBalances[_to]++;
    }
  }

  function setInitialOreClaimTimestamp(uint256 _timestamp) external onlyOwner {
    initialOreClaimTimestamp = _timestamp;
  }

  function claimOre(address _owner) external nonReentrant returns (uint256) {
    require(msg.sender == oreClaimAddress, "Invalid access");
    uint256 totalOre = _lastClaimableOreByAddress[_owner] + _getPendingClaimable(_owner);

    // Update the tracker states only if needed
    if (totalOre > 0) {
      lastOreClaimWeekByAddress[_owner] = _getOreClaimWeek();
      _lastClaimableOreByAddress[_owner] = 0;
    }

    return totalOre;
  }

  function transferFrom(address _from, address _to, uint256 _tokenId) public override {
    _updatePendingOre(_from, _to);
    if (_tokenId <= maxShardSupply) {
      _updateShardBalance(_from, _to);
    }

    ERC721.transferFrom(_from, _to, _tokenId);
  }

  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public override {
    _updatePendingOre(_from, _to);
    if (_tokenId <= maxShardSupply) {
      _updateShardBalance(_from, _to);
    }

    ERC721.safeTransferFrom(_from, _to, _tokenId);
  }

  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public override {
    _updatePendingOre(_from, _to);
    if (_tokenId <= maxShardSupply) {
      _updateShardBalance(_from, _to);
    }

    ERC721.safeTransferFrom(_from, _to, _tokenId, _data);
  }

  function withdraw() external onlyOwner {
    payable(msg.sender).transfer(address(this).balance);
  }
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 2 of 15: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

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 5 of 15: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. 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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    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` and `to` are never both zero.
     *
     * 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 6 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

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 7 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

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 8 of 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

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 9 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

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 10 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

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 11 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

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 12 of 15: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

File 13 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 14 of 15: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"address","name":"_oreClaim","type":"address"},{"internalType":"string","name":"_initialContractURI","type":"string"},{"internalType":"string","name":"_initialBaseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"devourType","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"assemble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assemblerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"claimOre","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"devourTypes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialOreClaimTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"","type":"address"}],"name":"lastOreClaimWeekByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxShardSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oreClaimAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orePerAssembled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orePerShard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_assembler","type":"address"}],"name":"setAssemblerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setInitialOreClaimTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPublicMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWhitelistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shardBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"}],"name":"tokenIdsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"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":[],"name":"totalAssembled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShardMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405267016345785d8a0000600d55600a600e556005600f556010805461ffff19169055604b601a556101f4601b553480156200003d57600080fd5b5060405162003f2b38038062003f2b83398101604081905262000060916200030d565b604051806040016040528060068152602001652232bb37bab960d11b815250604051806040016040528060068152602001652222ab27aaa960d11b8152508160009080519060200190620000b69291906200019a565b508051620000cc9060019060208401906200019a565b505050620000e9620000e36200014460201b60201c565b62000148565b6001600b55600c849055601280546001600160a01b0319166001600160a01b0385161790558151620001239060149060208501906200019a565b508051620001399060159060208401906200019a565b5050505050620003df565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a890620003a2565b90600052602060002090601f016020900481019282620001cc576000855562000217565b82601f10620001e757805160ff191683800117855562000217565b8280016001018555821562000217579182015b8281111562000217578251825591602001919060010190620001fa565b506200022592915062000229565b5090565b5b808211156200022557600081556001016200022a565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026857600080fd5b81516001600160401b038082111562000285576200028562000240565b604051601f8301601f19908116603f01168101908282118183101715620002b057620002b062000240565b81604052838152602092508683858801011115620002cd57600080fd5b600091505b83821015620002f15785820183015181830184015290820190620002d2565b83821115620003035760008385830101525b9695505050505050565b600080600080608085870312156200032457600080fd5b845160208601519094506001600160a01b03811681146200034457600080fd5b60408601519093506001600160401b03808211156200036257600080fd5b620003708883890162000256565b935060608701519150808211156200038757600080fd5b50620003968782880162000256565b91505092959194509250565b600181811c90821680620003b757607f821691505b60208210811415620003d957634e487b7160e01b600052602260045260246000fd5b50919050565b613b3c80620003ef6000396000f3fe60806040526004361061036b5760003560e01c80637bc528a0116101c6578063bb485b88116100f7578063e4d8c67511610095578063ef3e067c1161006f578063ef3e067c146109cc578063f2fde38b146109ec578063f43f48bf14610a0c578063f4a0a52814610a2257600080fd5b8063e4d8c6751461094e578063e8a3d4851461096e578063e985e9c51461098357600080fd5b8063c8efe9e0116100d1578063c8efe9e0146108e0578063cdd1d7951461090d578063d5138f9d14610923578063d547cfb71461093957600080fd5b8063bb485b881461088a578063c4181f0f146108a0578063c87b56dd146108c057600080fd5b8063940a80971161016457806398a8cffe1161013e57806398a8cffe146107fd578063a22cb4651461082a578063b767a0981461084a578063b88d4fde1461086a57600080fd5b8063940a8097146107a857806395d89b41146107c8578063966090ba146107dd57600080fd5b80638d93bcbd116101a05780638d93bcbd1461071c5780638da5cb5b1461073c5780638f85fa941461075a578063938e3d7b1461078857600080fd5b80637bc528a0146106af5780637cb64759146106dc578063818668d7146106fc57600080fd5b8063372f657c116102a05780636352211e1161023e57806370a082311161021857806370a082311461064e578063715018a61461066e578063741ff5bf1461068357806376aa073e1461069957600080fd5b80636352211e146105f95780636817c76c146106195780636caede3d1461062f57600080fd5b806342842e0e1161027a57806342842e0e146105835780634b5fb25a146105a35780634f6ccce7146105c3578063542a44c0146105e357600080fd5b8063372f657c1461053b578063381b965c1461054e5780633ccfd60b1461056e57600080fd5b8063209d78631161030d57806326092b83116102e757806326092b83146104dd5780632eb4a7ab146104e55780632f745c59146104fb57806330176e131461051b57600080fd5b8063209d78631461047a578063224f64981461049057806323b872dd146104bd57600080fd5b8063095ea7b311610349578063095ea7b3146103ff5780630f4161aa146104215780631342ff4c1461043b57806318160ddd1461045b57600080fd5b806301ffc9a71461037057806306fdde03146103a5578063081812fc146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b366004613437565b610a42565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103ba610a86565b60405161039c91906134b3565b3480156103d357600080fd5b506103e76103e23660046134c6565b610b18565b6040516001600160a01b03909116815260200161039c565b34801561040b57600080fd5b5061041f61041a3660046134fb565b610bb2565b005b34801561042d57600080fd5b506010546103909060ff1681565b34801561044757600080fd5b5061041f6104563660046134c6565b610ce4565b34801561046757600080fd5b506008545b60405190815260200161039c565b34801561048657600080fd5b5061046c61025881565b34801561049c57600080fd5b5061046c6104ab3660046134c6565b60176020526000908152604090205481565b3480156104c957600080fd5b5061041f6104d8366004613525565b610e07565b61041f610e2f565b3480156104f157600080fd5b5061046c600c5481565b34801561050757600080fd5b5061046c6105163660046134fb565b611073565b34801561052757600080fd5b5061041f6105363660046135ed565b61111b565b61041f610549366004613682565b61117a565b34801561055a57600080fd5b5061041f6105693660046134c6565b611531565b34801561057a57600080fd5b5061041f61157e565b34801561058f57600080fd5b5061041f61059e366004613525565b6115f5565b3480156105af57600080fd5b5061041f6105be3660046136c4565b61161d565b3480156105cf57600080fd5b5061046c6105de3660046134c6565b611687565b3480156105ef57600080fd5b5061046c60185481565b34801561060557600080fd5b506103e76106143660046134c6565b61172b565b34801561062557600080fd5b5061046c600d5481565b34801561063b57600080fd5b5060105461039090610100900460ff1681565b34801561065a57600080fd5b5061046c6106693660046136c4565b6117b6565b34801561067a57600080fd5b5061041f611850565b34801561068f57600080fd5b5061046c60195481565b3480156106a557600080fd5b5061046c601c5481565b3480156106bb57600080fd5b5061046c6106ca3660046136c4565b601d6020526000908152604090205481565b3480156106e857600080fd5b5061041f6106f73660046134c6565b6118a4565b34801561070857600080fd5b5061041f6107173660046136ef565b6118f1565b34801561072857600080fd5b506013546103e7906001600160a01b031681565b34801561074857600080fd5b50600a546001600160a01b03166103e7565b34801561076657600080fd5b5061077a6107753660046136c4565b61194c565b60405161039c929190613745565b34801561079457600080fd5b5061041f6107a33660046135ed565b611ab3565b3480156107b457600080fd5b5061046c6107c33660046136c4565b611b0e565b3480156107d457600080fd5b506103ba611c33565b3480156107e957600080fd5b5061041f6107f8366004613773565b611c42565b34801561080957600080fd5b5061046c6108183660046136c4565b60116020526000908152604090205481565b34801561083657600080fd5b5061041f6108453660046137bf565b611eba565b34801561085657600080fd5b5061041f6108653660046136ef565b611ec5565b34801561087657600080fd5b5061041f6108853660046137f2565b611f27565b34801561089657600080fd5b5061046c600e5481565b3480156108ac57600080fd5b506012546103e7906001600160a01b031681565b3480156108cc57600080fd5b506103ba6108db3660046134c6565b611f56565b3480156108ec57600080fd5b5061046c6108fb3660046136c4565b60166020526000908152604090205481565b34801561091957600080fd5b5061046c601a5481565b34801561092f57600080fd5b5061046c600f5481565b34801561094557600080fd5b506103ba612020565b34801561095a57600080fd5b5061041f6109693660046134c6565b6120ae565b34801561097a57600080fd5b506103ba6120fb565b34801561098f57600080fd5b5061039061099e36600461386e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109d857600080fd5b5061041f6109e73660046134c6565b612108565b3480156109f857600080fd5b5061041f610a073660046136c4565b612155565b348015610a1857600080fd5b5061046c601b5481565b348015610a2e57600080fd5b5061041f610a3d3660046134c6565b612222565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610a805750610a808261226f565b92915050565b606060008054610a9590613898565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac190613898565b8015610b0e5780601f10610ae357610100808354040283529160200191610b0e565b820191906000526020600020905b815481529060010190602001808311610af157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b965760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610bbd8261172b565b9050806001600160a01b0316836001600160a01b03161415610c475760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b8d565b336001600160a01b0382161480610c635750610c63813361099e565b610cd55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b8d565b610cdf838361230a565b505050565b600a546001600160a01b03163314610d2c5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601854610258610d3c83836138e9565b1115610d8a5760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964206d696e7420636f756e7400000000000000000000000000006044820152606401610b8d565b60005b82811015610dc557610db333610da383856138e9565b610dae9060016138e9565b612378565b80610dbd81613901565b915050610d8d565b503360009081526016602052604081208054849290610de59084906138e9565b925050819055508160186000828254610dfe91906138e9565b90915550505050565b610e118383612392565b6102588111610e2457610e248383612479565b610cdf8383836124ee565b6002600b541415610e825760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b55601854600d5460105460ff16610edf5760405162461bcd60e51b815260206004820152601560248201527f5075626c6963206d696e7420697320636c6f73656400000000000000000000006044820152606401610b8d565b6102588210610f1c5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610b8d565b80341015610f6c5760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f7567682066756e6473000000000000000000000000000000006044820152606401610b8d565b6000610f788234613932565b90506000610f8884610258613946565b9050600e548211610f995781610f9d565b600e545b9150808211610fac5781610fae565b805b915060005b82811015610fdb57610fc933610da383886138e9565b80610fd381613901565b915050610fb3565b503360009081526016602052604081208054849290610ffb9084906138e9565b92505081905550816018600082825461101491906138e9565b9091555060009050611026848461395d565b6110309034613946565b9050801561106757604051339082156108fc029083906000818181858888f19350505050158015611065573d6000803e3d6000fd5b505b50506001600b55505050565b600061107e836117b6565b82106110f25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b8d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146111635760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b8051611176906015906020840190613388565b5050565b6002600b5414156111cd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b55604080516bffffffffffffffffffffffff193360601b166020808301919091528251808303601401815260349092019092528051910120601854600d54601054610100900460ff166112665760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374206d696e7420697320636c6f73656400000000000000006044820152606401610b8d565b61025882106112a35760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610b8d565b6112e485858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150869050612575565b6113305760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c697374656400000000000000000000000000000000006044820152606401610b8d565b600f5433600090815260116020526040902054106113905760405162461bcd60e51b815260206004820152601c60248201527f57686974656c697374206d696e742066756c6c7920636c61696d6564000000006044820152606401610b8d565b803410156113e05760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f7567682066756e6473000000000000000000000000000000006044820152606401610b8d565b60006113ec8234613932565b905060006113fc84610258613946565b33600090815260116020526040812054600f54929350909161141e9190613946565b905080821161142d578161142f565b805b915081831161143e5782611440565b815b336000908152601160205260408120805492955085929091906114649084906138e9565b90915550600090505b838110156114955761148333610da383896138e9565b8061148d81613901565b91505061146d565b5033600090815260166020526040812080548592906114b59084906138e9565b9250508190555082601860008282546114ce91906138e9565b90915550600090506114e0858561395d565b6114ea9034613946565b9050801561152157604051339082156108fc029083906000818181858888f1935050505015801561151f573d6000803e3d6000fd5b505b50506001600b5550505050505050565b600a546001600160a01b031633146115795760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600f55565b600a546001600160a01b031633146115c65760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b60405133904780156108fc02916000818181858888f193505050501580156115f2573d6000803e3d6000fd5b50565b6115ff8383612392565b6102588111611612576116128383612479565b610cdf83838361258b565b600a546001600160a01b031633146116655760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600061169260085490565b82106117065760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b8d565b600882815481106117195761171961397c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a805760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b8d565b60006001600160a01b0382166118345760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b8d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146118985760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b6118a260006125a6565b565b600a546001600160a01b031633146118ec5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600c55565b600a546001600160a01b031633146119395760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b6010805460ff1916911515919091179055565b606080600061195a846117b6565b6001600160a01b0385166000908152601660205260408120549192506119808284613946565b905060008267ffffffffffffffff81111561199d5761199d613561565b6040519080825280602002602001820160405280156119c6578160200160208202803683370190505b50905060008267ffffffffffffffff8111156119e4576119e4613561565b604051908082528060200260200182016040528015611a0d578160200160208202803683370190505b50905060008060005b87811015611aa2576000611a2a8c83611073565b90506102588111611a6457808685611a4181613901565b965081518110611a5357611a5361397c565b602002602001018181525050611a8f565b808584611a7081613901565b955081518110611a8257611a8261397c565b6020026020010181815250505b5080611a9a81613901565b915050611a16565b509299919850909650505050505050565b600a546001600160a01b03163314611afb5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b8051611176906014906020840190613388565b60006002600b541415611b635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b556012546001600160a01b03163314611bc25760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206163636573730000000000000000000000000000000000006044820152606401610b8d565b6000611bcd836125f8565b6001600160a01b0384166000908152601e6020526040902054611bf091906138e9565b90508015611c2857611c006126b3565b6001600160a01b0384166000908152601d6020908152604080832093909355601e9052908120555b6001600b5592915050565b606060018054610a9590613898565b6002600b541415611c955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b556013546001600160a01b0316611cf25760405162461bcd60e51b815260206004820152601160248201527f417373656d626c6572206e6f74207365740000000000000000000000000000006044820152606401610b8d565b6013546001600160a01b03163314611d4c5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206163636573730000000000000000000000000000000000006044820152606401610b8d565b60058114611d9c5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420746f6b656e206964730000000000000000000000000000006044820152606401610b8d565b6000611dc083836000818110611db457611db461397c565b9050602002013561172b565b9050611dcd816000612392565b60005b82811015611e0b57611df9848483818110611ded57611ded61397c565b905060200201356126fe565b80611e0381613901565b915050611dd0565b506001600160a01b0381166000908152601660205260408120805460059290611e35908490613946565b909155505060198054906000611e4a83613901565b91905055506000601954610258611e6191906138e9565b60008181526017602052604090208690559050611e7e8282612378565b601b546001600160a01b0383166000908152601e602052604081208054909190611ea99084906138e9565b90915550506001600b555050505050565b6111763383836127a5565b600a546001600160a01b03163314611f0d5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601080549115156101000261ff0019909216919091179055565b611f318484612392565b6102588211611f4457611f448484612479565b611f5084848484612874565b50505050565b6000818152600260205260409020546060906001600160a01b0316611fbd5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610b8d565b61025882111561201557600082815260176020526040902054601590611fee90611fe9906103e86138e9565b6128fc565b604051602001611fff9291906139ae565b6040516020818303038152906040529050919050565b6015611fee836128fc565b6015805461202d90613898565b80601f016020809104026020016040519081016040528092919081815260200182805461205990613898565b80156120a65780601f1061207b576101008083540402835291602001916120a6565b820191906000526020600020905b81548152906001019060200180831161208957829003601f168201915b505050505081565b600a546001600160a01b031633146120f65760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601c55565b6014805461202d90613898565b600a546001600160a01b031633146121505760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600e55565b600a546001600160a01b0316331461219d5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b6001600160a01b0381166122195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b8d565b6115f2816125a6565b600a546001600160a01b0316331461226a5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600d55565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806122d257506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a8057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610a80565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061233f8261172b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611176828260405180602001604052806000815250612a36565b600061239c6126b3565b90506001600160a01b0383161561240b5760006123b8846125f8565b90508015612409576001600160a01b0384166000908152601e6020526040812080548392906123e89084906138e9565b90915550506001600160a01b0384166000908152601d602052604090208290555b505b6001600160a01b03821615610cdf576000612425836125f8565b90508015611f50576001600160a01b0383166000908152601e6020526040812080548392906124559084906138e9565b9091555050506001600160a01b03919091166000908152601d602052604090205550565b6001600160a01b038216156124b2576001600160a01b03821660009081526016602052604081208054916124ac83613a4c565b91905055505b6001600160a01b03811615611176576001600160a01b03811660009081526016602052604081208054916124e583613901565b91905055505050565b6124f83382612ab4565b61256a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b8d565b610cdf838383612ba7565b6000826125828584612d7f565b14949350505050565b610cdf83838360405180602001604052806000815250611f27565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806126036126b3565b6001600160a01b0384166000908152601d6020526040902054909150808211156126a95760006126338284613946565b6001600160a01b03861660009081526016602052604081205491925081612659886117b6565b6126639190613946565b601b54909150612673848361395d565b61267d919061395d565b601a5461268a858561395d565b612694919061395d565b61269e91906138e9565b979650505050505050565b5060009392505050565b601c54600090428115806126c657508181105b156126d45760009250505090565b62093a806126e28383613946565b6126ec9190613932565b6126f79060016138e9565b9250505090565b60006127098261172b565b905061271781600084612e2b565b61272260008361230a565b6001600160a01b038116600090815260036020526040812080546001929061274b908490613946565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156128075760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61287e3383612ab4565b6128f05760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b8d565b611f5084848484612ee3565b60608161293c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612966578061295081613901565b915061295f9050600a83613932565b9150612940565b60008167ffffffffffffffff81111561298157612981613561565b6040519080825280601f01601f1916602001820160405280156129ab576020820181803683370190505b5090505b8415612a2e576129c0600183613946565b91506129cd600a86613a63565b6129d89060306138e9565b60f81b8183815181106129ed576129ed61397c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a27600a86613932565b94506129af565b949350505050565b612a408383612f61565b612a4d60008484846130af565b610cdf5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b8d565b6000818152600260205260408120546001600160a01b0316612b2d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8d565b6000612b388361172b565b9050806001600160a01b0316846001600160a01b03161480612b735750836001600160a01b0316612b6884610b18565b6001600160a01b0316145b80612a2e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16612a2e565b826001600160a01b0316612bba8261172b565b6001600160a01b031614612c365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b8d565b6001600160a01b038216612cb15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b8d565b612cbc838383612e2b565b612cc760008261230a565b6001600160a01b0383166000908152600360205260408120805460019290612cf0908490613946565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d1e9084906138e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b8451811015612e23576000858281518110612da157612da161397c565b60200260200101519050808311612de3576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612e10565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612e1b81613901565b915050612d84565b509392505050565b6001600160a01b038316612e8657612e8181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612ea9565b816001600160a01b0316836001600160a01b031614612ea957612ea983826131f8565b6001600160a01b038216612ec057610cdf81613295565b826001600160a01b0316826001600160a01b031614610cdf57610cdf8282613344565b612eee848484612ba7565b612efa848484846130af565b611f505760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b8d565b6001600160a01b038216612fb75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8d565b6000818152600260205260409020546001600160a01b03161561301c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8d565b61302860008383612e2b565b6001600160a01b03821660009081526003602052604081208054600192906130519084906138e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156131ed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906130f3903390899088908890600401613a77565b6020604051808303816000875af192505050801561312e575060408051601f3d908101601f1916820190925261312b91810190613ab3565b60015b6131d3573d80801561315c576040519150601f19603f3d011682016040523d82523d6000602084013e613161565b606091505b5080516131cb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a2e565b506001949350505050565b60006001613205846117b6565b61320f9190613946565b600083815260076020526040902054909150808214613262576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132a790600190613946565b600083815260096020526040812054600880549394509092849081106132cf576132cf61397c565b9060005260206000200154905080600883815481106132f0576132f061397c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061332857613328613ad0565b6001900381819060005260206000200160009055905550505050565b600061334f836117b6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461339490613898565b90600052602060002090601f0160209004810192826133b657600085556133fc565b82601f106133cf57805160ff19168380011785556133fc565b828001600101855582156133fc579182015b828111156133fc5782518255916020019190600101906133e1565b5061340892915061340c565b5090565b5b80821115613408576000815560010161340d565b6001600160e01b0319811681146115f257600080fd5b60006020828403121561344957600080fd5b813561345481613421565b9392505050565b60005b8381101561347657818101518382015260200161345e565b83811115611f505750506000910152565b6000815180845261349f81602086016020860161345b565b601f01601f19169290920160200192915050565b6020815260006134546020830184613487565b6000602082840312156134d857600080fd5b5035919050565b80356001600160a01b03811681146134f657600080fd5b919050565b6000806040838503121561350e57600080fd5b613517836134df565b946020939093013593505050565b60008060006060848603121561353a57600080fd5b613543846134df565b9250613551602085016134df565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561359257613592613561565b604051601f8501601f19908116603f011681019082821181831017156135ba576135ba613561565b816040528093508581528686860111156135d357600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156135ff57600080fd5b813567ffffffffffffffff81111561361657600080fd5b8201601f8101841361362757600080fd5b612a2e84823560208401613577565b60008083601f84011261364857600080fd5b50813567ffffffffffffffff81111561366057600080fd5b6020830191508360208260051b850101111561367b57600080fd5b9250929050565b6000806020838503121561369557600080fd5b823567ffffffffffffffff8111156136ac57600080fd5b6136b885828601613636565b90969095509350505050565b6000602082840312156136d657600080fd5b613454826134df565b803580151581146134f657600080fd5b60006020828403121561370157600080fd5b613454826136df565b600081518084526020808501945080840160005b8381101561373a5781518752958201959082019060010161371e565b509495945050505050565b604081526000613758604083018561370a565b828103602084015261376a818561370a565b95945050505050565b60008060006040848603121561378857600080fd5b83359250602084013567ffffffffffffffff8111156137a657600080fd5b6137b286828701613636565b9497909650939450505050565b600080604083850312156137d257600080fd5b6137db836134df565b91506137e9602084016136df565b90509250929050565b6000806000806080858703121561380857600080fd5b613811856134df565b935061381f602086016134df565b925060408501359150606085013567ffffffffffffffff81111561384257600080fd5b8501601f8101871361385357600080fd5b61386287823560208401613577565b91505092959194509250565b6000806040838503121561388157600080fd5b61388a836134df565b91506137e9602084016134df565b600181811c908216806138ac57607f821691505b602082108114156138cd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156138fc576138fc6138d3565b500190565b6000600019821415613915576139156138d3565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826139415761394161391c565b500490565b600082821015613958576139586138d3565b500390565b6000816000190483118215151615613977576139776138d3565b500290565b634e487b7160e01b600052603260045260246000fd5b600081516139a481856020860161345b565b9290920192915050565b600080845481600182811c9150808316806139ca57607f831692505b60208084108214156139ea57634e487b7160e01b86526022600452602486fd5b8180156139fe5760018114613a0f57613a3c565b60ff19861689528489019650613a3c565b60008b81526020902060005b86811015613a345781548b820152908501908301613a1b565b505084890196505b50505050505061376a8185613992565b600081613a5b57613a5b6138d3565b506000190190565b600082613a7257613a7261391c565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613aa96080830184613487565b9695505050505050565b600060208284031215613ac557600080fd5b815161345481613421565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220321f4fa67a376dc548b935550ba5c7f3810edf3cdacfdb1e8f88c7e7d9cc873b64736f6c634300080b0033130b8e74bb99c9cf23d2e2e2aa375f98515c250651eaf4cbd2d449dbaa0436640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80637bc528a0116101c6578063bb485b88116100f7578063e4d8c67511610095578063ef3e067c1161006f578063ef3e067c146109cc578063f2fde38b146109ec578063f43f48bf14610a0c578063f4a0a52814610a2257600080fd5b8063e4d8c6751461094e578063e8a3d4851461096e578063e985e9c51461098357600080fd5b8063c8efe9e0116100d1578063c8efe9e0146108e0578063cdd1d7951461090d578063d5138f9d14610923578063d547cfb71461093957600080fd5b8063bb485b881461088a578063c4181f0f146108a0578063c87b56dd146108c057600080fd5b8063940a80971161016457806398a8cffe1161013e57806398a8cffe146107fd578063a22cb4651461082a578063b767a0981461084a578063b88d4fde1461086a57600080fd5b8063940a8097146107a857806395d89b41146107c8578063966090ba146107dd57600080fd5b80638d93bcbd116101a05780638d93bcbd1461071c5780638da5cb5b1461073c5780638f85fa941461075a578063938e3d7b1461078857600080fd5b80637bc528a0146106af5780637cb64759146106dc578063818668d7146106fc57600080fd5b8063372f657c116102a05780636352211e1161023e57806370a082311161021857806370a082311461064e578063715018a61461066e578063741ff5bf1461068357806376aa073e1461069957600080fd5b80636352211e146105f95780636817c76c146106195780636caede3d1461062f57600080fd5b806342842e0e1161027a57806342842e0e146105835780634b5fb25a146105a35780634f6ccce7146105c3578063542a44c0146105e357600080fd5b8063372f657c1461053b578063381b965c1461054e5780633ccfd60b1461056e57600080fd5b8063209d78631161030d57806326092b83116102e757806326092b83146104dd5780632eb4a7ab146104e55780632f745c59146104fb57806330176e131461051b57600080fd5b8063209d78631461047a578063224f64981461049057806323b872dd146104bd57600080fd5b8063095ea7b311610349578063095ea7b3146103ff5780630f4161aa146104215780631342ff4c1461043b57806318160ddd1461045b57600080fd5b806301ffc9a71461037057806306fdde03146103a5578063081812fc146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b366004613437565b610a42565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103ba610a86565b60405161039c91906134b3565b3480156103d357600080fd5b506103e76103e23660046134c6565b610b18565b6040516001600160a01b03909116815260200161039c565b34801561040b57600080fd5b5061041f61041a3660046134fb565b610bb2565b005b34801561042d57600080fd5b506010546103909060ff1681565b34801561044757600080fd5b5061041f6104563660046134c6565b610ce4565b34801561046757600080fd5b506008545b60405190815260200161039c565b34801561048657600080fd5b5061046c61025881565b34801561049c57600080fd5b5061046c6104ab3660046134c6565b60176020526000908152604090205481565b3480156104c957600080fd5b5061041f6104d8366004613525565b610e07565b61041f610e2f565b3480156104f157600080fd5b5061046c600c5481565b34801561050757600080fd5b5061046c6105163660046134fb565b611073565b34801561052757600080fd5b5061041f6105363660046135ed565b61111b565b61041f610549366004613682565b61117a565b34801561055a57600080fd5b5061041f6105693660046134c6565b611531565b34801561057a57600080fd5b5061041f61157e565b34801561058f57600080fd5b5061041f61059e366004613525565b6115f5565b3480156105af57600080fd5b5061041f6105be3660046136c4565b61161d565b3480156105cf57600080fd5b5061046c6105de3660046134c6565b611687565b3480156105ef57600080fd5b5061046c60185481565b34801561060557600080fd5b506103e76106143660046134c6565b61172b565b34801561062557600080fd5b5061046c600d5481565b34801561063b57600080fd5b5060105461039090610100900460ff1681565b34801561065a57600080fd5b5061046c6106693660046136c4565b6117b6565b34801561067a57600080fd5b5061041f611850565b34801561068f57600080fd5b5061046c60195481565b3480156106a557600080fd5b5061046c601c5481565b3480156106bb57600080fd5b5061046c6106ca3660046136c4565b601d6020526000908152604090205481565b3480156106e857600080fd5b5061041f6106f73660046134c6565b6118a4565b34801561070857600080fd5b5061041f6107173660046136ef565b6118f1565b34801561072857600080fd5b506013546103e7906001600160a01b031681565b34801561074857600080fd5b50600a546001600160a01b03166103e7565b34801561076657600080fd5b5061077a6107753660046136c4565b61194c565b60405161039c929190613745565b34801561079457600080fd5b5061041f6107a33660046135ed565b611ab3565b3480156107b457600080fd5b5061046c6107c33660046136c4565b611b0e565b3480156107d457600080fd5b506103ba611c33565b3480156107e957600080fd5b5061041f6107f8366004613773565b611c42565b34801561080957600080fd5b5061046c6108183660046136c4565b60116020526000908152604090205481565b34801561083657600080fd5b5061041f6108453660046137bf565b611eba565b34801561085657600080fd5b5061041f6108653660046136ef565b611ec5565b34801561087657600080fd5b5061041f6108853660046137f2565b611f27565b34801561089657600080fd5b5061046c600e5481565b3480156108ac57600080fd5b506012546103e7906001600160a01b031681565b3480156108cc57600080fd5b506103ba6108db3660046134c6565b611f56565b3480156108ec57600080fd5b5061046c6108fb3660046136c4565b60166020526000908152604090205481565b34801561091957600080fd5b5061046c601a5481565b34801561092f57600080fd5b5061046c600f5481565b34801561094557600080fd5b506103ba612020565b34801561095a57600080fd5b5061041f6109693660046134c6565b6120ae565b34801561097a57600080fd5b506103ba6120fb565b34801561098f57600080fd5b5061039061099e36600461386e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109d857600080fd5b5061041f6109e73660046134c6565b612108565b3480156109f857600080fd5b5061041f610a073660046136c4565b612155565b348015610a1857600080fd5b5061046c601b5481565b348015610a2e57600080fd5b5061041f610a3d3660046134c6565b612222565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610a805750610a808261226f565b92915050565b606060008054610a9590613898565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac190613898565b8015610b0e5780601f10610ae357610100808354040283529160200191610b0e565b820191906000526020600020905b815481529060010190602001808311610af157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b965760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610bbd8261172b565b9050806001600160a01b0316836001600160a01b03161415610c475760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b8d565b336001600160a01b0382161480610c635750610c63813361099e565b610cd55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b8d565b610cdf838361230a565b505050565b600a546001600160a01b03163314610d2c5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601854610258610d3c83836138e9565b1115610d8a5760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964206d696e7420636f756e7400000000000000000000000000006044820152606401610b8d565b60005b82811015610dc557610db333610da383856138e9565b610dae9060016138e9565b612378565b80610dbd81613901565b915050610d8d565b503360009081526016602052604081208054849290610de59084906138e9565b925050819055508160186000828254610dfe91906138e9565b90915550505050565b610e118383612392565b6102588111610e2457610e248383612479565b610cdf8383836124ee565b6002600b541415610e825760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b55601854600d5460105460ff16610edf5760405162461bcd60e51b815260206004820152601560248201527f5075626c6963206d696e7420697320636c6f73656400000000000000000000006044820152606401610b8d565b6102588210610f1c5760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610b8d565b80341015610f6c5760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f7567682066756e6473000000000000000000000000000000006044820152606401610b8d565b6000610f788234613932565b90506000610f8884610258613946565b9050600e548211610f995781610f9d565b600e545b9150808211610fac5781610fae565b805b915060005b82811015610fdb57610fc933610da383886138e9565b80610fd381613901565b915050610fb3565b503360009081526016602052604081208054849290610ffb9084906138e9565b92505081905550816018600082825461101491906138e9565b9091555060009050611026848461395d565b6110309034613946565b9050801561106757604051339082156108fc029083906000818181858888f19350505050158015611065573d6000803e3d6000fd5b505b50506001600b55505050565b600061107e836117b6565b82106110f25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b8d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146111635760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b8051611176906015906020840190613388565b5050565b6002600b5414156111cd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b55604080516bffffffffffffffffffffffff193360601b166020808301919091528251808303601401815260349092019092528051910120601854600d54601054610100900460ff166112665760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374206d696e7420697320636c6f73656400000000000000006044820152606401610b8d565b61025882106112a35760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610b8d565b6112e485858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150869050612575565b6113305760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c697374656400000000000000000000000000000000006044820152606401610b8d565b600f5433600090815260116020526040902054106113905760405162461bcd60e51b815260206004820152601c60248201527f57686974656c697374206d696e742066756c6c7920636c61696d6564000000006044820152606401610b8d565b803410156113e05760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f7567682066756e6473000000000000000000000000000000006044820152606401610b8d565b60006113ec8234613932565b905060006113fc84610258613946565b33600090815260116020526040812054600f54929350909161141e9190613946565b905080821161142d578161142f565b805b915081831161143e5782611440565b815b336000908152601160205260408120805492955085929091906114649084906138e9565b90915550600090505b838110156114955761148333610da383896138e9565b8061148d81613901565b91505061146d565b5033600090815260166020526040812080548592906114b59084906138e9565b9250508190555082601860008282546114ce91906138e9565b90915550600090506114e0858561395d565b6114ea9034613946565b9050801561152157604051339082156108fc029083906000818181858888f1935050505015801561151f573d6000803e3d6000fd5b505b50506001600b5550505050505050565b600a546001600160a01b031633146115795760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600f55565b600a546001600160a01b031633146115c65760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b60405133904780156108fc02916000818181858888f193505050501580156115f2573d6000803e3d6000fd5b50565b6115ff8383612392565b6102588111611612576116128383612479565b610cdf83838361258b565b600a546001600160a01b031633146116655760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600061169260085490565b82106117065760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b8d565b600882815481106117195761171961397c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a805760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b8d565b60006001600160a01b0382166118345760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b8d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146118985760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b6118a260006125a6565b565b600a546001600160a01b031633146118ec5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600c55565b600a546001600160a01b031633146119395760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b6010805460ff1916911515919091179055565b606080600061195a846117b6565b6001600160a01b0385166000908152601660205260408120549192506119808284613946565b905060008267ffffffffffffffff81111561199d5761199d613561565b6040519080825280602002602001820160405280156119c6578160200160208202803683370190505b50905060008267ffffffffffffffff8111156119e4576119e4613561565b604051908082528060200260200182016040528015611a0d578160200160208202803683370190505b50905060008060005b87811015611aa2576000611a2a8c83611073565b90506102588111611a6457808685611a4181613901565b965081518110611a5357611a5361397c565b602002602001018181525050611a8f565b808584611a7081613901565b955081518110611a8257611a8261397c565b6020026020010181815250505b5080611a9a81613901565b915050611a16565b509299919850909650505050505050565b600a546001600160a01b03163314611afb5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b8051611176906014906020840190613388565b60006002600b541415611b635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b556012546001600160a01b03163314611bc25760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206163636573730000000000000000000000000000000000006044820152606401610b8d565b6000611bcd836125f8565b6001600160a01b0384166000908152601e6020526040902054611bf091906138e9565b90508015611c2857611c006126b3565b6001600160a01b0384166000908152601d6020908152604080832093909355601e9052908120555b6001600b5592915050565b606060018054610a9590613898565b6002600b541415611c955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b8d565b6002600b556013546001600160a01b0316611cf25760405162461bcd60e51b815260206004820152601160248201527f417373656d626c6572206e6f74207365740000000000000000000000000000006044820152606401610b8d565b6013546001600160a01b03163314611d4c5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c6964206163636573730000000000000000000000000000000000006044820152606401610b8d565b60058114611d9c5760405162461bcd60e51b815260206004820152601160248201527f496e76616c696420746f6b656e206964730000000000000000000000000000006044820152606401610b8d565b6000611dc083836000818110611db457611db461397c565b9050602002013561172b565b9050611dcd816000612392565b60005b82811015611e0b57611df9848483818110611ded57611ded61397c565b905060200201356126fe565b80611e0381613901565b915050611dd0565b506001600160a01b0381166000908152601660205260408120805460059290611e35908490613946565b909155505060198054906000611e4a83613901565b91905055506000601954610258611e6191906138e9565b60008181526017602052604090208690559050611e7e8282612378565b601b546001600160a01b0383166000908152601e602052604081208054909190611ea99084906138e9565b90915550506001600b555050505050565b6111763383836127a5565b600a546001600160a01b03163314611f0d5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601080549115156101000261ff0019909216919091179055565b611f318484612392565b6102588211611f4457611f448484612479565b611f5084848484612874565b50505050565b6000818152600260205260409020546060906001600160a01b0316611fbd5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610b8d565b61025882111561201557600082815260176020526040902054601590611fee90611fe9906103e86138e9565b6128fc565b604051602001611fff9291906139ae565b6040516020818303038152906040529050919050565b6015611fee836128fc565b6015805461202d90613898565b80601f016020809104026020016040519081016040528092919081815260200182805461205990613898565b80156120a65780601f1061207b576101008083540402835291602001916120a6565b820191906000526020600020905b81548152906001019060200180831161208957829003601f168201915b505050505081565b600a546001600160a01b031633146120f65760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b601c55565b6014805461202d90613898565b600a546001600160a01b031633146121505760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600e55565b600a546001600160a01b0316331461219d5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b6001600160a01b0381166122195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b8d565b6115f2816125a6565b600a546001600160a01b0316331461226a5760405162461bcd60e51b81526020600482018190526024820152600080516020613ae78339815191526044820152606401610b8d565b600d55565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806122d257506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a8057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610a80565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061233f8261172b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611176828260405180602001604052806000815250612a36565b600061239c6126b3565b90506001600160a01b0383161561240b5760006123b8846125f8565b90508015612409576001600160a01b0384166000908152601e6020526040812080548392906123e89084906138e9565b90915550506001600160a01b0384166000908152601d602052604090208290555b505b6001600160a01b03821615610cdf576000612425836125f8565b90508015611f50576001600160a01b0383166000908152601e6020526040812080548392906124559084906138e9565b9091555050506001600160a01b03919091166000908152601d602052604090205550565b6001600160a01b038216156124b2576001600160a01b03821660009081526016602052604081208054916124ac83613a4c565b91905055505b6001600160a01b03811615611176576001600160a01b03811660009081526016602052604081208054916124e583613901565b91905055505050565b6124f83382612ab4565b61256a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b8d565b610cdf838383612ba7565b6000826125828584612d7f565b14949350505050565b610cdf83838360405180602001604052806000815250611f27565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806126036126b3565b6001600160a01b0384166000908152601d6020526040902054909150808211156126a95760006126338284613946565b6001600160a01b03861660009081526016602052604081205491925081612659886117b6565b6126639190613946565b601b54909150612673848361395d565b61267d919061395d565b601a5461268a858561395d565b612694919061395d565b61269e91906138e9565b979650505050505050565b5060009392505050565b601c54600090428115806126c657508181105b156126d45760009250505090565b62093a806126e28383613946565b6126ec9190613932565b6126f79060016138e9565b9250505090565b60006127098261172b565b905061271781600084612e2b565b61272260008361230a565b6001600160a01b038116600090815260036020526040812080546001929061274b908490613946565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156128075760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61287e3383612ab4565b6128f05760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b8d565b611f5084848484612ee3565b60608161293c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612966578061295081613901565b915061295f9050600a83613932565b9150612940565b60008167ffffffffffffffff81111561298157612981613561565b6040519080825280601f01601f1916602001820160405280156129ab576020820181803683370190505b5090505b8415612a2e576129c0600183613946565b91506129cd600a86613a63565b6129d89060306138e9565b60f81b8183815181106129ed576129ed61397c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a27600a86613932565b94506129af565b949350505050565b612a408383612f61565b612a4d60008484846130af565b610cdf5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b8d565b6000818152600260205260408120546001600160a01b0316612b2d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8d565b6000612b388361172b565b9050806001600160a01b0316846001600160a01b03161480612b735750836001600160a01b0316612b6884610b18565b6001600160a01b0316145b80612a2e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16612a2e565b826001600160a01b0316612bba8261172b565b6001600160a01b031614612c365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b8d565b6001600160a01b038216612cb15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b8d565b612cbc838383612e2b565b612cc760008261230a565b6001600160a01b0383166000908152600360205260408120805460019290612cf0908490613946565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d1e9084906138e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b8451811015612e23576000858281518110612da157612da161397c565b60200260200101519050808311612de3576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612e10565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612e1b81613901565b915050612d84565b509392505050565b6001600160a01b038316612e8657612e8181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612ea9565b816001600160a01b0316836001600160a01b031614612ea957612ea983826131f8565b6001600160a01b038216612ec057610cdf81613295565b826001600160a01b0316826001600160a01b031614610cdf57610cdf8282613344565b612eee848484612ba7565b612efa848484846130af565b611f505760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b8d565b6001600160a01b038216612fb75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8d565b6000818152600260205260409020546001600160a01b03161561301c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8d565b61302860008383612e2b565b6001600160a01b03821660009081526003602052604081208054600192906130519084906138e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156131ed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906130f3903390899088908890600401613a77565b6020604051808303816000875af192505050801561312e575060408051601f3d908101601f1916820190925261312b91810190613ab3565b60015b6131d3573d80801561315c576040519150601f19603f3d011682016040523d82523d6000602084013e613161565b606091505b5080516131cb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a2e565b506001949350505050565b60006001613205846117b6565b61320f9190613946565b600083815260076020526040902054909150808214613262576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132a790600190613946565b600083815260096020526040812054600880549394509092849081106132cf576132cf61397c565b9060005260206000200154905080600883815481106132f0576132f061397c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061332857613328613ad0565b6001900381819060005260206000200160009055905550505050565b600061334f836117b6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461339490613898565b90600052602060002090601f0160209004810192826133b657600085556133fc565b82601f106133cf57805160ff19168380011785556133fc565b828001600101855582156133fc579182015b828111156133fc5782518255916020019190600101906133e1565b5061340892915061340c565b5090565b5b80821115613408576000815560010161340d565b6001600160e01b0319811681146115f257600080fd5b60006020828403121561344957600080fd5b813561345481613421565b9392505050565b60005b8381101561347657818101518382015260200161345e565b83811115611f505750506000910152565b6000815180845261349f81602086016020860161345b565b601f01601f19169290920160200192915050565b6020815260006134546020830184613487565b6000602082840312156134d857600080fd5b5035919050565b80356001600160a01b03811681146134f657600080fd5b919050565b6000806040838503121561350e57600080fd5b613517836134df565b946020939093013593505050565b60008060006060848603121561353a57600080fd5b613543846134df565b9250613551602085016134df565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561359257613592613561565b604051601f8501601f19908116603f011681019082821181831017156135ba576135ba613561565b816040528093508581528686860111156135d357600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156135ff57600080fd5b813567ffffffffffffffff81111561361657600080fd5b8201601f8101841361362757600080fd5b612a2e84823560208401613577565b60008083601f84011261364857600080fd5b50813567ffffffffffffffff81111561366057600080fd5b6020830191508360208260051b850101111561367b57600080fd5b9250929050565b6000806020838503121561369557600080fd5b823567ffffffffffffffff8111156136ac57600080fd5b6136b885828601613636565b90969095509350505050565b6000602082840312156136d657600080fd5b613454826134df565b803580151581146134f657600080fd5b60006020828403121561370157600080fd5b613454826136df565b600081518084526020808501945080840160005b8381101561373a5781518752958201959082019060010161371e565b509495945050505050565b604081526000613758604083018561370a565b828103602084015261376a818561370a565b95945050505050565b60008060006040848603121561378857600080fd5b83359250602084013567ffffffffffffffff8111156137a657600080fd5b6137b286828701613636565b9497909650939450505050565b600080604083850312156137d257600080fd5b6137db836134df565b91506137e9602084016136df565b90509250929050565b6000806000806080858703121561380857600080fd5b613811856134df565b935061381f602086016134df565b925060408501359150606085013567ffffffffffffffff81111561384257600080fd5b8501601f8101871361385357600080fd5b61386287823560208401613577565b91505092959194509250565b6000806040838503121561388157600080fd5b61388a836134df565b91506137e9602084016134df565b600181811c908216806138ac57607f821691505b602082108114156138cd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156138fc576138fc6138d3565b500190565b6000600019821415613915576139156138d3565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826139415761394161391c565b500490565b600082821015613958576139586138d3565b500390565b6000816000190483118215151615613977576139776138d3565b500290565b634e487b7160e01b600052603260045260246000fd5b600081516139a481856020860161345b565b9290920192915050565b600080845481600182811c9150808316806139ca57607f831692505b60208084108214156139ea57634e487b7160e01b86526022600452602486fd5b8180156139fe5760018114613a0f57613a3c565b60ff19861689528489019650613a3c565b60008b81526020902060005b86811015613a345781548b820152908501908301613a1b565b505084890196505b50505050505061376a8185613992565b600081613a5b57613a5b6138d3565b506000190190565b600082613a7257613a7261391c565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613aa96080830184613487565b9695505050505050565b600060208284031215613ac557600080fd5b815161345481613421565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220321f4fa67a376dc548b935550ba5c7f3810edf3cdacfdb1e8f88c7e7d9cc873b64736f6c634300080b0033

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

130b8e74bb99c9cf23d2e2e2aa375f98515c250651eaf4cbd2d449dbaa0436640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007697066733a2f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x130b8e74bb99c9cf23d2e2e2aa375f98515c250651eaf4cbd2d449dbaa043664
Arg [1] : _oreClaim (address): 0x0000000000000000000000000000000000000000
Arg [2] : _initialContractURI (string): ipfs://
Arg [3] : _initialBaseTokenURI (string): ipfs://

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 130b8e74bb99c9cf23d2e2e2aa375f98515c250651eaf4cbd2d449dbaa043664
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 697066733a2f2f00000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 697066733a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

199:10406:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;989:222:5;;;;;;;;;;-1:-1:-1;989:222:5;;;;;:::i;:::-;;:::i;:::-;;;611:14:15;;604:22;586:41;;574:2;559:18;989:222:5;;;;;;;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1760:55:15;;;1742:74;;1730:2;1715:18;3919:217:4;1596:226:15;3457:401:4;;;;;;;;;;-1:-1:-1;3457:401:4;;;;;:::i;:::-;;:::i;:::-;;497:37:2;;;;;;;;;;-1:-1:-1;497:37:2;;;;;;;;3080:360;;;;;;;;;;-1:-1:-1;3080:360:2;;;;;:::i;:::-;;:::i;1614:111:5:-;;;;;;;;;;-1:-1:-1;1701:10:5;:17;1614:111;;;2433:25:15;;;2421:2;2406:18;1614:111:5;2287:177:15;336:44:2;;;;;;;;;;;;377:3;336:44;;912:47;;;;;;;;;;-1:-1:-1;912:47:2;;;;;:::i;:::-;;;;;;;;;;;;;;9682:255;;;;;;;;;;-1:-1:-1;9682:255:2;;;;;:::i;:::-;;:::i;4648:813::-;;;:::i;307:25::-;;;;;;;;;;;;;;;;1290:253:5;;;;;;;;;;-1:-1:-1;1290:253:5;;;;;:::i;:::-;;:::i;2481:112:2:-;;;;;;;;;;-1:-1:-1;2481:112:2;;;;;:::i;:::-;;:::i;3444:1200::-;;;;;;:::i;:::-;;:::i;1946:97::-;;;;;;;;;;-1:-1:-1;1946:97:2;;;;;:::i;:::-;;:::i;10502:101::-;;;;;;;;;;;;;:::i;9941:263::-;;;;;;;;;;-1:-1:-1;9941:263:2;;;;;:::i;:::-;;:::i;1744:108::-;;;;;;;;;;-1:-1:-1;1744:108:2;;;;;:::i;:::-;;:::i;1797:230:5:-;;;;;;;;;;-1:-1:-1;1797:230:5;;;;;:::i;:::-;;:::i;963:31:2:-;;;;;;;;;;;;;;;;2111:235:4;;;;;;;;;;-1:-1:-1;2111:235:4;;;;;:::i;:::-;;:::i;384:36:2:-;;;;;;;;;;;;;;;;538:40;;;;;;;;;;-1:-1:-1;538:40:2;;;;;;;;;;;1849:205:4;;;;;;;;;;-1:-1:-1;1849:205:4;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;998:29:2:-;;;;;;;;;;;;;;;;1143:39;;;;;;;;;;;;;;;;1186:61;;;;;;;;;;-1:-1:-1;1186:61:2;;;;;:::i;:::-;;;;;;;;;;;;;;1642:98;;;;;;;;;;-1:-1:-1;1642:98:2;;;;;:::i;:::-;;:::i;2149:103::-;;;;;;;;;;-1:-1:-1;2149:103:2;;;;;:::i;:::-;;:::i;722:31::-;;;;;;;;;;-1:-1:-1;722:31:2;;;;-1:-1:-1;;;;;722:31:2;;;1029:85:12;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;6537:731:2;;;;;;;;;;-1:-1:-1;6537:731:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2369:108::-;;;;;;;;;;-1:-1:-1;2369:108:2;;;;;:::i;:::-;;:::i;9238:440::-;;;;;;;;;;-1:-1:-1;9238:440:2;;;;;:::i;:::-;;:::i;2570:102:4:-;;;;;;;;;;;;;:::i;5465:969:2:-;;;;;;;;;;-1:-1:-1;5465:969:2;;;;;:::i;:::-;;:::i;582:51::-;;;;;;;;;;-1:-1:-1;582:51:2;;;;;:::i;:::-;;;;;;;;;;;;;;4203:153:4;;;;;;;;;;-1:-1:-1;4203:153:4;;;;;:::i;:::-;;:::i;2256:109:2:-;;;;;;;;;;-1:-1:-1;2256:109:2;;;;;:::i;:::-;;:::i;10208:290::-;;;;;;;;;;-1:-1:-1;10208:290:2;;;;;:::i;:::-;;:::i;424:35::-;;;;;;;;;;;;;;;;688:30;;;;;;;;;;-1:-1:-1;688:30:2;;;;-1:-1:-1;;;;;688:30:2;;;2597:479;;;;;;;;;;-1:-1:-1;2597:479:2;;;;;:::i;:::-;;:::i;859:49::-;;;;;;;;;;-1:-1:-1;859:49:2;;;;;:::i;:::-;;;;;;;;;;;;;;1068:31;;;;;;;;;;;;;;;;463:30;;;;;;;;;;;;;;;;786:26;;;;;;;;;;;;;:::i;9110:124::-;;;;;;;;;;-1:-1:-1;9110:124:2;;;;;:::i;:::-;;:::i;757:25::-;;;;;;;;;;;;;:::i;4422:162:4:-;;;;;;;;;;-1:-1:-1;4422:162:4;;;;;:::i;:::-;-1:-1:-1;;;;;4542:25:4;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;2047:98:2;;;;;;;;;;-1:-1:-1;2047:98:2;;;;;:::i;:::-;;:::i;1911:198:12:-;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;1103:36:2:-;;;;;;;;;;;;;;;;1856:86;;;;;;;;;;-1:-1:-1;1856:86:2;;;;;:::i;:::-;;:::i;989:222:5:-;1091:4;-1:-1:-1;;;;;;1114:50:5;;1129:35;1114:50;;:90;;;1168:36;1192:11;1168:23;:36::i;:::-;1107:97;989:222;-1:-1:-1;;989:222:5:o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:4;4014:73;;;;-1:-1:-1;;;4014:73:4;;9066:2:15;4014:73:4;;;9048:21:15;9105:2;9085:18;;;9078:30;9144:34;9124:18;;;9117:62;-1:-1:-1;;;9195:18:15;;;9188:42;9247:19;;4014:73:4;;;;;;;;;-1:-1:-1;4105:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:4;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:4;:2;-1:-1:-1;;;;;3594:11:4;;;3586:57;;;;-1:-1:-1;;;3586:57:4;;9479:2:15;3586:57:4;;;9461:21:15;9518:2;9498:18;;;9491:30;9557:34;9537:18;;;9530:62;9628:3;9608:18;;;9601:31;9649:19;;3586:57:4;9277:397:15;3586:57:4;719:10:1;-1:-1:-1;;;;;3675:21:4;;;;:62;;-1:-1:-1;3700:37:4;3717:5;719:10:1;4422:162:4;:::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:4;;9881:2:15;3654:165:4;;;9863:21:15;9920:2;9900:18;;;9893:30;9959:34;9939:18;;;9932:62;10030:26;10010:18;;;10003:54;10074:19;;3654:165:4;9679:420:15;3654:165:4;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;3080:360:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;3166:16:2::1;::::0;377:3:::1;3196:22;3212:6:::0;3166:16;3196:22:::1;:::i;:::-;:40;;3188:71;;;::::0;-1:-1:-1;;;3188:71:2;;10989:2:15;3188:71:2::1;::::0;::::1;10971:21:15::0;11028:2;11008:18;;;11001:30;11067:20;11047:18;;;11040:48;11105:18;;3188:71:2::1;10787:342:15::0;3188:71:2::1;3271:9;3266:96;3290:6;3286:1;:10;3266:96;;;3311:44;3321:10;3333:17;3349:1:::0;3333:13;:17:::1;:::i;:::-;:21;::::0;3353:1:::1;3333:21;:::i;:::-;3311:9;:44::i;:::-;3298:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3266:96;;;-1:-1:-1::0;3382:10:2::1;3368:25;::::0;;;:13:::1;:25;::::0;;;;:35;;3397:6;;3368:25;:35:::1;::::0;3397:6;;3368:35:::1;:::i;:::-;;;;;;;;3429:6;3409:16;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;3080:360:2:o;9682:255::-;9772:29;9790:5;9797:3;9772:17;:29::i;:::-;377:3;9811:8;:26;9807:78;;9847:31;9867:5;9874:3;9847:19;:31::i;:::-;9891:41;9911:5;9918:3;9923:8;9891:19;:41::i;4648:813::-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;11476:2:15;2317:63:13;;;11458:21:15;11515:2;11495:18;;;11488:30;11554:33;11534:18;;;11527:61;11605:18;;2317:63:13;11274:355:15;2317:63:13;1744:1;2455:7;:18;4730:16:2::1;::::0;4768:9:::1;::::0;4792:17:::1;::::0;::::1;;4784:51;;;::::0;-1:-1:-1;;;4784:51:2;;11836:2:15;4784:51:2::1;::::0;::::1;11818:21:15::0;11875:2;11855:18;;;11848:30;11914:23;11894:18;;;11887:51;11955:18;;4784:51:2::1;11634:345:15::0;4784:51:2::1;377:3;4849:13;:30;4841:52;;;::::0;-1:-1:-1;;;4841:52:2;;12186:2:15;4841:52:2::1;::::0;::::1;12168:21:15::0;12225:1;12205:18;;;12198:29;-1:-1:-1;;;12243:18:15;;;12236:39;12292:18;;4841:52:2::1;11984:332:15::0;4841:52:2::1;4920:5;4907:9;:18;;4899:47;;;::::0;-1:-1:-1;;;4899:47:2;;12523:2:15;4899:47:2::1;::::0;::::1;12505:21:15::0;12562:2;12542:18;;;12535:30;12601:18;12581;;;12574:46;12637:18;;4899:47:2::1;12321:340:15::0;4899:47:2::1;4953:13;4969:17;4981:5:::0;4969:9:::1;:17;:::i;:::-;4953:33:::0;-1:-1:-1;4992:17:2::1;5012:30;5029:13:::0;377:3:::1;5012:30;:::i;:::-;4992:50;;5065:15;;5057:5;:23;:49;;5101:5;5057:49;;;5083:15;;5057:49;5048:59;;5130:9;5122:5;:17;:37;;5154:5;5122:37;;;5142:9;5122:37;5113:47;;5172:9;5167:95;5191:5;5187:1;:9;5167:95;;;5211:44;5221:10;5233:17;5249:1:::0;5233:13;:17:::1;:::i;5211:44::-;5198:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5167:95;;;-1:-1:-1::0;5282:10:2::1;5268:25;::::0;;;:13:::1;:25;::::0;;;;:34;;5297:5;;5268:25;:34:::1;::::0;5297:5;;5268:34:::1;:::i;:::-;;;;;;;;5328:5;5308:16;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;5340:14:2::1;::::0;-1:-1:-1;5370:13:2::1;5378:5:::0;5370;:13:::1;:::i;:::-;5357:27;::::0;:9:::1;:27;:::i;:::-;5340:44:::0;-1:-1:-1;5394:10:2;;5390:67:::1;;5414:36;::::0;5422:10:::1;::::0;5414:36;::::1;;;::::0;5443:6;;5414:36:::1;::::0;;;5443:6;5422:10;5414:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;5390:67;-1:-1:-1::0;;1701:1:13;2628:7;:22;-1:-1:-1;;;4648:813:2:o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:5;;13485:2:15;1406:87:5;;;13467:21:15;13524:2;13504:18;;;13497:30;13563:34;13543:18;;;13536:62;13634:13;13614:18;;;13607:41;13665:19;;1406:87:5;13283:407:15;1406:87:5;-1:-1:-1;;;;;;1510:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;2481:112:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;2560:28:2;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2481:112:::0;:::o;3444:1200::-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;11476:2:15;2317:63:13;;;11458:21:15;11515:2;11495:18;;;11488:30;11554:33;11534:18;;;11527:61;11605:18;;2317:63:13;11274:355:15;2317:63:13;1744:1;2455:7;:18;3561:28:2::1;::::0;;-1:-1:-1;;3578:10:2::1;13844:2:15::0;13840:15;13836:53;3561:28:2::1;::::0;;::::1;13824:66:15::0;;;;3561:28:2;;;;;;;;;13906:12:15;;;;3561:28:2;;;3551:39;;;::::1;::::0;3620:16:::1;::::0;3658:9:::1;::::0;3682:20:::1;::::0;::::1;::::0;::::1;;;3674:57;;;::::0;-1:-1:-1;;;3674:57:2;;14131:2:15;3674:57:2::1;::::0;::::1;14113:21:15::0;14170:2;14150:18;;;14143:30;14209:26;14189:18;;;14182:54;14253:18;;3674:57:2::1;13929:348:15::0;3674:57:2::1;377:3;3745:13;:30;3737:52;;;::::0;-1:-1:-1;;;3737:52:2;;12186:2:15;3737:52:2::1;::::0;::::1;12168:21:15::0;12225:1;12205:18;;;12198:29;-1:-1:-1;;;12243:18:15;;;12236:39;12292:18;;3737:52:2::1;11984:332:15::0;3737:52:2::1;3803:50;3822:12;;3803:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;3836:10:2::1;::::0;;-1:-1:-1;3848:4:2;;-1:-1:-1;3803:18:2::1;:50::i;:::-;3795:78;;;::::0;-1:-1:-1;;;3795:78:2;;14484:2:15;3795:78:2::1;::::0;::::1;14466:21:15::0;14523:2;14503:18;;;14496:30;14562:17;14542:18;;;14535:45;14597:18;;3795:78:2::1;14282:339:15::0;3795:78:2::1;3917:11;::::0;3903:10:::1;3887:27;::::0;;;:15:::1;:27;::::0;;;;;:41:::1;3879:82;;;::::0;-1:-1:-1;;;3879:82:2;;14828:2:15;3879:82:2::1;::::0;::::1;14810:21:15::0;14867:2;14847:18;;;14840:30;14906;14886:18;;;14879:58;14954:18;;3879:82:2::1;14626:352:15::0;3879:82:2::1;3988:5;3975:9;:18;;3967:47;;;::::0;-1:-1:-1;;;3967:47:2;;12523:2:15;3967:47:2::1;::::0;::::1;12505:21:15::0;12562:2;12542:18;;;12535:30;12601:18;12581;;;12574:46;12637:18;;3967:47:2::1;12321:340:15::0;3967:47:2::1;4021:13;4037:17;4049:5:::0;4037:9:::1;:17;:::i;:::-;4021:33:::0;-1:-1:-1;4060:17:2::1;4080:30;4097:13:::0;377:3:::1;4080:30;:::i;:::-;4168:10;4116:19;4152:27:::0;;;:15:::1;:27;::::0;;;;;4138:11:::1;::::0;4060:50;;-1:-1:-1;4116:19:2;;4138:41:::1;::::0;4152:27;4138:41:::1;:::i;:::-;4116:63;;4210:11;4198:9;:23;:49;;4238:9;4198:49;;;4224:11;4198:49;4185:63;;4271:9;4263:5;:17;:37;;4295:5;4263:37;;;4283:9;4263:37;4323:10;4307:27;::::0;;;:15:::1;:27;::::0;;;;:36;;4254:47;;-1:-1:-1;4254:47:2;;4307:27;;;:36:::1;::::0;4254:47;;4307:36:::1;:::i;:::-;::::0;;;-1:-1:-1;4355:9:2::1;::::0;-1:-1:-1;4350:95:2::1;4374:5;4370:1;:9;4350:95;;;4394:44;4404:10;4416:17;4432:1:::0;4416:13;:17:::1;:::i;4394:44::-;4381:3:::0;::::1;::::0;::::1;:::i;:::-;;;;4350:95;;;-1:-1:-1::0;4465:10:2::1;4451:25;::::0;;;:13:::1;:25;::::0;;;;:34;;4480:5;;4451:25;:34:::1;::::0;4480:5;;4451:34:::1;:::i;:::-;;;;;;;;4511:5;4491:16;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;4523:14:2::1;::::0;-1:-1:-1;4553:13:2::1;4561:5:::0;4553;:13:::1;:::i;:::-;4540:27;::::0;:9:::1;:27;:::i;:::-;4523:44:::0;-1:-1:-1;4577:10:2;;4573:67:::1;;4597:36;::::0;4605:10:::1;::::0;4597:36;::::1;;;::::0;4626:6;;4597:36:::1;::::0;;;4626:6;4605:10;4597:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;4573:67;-1:-1:-1::0;;1701:1:13;2628:7;:22;-1:-1:-1;;;;;;;3444:1200:2:o;1946:97::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;2018:11:2::1;:20:::0;1946:97::o;10502:101::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;10547:51:2::1;::::0;10555:10:::1;::::0;10576:21:::1;10547:51:::0;::::1;;;::::0;::::1;::::0;;;10576:21;10555:10;10547:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;10502:101::o:0;9941:263::-;10035:29;10053:5;10060:3;10035:17;:29::i;:::-;377:3;10074:8;:26;10070:78;;10110:31;10130:5;10137:3;10110:19;:31::i;:::-;10154:45;10178:5;10185:3;10190:8;10154:23;:45::i;1744:108::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;1818:16:2::1;:29:::0;;-1:-1:-1;;;;;;1818:29:2::1;-1:-1:-1::0;;;;;1818:29:2;;;::::1;::::0;;;::::1;::::0;;1744:108::o;1797:230:5:-;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:5;;15185:2:15;1891:95:5;;;15167:21:15;15224:2;15204:18;;;15197:30;15263:34;15243:18;;;15236:62;15334:14;15314:18;;;15307:42;15366:19;;1891:95:5;14983:408:15;1891:95:5;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;2111:235:4:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:4;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:4;;15787:2:15;2244:73:4;;;15769:21:15;15826:2;15806:18;;;15799:30;15865:34;15845:18;;;15838:62;15936:11;15916:18;;;15909:39;15965:19;;2244:73:4;15585:405:15;1849:205:4;1921:7;-1:-1:-1;;;;;1948:19:4;;1940:74;;;;-1:-1:-1;;;1940:74:4;;16197:2:15;1940:74:4;;;16179:21:15;16236:2;16216:18;;;16209:30;16275:34;16255:18;;;16248:62;16346:12;16326:18;;;16319:40;16376:19;;1940:74:4;15995:406:15;1940:74:4;-1:-1:-1;;;;;;2031:16:4;;;;;:9;:16;;;;;;;1849:205::o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1642:98:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;1711:10:2::1;:24:::0;1642:98::o;2149:103::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;2219:17:2::1;:28:::0;;-1:-1:-1;;2219:28:2::1;::::0;::::1;;::::0;;;::::1;::::0;;2149:103::o;6537:731::-;6601:16;6619;6643:18;6664:17;6674:6;6664:9;:17::i;:::-;-1:-1:-1;;;;;6708:21:2;;6687:18;6708:21;;;:13;:21;;;;;;6643:38;;-1:-1:-1;6760:23:2;6708:21;6643:38;6760:23;:::i;:::-;6735:48;;6789:25;6831:10;6817:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6817:25:2;;6789:53;;6848:29;6894:14;6880:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6880:29:2;;6848:61;;6916:16;6942:20;6977:9;6972:254;6996:10;6992:1;:14;6972:254;;;7021:15;7039:30;7059:6;7067:1;7039:19;:30::i;:::-;7021:48;;377:3;7081:7;:25;7077:143;;7141:7;7118:8;7127:10;;;;:::i;:::-;;;7118:20;;;;;;;;:::i;:::-;;;;;;:30;;;;;7077:143;;;7204:7;7173:12;7186:14;;;;:::i;:::-;;;7173:28;;;;;;;;:::i;:::-;;;;;;:38;;;;;7077:143;-1:-1:-1;7008:3:2;;;;:::i;:::-;;;;6972:254;;;-1:-1:-1;7240:8:2;;7250:12;;-1:-1:-1;6537:731:2;;-1:-1:-1;;;;;;;6537:731:2:o;2369:108::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;2446:26:2;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;9238:440::-:0;9303:7;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;11476:2:15;2317:63:13;;;11458:21:15;11515:2;11495:18;;;11488:30;11554:33;11534:18;;;11527:61;11605:18;;2317:63:13;11274:355:15;2317:63:13;1744:1;2455:7;:18;9340:15:2::1;::::0;-1:-1:-1;;;;;9340:15:2::1;9326:10;:29;9318:56;;;::::0;-1:-1:-1;;;9318:56:2;;16608:2:15;9318:56:2::1;::::0;::::1;16590:21:15::0;16647:2;16627:18;;;16620:30;16686:16;16666:18;;;16659:44;16720:18;;9318:56:2::1;16406:338:15::0;9318:56:2::1;9380:16;9436:28;9457:6;9436:20;:28::i;:::-;-1:-1:-1::0;;;;;9399:34:2;::::1;;::::0;;;:26:::1;:34;::::0;;;;;:65:::1;::::0;;::::1;:::i;:::-;9380:84:::0;-1:-1:-1;9523:12:2;;9519:133:::1;;9581:18;:16;:18::i;:::-;-1:-1:-1::0;;;;;9545:33:2;::::1;;::::0;;;:25:::1;:33;::::0;;;;;;;:54;;;;9607:26:::1;:34:::0;;;;;:38;9519:133:::1;1701:1:13::0;2628:7;:22;9665:8:2;9238:440;-1:-1:-1;;9238:440:2:o;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;5465:969:2:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;11476:2:15;2317:63:13;;;11458:21:15;11515:2;11495:18;;;11488:30;11554:33;11534:18;;;11527:61;11605:18;;2317:63:13;11274:355:15;2317:63:13;1744:1;2455:7;:18;5569:16:2::1;::::0;-1:-1:-1;;;;;5569:16:2::1;5561:60;;;::::0;-1:-1:-1;;;5561:60:2;;16951:2:15;5561:60:2::1;::::0;::::1;16933:21:15::0;16990:2;16970:18;;;16963:30;17029:19;17009:18;;;17002:47;17066:18;;5561:60:2::1;16749:341:15::0;5561:60:2::1;5649:16;::::0;-1:-1:-1;;;;;5649:16:2::1;5635:10;:30;5627:57;;;::::0;-1:-1:-1;;;5627:57:2;;16608:2:15;5627:57:2::1;::::0;::::1;16590:21:15::0;16647:2;16627:18;;;16620:30;16686:16;16666:18;;;16659:44;16720:18;;5627:57:2::1;16406:338:15::0;5627:57:2::1;5718:1;5698:21:::0;::::1;5690:51;;;::::0;-1:-1:-1;;;5690:51:2;;17297:2:15;5690:51:2::1;::::0;::::1;17279:21:15::0;17336:2;17316:18;;;17309:30;17375:19;17355:18;;;17348:47;17412:18;;5690:51:2::1;17095:341:15::0;5690:51:2::1;5748:13;5764:21;5772:9;;5782:1;5772:12;;;;;;;:::i;:::-;;;;;;;5764:7;:21::i;:::-;5748:37;;5872:36;5890:5;5905:1;5872:17;:36::i;:::-;5920:9;5915:81;5935:20:::0;;::::1;5915:81;;;5970:19;5976:9;;5986:1;5976:12;;;;;;;:::i;:::-;;;;;;;5970:5;:19::i;:::-;5957:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5915:81;;;-1:-1:-1::0;;;;;;6002:20:2;::::1;;::::0;;;:13:::1;:20;::::0;;;;:25;;6026:1:::1;::::0;6002:20;:25:::1;::::0;6026:1;;6002:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;6033:14:2::1;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;6130:23;6173:14;;377:3;6156:31;;;;:::i;:::-;6193:28;::::0;;;:11:::1;:28;::::0;;;;:41;;;6130:57;-1:-1:-1;6240:33:2::1;6250:5:::0;6130:57;6240:9:::1;:33::i;:::-;6414:15;::::0;-1:-1:-1;;;;;6377:33:2;::::1;;::::0;;;:26:::1;:33;::::0;;;;:52;;:33;;;:52:::1;::::0;6414:15;;6377:52:::1;:::i;:::-;::::0;;;-1:-1:-1;;1701:1:13;2628:7;:22;-1:-1:-1;;;;;5465:969:2:o;4203:153:4:-;4297:52;719:10:1;4330:8:4;4340;4297:18;:52::i;2256:109:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;2329:20:2::1;:31:::0;;;::::1;;;;-1:-1:-1::0;;2329:31:2;;::::1;::::0;;;::::1;::::0;;2256:109::o;10208:290::-;10322:29;10340:5;10347:3;10322:17;:29::i;:::-;377:3;10361:8;:26;10357:78;;10397:31;10417:5;10424:3;10397:19;:31::i;:::-;10441:52;10465:5;10472:3;10477:8;10487:5;10441:23;:52::i;:::-;10208:290;;;;:::o;2597:479::-;7144:4:4;7167:16;;;:7;:16;;;;;;2663:13:2;;-1:-1:-1;;;;;7167:16:4;2684:61:2;;;;-1:-1:-1;;;2684:61:2;;17643:2:15;2684:61:2;;;17625:21:15;17682:2;17662:18;;;17655:30;17721:33;17701:18;;;17694:61;17772:18;;2684:61:2;17441:355:15;2684:61:2;377:3;2812:8;:25;2808:141;;;2909:21;;;;:11;:21;;;;;;2878:12;;2892:46;;2909:28;;2933:4;2909:28;:::i;:::-;2892:16;:46::i;:::-;2861:78;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2847:93;;2597:479;;;:::o;2808:141::-;3029:12;3043:26;3060:8;3043:16;:26::i;786:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9110:124::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;9192:24:2::1;:37:::0;9110:124::o;757:25::-;;;;;;;:::i;2047:98::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;2116:15:2::1;:24:::0;2047:98::o;1911:198:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;19555:2:15;1991:73:12::1;::::0;::::1;19537:21:15::0;19594:2;19574:18;;;19567:30;19633:34;19613:18;;;19606:62;19704:8;19684:18;;;19677:36;19730:19;;1991:73:12::1;19353:402:15::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;1856:86:2:-:0;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;10306:2:15;1233:68:12;;;10288:21:15;;;10325:18;;;10318:30;-1:-1:-1;;;;;;;;;;;10364:18:15;;;10357:62;10436:18;;1233:68:12;10104:356:15;1233:68:12;1919:9:2::1;:18:::0;1856:86::o;1490:300:4:-;1592:4;-1:-1:-1;;;;;;1627:40:4;;1642:25;1627:40;;:104;;-1:-1:-1;;;;;;;1683:48:4;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;952:25:3;-1:-1:-1;;;;;;937:40:3;;;1747:36:4;829:155:3;10930:171:4;11004:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11004:29:4;-1:-1:-1;;;;;11004:29:4;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;-1:-1:-1;;;;;11048:46:4;;;;;;;;;;;10930:171;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;8330:571:2:-;8400:12;8415:18;:16;:18::i;:::-;8400:33;-1:-1:-1;;;;;;8444:19:2;;;8440:230;;8473:18;8494:27;8515:5;8494:20;:27::i;:::-;8473:48;-1:-1:-1;8533:14:2;;8529:135;;-1:-1:-1;;;;;8559:33:2;;;;;;:26;:33;;;;;:47;;8596:10;;8559:33;:47;;8596:10;;8559:47;:::i;:::-;;;;-1:-1:-1;;;;;;;8616:32:2;;;;;;:25;:32;;;;;:39;;;8529:135;8465:205;8440:230;-1:-1:-1;;;;;8679:17:2;;;8675:222;;8706:18;8727:25;8748:3;8727:20;:25::i;:::-;8706:46;-1:-1:-1;8764:14:2;;8760:131;;-1:-1:-1;;;;;8790:31:2;;;;;;:26;:31;;;;;:45;;8825:10;;8790:31;:45;;8825:10;;8790:45;:::i;:::-;;;;-1:-1:-1;;;;;;;;8845:30:2;;;;;;;;:25;:30;;;;;:37;-1:-1:-1;8330:571:2:o;8905:201::-;-1:-1:-1;;;;;8981:19:2;;;8977:62;;-1:-1:-1;;;;;9010:20:2;;;;;;:13;:20;;;;;:22;;;;;;:::i;:::-;;;;;;8977:62;-1:-1:-1;;;;;9048:17:2;;;9044:58;;-1:-1:-1;;;;;9075:18:2;;;;;;:13;:18;;;;;:20;;;;;;:::i;:::-;;;;;;8905:201;;:::o;4646:330:4:-;4835:41;719:10:1;4868:7:4;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:4;;20103:2:15;4827:103:4;;;20085:21:15;20142:2;20122:18;;;20115:30;20181:34;20161:18;;;20154:62;20252:19;20232:18;;;20225:47;20289:19;;4827:103:4;19901:413:15;4827:103:4;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;847:184:11:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:11:o;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;7714:612:2:-;7783:7;7798:12;7813:18;:16;:18::i;:::-;-1:-1:-1;;;;;7863:33:2;;7837:23;7863:33;;;:25;:33;;;;;;7798;;-1:-1:-1;7907:22:2;;;7903:404;;;8036:15;8055:22;8062:15;8055:4;:22;:::i;:::-;-1:-1:-1;;;;;8109:21:2;;8086:20;8109:21;;;:13;:21;;;;;;8036:42;;-1:-1:-1;8109:21:2;8165:17;8123:6;8165:9;:17::i;:::-;:32;;;;:::i;:::-;8284:15;;8138:59;;-1:-1:-1;8255:26:2;8274:7;8138:59;8255:26;:::i;:::-;:44;;;;:::i;:::-;8239:11;;8214:22;8229:7;8214:12;:22;:::i;:::-;:36;;;;:::i;:::-;8213:87;;;;:::i;:::-;8206:94;7714:612;-1:-1:-1;;;;;;;7714:612:2:o;7903:404::-;-1:-1:-1;8320:1:2;;7714:612;-1:-1:-1;;;7714:612:2:o;7272:438::-;7356:24;;7323:7;;7406:15;7514:12;;;:35;;;7542:7;7530:9;:19;7514:35;7510:64;;;7566:1;7559:8;;;;7272:438;:::o;7510:64::-;7694:7;7671:19;7683:7;7671:9;:19;:::i;:::-;7670:31;;;;:::i;:::-;:35;;7704:1;7670:35;:::i;:::-;7663:42;;;;7272:438;:::o;9587:348:4:-;9646:13;9662:23;9677:7;9662:14;:23::i;:::-;9646:39;;9696:48;9717:5;9732:1;9736:7;9696:20;:48::i;:::-;9782:29;9799:1;9803:7;9782:8;:29::i;:::-;-1:-1:-1;;;;;9822:16:4;;;;;;:9;:16;;;;;:21;;9842:1;;9822:16;:21;;9842:1;;9822:21;:::i;:::-;;;;-1:-1:-1;;9860:16:4;;;;:7;:16;;;;;;9853:23;;-1:-1:-1;;;;;;9853:23:4;;;9892:36;9868:7;;9860:16;-1:-1:-1;;;;;9892:36:4;;;;;9860:16;;9892:36;9636:299;9587:348;:::o;11236:307::-;11386:8;-1:-1:-1;;;;;11377:17:4;:5;-1:-1:-1;;;;;11377:17:4;;;11369:55;;;;-1:-1:-1;;;11369:55:4;;20521:2:15;11369:55:4;;;20503:21:15;20560:2;20540:18;;;20533:30;20599:27;20579:18;;;20572:55;20644:18;;11369:55:4;20319:349:15;11369:55:4;-1:-1:-1;;;;;11434:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11434:46:4;;;;;;;;;;11495:41;;586::15;;;11495::4;;559:18:15;11495:41:4;;;;;;;11236:307;;;:::o;5287:320::-;5456:41;719:10:1;5489:7:4;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:4;;20103:2:15;5448:103:4;;;20085:21:15;20142:2;20122:18;;;20115:30;20181:34;20161:18;;;20154:62;20252:19;20232:18;;;20225:47;20289:19;;5448:103:4;19901:413:15;5448:103:4;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:14;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:14:o;8365:311:4:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:4;;20992:2:15;8518:151:4;;;20974:21:15;21031:2;21011:18;;;21004:30;21070:34;21050:18;;;21043:62;-1:-1:-1;;;21121:18:15;;;21114:48;21179:19;;8518:151:4;20790:414:15;7362:344:4;7455:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:4;7471:73;;;;-1:-1:-1;;;7471:73:4;;21411:2:15;7471:73:4;;;21393:21:15;21450:2;21430:18;;;21423:30;21489:34;21469:18;;;21462:62;-1:-1:-1;;;21540:18:15;;;21533:42;21592:19;;7471:73:4;21209:408:15;7471:73:4;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:4;:7;-1:-1:-1;;;;;7611:16:4;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:4;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:4;;7611:51;:87;;;-1:-1:-1;;;;;;4542:25:4;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7666:32;4422:162;10259:560;10413:4;-1:-1:-1;;;;;10386:31:4;:23;10401:7;10386:14;:23::i;:::-;-1:-1:-1;;;;;10386:31:4;;10378:85;;;;-1:-1:-1;;;10378:85:4;;21824:2:15;10378:85:4;;;21806:21:15;21863:2;21843:18;;;21836:30;21902:34;21882:18;;;21875:62;21973:11;21953:18;;;21946:39;22002:19;;10378:85:4;21622:405:15;10378:85:4;-1:-1:-1;;;;;10481:16:4;;10473:65;;;;-1:-1:-1;;;10473:65:4;;22234:2:15;10473:65:4;;;22216:21:15;22273:2;22253:18;;;22246:30;22312:34;22292:18;;;22285:62;22383:6;22363:18;;;22356:34;22407:19;;10473:65:4;22032:400:15;10473:65:4;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;-1:-1:-1;;;;;10690:15:4;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10720:13:4;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10748:21:4;-1:-1:-1;;;;;10748:21:4;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;1383:688:11:-;1466:7;1508:4;1466:7;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1779:44;;;;;;22594:19:15;;;22629:12;;;22622:28;;;22666:12;;1779:44:11;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;22594:19:15;;;22629:12;;;22622:28;;;22666:12;;1966:44:11;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:11;;;;:::i;:::-;;;;1522:514;;;-1:-1:-1;2052:12:11;1383:688;-1:-1:-1;;;1383:688:11:o;2623:572:5:-;-1:-1:-1;;;;;2822:18:5;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:5;:4;-1:-1:-1;;;;;2917:10:5;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:5;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;-1:-1:-1;;;;;3112:10:5;:2;-1:-1:-1;;;;;3112:10:5;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;6469:307:4:-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:4;;20992:2:15;6658:111:4;;;20974:21:15;21031:2;21011:18;;;21004:30;21070:34;21050:18;;;21043:62;-1:-1:-1;;;21121:18:15;;;21114:48;21179:19;;6658:111:4;20790:414:15;8998:372:4;-1:-1:-1;;;;;9077:16:4;;9069:61;;;;-1:-1:-1;;;9069:61:4;;22891:2:15;9069:61:4;;;22873:21:15;;;22910:18;;;22903:30;22969:34;22949:18;;;22942:62;23021:18;;9069:61:4;22689:356:15;9069:61:4;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:4;:30;9140:58;;;;-1:-1:-1;;;9140:58:4;;23252:2:15;9140:58:4;;;23234:21:15;23291:2;23271:18;;;23264:30;23330;23310:18;;;23303:58;23378:18;;9140:58:4;23050:352:15;9140:58:4;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;-1:-1:-1;;;;;9265:13:4;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9293:21:4;-1:-1:-1;;;;;9293:21:4;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;12096:778::-;12246:4;-1:-1:-1;;;;;12266:13:4;;1087:20:0;1133:8;12262:606:4;;12301:72;;-1:-1:-1;;;12301:72:4;;-1:-1:-1;;;;;12301:36:4;;;;;:72;;719:10:1;;12352:4:4;;12358:7;;12367:5;;12301:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:4;;;;;;;;-1:-1:-1;;12301:72:4;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:4;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:4;;20992:2:15;12582:60:4;;;20974:21:15;21031:2;21011:18;;;21004:30;21070:34;21050:18;;;21043:62;-1:-1:-1;;;21121:18:15;;;21114:48;21179:19;;12582:60:4;20790:414:15;12536:266:4;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;-1:-1:-1;;;;;;12423:51:4;-1:-1:-1;;;12423:51:4;;-1:-1:-1;12416:58:4;;12262:606;-1:-1:-1;12853:4:4;12096:778;;;;;;:::o;4679:970:5:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:5;;;5149:323;;-1:-1:-1;;;;;5219:18:5;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:5;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:5;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:5;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:5:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:15;-1:-1:-1;;;;;;92:5:15;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:15:o;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:15;868:16;;861:27;638:258::o;901:269::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1152:2;1131:15;-1:-1:-1;;1127:29:15;1118:39;;;;1159:4;1114:50;;901:269;-1:-1:-1;;901:269:15:o;1175:231::-;1324:2;1313:9;1306:21;1287:4;1344:56;1396:2;1385:9;1381:18;1373:6;1344:56;:::i;1411:180::-;1470:6;1523:2;1511:9;1502:7;1498:23;1494:32;1491:52;;;1539:1;1536;1529:12;1491:52;-1:-1:-1;1562:23:15;;1411:180;-1:-1:-1;1411:180:15:o;1827:196::-;1895:20;;-1:-1:-1;;;;;1944:54:15;;1934:65;;1924:93;;2013:1;2010;2003:12;1924:93;1827:196;;;:::o;2028:254::-;2096:6;2104;2157:2;2145:9;2136:7;2132:23;2128:32;2125:52;;;2173:1;2170;2163:12;2125:52;2196:29;2215:9;2196:29;:::i;:::-;2186:39;2272:2;2257:18;;;;2244:32;;-1:-1:-1;;;2028:254:15:o;2469:328::-;2546:6;2554;2562;2615:2;2603:9;2594:7;2590:23;2586:32;2583:52;;;2631:1;2628;2621:12;2583:52;2654:29;2673:9;2654:29;:::i;:::-;2644:39;;2702:38;2736:2;2725:9;2721:18;2702:38;:::i;:::-;2692:48;;2787:2;2776:9;2772:18;2759:32;2749:42;;2469:328;;;;;:::o;2984:184::-;-1:-1:-1;;;3033:1:15;3026:88;3133:4;3130:1;3123:15;3157:4;3154:1;3147:15;3173:632;3238:5;3268:18;3309:2;3301:6;3298:14;3295:40;;;3315:18;;:::i;:::-;3390:2;3384:9;3358:2;3444:15;;-1:-1:-1;;3440:24:15;;;3466:2;3436:33;3432:42;3420:55;;;3490:18;;;3510:22;;;3487:46;3484:72;;;3536:18;;:::i;:::-;3576:10;3572:2;3565:22;3605:6;3596:15;;3635:6;3627;3620:22;3675:3;3666:6;3661:3;3657:16;3654:25;3651:45;;;3692:1;3689;3682:12;3651:45;3742:6;3737:3;3730:4;3722:6;3718:17;3705:44;3797:1;3790:4;3781:6;3773;3769:19;3765:30;3758:41;;;;3173:632;;;;;:::o;3810:451::-;3879:6;3932:2;3920:9;3911:7;3907:23;3903:32;3900:52;;;3948:1;3945;3938:12;3900:52;3988:9;3975:23;4021:18;4013:6;4010:30;4007:50;;;4053:1;4050;4043:12;4007:50;4076:22;;4129:4;4121:13;;4117:27;-1:-1:-1;4107:55:15;;4158:1;4155;4148:12;4107:55;4181:74;4247:7;4242:2;4229:16;4224:2;4220;4216:11;4181:74;:::i;4266:367::-;4329:8;4339:6;4393:3;4386:4;4378:6;4374:17;4370:27;4360:55;;4411:1;4408;4401:12;4360:55;-1:-1:-1;4434:20:15;;4477:18;4466:30;;4463:50;;;4509:1;4506;4499:12;4463:50;4546:4;4538:6;4534:17;4522:29;;4606:3;4599:4;4589:6;4586:1;4582:14;4574:6;4570:27;4566:38;4563:47;4560:67;;;4623:1;4620;4613:12;4560:67;4266:367;;;;;:::o;4638:437::-;4724:6;4732;4785:2;4773:9;4764:7;4760:23;4756:32;4753:52;;;4801:1;4798;4791:12;4753:52;4841:9;4828:23;4874:18;4866:6;4863:30;4860:50;;;4906:1;4903;4896:12;4860:50;4945:70;5007:7;4998:6;4987:9;4983:22;4945:70;:::i;:::-;5034:8;;4919:96;;-1:-1:-1;4638:437:15;-1:-1:-1;;;;4638:437:15:o;5080:186::-;5139:6;5192:2;5180:9;5171:7;5167:23;5163:32;5160:52;;;5208:1;5205;5198:12;5160:52;5231:29;5250:9;5231:29;:::i;5456:160::-;5521:20;;5577:13;;5570:21;5560:32;;5550:60;;5606:1;5603;5596:12;5621:180;5677:6;5730:2;5718:9;5709:7;5705:23;5701:32;5698:52;;;5746:1;5743;5736:12;5698:52;5769:26;5785:9;5769:26;:::i;5806:435::-;5859:3;5897:5;5891:12;5924:6;5919:3;5912:19;5950:4;5979:2;5974:3;5970:12;5963:19;;6016:2;6009:5;6005:14;6037:1;6047:169;6061:6;6058:1;6055:13;6047:169;;;6122:13;;6110:26;;6156:12;;;;6191:15;;;;6083:1;6076:9;6047:169;;;-1:-1:-1;6232:3:15;;5806:435;-1:-1:-1;;;;;5806:435:15:o;6246:465::-;6503:2;6492:9;6485:21;6466:4;6529:56;6581:2;6570:9;6566:18;6558:6;6529:56;:::i;:::-;6633:9;6625:6;6621:22;6616:2;6605:9;6601:18;6594:50;6661:44;6698:6;6690;6661:44;:::i;:::-;6653:52;6246:465;-1:-1:-1;;;;;6246:465:15:o;6716:505::-;6811:6;6819;6827;6880:2;6868:9;6859:7;6855:23;6851:32;6848:52;;;6896:1;6893;6886:12;6848:52;6932:9;6919:23;6909:33;;6993:2;6982:9;6978:18;6965:32;7020:18;7012:6;7009:30;7006:50;;;7052:1;7049;7042:12;7006:50;7091:70;7153:7;7144:6;7133:9;7129:22;7091:70;:::i;:::-;6716:505;;7180:8;;-1:-1:-1;7065:96:15;;-1:-1:-1;;;;6716:505:15:o;7226:254::-;7291:6;7299;7352:2;7340:9;7331:7;7327:23;7323:32;7320:52;;;7368:1;7365;7358:12;7320:52;7391:29;7410:9;7391:29;:::i;:::-;7381:39;;7439:35;7470:2;7459:9;7455:18;7439:35;:::i;:::-;7429:45;;7226:254;;;;;:::o;7485:667::-;7580:6;7588;7596;7604;7657:3;7645:9;7636:7;7632:23;7628:33;7625:53;;;7674:1;7671;7664:12;7625:53;7697:29;7716:9;7697:29;:::i;:::-;7687:39;;7745:38;7779:2;7768:9;7764:18;7745:38;:::i;:::-;7735:48;;7830:2;7819:9;7815:18;7802:32;7792:42;;7885:2;7874:9;7870:18;7857:32;7912:18;7904:6;7901:30;7898:50;;;7944:1;7941;7934:12;7898:50;7967:22;;8020:4;8012:13;;8008:27;-1:-1:-1;7998:55:15;;8049:1;8046;8039:12;7998:55;8072:74;8138:7;8133:2;8120:16;8115:2;8111;8107:11;8072:74;:::i;:::-;8062:84;;;7485:667;;;;;;;:::o;8157:260::-;8225:6;8233;8286:2;8274:9;8265:7;8261:23;8257:32;8254:52;;;8302:1;8299;8292:12;8254:52;8325:29;8344:9;8325:29;:::i;:::-;8315:39;;8373:38;8407:2;8396:9;8392:18;8373:38;:::i;8422:437::-;8501:1;8497:12;;;;8544;;;8565:61;;8619:4;8611:6;8607:17;8597:27;;8565:61;8672:2;8664:6;8661:14;8641:18;8638:38;8635:218;;;-1:-1:-1;;;8706:1:15;8699:88;8810:4;8807:1;8800:15;8838:4;8835:1;8828:15;8635:218;;8422:437;;;:::o;10465:184::-;-1:-1:-1;;;10514:1:15;10507:88;10614:4;10611:1;10604:15;10638:4;10635:1;10628:15;10654:128;10694:3;10725:1;10721:6;10718:1;10715:13;10712:39;;;10731:18;;:::i;:::-;-1:-1:-1;10767:9:15;;10654:128::o;11134:135::-;11173:3;-1:-1:-1;;11194:17:15;;11191:43;;;11214:18;;:::i;:::-;-1:-1:-1;11261:1:15;11250:13;;11134:135::o;12666:184::-;-1:-1:-1;;;12715:1:15;12708:88;12815:4;12812:1;12805:15;12839:4;12836:1;12829:15;12855:120;12895:1;12921;12911:35;;12926:18;;:::i;:::-;-1:-1:-1;12960:9:15;;12855:120::o;12980:125::-;13020:4;13048:1;13045;13042:8;13039:34;;;13053:18;;:::i;:::-;-1:-1:-1;13090:9:15;;12980:125::o;13110:168::-;13150:7;13216:1;13212;13208:6;13204:14;13201:1;13198:21;13193:1;13186:9;13179:17;13175:45;13172:71;;;13223:18;;:::i;:::-;-1:-1:-1;13263:9:15;;13110:168::o;15396:184::-;-1:-1:-1;;;15445:1:15;15438:88;15545:4;15542:1;15535:15;15569:4;15566:1;15559:15;17927:185;17969:3;18007:5;18001:12;18022:52;18067:6;18062:3;18055:4;18048:5;18044:16;18022:52;:::i;:::-;18090:16;;;;;17927:185;-1:-1:-1;;17927:185:15:o;18117:1231::-;18293:3;18322:1;18355:6;18349:13;18385:3;18407:1;18435:9;18431:2;18427:18;18417:28;;18495:2;18484:9;18480:18;18517;18507:61;;18561:4;18553:6;18549:17;18539:27;;18507:61;18587:2;18635;18627:6;18624:14;18604:18;18601:38;18598:222;;;-1:-1:-1;;;18669:3:15;18662:90;18775:4;18772:1;18765:15;18805:4;18800:3;18793:17;18598:222;18836:18;18863:104;;;;18981:1;18976:320;;;;18829:467;;18863:104;-1:-1:-1;;18896:24:15;;18884:37;;18941:16;;;;-1:-1:-1;18863:104:15;;18976:320;17874:1;17867:14;;;17911:4;17898:18;;19071:1;19085:165;19099:6;19096:1;19093:13;19085:165;;;19177:14;;19164:11;;;19157:35;19220:16;;;;19114:10;;19085:165;;;19089:3;;19279:6;19274:3;19270:16;19263:23;;18829:467;;;;;;;19312:30;19338:3;19330:6;19312:30;:::i;19760:136::-;19799:3;19827:5;19817:39;;19836:18;;:::i;:::-;-1:-1:-1;;;19872:18:15;;19760:136::o;20673:112::-;20705:1;20731;20721:35;;20736:18;;:::i;:::-;-1:-1:-1;20770:9:15;;20673:112::o;23407:523::-;23601:4;-1:-1:-1;;;;;23711:2:15;23703:6;23699:15;23688:9;23681:34;23763:2;23755:6;23751:15;23746:2;23735:9;23731:18;23724:43;;23803:6;23798:2;23787:9;23783:18;23776:34;23846:3;23841:2;23830:9;23826:18;23819:31;23867:57;23919:3;23908:9;23904:19;23896:6;23867:57;:::i;:::-;23859:65;23407:523;-1:-1:-1;;;;;;23407:523:15:o;23935:249::-;24004:6;24057:2;24045:9;24036:7;24032:23;24028:32;24025:52;;;24073:1;24070;24063:12;24025:52;24105:9;24099:16;24124:30;24148:5;24124:30;:::i;24189:184::-;-1:-1:-1;;;24238:1:15;24231:88;24338:4;24335:1;24328:15;24362:4;24359:1;24352:15

Swarm Source

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