ETH Price: $2,571.96 (-2.02%)

Token

Evil Geniuses (EGNFT)
 

Overview

Max Total Supply

11 EGNFT

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
investtony.eth
Balance
1 EGNFT
0xb8a6b2a4c492eb20686ac1706bc5a2548a9e4000
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:
EG

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 14: EG.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

contract EG is Ownable, ERC721Enumerable {
  using SafeMath for uint256;

  uint256 public constant presaleMintPrice = 0.033 ether;
  uint256 public constant saleMintPrice = 0.04 ether;
  
  
  uint256 public constant maxPerTransact = 5;
  
  
  uint256 public constant presalePerW = 50;
  
  
  uint256 public constant salePerW = 50;
  
  
  uint256 public constant _maxSupply = 4455;
  
  
  uint256 public constant presaleLimit = 2500;
  
  
  uint256 public constant marketingLimit = 200;
  
  uint256 public marketingTokenCounter;
  uint256 public presaleTokenCounter;
  
  bool public _preSaleIsActive = false;
  bool public _saleIsActive = false;

  string public baseURI;

  //wl
  mapping(address => bool) private _presaleWhitelist;

  address private creatorAddress = 0xc28036bb255840873cc530a4845617EC7939A042; //ceo
  address private devAddress = 0x2D72855b361E0ac011D28297aEaC4B83cFdD5877; //devShare

  modifier onlyPresaleWhitelist {
    require(_presaleWhitelist[msg.sender], "Not on presale whitelist");
    _;
  }

  constructor(string memory inputBaseUri) ERC721("Evil Geniuses", "EGNFT") { 
    baseURI = inputBaseUri;
  }

  function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }

  function setBaseURI(string calldata newBaseUri) external onlyOwner {
    baseURI = newBaseUri;
  }
  
  function setState(uint state) external onlyOwner {
    if(state == 0)
    {
        _preSaleIsActive = false;
        _saleIsActive = false;
    }
    else if(state == 1)
    {
        _preSaleIsActive = true;
        _saleIsActive = false;
    }
    else if(state == 2)
    {
        _preSaleIsActive = false;
        _saleIsActive = true;
    }
  }
  
  function isPreSaleActive() public view returns(bool) {
    return _preSaleIsActive;
  }
  
  function isSaleActive() public view returns(bool) {
    return _saleIsActive;
  }

  function addToWhitelist(address[] memory wallets) public onlyOwner {
    for(uint i = 0; i < wallets.length; i++) {
      _presaleWhitelist[wallets[i]] = true;
    }
  }

  function isOnWhitelist(address wallet) public view returns (bool) {
    return _presaleWhitelist[wallet];
  }

  function buyPresale(uint numberOfTokens) external payable {
    require(isPreSaleActive(), "Presale is not active");
    require(numberOfTokens <= maxPerTransact, "Too many tokens for one transaction");
    require(balanceOf(msg.sender) + numberOfTokens <= presalePerW, "Too many tokens for wallet");
    require(numberOfTokens + presaleTokenCounter <= presaleLimit, "Not enough tokens for presale");
    require(msg.value >= presaleMintPrice.mul(numberOfTokens), "Insufficient payment");

    presaleTokenCounter += numberOfTokens;
    _mintFactory(numberOfTokens);
  }

  function buy(uint numberOfTokens) external payable {
    require(isSaleActive(), "Sale is not active");
    require(numberOfTokens <= maxPerTransact, "Too many tokens for one transaction");
    require(balanceOf(msg.sender) + numberOfTokens <= salePerW, "Too many tokens for wallet");
    require(numberOfTokens <= (_maxSupply - totalSupply()) - (marketingLimit - marketingTokenCounter), "Not enough tokens for sale");
    require(msg.value >= saleMintPrice.mul(numberOfTokens), "Insufficient payment");

    _mintFactory(numberOfTokens);
  }
  
  /*dev mint*/
  function reserve(uint256 numberOfTokens) external onlyOwner {
    require(numberOfTokens + marketingTokenCounter <= marketingLimit, "Too many tokens for marketing minting");
    
    _mintFactory(numberOfTokens);
    marketingTokenCounter += numberOfTokens;
  }
  
  function buying(address wallet, uint256 numberOfTokens) external onlyOwner {
    _mintFactoryWrapper(wallet, numberOfTokens);
  }
  
  function _mintFactory(uint numberOfTokens) private {
   _mintFactoryWrapper(msg.sender, numberOfTokens);
  }
  
  function _mintFactoryWrapper(address wallet, uint numberOfTokens) private {
    require(totalSupply().add(numberOfTokens) <= _maxSupply, "Not enough tokens left");

    uint256 newId = totalSupply();
    for(uint i = 0; i < numberOfTokens; i++) {
      newId += 1;
      _safeMint(wallet, newId);
    }
  }

  //a
  function withdraw() external onlyOwner {
    require(address(this).balance > 0, "No balance to withdraw");
    
    uint devShare = address(this).balance.mul(5).div(100);

    (bool success, ) = devAddress.call{value: devShare}("");
    require(success, "Withdrawal failed");

    (success, ) = creatorAddress.call{value: address(this).balance}("");
    require(success, "Withdrawal failed");
  }
  
  //b
  function withdraw2() external onlyOwner {
    require(address(this).balance > 0, "No balance to withdraw");
    
    (bool success, ) = creatorAddress.call{value: address(this).balance}("");
    require(success, "Withdrawal failed");
  }
  
  //c
  function withdraw3(address wallet, uint amount) external onlyOwner {
    require(address(this).balance > 0, "No balance to withdraw");
    
    uint value = address(this).balance.mul(amount).div(100);
    
    (bool success, ) = wallet.call{value: value}("");
    require(success, "Withdrawal failed");
  }

  function tokensOwnedBy(address wallet) external view returns(uint256[] memory) {
    uint tokenCount = balanceOf(wallet);

    uint256[] memory ownedTokenIds = new uint256[](tokenCount);
    for(uint i = 0; i < tokenCount; i++){
      ownedTokenIds[i] = tokenOfOwnerByIndex(wallet, i);
    }
    return ownedTokenIds;
  }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 14: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 14: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 14: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked("ipfs://", baseURI, "/", tokenId.toString(), ".json")) : "";
    }

    /**
     * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

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

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

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.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 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 14: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"inputBaseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buyPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isOnWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTransact","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":"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":"presaleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePerW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserve","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":[],"name":"saleMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePerW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"state","type":"uint256"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"tokensOwnedBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw3","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff02191690831515021790555073c28036bb255840873cc530a4845617ec7939a042601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732d72855b361e0ac011d28297aeac4b83cfdd5877601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f157600080fd5b50604051620059f5380380620059f58339818101604052810190620001179190620003f1565b6040518060400160405280600d81526020017f4576696c2047656e6975736573000000000000000000000000000000000000008152506040518060400160405280600581526020017f45474e4654000000000000000000000000000000000000000000000000000000815250620001a362000197620001f760201b60201c565b620001ff60201b60201c565b8160019080519060200190620001bb929190620002c3565b508060029080519060200190620001d4929190620002c3565b50505080600e9080519060200190620001ef929190620002c3565b5050620005c6565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d190620004d7565b90600052602060002090601f016020900481019282620002f5576000855562000341565b82601f106200031057805160ff191683800117855562000341565b8280016001018555821562000341579182015b828111156200034057825182559160200191906001019062000323565b5b50905062000350919062000354565b5090565b5b808211156200036f57600081600090555060010162000355565b5090565b60006200038a62000384846200046b565b62000442565b905082815260208101848484011115620003a957620003a8620005a6565b5b620003b6848285620004a1565b509392505050565b600082601f830112620003d657620003d5620005a1565b5b8151620003e884826020860162000373565b91505092915050565b6000602082840312156200040a5762000409620005b0565b5b600082015167ffffffffffffffff8111156200042b576200042a620005ab565b5b6200043984828501620003be565b91505092915050565b60006200044e62000461565b90506200045c82826200050d565b919050565b6000604051905090565b600067ffffffffffffffff82111562000489576200048862000572565b5b6200049482620005b5565b9050602081019050919050565b60005b83811015620004c1578082015181840152602081019050620004a4565b83811115620004d1576000848401525b50505050565b60006002820490506001821680620004f057607f821691505b6020821081141562000507576200050662000543565b5b50919050565b6200051882620005b5565b810181811067ffffffffffffffff821117156200053a576200053962000572565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61541f80620005d66000396000f3fe60806040526004361061027d5760003560e01c8063715018a61161014f578063a22cb465116100c1578063d8c7a7971161007a578063d8c7a7971461097d578063d96a094a146109a8578063e985e9c5146109c4578063ea66aeb314610a01578063ea98847b14610a3e578063f2fde38b14610a555761027d565b8063a22cb46514610871578063a507f00f1461089a578063a9e966b7146108c5578063abcc5443146108ee578063b88d4fde14610917578063c87b56dd146109405761027d565b80638fd8927e116101135780638fd8927e14610771578063912946a51461079a578063931625d4146107c557806395d89b41146107f05780639be9c50d1461081b5780639d044ed3146108465761027d565b8063715018a6146106b25780637f649783146106c9578063819b25ba146106f257806381df6c9b1461071b5780638da5cb5b146107465761027d565b806342842e0e116101f35780635be50521116101ac5780635be505211461058c5780635d893ba0146105b75780636352211e146105e257806366ddf93f1461061f5780636c0360eb1461064a57806370a08231146106755761027d565b806342842e0e1461048b57806349c32217146104b45780634f6ccce7146104d0578063525b3fe31461050d57806355f804b314610538578063564566a8146105615761027d565b806318160ddd1161024557806318160ddd1461037b57806322f4596f146103a657806323b872dd146103d15780632f745c59146103fa5780633a3ab672146104375780633ccfd60b146104745761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806310db2c5b14610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613b89565b610a7e565b6040516102b69190614318565b60405180910390f35b3480156102cb57600080fd5b506102d4610af8565b6040516102e19190614333565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613c30565b610b8a565b60405161031e919061428f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613b00565b610c0f565b005b34801561035c57600080fd5b50610365610d27565b60405161037291906146f5565b60405180910390f35b34801561038757600080fd5b50610390610d2d565b60405161039d91906146f5565b60405180910390f35b3480156103b257600080fd5b506103bb610d3a565b6040516103c891906146f5565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f391906139ea565b610d40565b005b34801561040657600080fd5b50610421600480360381019061041c9190613b00565b610da0565b60405161042e91906146f5565b60405180910390f35b34801561044357600080fd5b5061045e6004803603810190610459919061397d565b610e45565b60405161046b9190614318565b60405180910390f35b34801561048057600080fd5b50610489610e9b565b005b34801561049757600080fd5b506104b260048036038101906104ad91906139ea565b611125565b005b6104ce60048036038101906104c99190613c30565b611145565b005b3480156104dc57600080fd5b506104f760048036038101906104f29190613c30565b6112fa565b60405161050491906146f5565b60405180910390f35b34801561051957600080fd5b5061052261136b565b60405161052f91906146f5565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613be3565b611371565b005b34801561056d57600080fd5b50610576611403565b6040516105839190614318565b60405180910390f35b34801561059857600080fd5b506105a161141a565b6040516105ae91906146f5565b60405180910390f35b3480156105c357600080fd5b506105cc611425565b6040516105d99190614318565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190613c30565b611438565b604051610616919061428f565b60405180910390f35b34801561062b57600080fd5b506106346114ea565b60405161064191906146f5565b60405180910390f35b34801561065657600080fd5b5061065f6114ef565b60405161066c9190614333565b60405180910390f35b34801561068157600080fd5b5061069c6004803603810190610697919061397d565b61157d565b6040516106a991906146f5565b60405180910390f35b3480156106be57600080fd5b506106c7611635565b005b3480156106d557600080fd5b506106f060048036038101906106eb9190613b40565b6116bd565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613c30565b6117ce565b005b34801561072757600080fd5b506107306118c0565b60405161073d91906146f5565b60405180910390f35b34801561075257600080fd5b5061075b6118c5565b604051610768919061428f565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613b00565b6118ee565b005b3480156107a657600080fd5b506107af611a89565b6040516107bc91906146f5565b60405180910390f35b3480156107d157600080fd5b506107da611a8e565b6040516107e791906146f5565b60405180910390f35b3480156107fc57600080fd5b50610805611a93565b6040516108129190614333565b60405180910390f35b34801561082757600080fd5b50610830611b25565b60405161083d91906146f5565b60405180910390f35b34801561085257600080fd5b5061085b611b30565b6040516108689190614318565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613ac0565b611b47565b005b3480156108a657600080fd5b506108af611cc8565b6040516108bc91906146f5565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e79190613c30565b611cce565b005b3480156108fa57600080fd5b5061091560048036038101906109109190613b00565b611e17565b005b34801561092357600080fd5b5061093e60048036038101906109399190613a3d565b611ea1565b005b34801561094c57600080fd5b5061096760048036038101906109629190613c30565b611f03565b6040516109749190614333565b60405180910390f35b34801561098957600080fd5b50610992611faa565b60405161099f9190614318565b60405180910390f35b6109c260048036038101906109bd9190613c30565b611fbd565b005b3480156109d057600080fd5b506109eb60048036038101906109e691906139aa565b612177565b6040516109f89190614318565b60405180910390f35b348015610a0d57600080fd5b50610a286004803603810190610a23919061397d565b61220b565b604051610a3591906142f6565b60405180910390f35b348015610a4a57600080fd5b50610a536122b9565b005b348015610a6157600080fd5b50610a7c6004803603810190610a77919061397d565b612449565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af15750610af082612541565b5b9050919050565b606060018054610b07906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b33906149e4565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b9582612623565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614555565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1a82611438565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c82906145f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610caa61268f565b73ffffffffffffffffffffffffffffffffffffffff161480610cd95750610cd881610cd361268f565b612177565b5b610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90614495565b60405180910390fd5b610d228383612697565b505050565b600c5481565b6000600980549050905090565b61116781565b610d51610d4b61268f565b82612750565b610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614615565b60405180910390fd5b610d9b83838361282e565b505050565b6000610dab8361157d565b8210610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614395565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610ea361268f565b73ffffffffffffffffffffffffffffffffffffffff16610ec16118c5565b73ffffffffffffffffffffffffffffffffffffffff1614610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90614575565b60405180910390fd5b60004711610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f51906145d5565b60405180910390fd5b6000610f836064610f75600547612a8a90919063ffffffff16565b612aa090919063ffffffff16565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610fcd9061427a565b60006040518083038185875af1925050503d806000811461100a576040519150601f19603f3d011682016040523d82523d6000602084013e61100f565b606091505b5050905080611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a906146b5565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110999061427a565b60006040518083038185875af1925050503d80600081146110d6576040519150601f19603f3d011682016040523d82523d6000602084013e6110db565b606091505b50508091505080611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906146b5565b60405180910390fd5b5050565b61114083838360405180602001604052806000815250611ea1565b505050565b61114d611b30565b61118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390614675565b60405180910390fd5b60058111156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790614355565b60405180910390fd5b6032816111dc3361157d565b6111e69190614819565b1115611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90614655565b60405180910390fd5b6109c4600c54826112389190614819565b1115611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090614375565b60405180910390fd5b6112938166753d533d968000612a8a90919063ffffffff16565b3410156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90614535565b60405180910390fd5b80600c60008282546112e79190614819565b925050819055506112f781612ab6565b50565b6000611304610d2d565b8210611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90614635565b60405180910390fd5b6009828154811061135957611358614b7d565b5b90600052602060002001549050919050565b6109c481565b61137961268f565b73ffffffffffffffffffffffffffffffffffffffff166113976118c5565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490614575565b60405180910390fd5b8181600e91906113fe92919061370d565b505050565b6000600d60019054906101000a900460ff16905090565b66753d533d96800081565b600d60019054906101000a900460ff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d8906144d5565b60405180910390fd5b80915050919050565b603281565b600e80546114fc906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611528906149e4565b80156115755780601f1061154a57610100808354040283529160200191611575565b820191906000526020600020905b81548152906001019060200180831161155857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906144b5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61163d61268f565b73ffffffffffffffffffffffffffffffffffffffff1661165b6118c5565b73ffffffffffffffffffffffffffffffffffffffff16146116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a890614575565b60405180910390fd5b6116bb6000612ac3565b565b6116c561268f565b73ffffffffffffffffffffffffffffffffffffffff166116e36118c5565b73ffffffffffffffffffffffffffffffffffffffff1614611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090614575565b60405180910390fd5b60005b81518110156117ca576001600f600084848151811061175e5761175d614b7d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806117c290614a47565b91505061173c565b5050565b6117d661268f565b73ffffffffffffffffffffffffffffffffffffffff166117f46118c5565b73ffffffffffffffffffffffffffffffffffffffff161461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184190614575565b60405180910390fd5b60c8600b548261185a9190614819565b111561189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906146d5565b60405180910390fd5b6118a481612ab6565b80600b60008282546118b69190614819565b9250508190555050565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118f661268f565b73ffffffffffffffffffffffffffffffffffffffff166119146118c5565b73ffffffffffffffffffffffffffffffffffffffff161461196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190614575565b60405180910390fd5b600047116119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a4906145d5565b60405180910390fd5b60006119d560646119c78447612a8a90919063ffffffff16565b612aa090919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff16826040516119fd9061427a565b60006040518083038185875af1925050503d8060008114611a3a576040519150601f19603f3d011682016040523d82523d6000602084013e611a3f565b606091505b5050905080611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a906146b5565b60405180910390fd5b50505050565b603281565b60c881565b606060028054611aa2906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ace906149e4565b8015611b1b5780601f10611af057610100808354040283529160200191611b1b565b820191906000526020600020905b815481529060010190602001808311611afe57829003601f168201915b5050505050905090565b668e1bc9bf04000081565b6000600d60009054906101000a900460ff16905090565b611b4f61268f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614435565b60405180910390fd5b8060066000611bca61268f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c7761268f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cbc9190614318565b60405180910390a35050565b600b5481565b611cd661268f565b73ffffffffffffffffffffffffffffffffffffffff16611cf46118c5565b73ffffffffffffffffffffffffffffffffffffffff1614611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190614575565b60405180910390fd5b6000811415611d8e576000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550611e14565b6001811415611dd2576001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550611e13565b6002811415611e12576000600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055505b5b5b50565b611e1f61268f565b73ffffffffffffffffffffffffffffffffffffffff16611e3d6118c5565b73ffffffffffffffffffffffffffffffffffffffff1614611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614575565b60405180910390fd5b611e9d8282612b87565b5050565b611eb2611eac61268f565b83612750565b611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614615565b60405180910390fd5b611efd84848484612c2e565b50505050565b6060611f0e82612623565b611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906145b5565b60405180910390fd5b6000611f57612c8a565b90506000815111611f775760405180602001604052806000815250611fa2565b80611f8184612d1c565b604051602001611f92929190614235565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b611fc5611403565b612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614455565b60405180910390fd5b6005811115612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f90614355565b60405180910390fd5b6032816120543361157d565b61205e9190614819565b111561209f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209690614655565b60405180910390fd5b600b5460c86120ae91906148fa565b6120b6610d2d565b6111676120c391906148fa565b6120cd91906148fa565b81111561210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614695565b60405180910390fd5b61212981668e1bc9bf040000612a8a90919063ffffffff16565b34101561216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216290614535565b60405180910390fd5b61217481612ab6565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060006122188361157d565b905060008167ffffffffffffffff81111561223657612235614bac565b5b6040519080825280602002602001820160405280156122645781602001602082028036833780820191505090505b50905060005b828110156122ae5761227c8582610da0565b82828151811061228f5761228e614b7d565b5b60200260200101818152505080806122a690614a47565b91505061226a565b508092505050919050565b6122c161268f565b73ffffffffffffffffffffffffffffffffffffffff166122df6118c5565b73ffffffffffffffffffffffffffffffffffffffff1614612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c90614575565b60405180910390fd5b60004711612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f906145d5565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516123c09061427a565b60006040518083038185875af1925050503d80600081146123fd576040519150601f19603f3d011682016040523d82523d6000602084013e612402565b606091505b5050905080612446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243d906146b5565b60405180910390fd5b50565b61245161268f565b73ffffffffffffffffffffffffffffffffffffffff1661246f6118c5565b73ffffffffffffffffffffffffffffffffffffffff16146124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90614575565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252c906143d5565b60405180910390fd5b61253e81612ac3565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061260c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061261c575061261b82612e7d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270a83611438565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061275b82612623565b61279a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279190614475565b60405180910390fd5b60006127a583611438565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281457508373ffffffffffffffffffffffffffffffffffffffff166127fc84610b8a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061282557506128248185612177565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284e82611438565b73ffffffffffffffffffffffffffffffffffffffff16146128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b90614595565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290b90614415565b60405180910390fd5b61291f838383612ee7565b61292a600082612697565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297a91906148fa565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129d19190614819565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a9891906148a0565b905092915050565b60008183612aae919061486f565b905092915050565b612ac03382612b87565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611167612ba482612b96610d2d565b612ffb90919063ffffffff16565b1115612be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdc906144f5565b60405180910390fd5b6000612bef610d2d565b905060005b82811015612c2857600182612c099190614819565b9150612c158483613011565b8080612c2090614a47565b915050612bf4565b50505050565b612c3984848461282e565b612c458484848461302f565b612c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7b906143b5565b60405180910390fd5b50505050565b6060600e8054612c99906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc5906149e4565b8015612d125780601f10612ce757610100808354040283529160200191612d12565b820191906000526020600020905b815481529060010190602001808311612cf557829003601f168201915b5050505050905090565b60606000821415612d64576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e78565b600082905060005b60008214612d96578080612d7f90614a47565b915050600a82612d8f919061486f565b9150612d6c565b60008167ffffffffffffffff811115612db257612db1614bac565b5b6040519080825280601f01601f191660200182016040528015612de45781602001600182028036833780820191505090505b5090505b60008514612e7157600182612dfd91906148fa565b9150600a85612e0c9190614a90565b6030612e189190614819565b60f81b818381518110612e2e57612e2d614b7d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e6a919061486f565b9450612de8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ef28383836131c6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f3557612f30816131cb565b612f74565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f7357612f728382613214565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fb757612fb281613381565b612ff6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ff557612ff48282613452565b5b5b505050565b600081836130099190614819565b905092915050565b61302b8282604051806020016040528060008152506134d1565b5050565b60006130508473ffffffffffffffffffffffffffffffffffffffff1661352c565b156131b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307961268f565b8786866040518563ffffffff1660e01b815260040161309b94939291906142aa565b602060405180830381600087803b1580156130b557600080fd5b505af19250505080156130e657506040513d601f19601f820116820180604052508101906130e39190613bb6565b60015b613169573d8060008114613116576040519150601f19603f3d011682016040523d82523d6000602084013e61311b565b606091505b50600081511415613161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613158906143b5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131be565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132218461157d565b61322b91906148fa565b9050600060086000848152602001908152602001600020549050818114613310576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061339591906148fa565b90506000600a60008481526020019081526020016000205490506000600983815481106133c5576133c4614b7d565b5b9060005260206000200154905080600983815481106133e7576133e6614b7d565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061343657613435614b4e565b5b6001900381819060005260206000200160009055905550505050565b600061345d8361157d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6134db838361353f565b6134e8600084848461302f565b613527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351e906143b5565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a690614515565b60405180910390fd5b6135b881612623565b156135f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ef906143f5565b60405180910390fd5b61360460008383612ee7565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136549190614819565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613719906149e4565b90600052602060002090601f01602090048101928261373b5760008555613782565b82601f1061375457803560ff1916838001178555613782565b82800160010185558215613782579182015b82811115613781578235825591602001919060010190613766565b5b50905061378f9190613793565b5090565b5b808211156137ac576000816000905550600101613794565b5090565b60006137c36137be84614735565b614710565b905080838252602082019050828560208602820111156137e6576137e5614be5565b5b60005b8581101561381657816137fc8882613862565b8452602084019350602083019250506001810190506137e9565b5050509392505050565b600061383361382e84614761565b614710565b90508281526020810184848401111561384f5761384e614bea565b5b61385a8482856149a2565b509392505050565b6000813590506138718161538d565b92915050565b600082601f83011261388c5761388b614be0565b5b813561389c8482602086016137b0565b91505092915050565b6000813590506138b4816153a4565b92915050565b6000813590506138c9816153bb565b92915050565b6000815190506138de816153bb565b92915050565b600082601f8301126138f9576138f8614be0565b5b8135613909848260208601613820565b91505092915050565b60008083601f84011261392857613927614be0565b5b8235905067ffffffffffffffff81111561394557613944614bdb565b5b60208301915083600182028301111561396157613960614be5565b5b9250929050565b600081359050613977816153d2565b92915050565b60006020828403121561399357613992614bf4565b5b60006139a184828501613862565b91505092915050565b600080604083850312156139c1576139c0614bf4565b5b60006139cf85828601613862565b92505060206139e085828601613862565b9150509250929050565b600080600060608486031215613a0357613a02614bf4565b5b6000613a1186828701613862565b9350506020613a2286828701613862565b9250506040613a3386828701613968565b9150509250925092565b60008060008060808587031215613a5757613a56614bf4565b5b6000613a6587828801613862565b9450506020613a7687828801613862565b9350506040613a8787828801613968565b925050606085013567ffffffffffffffff811115613aa857613aa7614bef565b5b613ab4878288016138e4565b91505092959194509250565b60008060408385031215613ad757613ad6614bf4565b5b6000613ae585828601613862565b9250506020613af6858286016138a5565b9150509250929050565b60008060408385031215613b1757613b16614bf4565b5b6000613b2585828601613862565b9250506020613b3685828601613968565b9150509250929050565b600060208284031215613b5657613b55614bf4565b5b600082013567ffffffffffffffff811115613b7457613b73614bef565b5b613b8084828501613877565b91505092915050565b600060208284031215613b9f57613b9e614bf4565b5b6000613bad848285016138ba565b91505092915050565b600060208284031215613bcc57613bcb614bf4565b5b6000613bda848285016138cf565b91505092915050565b60008060208385031215613bfa57613bf9614bf4565b5b600083013567ffffffffffffffff811115613c1857613c17614bef565b5b613c2485828601613912565b92509250509250929050565b600060208284031215613c4657613c45614bf4565b5b6000613c5484828501613968565b91505092915050565b6000613c698383614217565b60208301905092915050565b613c7e8161492e565b82525050565b6000613c8f826147a2565b613c9981856147d0565b9350613ca483614792565b8060005b83811015613cd5578151613cbc8882613c5d565b9750613cc7836147c3565b925050600181019050613ca8565b5085935050505092915050565b613ceb81614940565b82525050565b6000613cfc826147ad565b613d0681856147e1565b9350613d168185602086016149b1565b613d1f81614bf9565b840191505092915050565b6000613d35826147b8565b613d3f81856147fd565b9350613d4f8185602086016149b1565b613d5881614bf9565b840191505092915050565b6000613d6e826147b8565b613d78818561480e565b9350613d888185602086016149b1565b80840191505092915050565b6000613da16023836147fd565b9150613dac82614c0a565b604082019050919050565b6000613dc4601d836147fd565b9150613dcf82614c59565b602082019050919050565b6000613de7602b836147fd565b9150613df282614c82565b604082019050919050565b6000613e0a6032836147fd565b9150613e1582614cd1565b604082019050919050565b6000613e2d6026836147fd565b9150613e3882614d20565b604082019050919050565b6000613e50601c836147fd565b9150613e5b82614d6f565b602082019050919050565b6000613e736024836147fd565b9150613e7e82614d98565b604082019050919050565b6000613e966019836147fd565b9150613ea182614de7565b602082019050919050565b6000613eb96012836147fd565b9150613ec482614e10565b602082019050919050565b6000613edc602c836147fd565b9150613ee782614e39565b604082019050919050565b6000613eff60078361480e565b9150613f0a82614e88565b600782019050919050565b6000613f226038836147fd565b9150613f2d82614eb1565b604082019050919050565b6000613f45602a836147fd565b9150613f5082614f00565b604082019050919050565b6000613f686029836147fd565b9150613f7382614f4f565b604082019050919050565b6000613f8b6016836147fd565b9150613f9682614f9e565b602082019050919050565b6000613fae6020836147fd565b9150613fb982614fc7565b602082019050919050565b6000613fd16014836147fd565b9150613fdc82614ff0565b602082019050919050565b6000613ff4602c836147fd565b9150613fff82615019565b604082019050919050565b600061401760058361480e565b915061402282615068565b600582019050919050565b600061403a6020836147fd565b915061404582615091565b602082019050919050565b600061405d6029836147fd565b9150614068826150ba565b604082019050919050565b6000614080602f836147fd565b915061408b82615109565b604082019050919050565b60006140a36016836147fd565b91506140ae82615158565b602082019050919050565b60006140c66021836147fd565b91506140d182615181565b604082019050919050565b60006140e96000836147f2565b91506140f4826151d0565b600082019050919050565b600061410c6031836147fd565b9150614117826151d3565b604082019050919050565b600061412f602c836147fd565b915061413a82615222565b604082019050919050565b6000614152601a836147fd565b915061415d82615271565b602082019050919050565b60006141756015836147fd565b91506141808261529a565b602082019050919050565b6000614198601a836147fd565b91506141a3826152c3565b602082019050919050565b60006141bb6011836147fd565b91506141c6826152ec565b602082019050919050565b60006141de6025836147fd565b91506141e982615315565b604082019050919050565b600061420160018361480e565b915061420c82615364565b600182019050919050565b61422081614998565b82525050565b61422f81614998565b82525050565b600061424082613ef2565b915061424c8285613d63565b9150614257826141f4565b91506142638284613d63565b915061426e8261400a565b91508190509392505050565b6000614285826140dc565b9150819050919050565b60006020820190506142a46000830184613c75565b92915050565b60006080820190506142bf6000830187613c75565b6142cc6020830186613c75565b6142d96040830185614226565b81810360608301526142eb8184613cf1565b905095945050505050565b600060208201905081810360008301526143108184613c84565b905092915050565b600060208201905061432d6000830184613ce2565b92915050565b6000602082019050818103600083015261434d8184613d2a565b905092915050565b6000602082019050818103600083015261436e81613d94565b9050919050565b6000602082019050818103600083015261438e81613db7565b9050919050565b600060208201905081810360008301526143ae81613dda565b9050919050565b600060208201905081810360008301526143ce81613dfd565b9050919050565b600060208201905081810360008301526143ee81613e20565b9050919050565b6000602082019050818103600083015261440e81613e43565b9050919050565b6000602082019050818103600083015261442e81613e66565b9050919050565b6000602082019050818103600083015261444e81613e89565b9050919050565b6000602082019050818103600083015261446e81613eac565b9050919050565b6000602082019050818103600083015261448e81613ecf565b9050919050565b600060208201905081810360008301526144ae81613f15565b9050919050565b600060208201905081810360008301526144ce81613f38565b9050919050565b600060208201905081810360008301526144ee81613f5b565b9050919050565b6000602082019050818103600083015261450e81613f7e565b9050919050565b6000602082019050818103600083015261452e81613fa1565b9050919050565b6000602082019050818103600083015261454e81613fc4565b9050919050565b6000602082019050818103600083015261456e81613fe7565b9050919050565b6000602082019050818103600083015261458e8161402d565b9050919050565b600060208201905081810360008301526145ae81614050565b9050919050565b600060208201905081810360008301526145ce81614073565b9050919050565b600060208201905081810360008301526145ee81614096565b9050919050565b6000602082019050818103600083015261460e816140b9565b9050919050565b6000602082019050818103600083015261462e816140ff565b9050919050565b6000602082019050818103600083015261464e81614122565b9050919050565b6000602082019050818103600083015261466e81614145565b9050919050565b6000602082019050818103600083015261468e81614168565b9050919050565b600060208201905081810360008301526146ae8161418b565b9050919050565b600060208201905081810360008301526146ce816141ae565b9050919050565b600060208201905081810360008301526146ee816141d1565b9050919050565b600060208201905061470a6000830184614226565b92915050565b600061471a61472b565b90506147268282614a16565b919050565b6000604051905090565b600067ffffffffffffffff8211156147505761474f614bac565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561477c5761477b614bac565b5b61478582614bf9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061482482614998565b915061482f83614998565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486457614863614ac1565b5b828201905092915050565b600061487a82614998565b915061488583614998565b92508261489557614894614af0565b5b828204905092915050565b60006148ab82614998565b91506148b683614998565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148ef576148ee614ac1565b5b828202905092915050565b600061490582614998565b915061491083614998565b92508282101561492357614922614ac1565b5b828203905092915050565b600061493982614978565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149cf5780820151818401526020810190506149b4565b838111156149de576000848401525b50505050565b600060028204905060018216806149fc57607f821691505b60208210811415614a1057614a0f614b1f565b5b50919050565b614a1f82614bf9565b810181811067ffffffffffffffff82111715614a3e57614a3d614bac565b5b80604052505050565b6000614a5282614998565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a8557614a84614ac1565b5b600182019050919050565b6000614a9b82614998565b9150614aa683614998565b925082614ab657614ab5614af0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6f206d616e7920746f6b656e7320666f72206f6e65207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e7320666f722070726573616c65000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546f6f206d616e7920746f6b656e7320666f722077616c6c6574000000000000600082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e7320666f722073616c65000000000000600082015250565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b7f546f6f206d616e7920746f6b656e7320666f72206d61726b6574696e67206d6960008201527f6e74696e67000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6153968161492e565b81146153a157600080fd5b50565b6153ad81614940565b81146153b857600080fd5b50565b6153c48161494c565b81146153cf57600080fd5b50565b6153db81614998565b81146153e657600080fd5b5056fea2646970667358221220f1892bfde42a7de7749ac03247054990a2275174f3071b528064b50fe0025c3c64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063715018a61161014f578063a22cb465116100c1578063d8c7a7971161007a578063d8c7a7971461097d578063d96a094a146109a8578063e985e9c5146109c4578063ea66aeb314610a01578063ea98847b14610a3e578063f2fde38b14610a555761027d565b8063a22cb46514610871578063a507f00f1461089a578063a9e966b7146108c5578063abcc5443146108ee578063b88d4fde14610917578063c87b56dd146109405761027d565b80638fd8927e116101135780638fd8927e14610771578063912946a51461079a578063931625d4146107c557806395d89b41146107f05780639be9c50d1461081b5780639d044ed3146108465761027d565b8063715018a6146106b25780637f649783146106c9578063819b25ba146106f257806381df6c9b1461071b5780638da5cb5b146107465761027d565b806342842e0e116101f35780635be50521116101ac5780635be505211461058c5780635d893ba0146105b75780636352211e146105e257806366ddf93f1461061f5780636c0360eb1461064a57806370a08231146106755761027d565b806342842e0e1461048b57806349c32217146104b45780634f6ccce7146104d0578063525b3fe31461050d57806355f804b314610538578063564566a8146105615761027d565b806318160ddd1161024557806318160ddd1461037b57806322f4596f146103a657806323b872dd146103d15780632f745c59146103fa5780633a3ab672146104375780633ccfd60b146104745761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806310db2c5b14610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613b89565b610a7e565b6040516102b69190614318565b60405180910390f35b3480156102cb57600080fd5b506102d4610af8565b6040516102e19190614333565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613c30565b610b8a565b60405161031e919061428f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613b00565b610c0f565b005b34801561035c57600080fd5b50610365610d27565b60405161037291906146f5565b60405180910390f35b34801561038757600080fd5b50610390610d2d565b60405161039d91906146f5565b60405180910390f35b3480156103b257600080fd5b506103bb610d3a565b6040516103c891906146f5565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f391906139ea565b610d40565b005b34801561040657600080fd5b50610421600480360381019061041c9190613b00565b610da0565b60405161042e91906146f5565b60405180910390f35b34801561044357600080fd5b5061045e6004803603810190610459919061397d565b610e45565b60405161046b9190614318565b60405180910390f35b34801561048057600080fd5b50610489610e9b565b005b34801561049757600080fd5b506104b260048036038101906104ad91906139ea565b611125565b005b6104ce60048036038101906104c99190613c30565b611145565b005b3480156104dc57600080fd5b506104f760048036038101906104f29190613c30565b6112fa565b60405161050491906146f5565b60405180910390f35b34801561051957600080fd5b5061052261136b565b60405161052f91906146f5565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613be3565b611371565b005b34801561056d57600080fd5b50610576611403565b6040516105839190614318565b60405180910390f35b34801561059857600080fd5b506105a161141a565b6040516105ae91906146f5565b60405180910390f35b3480156105c357600080fd5b506105cc611425565b6040516105d99190614318565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190613c30565b611438565b604051610616919061428f565b60405180910390f35b34801561062b57600080fd5b506106346114ea565b60405161064191906146f5565b60405180910390f35b34801561065657600080fd5b5061065f6114ef565b60405161066c9190614333565b60405180910390f35b34801561068157600080fd5b5061069c6004803603810190610697919061397d565b61157d565b6040516106a991906146f5565b60405180910390f35b3480156106be57600080fd5b506106c7611635565b005b3480156106d557600080fd5b506106f060048036038101906106eb9190613b40565b6116bd565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613c30565b6117ce565b005b34801561072757600080fd5b506107306118c0565b60405161073d91906146f5565b60405180910390f35b34801561075257600080fd5b5061075b6118c5565b604051610768919061428f565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613b00565b6118ee565b005b3480156107a657600080fd5b506107af611a89565b6040516107bc91906146f5565b60405180910390f35b3480156107d157600080fd5b506107da611a8e565b6040516107e791906146f5565b60405180910390f35b3480156107fc57600080fd5b50610805611a93565b6040516108129190614333565b60405180910390f35b34801561082757600080fd5b50610830611b25565b60405161083d91906146f5565b60405180910390f35b34801561085257600080fd5b5061085b611b30565b6040516108689190614318565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613ac0565b611b47565b005b3480156108a657600080fd5b506108af611cc8565b6040516108bc91906146f5565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e79190613c30565b611cce565b005b3480156108fa57600080fd5b5061091560048036038101906109109190613b00565b611e17565b005b34801561092357600080fd5b5061093e60048036038101906109399190613a3d565b611ea1565b005b34801561094c57600080fd5b5061096760048036038101906109629190613c30565b611f03565b6040516109749190614333565b60405180910390f35b34801561098957600080fd5b50610992611faa565b60405161099f9190614318565b60405180910390f35b6109c260048036038101906109bd9190613c30565b611fbd565b005b3480156109d057600080fd5b506109eb60048036038101906109e691906139aa565b612177565b6040516109f89190614318565b60405180910390f35b348015610a0d57600080fd5b50610a286004803603810190610a23919061397d565b61220b565b604051610a3591906142f6565b60405180910390f35b348015610a4a57600080fd5b50610a536122b9565b005b348015610a6157600080fd5b50610a7c6004803603810190610a77919061397d565b612449565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af15750610af082612541565b5b9050919050565b606060018054610b07906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b33906149e4565b8015610b805780601f10610b5557610100808354040283529160200191610b80565b820191906000526020600020905b815481529060010190602001808311610b6357829003601f168201915b5050505050905090565b6000610b9582612623565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614555565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1a82611438565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c82906145f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610caa61268f565b73ffffffffffffffffffffffffffffffffffffffff161480610cd95750610cd881610cd361268f565b612177565b5b610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90614495565b60405180910390fd5b610d228383612697565b505050565b600c5481565b6000600980549050905090565b61116781565b610d51610d4b61268f565b82612750565b610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614615565b60405180910390fd5b610d9b83838361282e565b505050565b6000610dab8361157d565b8210610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614395565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610ea361268f565b73ffffffffffffffffffffffffffffffffffffffff16610ec16118c5565b73ffffffffffffffffffffffffffffffffffffffff1614610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90614575565b60405180910390fd5b60004711610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f51906145d5565b60405180910390fd5b6000610f836064610f75600547612a8a90919063ffffffff16565b612aa090919063ffffffff16565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610fcd9061427a565b60006040518083038185875af1925050503d806000811461100a576040519150601f19603f3d011682016040523d82523d6000602084013e61100f565b606091505b5050905080611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a906146b5565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110999061427a565b60006040518083038185875af1925050503d80600081146110d6576040519150601f19603f3d011682016040523d82523d6000602084013e6110db565b606091505b50508091505080611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906146b5565b60405180910390fd5b5050565b61114083838360405180602001604052806000815250611ea1565b505050565b61114d611b30565b61118c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118390614675565b60405180910390fd5b60058111156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790614355565b60405180910390fd5b6032816111dc3361157d565b6111e69190614819565b1115611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90614655565b60405180910390fd5b6109c4600c54826112389190614819565b1115611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090614375565b60405180910390fd5b6112938166753d533d968000612a8a90919063ffffffff16565b3410156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90614535565b60405180910390fd5b80600c60008282546112e79190614819565b925050819055506112f781612ab6565b50565b6000611304610d2d565b8210611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90614635565b60405180910390fd5b6009828154811061135957611358614b7d565b5b90600052602060002001549050919050565b6109c481565b61137961268f565b73ffffffffffffffffffffffffffffffffffffffff166113976118c5565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490614575565b60405180910390fd5b8181600e91906113fe92919061370d565b505050565b6000600d60019054906101000a900460ff16905090565b66753d533d96800081565b600d60019054906101000a900460ff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d8906144d5565b60405180910390fd5b80915050919050565b603281565b600e80546114fc906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611528906149e4565b80156115755780601f1061154a57610100808354040283529160200191611575565b820191906000526020600020905b81548152906001019060200180831161155857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906144b5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61163d61268f565b73ffffffffffffffffffffffffffffffffffffffff1661165b6118c5565b73ffffffffffffffffffffffffffffffffffffffff16146116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a890614575565b60405180910390fd5b6116bb6000612ac3565b565b6116c561268f565b73ffffffffffffffffffffffffffffffffffffffff166116e36118c5565b73ffffffffffffffffffffffffffffffffffffffff1614611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090614575565b60405180910390fd5b60005b81518110156117ca576001600f600084848151811061175e5761175d614b7d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806117c290614a47565b91505061173c565b5050565b6117d661268f565b73ffffffffffffffffffffffffffffffffffffffff166117f46118c5565b73ffffffffffffffffffffffffffffffffffffffff161461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184190614575565b60405180910390fd5b60c8600b548261185a9190614819565b111561189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906146d5565b60405180910390fd5b6118a481612ab6565b80600b60008282546118b69190614819565b9250508190555050565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118f661268f565b73ffffffffffffffffffffffffffffffffffffffff166119146118c5565b73ffffffffffffffffffffffffffffffffffffffff161461196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190614575565b60405180910390fd5b600047116119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a4906145d5565b60405180910390fd5b60006119d560646119c78447612a8a90919063ffffffff16565b612aa090919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff16826040516119fd9061427a565b60006040518083038185875af1925050503d8060008114611a3a576040519150601f19603f3d011682016040523d82523d6000602084013e611a3f565b606091505b5050905080611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a906146b5565b60405180910390fd5b50505050565b603281565b60c881565b606060028054611aa2906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ace906149e4565b8015611b1b5780601f10611af057610100808354040283529160200191611b1b565b820191906000526020600020905b815481529060010190602001808311611afe57829003601f168201915b5050505050905090565b668e1bc9bf04000081565b6000600d60009054906101000a900460ff16905090565b611b4f61268f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614435565b60405180910390fd5b8060066000611bca61268f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c7761268f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cbc9190614318565b60405180910390a35050565b600b5481565b611cd661268f565b73ffffffffffffffffffffffffffffffffffffffff16611cf46118c5565b73ffffffffffffffffffffffffffffffffffffffff1614611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190614575565b60405180910390fd5b6000811415611d8e576000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550611e14565b6001811415611dd2576001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550611e13565b6002811415611e12576000600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055505b5b5b50565b611e1f61268f565b73ffffffffffffffffffffffffffffffffffffffff16611e3d6118c5565b73ffffffffffffffffffffffffffffffffffffffff1614611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614575565b60405180910390fd5b611e9d8282612b87565b5050565b611eb2611eac61268f565b83612750565b611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614615565b60405180910390fd5b611efd84848484612c2e565b50505050565b6060611f0e82612623565b611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906145b5565b60405180910390fd5b6000611f57612c8a565b90506000815111611f775760405180602001604052806000815250611fa2565b80611f8184612d1c565b604051602001611f92929190614235565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b611fc5611403565b612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614455565b60405180910390fd5b6005811115612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f90614355565b60405180910390fd5b6032816120543361157d565b61205e9190614819565b111561209f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209690614655565b60405180910390fd5b600b5460c86120ae91906148fa565b6120b6610d2d565b6111676120c391906148fa565b6120cd91906148fa565b81111561210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614695565b60405180910390fd5b61212981668e1bc9bf040000612a8a90919063ffffffff16565b34101561216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216290614535565b60405180910390fd5b61217481612ab6565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060006122188361157d565b905060008167ffffffffffffffff81111561223657612235614bac565b5b6040519080825280602002602001820160405280156122645781602001602082028036833780820191505090505b50905060005b828110156122ae5761227c8582610da0565b82828151811061228f5761228e614b7d565b5b60200260200101818152505080806122a690614a47565b91505061226a565b508092505050919050565b6122c161268f565b73ffffffffffffffffffffffffffffffffffffffff166122df6118c5565b73ffffffffffffffffffffffffffffffffffffffff1614612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c90614575565b60405180910390fd5b60004711612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f906145d5565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516123c09061427a565b60006040518083038185875af1925050503d80600081146123fd576040519150601f19603f3d011682016040523d82523d6000602084013e612402565b606091505b5050905080612446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243d906146b5565b60405180910390fd5b50565b61245161268f565b73ffffffffffffffffffffffffffffffffffffffff1661246f6118c5565b73ffffffffffffffffffffffffffffffffffffffff16146124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90614575565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252c906143d5565b60405180910390fd5b61253e81612ac3565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061260c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061261c575061261b82612e7d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270a83611438565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061275b82612623565b61279a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279190614475565b60405180910390fd5b60006127a583611438565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281457508373ffffffffffffffffffffffffffffffffffffffff166127fc84610b8a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061282557506128248185612177565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661284e82611438565b73ffffffffffffffffffffffffffffffffffffffff16146128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b90614595565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290b90614415565b60405180910390fd5b61291f838383612ee7565b61292a600082612697565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297a91906148fa565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129d19190614819565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a9891906148a0565b905092915050565b60008183612aae919061486f565b905092915050565b612ac03382612b87565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611167612ba482612b96610d2d565b612ffb90919063ffffffff16565b1115612be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdc906144f5565b60405180910390fd5b6000612bef610d2d565b905060005b82811015612c2857600182612c099190614819565b9150612c158483613011565b8080612c2090614a47565b915050612bf4565b50505050565b612c3984848461282e565b612c458484848461302f565b612c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7b906143b5565b60405180910390fd5b50505050565b6060600e8054612c99906149e4565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc5906149e4565b8015612d125780601f10612ce757610100808354040283529160200191612d12565b820191906000526020600020905b815481529060010190602001808311612cf557829003601f168201915b5050505050905090565b60606000821415612d64576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e78565b600082905060005b60008214612d96578080612d7f90614a47565b915050600a82612d8f919061486f565b9150612d6c565b60008167ffffffffffffffff811115612db257612db1614bac565b5b6040519080825280601f01601f191660200182016040528015612de45781602001600182028036833780820191505090505b5090505b60008514612e7157600182612dfd91906148fa565b9150600a85612e0c9190614a90565b6030612e189190614819565b60f81b818381518110612e2e57612e2d614b7d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e6a919061486f565b9450612de8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ef28383836131c6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f3557612f30816131cb565b612f74565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f7357612f728382613214565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fb757612fb281613381565b612ff6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ff557612ff48282613452565b5b5b505050565b600081836130099190614819565b905092915050565b61302b8282604051806020016040528060008152506134d1565b5050565b60006130508473ffffffffffffffffffffffffffffffffffffffff1661352c565b156131b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307961268f565b8786866040518563ffffffff1660e01b815260040161309b94939291906142aa565b602060405180830381600087803b1580156130b557600080fd5b505af19250505080156130e657506040513d601f19601f820116820180604052508101906130e39190613bb6565b60015b613169573d8060008114613116576040519150601f19603f3d011682016040523d82523d6000602084013e61311b565b606091505b50600081511415613161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613158906143b5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131be565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132218461157d565b61322b91906148fa565b9050600060086000848152602001908152602001600020549050818114613310576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061339591906148fa565b90506000600a60008481526020019081526020016000205490506000600983815481106133c5576133c4614b7d565b5b9060005260206000200154905080600983815481106133e7576133e6614b7d565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061343657613435614b4e565b5b6001900381819060005260206000200160009055905550505050565b600061345d8361157d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6134db838361353f565b6134e8600084848461302f565b613527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351e906143b5565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a690614515565b60405180910390fd5b6135b881612623565b156135f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ef906143f5565b60405180910390fd5b61360460008383612ee7565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136549190614819565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613719906149e4565b90600052602060002090601f01602090048101928261373b5760008555613782565b82601f1061375457803560ff1916838001178555613782565b82800160010185558215613782579182015b82811115613781578235825591602001919060010190613766565b5b50905061378f9190613793565b5090565b5b808211156137ac576000816000905550600101613794565b5090565b60006137c36137be84614735565b614710565b905080838252602082019050828560208602820111156137e6576137e5614be5565b5b60005b8581101561381657816137fc8882613862565b8452602084019350602083019250506001810190506137e9565b5050509392505050565b600061383361382e84614761565b614710565b90508281526020810184848401111561384f5761384e614bea565b5b61385a8482856149a2565b509392505050565b6000813590506138718161538d565b92915050565b600082601f83011261388c5761388b614be0565b5b813561389c8482602086016137b0565b91505092915050565b6000813590506138b4816153a4565b92915050565b6000813590506138c9816153bb565b92915050565b6000815190506138de816153bb565b92915050565b600082601f8301126138f9576138f8614be0565b5b8135613909848260208601613820565b91505092915050565b60008083601f84011261392857613927614be0565b5b8235905067ffffffffffffffff81111561394557613944614bdb565b5b60208301915083600182028301111561396157613960614be5565b5b9250929050565b600081359050613977816153d2565b92915050565b60006020828403121561399357613992614bf4565b5b60006139a184828501613862565b91505092915050565b600080604083850312156139c1576139c0614bf4565b5b60006139cf85828601613862565b92505060206139e085828601613862565b9150509250929050565b600080600060608486031215613a0357613a02614bf4565b5b6000613a1186828701613862565b9350506020613a2286828701613862565b9250506040613a3386828701613968565b9150509250925092565b60008060008060808587031215613a5757613a56614bf4565b5b6000613a6587828801613862565b9450506020613a7687828801613862565b9350506040613a8787828801613968565b925050606085013567ffffffffffffffff811115613aa857613aa7614bef565b5b613ab4878288016138e4565b91505092959194509250565b60008060408385031215613ad757613ad6614bf4565b5b6000613ae585828601613862565b9250506020613af6858286016138a5565b9150509250929050565b60008060408385031215613b1757613b16614bf4565b5b6000613b2585828601613862565b9250506020613b3685828601613968565b9150509250929050565b600060208284031215613b5657613b55614bf4565b5b600082013567ffffffffffffffff811115613b7457613b73614bef565b5b613b8084828501613877565b91505092915050565b600060208284031215613b9f57613b9e614bf4565b5b6000613bad848285016138ba565b91505092915050565b600060208284031215613bcc57613bcb614bf4565b5b6000613bda848285016138cf565b91505092915050565b60008060208385031215613bfa57613bf9614bf4565b5b600083013567ffffffffffffffff811115613c1857613c17614bef565b5b613c2485828601613912565b92509250509250929050565b600060208284031215613c4657613c45614bf4565b5b6000613c5484828501613968565b91505092915050565b6000613c698383614217565b60208301905092915050565b613c7e8161492e565b82525050565b6000613c8f826147a2565b613c9981856147d0565b9350613ca483614792565b8060005b83811015613cd5578151613cbc8882613c5d565b9750613cc7836147c3565b925050600181019050613ca8565b5085935050505092915050565b613ceb81614940565b82525050565b6000613cfc826147ad565b613d0681856147e1565b9350613d168185602086016149b1565b613d1f81614bf9565b840191505092915050565b6000613d35826147b8565b613d3f81856147fd565b9350613d4f8185602086016149b1565b613d5881614bf9565b840191505092915050565b6000613d6e826147b8565b613d78818561480e565b9350613d888185602086016149b1565b80840191505092915050565b6000613da16023836147fd565b9150613dac82614c0a565b604082019050919050565b6000613dc4601d836147fd565b9150613dcf82614c59565b602082019050919050565b6000613de7602b836147fd565b9150613df282614c82565b604082019050919050565b6000613e0a6032836147fd565b9150613e1582614cd1565b604082019050919050565b6000613e2d6026836147fd565b9150613e3882614d20565b604082019050919050565b6000613e50601c836147fd565b9150613e5b82614d6f565b602082019050919050565b6000613e736024836147fd565b9150613e7e82614d98565b604082019050919050565b6000613e966019836147fd565b9150613ea182614de7565b602082019050919050565b6000613eb96012836147fd565b9150613ec482614e10565b602082019050919050565b6000613edc602c836147fd565b9150613ee782614e39565b604082019050919050565b6000613eff60078361480e565b9150613f0a82614e88565b600782019050919050565b6000613f226038836147fd565b9150613f2d82614eb1565b604082019050919050565b6000613f45602a836147fd565b9150613f5082614f00565b604082019050919050565b6000613f686029836147fd565b9150613f7382614f4f565b604082019050919050565b6000613f8b6016836147fd565b9150613f9682614f9e565b602082019050919050565b6000613fae6020836147fd565b9150613fb982614fc7565b602082019050919050565b6000613fd16014836147fd565b9150613fdc82614ff0565b602082019050919050565b6000613ff4602c836147fd565b9150613fff82615019565b604082019050919050565b600061401760058361480e565b915061402282615068565b600582019050919050565b600061403a6020836147fd565b915061404582615091565b602082019050919050565b600061405d6029836147fd565b9150614068826150ba565b604082019050919050565b6000614080602f836147fd565b915061408b82615109565b604082019050919050565b60006140a36016836147fd565b91506140ae82615158565b602082019050919050565b60006140c66021836147fd565b91506140d182615181565b604082019050919050565b60006140e96000836147f2565b91506140f4826151d0565b600082019050919050565b600061410c6031836147fd565b9150614117826151d3565b604082019050919050565b600061412f602c836147fd565b915061413a82615222565b604082019050919050565b6000614152601a836147fd565b915061415d82615271565b602082019050919050565b60006141756015836147fd565b91506141808261529a565b602082019050919050565b6000614198601a836147fd565b91506141a3826152c3565b602082019050919050565b60006141bb6011836147fd565b91506141c6826152ec565b602082019050919050565b60006141de6025836147fd565b91506141e982615315565b604082019050919050565b600061420160018361480e565b915061420c82615364565b600182019050919050565b61422081614998565b82525050565b61422f81614998565b82525050565b600061424082613ef2565b915061424c8285613d63565b9150614257826141f4565b91506142638284613d63565b915061426e8261400a565b91508190509392505050565b6000614285826140dc565b9150819050919050565b60006020820190506142a46000830184613c75565b92915050565b60006080820190506142bf6000830187613c75565b6142cc6020830186613c75565b6142d96040830185614226565b81810360608301526142eb8184613cf1565b905095945050505050565b600060208201905081810360008301526143108184613c84565b905092915050565b600060208201905061432d6000830184613ce2565b92915050565b6000602082019050818103600083015261434d8184613d2a565b905092915050565b6000602082019050818103600083015261436e81613d94565b9050919050565b6000602082019050818103600083015261438e81613db7565b9050919050565b600060208201905081810360008301526143ae81613dda565b9050919050565b600060208201905081810360008301526143ce81613dfd565b9050919050565b600060208201905081810360008301526143ee81613e20565b9050919050565b6000602082019050818103600083015261440e81613e43565b9050919050565b6000602082019050818103600083015261442e81613e66565b9050919050565b6000602082019050818103600083015261444e81613e89565b9050919050565b6000602082019050818103600083015261446e81613eac565b9050919050565b6000602082019050818103600083015261448e81613ecf565b9050919050565b600060208201905081810360008301526144ae81613f15565b9050919050565b600060208201905081810360008301526144ce81613f38565b9050919050565b600060208201905081810360008301526144ee81613f5b565b9050919050565b6000602082019050818103600083015261450e81613f7e565b9050919050565b6000602082019050818103600083015261452e81613fa1565b9050919050565b6000602082019050818103600083015261454e81613fc4565b9050919050565b6000602082019050818103600083015261456e81613fe7565b9050919050565b6000602082019050818103600083015261458e8161402d565b9050919050565b600060208201905081810360008301526145ae81614050565b9050919050565b600060208201905081810360008301526145ce81614073565b9050919050565b600060208201905081810360008301526145ee81614096565b9050919050565b6000602082019050818103600083015261460e816140b9565b9050919050565b6000602082019050818103600083015261462e816140ff565b9050919050565b6000602082019050818103600083015261464e81614122565b9050919050565b6000602082019050818103600083015261466e81614145565b9050919050565b6000602082019050818103600083015261468e81614168565b9050919050565b600060208201905081810360008301526146ae8161418b565b9050919050565b600060208201905081810360008301526146ce816141ae565b9050919050565b600060208201905081810360008301526146ee816141d1565b9050919050565b600060208201905061470a6000830184614226565b92915050565b600061471a61472b565b90506147268282614a16565b919050565b6000604051905090565b600067ffffffffffffffff8211156147505761474f614bac565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561477c5761477b614bac565b5b61478582614bf9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061482482614998565b915061482f83614998565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561486457614863614ac1565b5b828201905092915050565b600061487a82614998565b915061488583614998565b92508261489557614894614af0565b5b828204905092915050565b60006148ab82614998565b91506148b683614998565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148ef576148ee614ac1565b5b828202905092915050565b600061490582614998565b915061491083614998565b92508282101561492357614922614ac1565b5b828203905092915050565b600061493982614978565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149cf5780820151818401526020810190506149b4565b838111156149de576000848401525b50505050565b600060028204905060018216806149fc57607f821691505b60208210811415614a1057614a0f614b1f565b5b50919050565b614a1f82614bf9565b810181811067ffffffffffffffff82111715614a3e57614a3d614bac565b5b80604052505050565b6000614a5282614998565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a8557614a84614ac1565b5b600182019050919050565b6000614a9b82614998565b9150614aa683614998565b925082614ab657614ab5614af0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6f206d616e7920746f6b656e7320666f72206f6e65207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e7320666f722070726573616c65000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546f6f206d616e7920746f6b656e7320666f722077616c6c6574000000000000600082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e7320666f722073616c65000000000000600082015250565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b7f546f6f206d616e7920746f6b656e7320666f72206d61726b6574696e67206d6960008201527f6e74696e67000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6153968161492e565b81146153a157600080fd5b50565b6153ad81614940565b81146153b857600080fd5b50565b6153c48161494c565b81146153cf57600080fd5b50565b6153db81614998565b81146153e657600080fd5b5056fea2646970667358221220f1892bfde42a7de7749ac03247054990a2275174f3071b528064b50fe0025c3c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

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

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


Deployed Bytecode Sourcemap

141:5425:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:222:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3885:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3423:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;679:34:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1534:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;484:41:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4749:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1210:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2194:109:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4276:396;;;;;;;;;;;;;:::i;:::-;;5145:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2307:570:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1717:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;535:43:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1383:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1936:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;217:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;760:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2052:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;437:37:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;798:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1790:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:11;;;;;;;;;;;;;:::i;:::-;;2021:169:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3444:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;335:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;966:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4933:306:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;387:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;588:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;275:50:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1843:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4169:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;639:36:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1487:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3711:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5390:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2679:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;720:36:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2881:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4525:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5243:321:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4684:237;;;;;;;;;;;;;:::i;:::-;;1839:189:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;909:222:5;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;2349:98:4:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3885:217::-;3961:7;3988:16;3996:7;3988;:16::i;:::-;3980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4071:15;:24;4087:7;4071:24;;;;;;;;;;;;;;;;;;;;;4064:31;;3885:217;;;:::o;3423:401::-;3503:13;3519:23;3534:7;3519:14;:23::i;:::-;3503:39;;3566:5;3560:11;;:2;:11;;;;3552:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3657:5;3641:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3666:37;3683:5;3690:12;:10;:12::i;:::-;3666:16;:37::i;:::-;3641:62;3620:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3796:21;3805:2;3809:7;3796:8;:21::i;:::-;3493:331;3423:401;;:::o;679:34:2:-;;;;:::o;1534:111:5:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;484:41:2:-;521:4;484:41;:::o;4749:330:4:-;4938:41;4957:12;:10;:12::i;:::-;4971:7;4938:18;:41::i;:::-;4930:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5044:28;5054:4;5060:2;5064:7;5044:9;:28::i;:::-;4749:330;;;:::o;1210:253:5:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;2194:109:2:-;2254:4;2273:17;:25;2291:6;2273:25;;;;;;;;;;;;;;;;;;;;;;;;;2266:32;;2194:109;;;:::o;4276:396::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4353:1:2::1;4329:21;:25;4321:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4392:13;4408:37;4441:3;4408:28;4434:1;4408:21;:25;;:28;;;;:::i;:::-;:32;;:37;;;;:::i;:::-;4392:53;;4453:12;4471:10;;;;;;;;;;;:15;;4494:8;4471:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4452:55;;;4521:7;4513:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;4571:14;;;;;;;;;;;:19;;4598:21;4571:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4557:67;;;;;4638:7;4630:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;4315:357;;4276:396::o:0;5145:179:4:-;5278:39;5295:4;5301:2;5305:7;5278:39;;;;;;;;;;;;:16;:39::i;:::-;5145:179;;;:::o;2307:570:2:-;2379:17;:15;:17::i;:::-;2371:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;376:1;2436:14;:32;;2428:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;425:2;2546:14;2522:21;2532:10;2522:9;:21::i;:::-;:38;;;;:::i;:::-;:53;;2514:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;574:4;2637:19;;2620:14;:36;;;;:::i;:::-;:52;;2612:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;2733:36;2754:14;260:11;2733:20;;:36;;;;:::i;:::-;2720:9;:49;;2712:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;2824:14;2801:19;;:37;;;;;;;:::i;:::-;;;;;;;;2844:28;2857:14;2844:12;:28::i;:::-;2307:570;:::o;1717:230:5:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;;1916:24;;1717:230;;;:::o;535:43:2:-;574:4;535:43;:::o;1383:98::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1466:10:2::1;;1456:7;:20;;;;;;;:::i;:::-;;1383:98:::0;;:::o;1936:81::-;1980:4;1999:13;;;;;;;;;;;1992:20;;1936:81;:::o;217:54::-;260:11;217:54;:::o;760:33::-;;;;;;;;;;;;;:::o;2052:235:4:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;437:37:2:-;472:2;437:37;:::o;798:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1790:205:4:-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;2021:169:2:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2098:6:2::1;2094:92;2114:7;:14;2110:1;:18;2094:92;;;2175:4;2143:17;:29;2161:7;2169:1;2161:10;;;;;;;;:::i;:::-;;;;;;;;2143:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;2130:3;;;;;:::i;:::-;;;;2094:92;;;;2021:169:::0;:::o;3444:261::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;629:3:2::1;3535:21;;3518:14;:38;;;;:::i;:::-;:56;;3510:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;3627:28;3640:14;3627:12;:28::i;:::-;3686:14;3661:21;;:39;;;;;;;:::i;:::-;;;;;;;;3444:261:::0;:::o;335:42::-;376:1;335:42;:::o;966:85:11:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;4933:306:2:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5038:1:2::1;5014:21;:25;5006:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5077:10;5090:42;5128:3;5090:33;5116:6;5090:21;:25;;:33;;;;:::i;:::-;:37;;:42;;;;:::i;:::-;5077:55;;5144:12;5162:6;:11;;5181:5;5162:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5143:48;;;5205:7;5197:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;5000:239;;4933:306:::0;;:::o;387:40::-;425:2;387:40;:::o;588:44::-;629:3;588:44;:::o;2511:102:4:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;275:50:2:-;315:10;275:50;:::o;1843:87::-;1890:4;1909:16;;;;;;;;;;;1902:23;;1843:87;:::o;4169:290:4:-;4283:12;:10;:12::i;:::-;4271:24;;:8;:24;;;;4263:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4381:8;4336:18;:32;4355:12;:10;:12::i;:::-;4336:32;;;;;;;;;;;;;;;:42;4369:8;4336:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4433:8;4404:48;;4419:12;:10;:12::i;:::-;4404:48;;;4443:8;4404:48;;;;;;:::i;:::-;;;;;;;;4169:290;;:::o;639:36:2:-;;;;:::o;1487:350::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1554:1:2::1;1545:5;:10;1542:291;;;1590:5;1571:16;;:24;;;;;;;;;;;;;;;;;;1621:5;1605:13;;:21;;;;;;;;;;;;;;;;;;1542:291;;;1655:1;1646:5;:10;1643:190;;;1691:4;1672:16;;:23;;;;;;;;;;;;;;;;;;1721:5;1705:13;;:21;;;;;;;;;;;;;;;;;;1643:190;;;1755:1;1746:5;:10;1743:90;;;1791:5;1772:16;;:24;;;;;;;;;;;;;;;;;;1822:4;1806:13;;:20;;;;;;;;;;;;;;;;;;1743:90;1643:190;1542:291;1487:350:::0;:::o;3711:129::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3792:43:2::1;3812:6;3820:14;3792:19;:43::i;:::-;3711:129:::0;;:::o;5390:320:4:-;5559:41;5578:12;:10;:12::i;:::-;5592:7;5559:18;:41::i;:::-;5551:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5664:39;5678:4;5684:2;5688:7;5697:5;5664:13;:39::i;:::-;5390:320;;;;:::o;2679:354::-;2752:13;2785:16;2793:7;2785;:16::i;:::-;2777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:111;;;;;;;;;;;;;;;;;2978:7;2992:18;:7;:16;:18::i;:::-;2950:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:111;2908:118;;;2679:354;;;:::o;720:36:2:-;;;;;;;;;;;;;:::o;2881:542::-;2946:14;:12;:14::i;:::-;2938:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;376:1;2997:14;:32;;2989:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;472:2;3107:14;3083:21;3093:10;3083:9;:21::i;:::-;:38;;;;:::i;:::-;:50;;3075:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;3245:21;;629:3;3228:38;;;;:::i;:::-;3210:13;:11;:13::i;:::-;521:4;3197:26;;;;:::i;:::-;3196:71;;;;:::i;:::-;3178:14;:89;;3170:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;3325:33;3343:14;315:10;3325:17;;:33;;;;:::i;:::-;3312:9;:46;;3304:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;3390:28;3403:14;3390:12;:28::i;:::-;2881:542;:::o;4525:162:4:-;4622:4;4645:18;:25;4664:5;4645:25;;;;;;;;;;;;;;;:35;4671:8;4645:35;;;;;;;;;;;;;;;;;;;;;;;;;4638:42;;4525:162;;;;:::o;5243:321:2:-;5304:16;5328:15;5346:17;5356:6;5346:9;:17::i;:::-;5328:35;;5370:30;5417:10;5403:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5370:58;;5438:6;5434:100;5454:10;5450:1;:14;5434:100;;;5497:30;5517:6;5525:1;5497:19;:30::i;:::-;5478:13;5492:1;5478:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;5466:3;;;;;:::i;:::-;;;;5434:100;;;;5546:13;5539:20;;;;5243:321;;;:::o;4684:237::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4762:1:2::1;4738:21;:25;4730:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4802:12;4820:14;;;;;;;;;;;:19;;4847:21;4820:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4801:72;;;4887:7;4879:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;4724:197;4684:237::o:0;1839:189:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;1431:300:4:-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;7182:125::-;7247:4;7298:1;7270:30;;:7;:16;7278:7;7270:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7263:37;;7182:125;;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;11033:171:4:-;11134:2;11107:15;:24;11123:7;11107:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11189:7;11185:2;11151:46;;11160:23;11175:7;11160:14;:23::i;:::-;11151:46;;;;;;;;;;;;11033:171;;:::o;7465:344::-;7558:4;7582:16;7590:7;7582;:16::i;:::-;7574:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7657:13;7673:23;7688:7;7673:14;:23::i;:::-;7657:39;;7725:5;7714:16;;:7;:16;;;:51;;;;7758:7;7734:31;;:20;7746:7;7734:11;:20::i;:::-;:31;;;7714:51;:87;;;;7769:32;7786:5;7793:7;7769:16;:32::i;:::-;7714:87;7706:96;;;7465:344;;;;:::o;10362:560::-;10516:4;10489:31;;:23;10504:7;10489:14;:23::i;:::-;:31;;;10481:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10598:1;10584:16;;:2;:16;;;;10576:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10652:39;10673:4;10679:2;10683:7;10652:20;:39::i;:::-;10753:29;10770:1;10774:7;10753:8;:29::i;:::-;10812:1;10793:9;:15;10803:4;10793:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10840:1;10823:9;:13;10833:2;10823:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10870:2;10851:7;:16;10859:7;10851:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10907:7;10903:2;10888:27;;10897:4;10888:27;;;;;;;;;;;;10362:560;;;:::o;3382:96:12:-;3440:7;3470:1;3466;:5;;;;:::i;:::-;3459:12;;3382:96;;;;:::o;3767:::-;3825:7;3855:1;3851;:5;;;;:::i;:::-;3844:12;;3767:96;;;;:::o;3846:108:2:-;3902:47;3922:10;3934:14;3902:19;:47::i;:::-;3846:108;:::o;2034:169:11:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;3960:306:2:-;521:4;4048:33;4066:14;4048:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;4040:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;4129:13;4145;:11;:13::i;:::-;4129:29;;4168:6;4164:98;4184:14;4180:1;:18;4164:98;;;4222:1;4213:10;;;;;:::i;:::-;;;4231:24;4241:6;4249:5;4231:9;:24::i;:::-;4200:3;;;;;:::i;:::-;;;;4164:98;;;;4034:232;3960:306;;:::o;6572:307:4:-;6723:28;6733:4;6739:2;6743:7;6723:9;:28::i;:::-;6769:48;6792:4;6798:2;6802:7;6811:5;6769:22;:48::i;:::-;6761:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6572:307;;;;:::o;1287:92:2:-;1339:13;1367:7;1360:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1287:92;:::o;275:703:13:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2543:572:5:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;2672:96:12:-;2730:7;2760:1;2756;:5;;;;:::i;:::-;2749:12;;2672:96;;;;:::o;8139:108:4:-;8214:26;8224:2;8228:7;8214:26;;;;;;;;;;;;:9;:26::i;:::-;8139:108;;:::o;11757:778::-;11907:4;11927:15;:2;:13;;;:15::i;:::-;11923:606;;;11978:2;11962:36;;;11999:12;:10;:12::i;:::-;12013:4;12019:7;12028:5;11962:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11958:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12218:1;12201:6;:13;:18;12197:266;;;12243:60;;;;;;;;;;:::i;:::-;;;;;;;;12197:266;12415:6;12409:13;12400:6;12396:2;12392:15;12385:38;11958:519;12094:41;;;12084:51;;;:6;:51;;;;12077:58;;;;;11923:606;12514:4;12507:11;;11757:778;;;;;;;:::o;13091:122::-;;;;:::o;3821:161:5:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5103:289;5069:323;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4680:889;;4599:970;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;:::i;:::-;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3483:143;3409:217;;:::o;8468:311:4:-;8593:18;8599:2;8603:7;8593:5;:18::i;:::-;8642:54;8673:1;8677:2;8681:7;8690:5;8642:22;:54::i;:::-;8621:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8468:311;;;:::o;719:377:0:-;779:4;982:12;1047:7;1035:20;1027:28;;1088:1;1081:4;:8;1074:15;;;719:377;;;:::o;9101:372:4:-;9194:1;9180:16;;:2;:16;;;;9172:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9252:16;9260:7;9252;:16::i;:::-;9251:17;9243:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9312:45;9341:1;9345:2;9349:7;9312:20;:45::i;:::-;9385:1;9368:9;:13;9378:2;9368:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9415:2;9396:7;:16;9404:7;9396:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9458:7;9454:2;9433:33;;9450:1;9433:33;;;;;;;;;;;;9101:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:14:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:137::-;1890:5;1928:6;1915:20;1906:29;;1944:32;1970:5;1944:32;:::i;:::-;1845:137;;;;:::o;1988:141::-;2044:5;2075:6;2069:13;2060:22;;2091:32;2117:5;2091:32;:::i;:::-;1988:141;;;;:::o;2148:338::-;2203:5;2252:3;2245:4;2237:6;2233:17;2229:27;2219:122;;2260:79;;:::i;:::-;2219:122;2377:6;2364:20;2402:78;2476:3;2468:6;2461:4;2453:6;2449:17;2402:78;:::i;:::-;2393:87;;2209:277;2148:338;;;;:::o;2506:553::-;2564:8;2574:6;2624:3;2617:4;2609:6;2605:17;2601:27;2591:122;;2632:79;;:::i;:::-;2591:122;2745:6;2732:20;2722:30;;2775:18;2767:6;2764:30;2761:117;;;2797:79;;:::i;:::-;2761:117;2911:4;2903:6;2899:17;2887:29;;2965:3;2957:4;2949:6;2945:17;2935:8;2931:32;2928:41;2925:128;;;2972:79;;:::i;:::-;2925:128;2506:553;;;;;:::o;3065:139::-;3111:5;3149:6;3136:20;3127:29;;3165:33;3192:5;3165:33;:::i;:::-;3065:139;;;;:::o;3210:329::-;3269:6;3318:2;3306:9;3297:7;3293:23;3289:32;3286:119;;;3324:79;;:::i;:::-;3286:119;3444:1;3469:53;3514:7;3505:6;3494:9;3490:22;3469:53;:::i;:::-;3459:63;;3415:117;3210:329;;;;:::o;3545:474::-;3613:6;3621;3670:2;3658:9;3649:7;3645:23;3641:32;3638:119;;;3676:79;;:::i;:::-;3638:119;3796:1;3821:53;3866:7;3857:6;3846:9;3842:22;3821:53;:::i;:::-;3811:63;;3767:117;3923:2;3949:53;3994:7;3985:6;3974:9;3970:22;3949:53;:::i;:::-;3939:63;;3894:118;3545:474;;;;;:::o;4025:619::-;4102:6;4110;4118;4167:2;4155:9;4146:7;4142:23;4138:32;4135:119;;;4173:79;;:::i;:::-;4135:119;4293:1;4318:53;4363:7;4354:6;4343:9;4339:22;4318:53;:::i;:::-;4308:63;;4264:117;4420:2;4446:53;4491:7;4482:6;4471:9;4467:22;4446:53;:::i;:::-;4436:63;;4391:118;4548:2;4574:53;4619:7;4610:6;4599:9;4595:22;4574:53;:::i;:::-;4564:63;;4519:118;4025:619;;;;;:::o;4650:943::-;4745:6;4753;4761;4769;4818:3;4806:9;4797:7;4793:23;4789:33;4786:120;;;4825:79;;:::i;:::-;4786:120;4945:1;4970:53;5015:7;5006:6;4995:9;4991:22;4970:53;:::i;:::-;4960:63;;4916:117;5072:2;5098:53;5143:7;5134:6;5123:9;5119:22;5098:53;:::i;:::-;5088:63;;5043:118;5200:2;5226:53;5271:7;5262:6;5251:9;5247:22;5226:53;:::i;:::-;5216:63;;5171:118;5356:2;5345:9;5341:18;5328:32;5387:18;5379:6;5376:30;5373:117;;;5409:79;;:::i;:::-;5373:117;5514:62;5568:7;5559:6;5548:9;5544:22;5514:62;:::i;:::-;5504:72;;5299:287;4650:943;;;;;;;:::o;5599:468::-;5664:6;5672;5721:2;5709:9;5700:7;5696:23;5692:32;5689:119;;;5727:79;;:::i;:::-;5689:119;5847:1;5872:53;5917:7;5908:6;5897:9;5893:22;5872:53;:::i;:::-;5862:63;;5818:117;5974:2;6000:50;6042:7;6033:6;6022:9;6018:22;6000:50;:::i;:::-;5990:60;;5945:115;5599:468;;;;;:::o;6073:474::-;6141:6;6149;6198:2;6186:9;6177:7;6173:23;6169:32;6166:119;;;6204:79;;:::i;:::-;6166:119;6324:1;6349:53;6394:7;6385:6;6374:9;6370:22;6349:53;:::i;:::-;6339:63;;6295:117;6451:2;6477:53;6522:7;6513:6;6502:9;6498:22;6477:53;:::i;:::-;6467:63;;6422:118;6073:474;;;;;:::o;6553:539::-;6637:6;6686:2;6674:9;6665:7;6661:23;6657:32;6654:119;;;6692:79;;:::i;:::-;6654:119;6840:1;6829:9;6825:17;6812:31;6870:18;6862:6;6859:30;6856:117;;;6892:79;;:::i;:::-;6856:117;6997:78;7067:7;7058:6;7047:9;7043:22;6997:78;:::i;:::-;6987:88;;6783:302;6553:539;;;;:::o;7098:327::-;7156:6;7205:2;7193:9;7184:7;7180:23;7176:32;7173:119;;;7211:79;;:::i;:::-;7173:119;7331:1;7356:52;7400:7;7391:6;7380:9;7376:22;7356:52;:::i;:::-;7346:62;;7302:116;7098:327;;;;:::o;7431:349::-;7500:6;7549:2;7537:9;7528:7;7524:23;7520:32;7517:119;;;7555:79;;:::i;:::-;7517:119;7675:1;7700:63;7755:7;7746:6;7735:9;7731:22;7700:63;:::i;:::-;7690:73;;7646:127;7431:349;;;;:::o;7786:529::-;7857:6;7865;7914:2;7902:9;7893:7;7889:23;7885:32;7882:119;;;7920:79;;:::i;:::-;7882:119;8068:1;8057:9;8053:17;8040:31;8098:18;8090:6;8087:30;8084:117;;;8120:79;;:::i;:::-;8084:117;8233:65;8290:7;8281:6;8270:9;8266:22;8233:65;:::i;:::-;8215:83;;;;8011:297;7786:529;;;;;:::o;8321:329::-;8380:6;8429:2;8417:9;8408:7;8404:23;8400:32;8397:119;;;8435:79;;:::i;:::-;8397:119;8555:1;8580:53;8625:7;8616:6;8605:9;8601:22;8580:53;:::i;:::-;8570:63;;8526:117;8321:329;;;;:::o;8656:179::-;8725:10;8746:46;8788:3;8780:6;8746:46;:::i;:::-;8824:4;8819:3;8815:14;8801:28;;8656:179;;;;:::o;8841:118::-;8928:24;8946:5;8928:24;:::i;:::-;8923:3;8916:37;8841:118;;:::o;8995:732::-;9114:3;9143:54;9191:5;9143:54;:::i;:::-;9213:86;9292:6;9287:3;9213:86;:::i;:::-;9206:93;;9323:56;9373:5;9323:56;:::i;:::-;9402:7;9433:1;9418:284;9443:6;9440:1;9437:13;9418:284;;;9519:6;9513:13;9546:63;9605:3;9590:13;9546:63;:::i;:::-;9539:70;;9632:60;9685:6;9632:60;:::i;:::-;9622:70;;9478:224;9465:1;9462;9458:9;9453:14;;9418:284;;;9422:14;9718:3;9711:10;;9119:608;;;8995:732;;;;:::o;9733:109::-;9814:21;9829:5;9814:21;:::i;:::-;9809:3;9802:34;9733:109;;:::o;9848:360::-;9934:3;9962:38;9994:5;9962:38;:::i;:::-;10016:70;10079:6;10074:3;10016:70;:::i;:::-;10009:77;;10095:52;10140:6;10135:3;10128:4;10121:5;10117:16;10095:52;:::i;:::-;10172:29;10194:6;10172:29;:::i;:::-;10167:3;10163:39;10156:46;;9938:270;9848:360;;;;:::o;10214:364::-;10302:3;10330:39;10363:5;10330:39;:::i;:::-;10385:71;10449:6;10444:3;10385:71;:::i;:::-;10378:78;;10465:52;10510:6;10505:3;10498:4;10491:5;10487:16;10465:52;:::i;:::-;10542:29;10564:6;10542:29;:::i;:::-;10537:3;10533:39;10526:46;;10306:272;10214:364;;;;:::o;10584:377::-;10690:3;10718:39;10751:5;10718:39;:::i;:::-;10773:89;10855:6;10850:3;10773:89;:::i;:::-;10766:96;;10871:52;10916:6;10911:3;10904:4;10897:5;10893:16;10871:52;:::i;:::-;10948:6;10943:3;10939:16;10932:23;;10694:267;10584:377;;;;:::o;10967:366::-;11109:3;11130:67;11194:2;11189:3;11130:67;:::i;:::-;11123:74;;11206:93;11295:3;11206:93;:::i;:::-;11324:2;11319:3;11315:12;11308:19;;10967:366;;;:::o;11339:::-;11481:3;11502:67;11566:2;11561:3;11502:67;:::i;:::-;11495:74;;11578:93;11667:3;11578:93;:::i;:::-;11696:2;11691:3;11687:12;11680:19;;11339:366;;;:::o;11711:::-;11853:3;11874:67;11938:2;11933:3;11874:67;:::i;:::-;11867:74;;11950:93;12039:3;11950:93;:::i;:::-;12068:2;12063:3;12059:12;12052:19;;11711:366;;;:::o;12083:::-;12225:3;12246:67;12310:2;12305:3;12246:67;:::i;:::-;12239:74;;12322:93;12411:3;12322:93;:::i;:::-;12440:2;12435:3;12431:12;12424:19;;12083:366;;;:::o;12455:::-;12597:3;12618:67;12682:2;12677:3;12618:67;:::i;:::-;12611:74;;12694:93;12783:3;12694:93;:::i;:::-;12812:2;12807:3;12803:12;12796:19;;12455:366;;;:::o;12827:::-;12969:3;12990:67;13054:2;13049:3;12990:67;:::i;:::-;12983:74;;13066:93;13155:3;13066:93;:::i;:::-;13184:2;13179:3;13175:12;13168:19;;12827:366;;;:::o;13199:::-;13341:3;13362:67;13426:2;13421:3;13362:67;:::i;:::-;13355:74;;13438:93;13527:3;13438:93;:::i;:::-;13556:2;13551:3;13547:12;13540:19;;13199:366;;;:::o;13571:::-;13713:3;13734:67;13798:2;13793:3;13734:67;:::i;:::-;13727:74;;13810:93;13899:3;13810:93;:::i;:::-;13928:2;13923:3;13919:12;13912:19;;13571:366;;;:::o;13943:::-;14085:3;14106:67;14170:2;14165:3;14106:67;:::i;:::-;14099:74;;14182:93;14271:3;14182:93;:::i;:::-;14300:2;14295:3;14291:12;14284:19;;13943:366;;;:::o;14315:::-;14457:3;14478:67;14542:2;14537:3;14478:67;:::i;:::-;14471:74;;14554:93;14643:3;14554:93;:::i;:::-;14672:2;14667:3;14663:12;14656:19;;14315:366;;;:::o;14687:400::-;14847:3;14868:84;14950:1;14945:3;14868:84;:::i;:::-;14861:91;;14961:93;15050:3;14961:93;:::i;:::-;15079:1;15074:3;15070:11;15063:18;;14687:400;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15093:366;;;:::o;15465:::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15465:366;;;:::o;15837:::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15837:366;;;:::o;16209:::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16209:366;;;:::o;16581:::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16581:366;;;:::o;16953:::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;16953:366;;;:::o;17325:::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17325:366;;;:::o;17697:400::-;17857:3;17878:84;17960:1;17955:3;17878:84;:::i;:::-;17871:91;;17971:93;18060:3;17971:93;:::i;:::-;18089:1;18084:3;18080:11;18073:18;;17697:400;;;:::o;18103:366::-;18245:3;18266:67;18330:2;18325:3;18266:67;:::i;:::-;18259:74;;18342:93;18431:3;18342:93;:::i;:::-;18460:2;18455:3;18451:12;18444:19;;18103:366;;;:::o;18475:::-;18617:3;18638:67;18702:2;18697:3;18638:67;:::i;:::-;18631:74;;18714:93;18803:3;18714:93;:::i;:::-;18832:2;18827:3;18823:12;18816:19;;18475:366;;;:::o;18847:::-;18989:3;19010:67;19074:2;19069:3;19010:67;:::i;:::-;19003:74;;19086:93;19175:3;19086:93;:::i;:::-;19204:2;19199:3;19195:12;19188:19;;18847:366;;;:::o;19219:::-;19361:3;19382:67;19446:2;19441:3;19382:67;:::i;:::-;19375:74;;19458:93;19547:3;19458:93;:::i;:::-;19576:2;19571:3;19567:12;19560:19;;19219:366;;;:::o;19591:::-;19733:3;19754:67;19818:2;19813:3;19754:67;:::i;:::-;19747:74;;19830:93;19919:3;19830:93;:::i;:::-;19948:2;19943:3;19939:12;19932:19;;19591:366;;;:::o;19963:398::-;20122:3;20143:83;20224:1;20219:3;20143:83;:::i;:::-;20136:90;;20235:93;20324:3;20235:93;:::i;:::-;20353:1;20348:3;20344:11;20337:18;;19963:398;;;:::o;20367:366::-;20509:3;20530:67;20594:2;20589:3;20530:67;:::i;:::-;20523:74;;20606:93;20695:3;20606:93;:::i;:::-;20724:2;20719:3;20715:12;20708:19;;20367:366;;;:::o;20739:::-;20881:3;20902:67;20966:2;20961:3;20902:67;:::i;:::-;20895:74;;20978:93;21067:3;20978:93;:::i;:::-;21096:2;21091:3;21087:12;21080:19;;20739:366;;;:::o;21111:::-;21253:3;21274:67;21338:2;21333:3;21274:67;:::i;:::-;21267:74;;21350:93;21439:3;21350:93;:::i;:::-;21468:2;21463:3;21459:12;21452:19;;21111:366;;;:::o;21483:::-;21625:3;21646:67;21710:2;21705:3;21646:67;:::i;:::-;21639:74;;21722:93;21811:3;21722:93;:::i;:::-;21840:2;21835:3;21831:12;21824:19;;21483:366;;;:::o;21855:::-;21997:3;22018:67;22082:2;22077:3;22018:67;:::i;:::-;22011:74;;22094:93;22183:3;22094:93;:::i;:::-;22212:2;22207:3;22203:12;22196:19;;21855:366;;;:::o;22227:::-;22369:3;22390:67;22454:2;22449:3;22390:67;:::i;:::-;22383:74;;22466:93;22555:3;22466:93;:::i;:::-;22584:2;22579:3;22575:12;22568:19;;22227:366;;;:::o;22599:::-;22741:3;22762:67;22826:2;22821:3;22762:67;:::i;:::-;22755:74;;22838:93;22927:3;22838:93;:::i;:::-;22956:2;22951:3;22947:12;22940:19;;22599:366;;;:::o;22971:400::-;23131:3;23152:84;23234:1;23229:3;23152:84;:::i;:::-;23145:91;;23245:93;23334:3;23245:93;:::i;:::-;23363:1;23358:3;23354:11;23347:18;;22971:400;;;:::o;23377:108::-;23454:24;23472:5;23454:24;:::i;:::-;23449:3;23442:37;23377:108;;:::o;23491:118::-;23578:24;23596:5;23578:24;:::i;:::-;23573:3;23566:37;23491:118;;:::o;23615:1233::-;24098:3;24120:148;24264:3;24120:148;:::i;:::-;24113:155;;24285:95;24376:3;24367:6;24285:95;:::i;:::-;24278:102;;24397:148;24541:3;24397:148;:::i;:::-;24390:155;;24562:95;24653:3;24644:6;24562:95;:::i;:::-;24555:102;;24674:148;24818:3;24674:148;:::i;:::-;24667:155;;24839:3;24832:10;;23615:1233;;;;;:::o;24854:379::-;25038:3;25060:147;25203:3;25060:147;:::i;:::-;25053:154;;25224:3;25217:10;;24854:379;;;:::o;25239:222::-;25332:4;25370:2;25359:9;25355:18;25347:26;;25383:71;25451:1;25440:9;25436:17;25427:6;25383:71;:::i;:::-;25239:222;;;;:::o;25467:640::-;25662:4;25700:3;25689:9;25685:19;25677:27;;25714:71;25782:1;25771:9;25767:17;25758:6;25714:71;:::i;:::-;25795:72;25863:2;25852:9;25848:18;25839:6;25795:72;:::i;:::-;25877;25945:2;25934:9;25930:18;25921:6;25877:72;:::i;:::-;25996:9;25990:4;25986:20;25981:2;25970:9;25966:18;25959:48;26024:76;26095:4;26086:6;26024:76;:::i;:::-;26016:84;;25467:640;;;;;;;:::o;26113:373::-;26256:4;26294:2;26283:9;26279:18;26271:26;;26343:9;26337:4;26333:20;26329:1;26318:9;26314:17;26307:47;26371:108;26474:4;26465:6;26371:108;:::i;:::-;26363:116;;26113:373;;;;:::o;26492:210::-;26579:4;26617:2;26606:9;26602:18;26594:26;;26630:65;26692:1;26681:9;26677:17;26668:6;26630:65;:::i;:::-;26492:210;;;;:::o;26708:313::-;26821:4;26859:2;26848:9;26844:18;26836:26;;26908:9;26902:4;26898:20;26894:1;26883:9;26879:17;26872:47;26936:78;27009:4;27000:6;26936:78;:::i;:::-;26928:86;;26708:313;;;;:::o;27027:419::-;27193:4;27231:2;27220:9;27216:18;27208:26;;27280:9;27274:4;27270:20;27266:1;27255:9;27251:17;27244:47;27308:131;27434:4;27308:131;:::i;:::-;27300:139;;27027:419;;;:::o;27452:::-;27618:4;27656:2;27645:9;27641:18;27633:26;;27705:9;27699:4;27695:20;27691:1;27680:9;27676:17;27669:47;27733:131;27859:4;27733:131;:::i;:::-;27725:139;;27452:419;;;:::o;27877:::-;28043:4;28081:2;28070:9;28066:18;28058:26;;28130:9;28124:4;28120:20;28116:1;28105:9;28101:17;28094:47;28158:131;28284:4;28158:131;:::i;:::-;28150:139;;27877:419;;;:::o;28302:::-;28468:4;28506:2;28495:9;28491:18;28483:26;;28555:9;28549:4;28545:20;28541:1;28530:9;28526:17;28519:47;28583:131;28709:4;28583:131;:::i;:::-;28575:139;;28302:419;;;:::o;28727:::-;28893:4;28931:2;28920:9;28916:18;28908:26;;28980:9;28974:4;28970:20;28966:1;28955:9;28951:17;28944:47;29008:131;29134:4;29008:131;:::i;:::-;29000:139;;28727:419;;;:::o;29152:::-;29318:4;29356:2;29345:9;29341:18;29333:26;;29405:9;29399:4;29395:20;29391:1;29380:9;29376:17;29369:47;29433:131;29559:4;29433:131;:::i;:::-;29425:139;;29152:419;;;:::o;29577:::-;29743:4;29781:2;29770:9;29766:18;29758:26;;29830:9;29824:4;29820:20;29816:1;29805:9;29801:17;29794:47;29858:131;29984:4;29858:131;:::i;:::-;29850:139;;29577:419;;;:::o;30002:::-;30168:4;30206:2;30195:9;30191:18;30183:26;;30255:9;30249:4;30245:20;30241:1;30230:9;30226:17;30219:47;30283:131;30409:4;30283:131;:::i;:::-;30275:139;;30002:419;;;:::o;30427:::-;30593:4;30631:2;30620:9;30616:18;30608:26;;30680:9;30674:4;30670:20;30666:1;30655:9;30651:17;30644:47;30708:131;30834:4;30708:131;:::i;:::-;30700:139;;30427:419;;;:::o;30852:::-;31018:4;31056:2;31045:9;31041:18;31033:26;;31105:9;31099:4;31095:20;31091:1;31080:9;31076:17;31069:47;31133:131;31259:4;31133:131;:::i;:::-;31125:139;;30852:419;;;:::o;31277:::-;31443:4;31481:2;31470:9;31466:18;31458:26;;31530:9;31524:4;31520:20;31516:1;31505:9;31501:17;31494:47;31558:131;31684:4;31558:131;:::i;:::-;31550:139;;31277:419;;;:::o;31702:::-;31868:4;31906:2;31895:9;31891:18;31883:26;;31955:9;31949:4;31945:20;31941:1;31930:9;31926:17;31919:47;31983:131;32109:4;31983:131;:::i;:::-;31975:139;;31702:419;;;:::o;32127:::-;32293:4;32331:2;32320:9;32316:18;32308:26;;32380:9;32374:4;32370:20;32366:1;32355:9;32351:17;32344:47;32408:131;32534:4;32408:131;:::i;:::-;32400:139;;32127:419;;;:::o;32552:::-;32718:4;32756:2;32745:9;32741:18;32733:26;;32805:9;32799:4;32795:20;32791:1;32780:9;32776:17;32769:47;32833:131;32959:4;32833:131;:::i;:::-;32825:139;;32552:419;;;:::o;32977:::-;33143:4;33181:2;33170:9;33166:18;33158:26;;33230:9;33224:4;33220:20;33216:1;33205:9;33201:17;33194:47;33258:131;33384:4;33258:131;:::i;:::-;33250:139;;32977:419;;;:::o;33402:::-;33568:4;33606:2;33595:9;33591:18;33583:26;;33655:9;33649:4;33645:20;33641:1;33630:9;33626:17;33619:47;33683:131;33809:4;33683:131;:::i;:::-;33675:139;;33402:419;;;:::o;33827:::-;33993:4;34031:2;34020:9;34016:18;34008:26;;34080:9;34074:4;34070:20;34066:1;34055:9;34051:17;34044:47;34108:131;34234:4;34108:131;:::i;:::-;34100:139;;33827:419;;;:::o;34252:::-;34418:4;34456:2;34445:9;34441:18;34433:26;;34505:9;34499:4;34495:20;34491:1;34480:9;34476:17;34469:47;34533:131;34659:4;34533:131;:::i;:::-;34525:139;;34252:419;;;:::o;34677:::-;34843:4;34881:2;34870:9;34866:18;34858:26;;34930:9;34924:4;34920:20;34916:1;34905:9;34901:17;34894:47;34958:131;35084:4;34958:131;:::i;:::-;34950:139;;34677:419;;;:::o;35102:::-;35268:4;35306:2;35295:9;35291:18;35283:26;;35355:9;35349:4;35345:20;35341:1;35330:9;35326:17;35319:47;35383:131;35509:4;35383:131;:::i;:::-;35375:139;;35102:419;;;:::o;35527:::-;35693:4;35731:2;35720:9;35716:18;35708:26;;35780:9;35774:4;35770:20;35766:1;35755:9;35751:17;35744:47;35808:131;35934:4;35808:131;:::i;:::-;35800:139;;35527:419;;;:::o;35952:::-;36118:4;36156:2;36145:9;36141:18;36133:26;;36205:9;36199:4;36195:20;36191:1;36180:9;36176:17;36169:47;36233:131;36359:4;36233:131;:::i;:::-;36225:139;;35952:419;;;:::o;36377:::-;36543:4;36581:2;36570:9;36566:18;36558:26;;36630:9;36624:4;36620:20;36616:1;36605:9;36601:17;36594:47;36658:131;36784:4;36658:131;:::i;:::-;36650:139;;36377:419;;;:::o;36802:::-;36968:4;37006:2;36995:9;36991:18;36983:26;;37055:9;37049:4;37045:20;37041:1;37030:9;37026:17;37019:47;37083:131;37209:4;37083:131;:::i;:::-;37075:139;;36802:419;;;:::o;37227:::-;37393:4;37431:2;37420:9;37416:18;37408:26;;37480:9;37474:4;37470:20;37466:1;37455:9;37451:17;37444:47;37508:131;37634:4;37508:131;:::i;:::-;37500:139;;37227:419;;;:::o;37652:::-;37818:4;37856:2;37845:9;37841:18;37833:26;;37905:9;37899:4;37895:20;37891:1;37880:9;37876:17;37869:47;37933:131;38059:4;37933:131;:::i;:::-;37925:139;;37652:419;;;:::o;38077:::-;38243:4;38281:2;38270:9;38266:18;38258:26;;38330:9;38324:4;38320:20;38316:1;38305:9;38301:17;38294:47;38358:131;38484:4;38358:131;:::i;:::-;38350:139;;38077:419;;;:::o;38502:::-;38668:4;38706:2;38695:9;38691:18;38683:26;;38755:9;38749:4;38745:20;38741:1;38730:9;38726:17;38719:47;38783:131;38909:4;38783:131;:::i;:::-;38775:139;;38502:419;;;:::o;38927:::-;39093:4;39131:2;39120:9;39116:18;39108:26;;39180:9;39174:4;39170:20;39166:1;39155:9;39151:17;39144:47;39208:131;39334:4;39208:131;:::i;:::-;39200:139;;38927:419;;;:::o;39352:222::-;39445:4;39483:2;39472:9;39468:18;39460:26;;39496:71;39564:1;39553:9;39549:17;39540:6;39496:71;:::i;:::-;39352:222;;;;:::o;39580:129::-;39614:6;39641:20;;:::i;:::-;39631:30;;39670:33;39698:4;39690:6;39670:33;:::i;:::-;39580:129;;;:::o;39715:75::-;39748:6;39781:2;39775:9;39765:19;;39715:75;:::o;39796:311::-;39873:4;39963:18;39955:6;39952:30;39949:56;;;39985:18;;:::i;:::-;39949:56;40035:4;40027:6;40023:17;40015:25;;40095:4;40089;40085:15;40077:23;;39796:311;;;:::o;40113:307::-;40174:4;40264:18;40256:6;40253:30;40250:56;;;40286:18;;:::i;:::-;40250:56;40324:29;40346:6;40324:29;:::i;:::-;40316:37;;40408:4;40402;40398:15;40390:23;;40113:307;;;:::o;40426:132::-;40493:4;40516:3;40508:11;;40546:4;40541:3;40537:14;40529:22;;40426:132;;;:::o;40564:114::-;40631:6;40665:5;40659:12;40649:22;;40564:114;;;:::o;40684:98::-;40735:6;40769:5;40763:12;40753:22;;40684:98;;;:::o;40788:99::-;40840:6;40874:5;40868:12;40858:22;;40788:99;;;:::o;40893:113::-;40963:4;40995;40990:3;40986:14;40978:22;;40893:113;;;:::o;41012:184::-;41111:11;41145:6;41140:3;41133:19;41185:4;41180:3;41176:14;41161:29;;41012:184;;;;:::o;41202:168::-;41285:11;41319:6;41314:3;41307:19;41359:4;41354:3;41350:14;41335:29;;41202:168;;;;:::o;41376:147::-;41477:11;41514:3;41499:18;;41376:147;;;;:::o;41529:169::-;41613:11;41647:6;41642:3;41635:19;41687:4;41682:3;41678:14;41663:29;;41529:169;;;;:::o;41704:148::-;41806:11;41843:3;41828:18;;41704:148;;;;:::o;41858:305::-;41898:3;41917:20;41935:1;41917:20;:::i;:::-;41912:25;;41951:20;41969:1;41951:20;:::i;:::-;41946:25;;42105:1;42037:66;42033:74;42030:1;42027:81;42024:107;;;42111:18;;:::i;:::-;42024:107;42155:1;42152;42148:9;42141:16;;41858:305;;;;:::o;42169:185::-;42209:1;42226:20;42244:1;42226:20;:::i;:::-;42221:25;;42260:20;42278:1;42260:20;:::i;:::-;42255:25;;42299:1;42289:35;;42304:18;;:::i;:::-;42289:35;42346:1;42343;42339:9;42334:14;;42169:185;;;;:::o;42360:348::-;42400:7;42423:20;42441:1;42423:20;:::i;:::-;42418:25;;42457:20;42475:1;42457:20;:::i;:::-;42452:25;;42645:1;42577:66;42573:74;42570:1;42567:81;42562:1;42555:9;42548:17;42544:105;42541:131;;;42652:18;;:::i;:::-;42541:131;42700:1;42697;42693:9;42682:20;;42360:348;;;;:::o;42714:191::-;42754:4;42774:20;42792:1;42774:20;:::i;:::-;42769:25;;42808:20;42826:1;42808:20;:::i;:::-;42803:25;;42847:1;42844;42841:8;42838:34;;;42852:18;;:::i;:::-;42838:34;42897:1;42894;42890:9;42882:17;;42714:191;;;;:::o;42911:96::-;42948:7;42977:24;42995:5;42977:24;:::i;:::-;42966:35;;42911:96;;;:::o;43013:90::-;43047:7;43090:5;43083:13;43076:21;43065:32;;43013:90;;;:::o;43109:149::-;43145:7;43185:66;43178:5;43174:78;43163:89;;43109:149;;;:::o;43264:126::-;43301:7;43341:42;43334:5;43330:54;43319:65;;43264:126;;;:::o;43396:77::-;43433:7;43462:5;43451:16;;43396:77;;;:::o;43479:154::-;43563:6;43558:3;43553;43540:30;43625:1;43616:6;43611:3;43607:16;43600:27;43479:154;;;:::o;43639:307::-;43707:1;43717:113;43731:6;43728:1;43725:13;43717:113;;;43816:1;43811:3;43807:11;43801:18;43797:1;43792:3;43788:11;43781:39;43753:2;43750:1;43746:10;43741:15;;43717:113;;;43848:6;43845:1;43842:13;43839:101;;;43928:1;43919:6;43914:3;43910:16;43903:27;43839:101;43688:258;43639:307;;;:::o;43952:320::-;43996:6;44033:1;44027:4;44023:12;44013:22;;44080:1;44074:4;44070:12;44101:18;44091:81;;44157:4;44149:6;44145:17;44135:27;;44091:81;44219:2;44211:6;44208:14;44188:18;44185:38;44182:84;;;44238:18;;:::i;:::-;44182:84;44003:269;43952:320;;;:::o;44278:281::-;44361:27;44383:4;44361:27;:::i;:::-;44353:6;44349:40;44491:6;44479:10;44476:22;44455:18;44443:10;44440:34;44437:62;44434:88;;;44502:18;;:::i;:::-;44434:88;44542:10;44538:2;44531:22;44321:238;44278:281;;:::o;44565:233::-;44604:3;44627:24;44645:5;44627:24;:::i;:::-;44618:33;;44673:66;44666:5;44663:77;44660:103;;;44743:18;;:::i;:::-;44660:103;44790:1;44783:5;44779:13;44772:20;;44565:233;;;:::o;44804:176::-;44836:1;44853:20;44871:1;44853:20;:::i;:::-;44848:25;;44887:20;44905:1;44887:20;:::i;:::-;44882:25;;44926:1;44916:35;;44931:18;;:::i;:::-;44916:35;44972:1;44969;44965:9;44960:14;;44804:176;;;;:::o;44986:180::-;45034:77;45031:1;45024:88;45131:4;45128:1;45121:15;45155:4;45152:1;45145:15;45172:180;45220:77;45217:1;45210:88;45317:4;45314:1;45307:15;45341:4;45338:1;45331:15;45358:180;45406:77;45403:1;45396:88;45503:4;45500:1;45493:15;45527:4;45524:1;45517:15;45544:180;45592:77;45589:1;45582:88;45689:4;45686:1;45679:15;45713:4;45710:1;45703:15;45730:180;45778:77;45775:1;45768:88;45875:4;45872:1;45865:15;45899:4;45896:1;45889:15;45916:180;45964:77;45961:1;45954:88;46061:4;46058:1;46051:15;46085:4;46082:1;46075:15;46102:117;46211:1;46208;46201:12;46225:117;46334:1;46331;46324:12;46348:117;46457:1;46454;46447:12;46471:117;46580:1;46577;46570:12;46594:117;46703:1;46700;46693:12;46717:117;46826:1;46823;46816:12;46840:102;46881:6;46932:2;46928:7;46923:2;46916:5;46912:14;46908:28;46898:38;;46840:102;;;:::o;46948:222::-;47088:34;47084:1;47076:6;47072:14;47065:58;47157:5;47152:2;47144:6;47140:15;47133:30;46948:222;:::o;47176:179::-;47316:31;47312:1;47304:6;47300:14;47293:55;47176:179;:::o;47361:230::-;47501:34;47497:1;47489:6;47485:14;47478:58;47570:13;47565:2;47557:6;47553:15;47546:38;47361:230;:::o;47597:237::-;47737:34;47733:1;47725:6;47721:14;47714:58;47806:20;47801:2;47793:6;47789:15;47782:45;47597:237;:::o;47840:225::-;47980:34;47976:1;47968:6;47964:14;47957:58;48049:8;48044:2;48036:6;48032:15;48025:33;47840:225;:::o;48071:178::-;48211:30;48207:1;48199:6;48195:14;48188:54;48071:178;:::o;48255:223::-;48395:34;48391:1;48383:6;48379:14;48372:58;48464:6;48459:2;48451:6;48447:15;48440:31;48255:223;:::o;48484:175::-;48624:27;48620:1;48612:6;48608:14;48601:51;48484:175;:::o;48665:168::-;48805:20;48801:1;48793:6;48789:14;48782:44;48665:168;:::o;48839:231::-;48979:34;48975:1;48967:6;48963:14;48956:58;49048:14;49043:2;49035:6;49031:15;49024:39;48839:231;:::o;49076:161::-;49216:9;49212:1;49204:6;49200:14;49193:33;49076:161;:::o;49247:255::-;49391:34;49387:1;49379:6;49375:14;49368:58;49464:26;49459:2;49451:6;49447:15;49440:51;49247:255;:::o;49512:241::-;49656:34;49652:1;49644:6;49640:14;49633:58;49729:12;49724:2;49716:6;49712:15;49705:37;49512:241;:::o;49763:240::-;49907:34;49903:1;49895:6;49891:14;49884:58;49980:11;49975:2;49967:6;49963:15;49956:36;49763:240;:::o;50013:180::-;50157:24;50153:1;50145:6;50141:14;50134:48;50013:180;:::o;50203:190::-;50347:34;50343:1;50335:6;50331:14;50324:58;50203:190;:::o;50403:178::-;50547:22;50543:1;50535:6;50531:14;50524:46;50403:178;:::o;50591:243::-;50735:34;50731:1;50723:6;50719:14;50712:58;50808:14;50803:2;50795:6;50791:15;50784:39;50591:243;:::o;50844:163::-;50988:7;50984:1;50976:6;50972:14;50965:31;50844:163;:::o;51017:190::-;51161:34;51157:1;51149:6;51145:14;51138:58;51017:190;:::o;51217:240::-;51361:34;51357:1;51349:6;51345:14;51338:58;51434:11;51429:2;51421:6;51417:15;51410:36;51217:240;:::o;51467:246::-;51611:34;51607:1;51599:6;51595:14;51588:58;51684:17;51679:2;51671:6;51667:15;51660:42;51467:246;:::o;51723:180::-;51867:24;51863:1;51855:6;51851:14;51844:48;51723:180;:::o;51913:232::-;52057:34;52053:1;52045:6;52041:14;52034:58;52130:3;52125:2;52117:6;52113:15;52106:28;51913:232;:::o;52155:118::-;;:::o;52283:248::-;52427:34;52423:1;52415:6;52411:14;52404:58;52500:19;52495:2;52487:6;52483:15;52476:44;52283:248;:::o;52541:243::-;52685:34;52681:1;52673:6;52669:14;52662:58;52758:14;52753:2;52745:6;52741:15;52734:39;52541:243;:::o;52794:184::-;52938:28;52934:1;52926:6;52922:14;52915:52;52794:184;:::o;52988:179::-;53132:23;53128:1;53120:6;53116:14;53109:47;52988:179;:::o;53177:184::-;53321:28;53317:1;53309:6;53305:14;53298:52;53177:184;:::o;53371:175::-;53515:19;53511:1;53503:6;53499:14;53492:43;53371:175;:::o;53556:236::-;53700:34;53696:1;53688:6;53684:14;53677:58;53773:7;53768:2;53760:6;53756:15;53749:32;53556:236;:::o;53802:159::-;53946:3;53942:1;53934:6;53930:14;53923:27;53802:159;:::o;53971:130::-;54048:24;54066:5;54048:24;:::i;:::-;54041:5;54038:35;54028:63;;54087:1;54084;54077:12;54028:63;53971:130;:::o;54111:124::-;54185:21;54200:5;54185:21;:::i;:::-;54178:5;54175:32;54165:60;;54221:1;54218;54211:12;54165:60;54111:124;:::o;54245:128::-;54321:23;54338:5;54321:23;:::i;:::-;54314:5;54311:34;54301:62;;54359:1;54356;54349:12;54301:62;54245:128;:::o;54383:130::-;54460:24;54478:5;54460:24;:::i;:::-;54453:5;54450:35;54440:63;;54499:1;54496;54489:12;54440:63;54383:130;:::o

Swarm Source

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