ETH Price: $3,338.61 (-0.14%)

Token

Taiketsu (TAIKETSU)
 

Overview

Max Total Supply

686 TAIKETSU

Holders

337

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 TAIKETSU
0x4918aaa1679d51d28c8f7f7a80ee5bea491af6bc
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:
Taiketsu

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-26
*/

/*
▄▄▄█████▓ ▄▄▄       ██▓ ██ ▄█▀▓█████▄▄▄█████▓  ██████  █    ██ 
▓  ██▒ ▓▒▒████▄    ▓██▒ ██▄█▒ ▓█   ▀▓  ██▒ ▓▒▒██    ▒  ██  ▓██▒
▒ ▓██░ ▒░▒██  ▀█▄  ▒██▒▓███▄░ ▒███  ▒ ▓██░ ▒░░ ▓██▄   ▓██  ▒██░
░ ▓██▓ ░ ░██▄▄▄▄██ ░██░▓██ █▄ ▒▓█  ▄░ ▓██▓ ░   ▒   ██▒▓▓█  ░██░
  ▒██▒ ░  ▓█   ▓██▒░██░▒██▒ █▄░▒████▒ ▒██▒ ░ ▒██████▒▒▒▒█████▓ 
  ▒ ░░    ▒▒   ▓▒█░░▓  ▒ ▒▒ ▓▒░░ ▒░ ░ ▒ ░░   ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ 
    ░      ▒   ▒▒ ░ ▒ ░░ ░▒ ▒░ ░ ░  ░   ░    ░ ░▒  ░ ░░░▒░ ░ ░ 
  ░        ░   ▒    ▒ ░░ ░░ ░    ░    ░      ░  ░  ░   ░░░ ░ ░ 
               ░  ░ ░  ░  ░      ░  ░              ░     ░                                                                    
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    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);
    }
}

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}


abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

        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);
    }

    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);
    }

    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);
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {

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

    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");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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");
    }

    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);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    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);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {

            if (returndata.length > 0) {

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

interface IERC721Metadata is IERC721 {

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

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

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

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

    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    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);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    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);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    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);
    }

    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");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    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));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    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"
        );
    }

    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);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        _approve(address(0), tokenId);

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

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

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

        _approve(address(0), tokenId);

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

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

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

    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];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

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

    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);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

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

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; 
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }


        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

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

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex;

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  string private _name;

  string private _symbol;

  mapping(uint256 => TokenOwnership) private _ownerships;

  mapping(address => AddressData) private _addressData;

  mapping(uint256 => address) private _tokenApprovals;

  mapping(address => mapping(address => bool)) private _operatorApprovals;

  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165, IERC165)
    returns (bool)
  {
    return
      interfaceId == type(IERC721).interfaceId ||
      interfaceId == type(IERC721Metadata).interfaceId ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  function name() public view virtual override returns (string memory) {
    return _name;
  }

  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

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

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

  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

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

  function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

    _approve(address(0), tokenId, prevOwnership.addr);

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }

    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

library MerkleProof {

    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

contract Taiketsu is ERC721A, Ownable, ReentrancyGuard{
    
    using Strings for uint256;
    
    uint256 public constant MAX_SUPPLY = 5889;
    uint public publicSalePrice = 0.1 ether;
    uint public preSalePrice = 0.08 ether;
    
    address public preordersDataContract = 0x1815a17ABe7630045133051aD7cB905b25d57AE9;

    bool public isPublicSaleActive;
    bool public isPreSaleActive;
    bool public isPreorderMintActive;

    uint256 public maxPublicSalesPerTransaction = 3;
    uint256 public maxPreSalesPerAddress = 2;
    uint256 private maxOwnerMint = 10;
    
    bytes32 public preSaleMerkleRoot;
    mapping(address => uint256) private preSalesCounter;
    mapping(address => bool) private preordersCheck;
    uint256 private ownerMintCounter;

    uint256 public preordersCounter;
    bool isPreordersCounterLoaded;

    string private _baseTokenURI;

    constructor() ERC721A("Taiketsu", "TAIKETSU", 3, MAX_SUPPLY)  {
      
    }

    function publicSale(uint256 _count) public payable nonReentrant {
        require(totalSupply() < MAX_SUPPLY, "Sale end");
        require(isPublicSaleActive, "Public sales is closed");
        require(totalSupply() + _count <= MAX_SUPPLY - preordersCounter, "Exceeds MAX limit");
        require(_count <= maxPublicSalesPerTransaction, "Exceeds TX limit");
        require(msg.value == _count * publicSalePrice, "Value below price");
        _safeMint(_msgSender(), _count);
    }

    function preSale(uint256 _count, bytes32[] calldata _merkleProof) public payable nonReentrant {
        require(totalSupply() < MAX_SUPPLY, "Sale end");
        require(isPreSaleActive, "Presale is closed");
        require(totalSupply() + _count <= MAX_SUPPLY - preordersCounter, "Exceeds MAX limit");
        require(_count + preSalesCounter[_msgSender()] <= maxPreSalesPerAddress, "Exceeds address limit");
        require(_verify(_merkleProof, _msgSender()), "Invalid proof");
        require(msg.value == preSalePrice * _count, "Value below price");
        preSalesCounter[_msgSender()] += _count;
        _safeMint(_msgSender(), _count);
    }

    function mintPreorder() public nonReentrant {
        require(totalSupply() < MAX_SUPPLY, "Sale end");
        require(isPreorderMintActive, "Preorders mint is closed");
        uint256 _preorders = preordersAtAddress(msg.sender);
        require(_preorders > 0, "No preorders");
        require(!preordersCheck[msg.sender], "Already minted");
        preordersCheck[msg.sender] = true;
        preordersCounter -= _preorders;
        _safeMint(msg.sender, _preorders);
    }

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

    function preordersAtAddress(address _address) public view returns(uint256) {
        if (preordersCheck[_address]){
          return 0;
        } else {
          return PREORDERS(preordersDataContract).preordersAtAddress(_address);
        }
    }

    function presalesAtAddress(address _address) public view returns(uint256) {
        return preSalesCounter[_address];
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory) {
        uint tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint i = 0; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function _verify(bytes32[] calldata merkleProof, address sender) private view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(sender));
        return MerkleProof.verify(merkleProof, preSaleMerkleRoot, leaf);
    }
    
    function ownerMint(address _to, uint256 _count) public onlyOwner{
        require(totalSupply() < MAX_SUPPLY, "Sale end");
        require(_count + ownerMintCounter <= maxOwnerMint, "Exceeds owner mint limit");
        ownerMintCounter += _count;
        _safeMint(_to, _count);
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setStatusPublicSale(bool _status) public onlyOwner {
        isPublicSaleActive = _status;
    }

    function setStatusPreMint(bool _statusPreSale, bool _statusPreorders) public onlyOwner {
        isPreSaleActive = _statusPreSale;
        isPreorderMintActive = _statusPreorders;
        if (!isPreordersCounterLoaded){
          preordersCounter = PREORDERS(preordersDataContract).preordersCounter();
          isPreordersCounterLoaded = true;
        }
    }

    function setPreSalesLimit(uint256 _count) public onlyOwner {
        maxPreSalesPerAddress = _count;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        preSaleMerkleRoot = _merkleRoot;
    }

    function withdrawAll() public payable onlyOwner{
        address cofounder = 0xD03c810C126B4f6E18e98A1EC29131605882Dc13;
        uint256 cofounder_value = address(this).balance / 100 * 50;
        uint256 owner_value = address(this).balance - cofounder_value;
        require(payable(cofounder).send(cofounder_value));
        require(payable(owner()).send(owner_value));
    }

}

interface PREORDERS{
    function preordersCounter() external view returns (uint256);
    function preordersAtAddress(address _address) external view returns (uint256);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreorderMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreSalesPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSalesPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPreorder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"preSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"preordersAtAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preordersCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preordersDataContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"presalesAtAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setPreSalesLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_statusPreSale","type":"bool"},{"internalType":"bool","name":"_statusPreorders","type":"bool"}],"name":"setStatusPreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setStatusPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60c060405260008055600060075567016345785d8a0000600a5567011c37937e080000600b55731815a17abe7630045133051ad7cb905b25d57ae9600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600d556002600e55600a600f553480156200009657600080fd5b506040518060400160405280600881526020017f5461696b657473750000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f5441494b455453550000000000000000000000000000000000000000000000008152506003611701600081116200014e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014590620003f6565b60405180910390fd5b6000821162000194576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018b90620003d4565b60405180910390fd5b8360019080519060200190620001ac929190620002d6565b508260029080519060200190620001c5929190620002d6565b508160a08181525050806080818152505050505050620001fa620001ee6200020860201b60201c565b6200021060201b60201c565b60016009819055506200052c565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e49062000429565b90600052602060002090601f01602090048101928262000308576000855562000354565b82601f106200032357805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035357825182559160200191906001019062000336565b5b50905062000363919062000367565b5090565b5b808211156200038257600081600090555060010162000368565b5090565b60006200039560278362000418565b9150620003a2826200048e565b604082019050919050565b6000620003bc602e8362000418565b9150620003c982620004dd565b604082019050919050565b60006020820190508181036000830152620003ef8162000386565b9050919050565b600060208201905081810360008301526200041181620003ad565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200044257607f821691505b602082108114156200045957620004586200045f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051615a086200055d60003960008181612df301528181612e1c0152613543015260005050615a086000f3fe6080604052600436106102675760003560e01c80637cb6475911610144578063b287c8ed116100b6578063cc7cee441161007a578063cc7cee4414610905578063d7224ba014610930578063d8ea82dd1461095b578063e757c17d14610986578063e985e9c5146109b1578063f2fde38b146109ee57610267565b8063b287c8ed1461082f578063b88d4fde1461084b578063bc9e128014610874578063c5bd6f0a1461089d578063c87b56dd146108c857610267565b806395d89b411161010857806395d89b41146107405780639b6860c81461076b5780639d044ed314610796578063a22cb465146107c1578063a98bbc5a146107ea578063b26ce6771461080657610267565b80637cb647591461068e57806383ebaa19146106b75780638462151c146106ce578063853828b61461070b5780638da5cb5b1461071557610267565b806343838845116101dd57806355f804b3116101a157806355f804b3146105805780636352211e146105a957806370a08231146105e6578063714dea4914610623578063715018a61461064e5780637892ceb01461066557610267565b80634383884514610475578063484b973c146104a05780634a106b0f146104c95780634f6ccce71461050657806352bad9121461054357610267565b806318160ddd1161022f57806318160ddd146103655780631e84c4131461039057806323b872dd146103bb5780632f745c59146103e457806332cb6b0c1461042157806342842e0e1461044c57610267565b806301ffc9a71461026c5780630337a0ff146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613f1a565b610a17565b6040516102a0919061473d565b60405180910390f35b3480156102b557600080fd5b506102be610b61565b6040516102cb9190614bb5565b60405180910390f35b3480156102e057600080fd5b506102e9610b67565b6040516102f69190614773565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613fbd565b610bf9565b60405161033391906146b4565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190613e40565b610c7e565b005b34801561037157600080fd5b5061037a610d97565b6040516103879190614bb5565b60405180910390f35b34801561039c57600080fd5b506103a5610da0565b6040516103b2919061473d565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd9190613d2a565b610db3565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613e40565b610dc3565b6040516104189190614bb5565b60405180910390f35b34801561042d57600080fd5b50610436610fc1565b6040516104439190614bb5565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613d2a565b610fc7565b005b34801561048157600080fd5b5061048a610fe7565b6040516104979190614758565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c29190613e40565b610fed565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613cbd565b61112d565b6040516104fd9190614bb5565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613fbd565b611176565b60405161053a9190614bb5565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613cbd565b6111c9565b6040516105779190614bb5565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613f74565b6112d9565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613fbd565b61136f565b6040516105dd91906146b4565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613cbd565b611385565b60405161061a9190614bb5565b60405180910390f35b34801561062f57600080fd5b5061063861146e565b60405161064591906146b4565b60405180910390f35b34801561065a57600080fd5b50610663611494565b005b34801561067157600080fd5b5061068c60048036038101906106879190613ead565b61151c565b005b34801561069a57600080fd5b506106b560048036038101906106b09190613eed565b6116a6565b005b3480156106c357600080fd5b506106cc61172c565b005b3480156106da57600080fd5b506106f560048036038101906106f09190613cbd565b611977565b604051610702919061471b565b60405180910390f35b610713611a25565b005b34801561072157600080fd5b5061072a611b6f565b60405161073791906146b4565b60405180910390f35b34801561074c57600080fd5b50610755611b99565b6040516107629190614773565b60405180910390f35b34801561077757600080fd5b50610780611c2b565b60405161078d9190614bb5565b60405180910390f35b3480156107a257600080fd5b506107ab611c31565b6040516107b8919061473d565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e39190613e00565b611c44565b005b61080460048036038101906107ff9190614017565b611dc5565b005b34801561081257600080fd5b5061082d60048036038101906108289190613e80565b6120c2565b005b61084960048036038101906108449190613fbd565b61215b565b005b34801561085757600080fd5b50610872600480360381019061086d9190613d7d565b612357565b005b34801561088057600080fd5b5061089b60048036038101906108969190613fbd565b6123b3565b005b3480156108a957600080fd5b506108b2612439565b6040516108bf9190614bb5565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190613fbd565b61243f565b6040516108fc9190614773565b60405180910390f35b34801561091157600080fd5b5061091a6124e6565b604051610927919061473d565b60405180910390f35b34801561093c57600080fd5b506109456124f9565b6040516109529190614bb5565b60405180910390f35b34801561096757600080fd5b506109706124ff565b60405161097d9190614bb5565b60405180910390f35b34801561099257600080fd5b5061099b612505565b6040516109a89190614bb5565b60405180910390f35b3480156109bd57600080fd5b506109d860048036038101906109d39190613cea565b61250b565b6040516109e5919061473d565b60405180910390f35b3480156109fa57600080fd5b50610a156004803603810190610a109190613cbd565b61259f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5a5750610b5982612697565b5b9050919050565b60145481565b606060018054610b7690614f68565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba290614f68565b8015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b5050505050905090565b6000610c0482612701565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90614b55565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c898261136f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190614a15565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1961270e565b73ffffffffffffffffffffffffffffffffffffffff161480610d485750610d4781610d4261270e565b61250b565b5b610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e906148d5565b60405180910390fd5b610d92838383612716565b505050565b60008054905090565b600c60149054906101000a900460ff1681565b610dbe8383836127c8565b505050565b6000610dce83611385565b8210610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0690614795565b60405180910390fd5b6000610e19610d97565b905060008060005b83811015610f7f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f1357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f6b5786841415610f5c578195505050505050610fbb565b8380610f6790614fcb565b9450505b508080610f7790614fcb565b915050610e21565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290614af5565b60405180910390fd5b92915050565b61170181565b610fe283838360405180602001604052806000815250612357565b505050565b60105481565b610ff561270e565b73ffffffffffffffffffffffffffffffffffffffff16611013611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090614955565b60405180910390fd5b611701611074610d97565b106110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab90614915565b60405180910390fd5b600f54601354826110c59190614d19565b1115611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90614975565b60405180910390fd5b80601360008282546111189190614d19565b925050819055506111298282612d81565b5050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611180610d97565b82106111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890614835565b60405180910390fd5b819050919050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561122657600090506112d4565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352bad912836040518263ffffffff1660e01b815260040161128191906146b4565b60206040518083038186803b15801561129957600080fd5b505afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d19190613fea565b90505b919050565b6112e161270e565b73ffffffffffffffffffffffffffffffffffffffff166112ff611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614955565b60405180910390fd5b806016908051906020019061136b929190613a17565b5050565b600061137a82612d9f565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed906148f5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61149c61270e565b73ffffffffffffffffffffffffffffffffffffffff166114ba611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790614955565b60405180910390fd5b61151a6000612fa2565b565b61152461270e565b73ffffffffffffffffffffffffffffffffffffffff16611542611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158f90614955565b60405180910390fd5b81600c60156101000a81548160ff02191690831515021790555080600c60166101000a81548160ff021916908315150217905550601560009054906101000a900460ff166116a257600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630337a0ff6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164857600080fd5b505afa15801561165c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116809190613fea565b6014819055506001601560006101000a81548160ff0219169083151502179055505b5050565b6116ae61270e565b73ffffffffffffffffffffffffffffffffffffffff166116cc611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614955565b60405180910390fd5b8060108190555050565b60026009541415611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990614b15565b60405180910390fd5b6002600981905550611701611785610d97565b106117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90614915565b60405180910390fd5b600c60169054906101000a900460ff16611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b906148b5565b60405180910390fd5b600061181f336111c9565b905060008111611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185b90614875565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e8906147b5565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550806014600082825461195b9190614e2e565b9250508190555061196c3382612d81565b506001600981905550565b6060600061198483611385565b905060008167ffffffffffffffff8111156119a2576119a1615125565b5b6040519080825280602002602001820160405280156119d05781602001602082028036833780820191505090505b50905060005b82811015611a1a576119e88582610dc3565b8282815181106119fb576119fa6150f6565b5b6020026020010181815250508080611a1290614fcb565b9150506119d6565b508092505050919050565b611a2d61270e565b73ffffffffffffffffffffffffffffffffffffffff16611a4b611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614955565b60405180910390fd5b600073d03c810c126b4f6e18e98a1ec29131605882dc13905060006032606447611acb9190614d6f565b611ad59190614da0565b905060008147611ae59190614e2e565b90508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050611b2557600080fd5b611b2d611b6f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050611b6a57600080fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611ba890614f68565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd490614f68565b8015611c215780601f10611bf657610100808354040283529160200191611c21565b820191906000526020600020905b815481529060010190602001808311611c0457829003601f168201915b5050505050905090565b600a5481565b600c60159054906101000a900460ff1681565b611c4c61270e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb1906149b5565b60405180910390fd5b8060066000611cc761270e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d7461270e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db9919061473d565b60405180910390a35050565b60026009541415611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290614b15565b60405180910390fd5b6002600981905550611701611e1e610d97565b10611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590614915565b60405180910390fd5b600c60159054906101000a900460ff16611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614815565b60405180910390fd5b601454611701611ebd9190614e2e565b83611ec6610d97565b611ed09190614d19565b1115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614b95565b60405180910390fd5b600e5460116000611f2061270e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611f669190614d19565b1115611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614ab5565b60405180910390fd5b611fb98282611fb461270e565b613068565b611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90614ad5565b60405180910390fd5b82600b546120069190614da0565b3414612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e906149f5565b60405180910390fd5b826011600061205461270e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209d9190614d19565b925050819055506120b56120af61270e565b84612d81565b6001600981905550505050565b6120ca61270e565b73ffffffffffffffffffffffffffffffffffffffff166120e8611b6f565b73ffffffffffffffffffffffffffffffffffffffff161461213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590614955565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600260095414156121a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219890614b15565b60405180910390fd5b60026009819055506117016121b4610d97565b106121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90614915565b60405180910390fd5b600c60149054906101000a900460ff16612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a90614a95565b60405180910390fd5b6014546117016122539190614e2e565b8161225c610d97565b6122669190614d19565b11156122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e90614b95565b60405180910390fd5b600d548111156122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e390614895565b60405180910390fd5b600a54816122fa9190614da0565b341461233b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612332906149f5565b60405180910390fd5b61234c61234661270e565b82612d81565b600160098190555050565b6123628484846127c8565b61236e848484846130ec565b6123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a490614a35565b60405180910390fd5b50505050565b6123bb61270e565b73ffffffffffffffffffffffffffffffffffffffff166123d9611b6f565b73ffffffffffffffffffffffffffffffffffffffff161461242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614955565b60405180910390fd5b80600e8190555050565b600d5481565b606061244a82612701565b612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614995565b60405180910390fd5b6000612493613283565b905060008151116124b357604051806020016040528060008152506124de565b806124bd84613315565b6040516020016124ce929190614690565b6040516020818303038152906040525b915050919050565b600c60169054906101000a900460ff1681565b60075481565b600e5481565b600b5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125a761270e565b73ffffffffffffffffffffffffffffffffffffffff166125c5611b6f565b73ffffffffffffffffffffffffffffffffffffffff161461261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614955565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561268b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612682906147d5565b60405180910390fd5b61269481612fa2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127d382612d9f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127fa61270e565b73ffffffffffffffffffffffffffffffffffffffff161480612856575061281f61270e565b73ffffffffffffffffffffffffffffffffffffffff1661283e84610bf9565b73ffffffffffffffffffffffffffffffffffffffff16145b806128725750612871826000015161286c61270e565b61250b565b5b9050806128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab906149d5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90614935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90614855565b60405180910390fd5b6129a38585856001613476565b6129b36000848460000151612716565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a219190614dfa565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ac59190614cd3565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612bcb9190614d19565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d1157612c4181612701565b15612d10576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d79868686600161347c565b505050505050565b612d9b828260405180602001604052806000815250613482565b5050565b612da7613a9d565b612db082612701565b612def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de6906147f5565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612e535760017f000000000000000000000000000000000000000000000000000000000000000084612e469190614e2e565b612e509190614d19565b90505b60008390505b818110612f61576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f4d57809350505050612f9d565b508080612f5990614f3e565b915050612e59565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9490614b35565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808260405160200161307c9190614675565b6040516020818303038152906040528051906020012090506130e2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483613961565b9150509392505050565b600061310d8473ffffffffffffffffffffffffffffffffffffffff16613978565b15613276578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261313661270e565b8786866040518563ffffffff1660e01b815260040161315894939291906146cf565b602060405180830381600087803b15801561317257600080fd5b505af19250505080156131a357506040513d601f19601f820116820180604052508101906131a09190613f47565b60015b613226573d80600081146131d3576040519150601f19603f3d011682016040523d82523d6000602084013e6131d8565b606091505b5060008151141561321e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321590614a35565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061327b565b600190505b949350505050565b60606016805461329290614f68565b80601f01602080910402602001604051908101604052809291908181526020018280546132be90614f68565b801561330b5780601f106132e05761010080835404028352916020019161330b565b820191906000526020600020905b8154815290600101906020018083116132ee57829003601f168201915b5050505050905090565b6060600082141561335d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613471565b600082905060005b6000821461338f57808061337890614fcb565b915050600a826133889190614d6f565b9150613365565b60008167ffffffffffffffff8111156133ab576133aa615125565b5b6040519080825280601f01601f1916602001820160405280156133dd5781602001600182028036833780820191505090505b5090505b6000851461346a576001826133f69190614e2e565b9150600a856134059190615038565b60306134119190614d19565b60f81b818381518110613427576134266150f6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134639190614d6f565b94506133e1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156134f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ef90614a75565b60405180910390fd5b61350181612701565b15613541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353890614a55565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156135a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359b90614b75565b60405180910390fd5b6135b16000858386613476565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136ae9190614cd3565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136d59190614cd3565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561394457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138e460008884886130ec565b613923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391a90614a35565b60405180910390fd5b818061392e90614fcb565b925050808061393c90614fcb565b915050613873565b5080600081905550613959600087858861347c565b505050505050565b60008261396e858461398b565b1490509392505050565b600080823b905060008111915050919050565b60008082905060005b84518110156139f55760008582815181106139b2576139b16150f6565b5b602002602001015190508083116139d4576139cd8382613a00565b92506139e1565b6139de8184613a00565b92505b5080806139ed90614fcb565b915050613994565b508091505092915050565b600082600052816020526040600020905092915050565b828054613a2390614f68565b90600052602060002090601f016020900481019282613a455760008555613a8c565b82601f10613a5e57805160ff1916838001178555613a8c565b82800160010185558215613a8c579182015b82811115613a8b578251825591602001919060010190613a70565b5b509050613a999190613ad7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613af0576000816000905550600101613ad8565b5090565b6000613b07613b0284614bf5565b614bd0565b905082815260208101848484011115613b2357613b22615163565b5b613b2e848285614efc565b509392505050565b6000613b49613b4484614c26565b614bd0565b905082815260208101848484011115613b6557613b64615163565b5b613b70848285614efc565b509392505050565b600081359050613b878161595f565b92915050565b60008083601f840112613ba357613ba2615159565b5b8235905067ffffffffffffffff811115613bc057613bbf615154565b5b602083019150836020820283011115613bdc57613bdb61515e565b5b9250929050565b600081359050613bf281615976565b92915050565b600081359050613c078161598d565b92915050565b600081359050613c1c816159a4565b92915050565b600081519050613c31816159a4565b92915050565b600082601f830112613c4c57613c4b615159565b5b8135613c5c848260208601613af4565b91505092915050565b600082601f830112613c7a57613c79615159565b5b8135613c8a848260208601613b36565b91505092915050565b600081359050613ca2816159bb565b92915050565b600081519050613cb7816159bb565b92915050565b600060208284031215613cd357613cd261516d565b5b6000613ce184828501613b78565b91505092915050565b60008060408385031215613d0157613d0061516d565b5b6000613d0f85828601613b78565b9250506020613d2085828601613b78565b9150509250929050565b600080600060608486031215613d4357613d4261516d565b5b6000613d5186828701613b78565b9350506020613d6286828701613b78565b9250506040613d7386828701613c93565b9150509250925092565b60008060008060808587031215613d9757613d9661516d565b5b6000613da587828801613b78565b9450506020613db687828801613b78565b9350506040613dc787828801613c93565b925050606085013567ffffffffffffffff811115613de857613de7615168565b5b613df487828801613c37565b91505092959194509250565b60008060408385031215613e1757613e1661516d565b5b6000613e2585828601613b78565b9250506020613e3685828601613be3565b9150509250929050565b60008060408385031215613e5757613e5661516d565b5b6000613e6585828601613b78565b9250506020613e7685828601613c93565b9150509250929050565b600060208284031215613e9657613e9561516d565b5b6000613ea484828501613be3565b91505092915050565b60008060408385031215613ec457613ec361516d565b5b6000613ed285828601613be3565b9250506020613ee385828601613be3565b9150509250929050565b600060208284031215613f0357613f0261516d565b5b6000613f1184828501613bf8565b91505092915050565b600060208284031215613f3057613f2f61516d565b5b6000613f3e84828501613c0d565b91505092915050565b600060208284031215613f5d57613f5c61516d565b5b6000613f6b84828501613c22565b91505092915050565b600060208284031215613f8a57613f8961516d565b5b600082013567ffffffffffffffff811115613fa857613fa7615168565b5b613fb484828501613c65565b91505092915050565b600060208284031215613fd357613fd261516d565b5b6000613fe184828501613c93565b91505092915050565b60006020828403121561400057613fff61516d565b5b600061400e84828501613ca8565b91505092915050565b6000806000604084860312156140305761402f61516d565b5b600061403e86828701613c93565b935050602084013567ffffffffffffffff81111561405f5761405e615168565b5b61406b86828701613b8d565b92509250509250925092565b60006140838383614657565b60208301905092915050565b61409881614e62565b82525050565b6140af6140aa82614e62565b615014565b82525050565b60006140c082614c67565b6140ca8185614c95565b93506140d583614c57565b8060005b838110156141065781516140ed8882614077565b97506140f883614c88565b9250506001810190506140d9565b5085935050505092915050565b61411c81614e74565b82525050565b61412b81614e80565b82525050565b600061413c82614c72565b6141468185614ca6565b9350614156818560208601614f0b565b61415f81615172565b840191505092915050565b600061417582614c7d565b61417f8185614cb7565b935061418f818560208601614f0b565b61419881615172565b840191505092915050565b60006141ae82614c7d565b6141b88185614cc8565b93506141c8818560208601614f0b565b80840191505092915050565b60006141e1602283614cb7565b91506141ec82615190565b604082019050919050565b6000614204600e83614cb7565b915061420f826151df565b602082019050919050565b6000614227602683614cb7565b915061423282615208565b604082019050919050565b600061424a602a83614cb7565b915061425582615257565b604082019050919050565b600061426d601183614cb7565b9150614278826152a6565b602082019050919050565b6000614290602383614cb7565b915061429b826152cf565b604082019050919050565b60006142b3602583614cb7565b91506142be8261531e565b604082019050919050565b60006142d6600c83614cb7565b91506142e18261536d565b602082019050919050565b60006142f9601083614cb7565b915061430482615396565b602082019050919050565b600061431c601883614cb7565b9150614327826153bf565b602082019050919050565b600061433f603983614cb7565b915061434a826153e8565b604082019050919050565b6000614362602b83614cb7565b915061436d82615437565b604082019050919050565b6000614385600883614cb7565b915061439082615486565b602082019050919050565b60006143a8602683614cb7565b91506143b3826154af565b604082019050919050565b60006143cb602083614cb7565b91506143d6826154fe565b602082019050919050565b60006143ee601883614cb7565b91506143f982615527565b602082019050919050565b6000614411602f83614cb7565b915061441c82615550565b604082019050919050565b6000614434601a83614cb7565b915061443f8261559f565b602082019050919050565b6000614457603283614cb7565b9150614462826155c8565b604082019050919050565b600061447a601183614cb7565b915061448582615617565b602082019050919050565b600061449d602283614cb7565b91506144a882615640565b604082019050919050565b60006144c0603383614cb7565b91506144cb8261568f565b604082019050919050565b60006144e3601d83614cb7565b91506144ee826156de565b602082019050919050565b6000614506602183614cb7565b915061451182615707565b604082019050919050565b6000614529601683614cb7565b915061453482615756565b602082019050919050565b600061454c601583614cb7565b91506145578261577f565b602082019050919050565b600061456f600d83614cb7565b915061457a826157a8565b602082019050919050565b6000614592602e83614cb7565b915061459d826157d1565b604082019050919050565b60006145b5601f83614cb7565b91506145c082615820565b602082019050919050565b60006145d8602f83614cb7565b91506145e382615849565b604082019050919050565b60006145fb602d83614cb7565b915061460682615898565b604082019050919050565b600061461e602283614cb7565b9150614629826158e7565b604082019050919050565b6000614641601183614cb7565b915061464c82615936565b602082019050919050565b61466081614ef2565b82525050565b61466f81614ef2565b82525050565b6000614681828461409e565b60148201915081905092915050565b600061469c82856141a3565b91506146a882846141a3565b91508190509392505050565b60006020820190506146c9600083018461408f565b92915050565b60006080820190506146e4600083018761408f565b6146f1602083018661408f565b6146fe6040830185614666565b81810360608301526147108184614131565b905095945050505050565b6000602082019050818103600083015261473581846140b5565b905092915050565b60006020820190506147526000830184614113565b92915050565b600060208201905061476d6000830184614122565b92915050565b6000602082019050818103600083015261478d818461416a565b905092915050565b600060208201905081810360008301526147ae816141d4565b9050919050565b600060208201905081810360008301526147ce816141f7565b9050919050565b600060208201905081810360008301526147ee8161421a565b9050919050565b6000602082019050818103600083015261480e8161423d565b9050919050565b6000602082019050818103600083015261482e81614260565b9050919050565b6000602082019050818103600083015261484e81614283565b9050919050565b6000602082019050818103600083015261486e816142a6565b9050919050565b6000602082019050818103600083015261488e816142c9565b9050919050565b600060208201905081810360008301526148ae816142ec565b9050919050565b600060208201905081810360008301526148ce8161430f565b9050919050565b600060208201905081810360008301526148ee81614332565b9050919050565b6000602082019050818103600083015261490e81614355565b9050919050565b6000602082019050818103600083015261492e81614378565b9050919050565b6000602082019050818103600083015261494e8161439b565b9050919050565b6000602082019050818103600083015261496e816143be565b9050919050565b6000602082019050818103600083015261498e816143e1565b9050919050565b600060208201905081810360008301526149ae81614404565b9050919050565b600060208201905081810360008301526149ce81614427565b9050919050565b600060208201905081810360008301526149ee8161444a565b9050919050565b60006020820190508181036000830152614a0e8161446d565b9050919050565b60006020820190508181036000830152614a2e81614490565b9050919050565b60006020820190508181036000830152614a4e816144b3565b9050919050565b60006020820190508181036000830152614a6e816144d6565b9050919050565b60006020820190508181036000830152614a8e816144f9565b9050919050565b60006020820190508181036000830152614aae8161451c565b9050919050565b60006020820190508181036000830152614ace8161453f565b9050919050565b60006020820190508181036000830152614aee81614562565b9050919050565b60006020820190508181036000830152614b0e81614585565b9050919050565b60006020820190508181036000830152614b2e816145a8565b9050919050565b60006020820190508181036000830152614b4e816145cb565b9050919050565b60006020820190508181036000830152614b6e816145ee565b9050919050565b60006020820190508181036000830152614b8e81614611565b9050919050565b60006020820190508181036000830152614bae81614634565b9050919050565b6000602082019050614bca6000830184614666565b92915050565b6000614bda614beb565b9050614be68282614f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1057614c0f615125565b5b614c1982615172565b9050602081019050919050565b600067ffffffffffffffff821115614c4157614c40615125565b5b614c4a82615172565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cde82614eb6565b9150614ce983614eb6565b9250826fffffffffffffffffffffffffffffffff03821115614d0e57614d0d615069565b5b828201905092915050565b6000614d2482614ef2565b9150614d2f83614ef2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d6457614d63615069565b5b828201905092915050565b6000614d7a82614ef2565b9150614d8583614ef2565b925082614d9557614d94615098565b5b828204905092915050565b6000614dab82614ef2565b9150614db683614ef2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614def57614dee615069565b5b828202905092915050565b6000614e0582614eb6565b9150614e1083614eb6565b925082821015614e2357614e22615069565b5b828203905092915050565b6000614e3982614ef2565b9150614e4483614ef2565b925082821015614e5757614e56615069565b5b828203905092915050565b6000614e6d82614ed2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f29578082015181840152602081019050614f0e565b83811115614f38576000848401525b50505050565b6000614f4982614ef2565b91506000821415614f5d57614f5c615069565b5b600182039050919050565b60006002820490506001821680614f8057607f821691505b60208210811415614f9457614f936150c7565b5b50919050565b614fa382615172565b810181811067ffffffffffffffff82111715614fc257614fc1615125565b5b80604052505050565b6000614fd682614ef2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561500957615008615069565b5b600182019050919050565b600061501f82615026565b9050919050565b600061503182615183565b9050919050565b600061504382614ef2565b915061504e83614ef2565b92508261505e5761505d615098565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f50726573616c6520697320636c6f736564000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f207072656f72646572730000000000000000000000000000000000000000600082015250565b7f45786365656473205458206c696d697400000000000000000000000000000000600082015250565b7f5072656f7264657273206d696e7420697320636c6f7365640000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206f776e6572206d696e74206c696d69740000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c657320697320636c6f73656400000000000000000000600082015250565b7f457863656564732061646472657373206c696d69740000000000000000000000600082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473204d4158206c696d6974000000000000000000000000000000600082015250565b61596881614e62565b811461597357600080fd5b50565b61597f81614e74565b811461598a57600080fd5b50565b61599681614e80565b81146159a157600080fd5b50565b6159ad81614e8a565b81146159b857600080fd5b50565b6159c481614ef2565b81146159cf57600080fd5b5056fea264697066735822122025bbb46fa842185214f15360e3ebe089a189f5fcd06d6086266bcc9e64b0da0064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102675760003560e01c80637cb6475911610144578063b287c8ed116100b6578063cc7cee441161007a578063cc7cee4414610905578063d7224ba014610930578063d8ea82dd1461095b578063e757c17d14610986578063e985e9c5146109b1578063f2fde38b146109ee57610267565b8063b287c8ed1461082f578063b88d4fde1461084b578063bc9e128014610874578063c5bd6f0a1461089d578063c87b56dd146108c857610267565b806395d89b411161010857806395d89b41146107405780639b6860c81461076b5780639d044ed314610796578063a22cb465146107c1578063a98bbc5a146107ea578063b26ce6771461080657610267565b80637cb647591461068e57806383ebaa19146106b75780638462151c146106ce578063853828b61461070b5780638da5cb5b1461071557610267565b806343838845116101dd57806355f804b3116101a157806355f804b3146105805780636352211e146105a957806370a08231146105e6578063714dea4914610623578063715018a61461064e5780637892ceb01461066557610267565b80634383884514610475578063484b973c146104a05780634a106b0f146104c95780634f6ccce71461050657806352bad9121461054357610267565b806318160ddd1161022f57806318160ddd146103655780631e84c4131461039057806323b872dd146103bb5780632f745c59146103e457806332cb6b0c1461042157806342842e0e1461044c57610267565b806301ffc9a71461026c5780630337a0ff146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613f1a565b610a17565b6040516102a0919061473d565b60405180910390f35b3480156102b557600080fd5b506102be610b61565b6040516102cb9190614bb5565b60405180910390f35b3480156102e057600080fd5b506102e9610b67565b6040516102f69190614773565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613fbd565b610bf9565b60405161033391906146b4565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190613e40565b610c7e565b005b34801561037157600080fd5b5061037a610d97565b6040516103879190614bb5565b60405180910390f35b34801561039c57600080fd5b506103a5610da0565b6040516103b2919061473d565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd9190613d2a565b610db3565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613e40565b610dc3565b6040516104189190614bb5565b60405180910390f35b34801561042d57600080fd5b50610436610fc1565b6040516104439190614bb5565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613d2a565b610fc7565b005b34801561048157600080fd5b5061048a610fe7565b6040516104979190614758565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c29190613e40565b610fed565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613cbd565b61112d565b6040516104fd9190614bb5565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613fbd565b611176565b60405161053a9190614bb5565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613cbd565b6111c9565b6040516105779190614bb5565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613f74565b6112d9565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613fbd565b61136f565b6040516105dd91906146b4565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613cbd565b611385565b60405161061a9190614bb5565b60405180910390f35b34801561062f57600080fd5b5061063861146e565b60405161064591906146b4565b60405180910390f35b34801561065a57600080fd5b50610663611494565b005b34801561067157600080fd5b5061068c60048036038101906106879190613ead565b61151c565b005b34801561069a57600080fd5b506106b560048036038101906106b09190613eed565b6116a6565b005b3480156106c357600080fd5b506106cc61172c565b005b3480156106da57600080fd5b506106f560048036038101906106f09190613cbd565b611977565b604051610702919061471b565b60405180910390f35b610713611a25565b005b34801561072157600080fd5b5061072a611b6f565b60405161073791906146b4565b60405180910390f35b34801561074c57600080fd5b50610755611b99565b6040516107629190614773565b60405180910390f35b34801561077757600080fd5b50610780611c2b565b60405161078d9190614bb5565b60405180910390f35b3480156107a257600080fd5b506107ab611c31565b6040516107b8919061473d565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e39190613e00565b611c44565b005b61080460048036038101906107ff9190614017565b611dc5565b005b34801561081257600080fd5b5061082d60048036038101906108289190613e80565b6120c2565b005b61084960048036038101906108449190613fbd565b61215b565b005b34801561085757600080fd5b50610872600480360381019061086d9190613d7d565b612357565b005b34801561088057600080fd5b5061089b60048036038101906108969190613fbd565b6123b3565b005b3480156108a957600080fd5b506108b2612439565b6040516108bf9190614bb5565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190613fbd565b61243f565b6040516108fc9190614773565b60405180910390f35b34801561091157600080fd5b5061091a6124e6565b604051610927919061473d565b60405180910390f35b34801561093c57600080fd5b506109456124f9565b6040516109529190614bb5565b60405180910390f35b34801561096757600080fd5b506109706124ff565b60405161097d9190614bb5565b60405180910390f35b34801561099257600080fd5b5061099b612505565b6040516109a89190614bb5565b60405180910390f35b3480156109bd57600080fd5b506109d860048036038101906109d39190613cea565b61250b565b6040516109e5919061473d565b60405180910390f35b3480156109fa57600080fd5b50610a156004803603810190610a109190613cbd565b61259f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5a5750610b5982612697565b5b9050919050565b60145481565b606060018054610b7690614f68565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba290614f68565b8015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b5050505050905090565b6000610c0482612701565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90614b55565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c898261136f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190614a15565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1961270e565b73ffffffffffffffffffffffffffffffffffffffff161480610d485750610d4781610d4261270e565b61250b565b5b610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e906148d5565b60405180910390fd5b610d92838383612716565b505050565b60008054905090565b600c60149054906101000a900460ff1681565b610dbe8383836127c8565b505050565b6000610dce83611385565b8210610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0690614795565b60405180910390fd5b6000610e19610d97565b905060008060005b83811015610f7f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f1357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f6b5786841415610f5c578195505050505050610fbb565b8380610f6790614fcb565b9450505b508080610f7790614fcb565b915050610e21565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290614af5565b60405180910390fd5b92915050565b61170181565b610fe283838360405180602001604052806000815250612357565b505050565b60105481565b610ff561270e565b73ffffffffffffffffffffffffffffffffffffffff16611013611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090614955565b60405180910390fd5b611701611074610d97565b106110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab90614915565b60405180910390fd5b600f54601354826110c59190614d19565b1115611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90614975565b60405180910390fd5b80601360008282546111189190614d19565b925050819055506111298282612d81565b5050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611180610d97565b82106111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890614835565b60405180910390fd5b819050919050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561122657600090506112d4565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352bad912836040518263ffffffff1660e01b815260040161128191906146b4565b60206040518083038186803b15801561129957600080fd5b505afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d19190613fea565b90505b919050565b6112e161270e565b73ffffffffffffffffffffffffffffffffffffffff166112ff611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614955565b60405180910390fd5b806016908051906020019061136b929190613a17565b5050565b600061137a82612d9f565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed906148f5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61149c61270e565b73ffffffffffffffffffffffffffffffffffffffff166114ba611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790614955565b60405180910390fd5b61151a6000612fa2565b565b61152461270e565b73ffffffffffffffffffffffffffffffffffffffff16611542611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158f90614955565b60405180910390fd5b81600c60156101000a81548160ff02191690831515021790555080600c60166101000a81548160ff021916908315150217905550601560009054906101000a900460ff166116a257600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630337a0ff6040518163ffffffff1660e01b815260040160206040518083038186803b15801561164857600080fd5b505afa15801561165c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116809190613fea565b6014819055506001601560006101000a81548160ff0219169083151502179055505b5050565b6116ae61270e565b73ffffffffffffffffffffffffffffffffffffffff166116cc611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614955565b60405180910390fd5b8060108190555050565b60026009541415611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990614b15565b60405180910390fd5b6002600981905550611701611785610d97565b106117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90614915565b60405180910390fd5b600c60169054906101000a900460ff16611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b906148b5565b60405180910390fd5b600061181f336111c9565b905060008111611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185b90614875565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e8906147b5565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550806014600082825461195b9190614e2e565b9250508190555061196c3382612d81565b506001600981905550565b6060600061198483611385565b905060008167ffffffffffffffff8111156119a2576119a1615125565b5b6040519080825280602002602001820160405280156119d05781602001602082028036833780820191505090505b50905060005b82811015611a1a576119e88582610dc3565b8282815181106119fb576119fa6150f6565b5b6020026020010181815250508080611a1290614fcb565b9150506119d6565b508092505050919050565b611a2d61270e565b73ffffffffffffffffffffffffffffffffffffffff16611a4b611b6f565b73ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614955565b60405180910390fd5b600073d03c810c126b4f6e18e98a1ec29131605882dc13905060006032606447611acb9190614d6f565b611ad59190614da0565b905060008147611ae59190614e2e565b90508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050611b2557600080fd5b611b2d611b6f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050611b6a57600080fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611ba890614f68565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd490614f68565b8015611c215780601f10611bf657610100808354040283529160200191611c21565b820191906000526020600020905b815481529060010190602001808311611c0457829003601f168201915b5050505050905090565b600a5481565b600c60159054906101000a900460ff1681565b611c4c61270e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb1906149b5565b60405180910390fd5b8060066000611cc761270e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d7461270e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db9919061473d565b60405180910390a35050565b60026009541415611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290614b15565b60405180910390fd5b6002600981905550611701611e1e610d97565b10611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5590614915565b60405180910390fd5b600c60159054906101000a900460ff16611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614815565b60405180910390fd5b601454611701611ebd9190614e2e565b83611ec6610d97565b611ed09190614d19565b1115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614b95565b60405180910390fd5b600e5460116000611f2061270e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611f669190614d19565b1115611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90614ab5565b60405180910390fd5b611fb98282611fb461270e565b613068565b611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90614ad5565b60405180910390fd5b82600b546120069190614da0565b3414612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e906149f5565b60405180910390fd5b826011600061205461270e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209d9190614d19565b925050819055506120b56120af61270e565b84612d81565b6001600981905550505050565b6120ca61270e565b73ffffffffffffffffffffffffffffffffffffffff166120e8611b6f565b73ffffffffffffffffffffffffffffffffffffffff161461213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590614955565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600260095414156121a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219890614b15565b60405180910390fd5b60026009819055506117016121b4610d97565b106121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90614915565b60405180910390fd5b600c60149054906101000a900460ff16612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a90614a95565b60405180910390fd5b6014546117016122539190614e2e565b8161225c610d97565b6122669190614d19565b11156122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e90614b95565b60405180910390fd5b600d548111156122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e390614895565b60405180910390fd5b600a54816122fa9190614da0565b341461233b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612332906149f5565b60405180910390fd5b61234c61234661270e565b82612d81565b600160098190555050565b6123628484846127c8565b61236e848484846130ec565b6123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a490614a35565b60405180910390fd5b50505050565b6123bb61270e565b73ffffffffffffffffffffffffffffffffffffffff166123d9611b6f565b73ffffffffffffffffffffffffffffffffffffffff161461242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614955565b60405180910390fd5b80600e8190555050565b600d5481565b606061244a82612701565b612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614995565b60405180910390fd5b6000612493613283565b905060008151116124b357604051806020016040528060008152506124de565b806124bd84613315565b6040516020016124ce929190614690565b6040516020818303038152906040525b915050919050565b600c60169054906101000a900460ff1681565b60075481565b600e5481565b600b5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125a761270e565b73ffffffffffffffffffffffffffffffffffffffff166125c5611b6f565b73ffffffffffffffffffffffffffffffffffffffff161461261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614955565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561268b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612682906147d5565b60405180910390fd5b61269481612fa2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127d382612d9f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127fa61270e565b73ffffffffffffffffffffffffffffffffffffffff161480612856575061281f61270e565b73ffffffffffffffffffffffffffffffffffffffff1661283e84610bf9565b73ffffffffffffffffffffffffffffffffffffffff16145b806128725750612871826000015161286c61270e565b61250b565b5b9050806128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab906149d5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90614935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90614855565b60405180910390fd5b6129a38585856001613476565b6129b36000848460000151612716565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a219190614dfa565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ac59190614cd3565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612bcb9190614d19565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d1157612c4181612701565b15612d10576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d79868686600161347c565b505050505050565b612d9b828260405180602001604052806000815250613482565b5050565b612da7613a9d565b612db082612701565b612def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de6906147f5565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000038310612e535760017f000000000000000000000000000000000000000000000000000000000000000384612e469190614e2e565b612e509190614d19565b90505b60008390505b818110612f61576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f4d57809350505050612f9d565b508080612f5990614f3e565b915050612e59565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9490614b35565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808260405160200161307c9190614675565b6040516020818303038152906040528051906020012090506130e2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483613961565b9150509392505050565b600061310d8473ffffffffffffffffffffffffffffffffffffffff16613978565b15613276578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261313661270e565b8786866040518563ffffffff1660e01b815260040161315894939291906146cf565b602060405180830381600087803b15801561317257600080fd5b505af19250505080156131a357506040513d601f19601f820116820180604052508101906131a09190613f47565b60015b613226573d80600081146131d3576040519150601f19603f3d011682016040523d82523d6000602084013e6131d8565b606091505b5060008151141561321e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321590614a35565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061327b565b600190505b949350505050565b60606016805461329290614f68565b80601f01602080910402602001604051908101604052809291908181526020018280546132be90614f68565b801561330b5780601f106132e05761010080835404028352916020019161330b565b820191906000526020600020905b8154815290600101906020018083116132ee57829003601f168201915b5050505050905090565b6060600082141561335d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613471565b600082905060005b6000821461338f57808061337890614fcb565b915050600a826133889190614d6f565b9150613365565b60008167ffffffffffffffff8111156133ab576133aa615125565b5b6040519080825280601f01601f1916602001820160405280156133dd5781602001600182028036833780820191505090505b5090505b6000851461346a576001826133f69190614e2e565b9150600a856134059190615038565b60306134119190614d19565b60f81b818381518110613427576134266150f6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134639190614d6f565b94506133e1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156134f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ef90614a75565b60405180910390fd5b61350181612701565b15613541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353890614a55565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000038311156135a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359b90614b75565b60405180910390fd5b6135b16000858386613476565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136ae9190614cd3565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136d59190614cd3565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561394457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138e460008884886130ec565b613923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391a90614a35565b60405180910390fd5b818061392e90614fcb565b925050808061393c90614fcb565b915050613873565b5080600081905550613959600087858861347c565b505050505050565b60008261396e858461398b565b1490509392505050565b600080823b905060008111915050919050565b60008082905060005b84518110156139f55760008582815181106139b2576139b16150f6565b5b602002602001015190508083116139d4576139cd8382613a00565b92506139e1565b6139de8184613a00565b92505b5080806139ed90614fcb565b915050613994565b508091505092915050565b600082600052816020526040600020905092915050565b828054613a2390614f68565b90600052602060002090601f016020900481019282613a455760008555613a8c565b82601f10613a5e57805160ff1916838001178555613a8c565b82800160010185558215613a8c579182015b82811115613a8b578251825591602001919060010190613a70565b5b509050613a999190613ad7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613af0576000816000905550600101613ad8565b5090565b6000613b07613b0284614bf5565b614bd0565b905082815260208101848484011115613b2357613b22615163565b5b613b2e848285614efc565b509392505050565b6000613b49613b4484614c26565b614bd0565b905082815260208101848484011115613b6557613b64615163565b5b613b70848285614efc565b509392505050565b600081359050613b878161595f565b92915050565b60008083601f840112613ba357613ba2615159565b5b8235905067ffffffffffffffff811115613bc057613bbf615154565b5b602083019150836020820283011115613bdc57613bdb61515e565b5b9250929050565b600081359050613bf281615976565b92915050565b600081359050613c078161598d565b92915050565b600081359050613c1c816159a4565b92915050565b600081519050613c31816159a4565b92915050565b600082601f830112613c4c57613c4b615159565b5b8135613c5c848260208601613af4565b91505092915050565b600082601f830112613c7a57613c79615159565b5b8135613c8a848260208601613b36565b91505092915050565b600081359050613ca2816159bb565b92915050565b600081519050613cb7816159bb565b92915050565b600060208284031215613cd357613cd261516d565b5b6000613ce184828501613b78565b91505092915050565b60008060408385031215613d0157613d0061516d565b5b6000613d0f85828601613b78565b9250506020613d2085828601613b78565b9150509250929050565b600080600060608486031215613d4357613d4261516d565b5b6000613d5186828701613b78565b9350506020613d6286828701613b78565b9250506040613d7386828701613c93565b9150509250925092565b60008060008060808587031215613d9757613d9661516d565b5b6000613da587828801613b78565b9450506020613db687828801613b78565b9350506040613dc787828801613c93565b925050606085013567ffffffffffffffff811115613de857613de7615168565b5b613df487828801613c37565b91505092959194509250565b60008060408385031215613e1757613e1661516d565b5b6000613e2585828601613b78565b9250506020613e3685828601613be3565b9150509250929050565b60008060408385031215613e5757613e5661516d565b5b6000613e6585828601613b78565b9250506020613e7685828601613c93565b9150509250929050565b600060208284031215613e9657613e9561516d565b5b6000613ea484828501613be3565b91505092915050565b60008060408385031215613ec457613ec361516d565b5b6000613ed285828601613be3565b9250506020613ee385828601613be3565b9150509250929050565b600060208284031215613f0357613f0261516d565b5b6000613f1184828501613bf8565b91505092915050565b600060208284031215613f3057613f2f61516d565b5b6000613f3e84828501613c0d565b91505092915050565b600060208284031215613f5d57613f5c61516d565b5b6000613f6b84828501613c22565b91505092915050565b600060208284031215613f8a57613f8961516d565b5b600082013567ffffffffffffffff811115613fa857613fa7615168565b5b613fb484828501613c65565b91505092915050565b600060208284031215613fd357613fd261516d565b5b6000613fe184828501613c93565b91505092915050565b60006020828403121561400057613fff61516d565b5b600061400e84828501613ca8565b91505092915050565b6000806000604084860312156140305761402f61516d565b5b600061403e86828701613c93565b935050602084013567ffffffffffffffff81111561405f5761405e615168565b5b61406b86828701613b8d565b92509250509250925092565b60006140838383614657565b60208301905092915050565b61409881614e62565b82525050565b6140af6140aa82614e62565b615014565b82525050565b60006140c082614c67565b6140ca8185614c95565b93506140d583614c57565b8060005b838110156141065781516140ed8882614077565b97506140f883614c88565b9250506001810190506140d9565b5085935050505092915050565b61411c81614e74565b82525050565b61412b81614e80565b82525050565b600061413c82614c72565b6141468185614ca6565b9350614156818560208601614f0b565b61415f81615172565b840191505092915050565b600061417582614c7d565b61417f8185614cb7565b935061418f818560208601614f0b565b61419881615172565b840191505092915050565b60006141ae82614c7d565b6141b88185614cc8565b93506141c8818560208601614f0b565b80840191505092915050565b60006141e1602283614cb7565b91506141ec82615190565b604082019050919050565b6000614204600e83614cb7565b915061420f826151df565b602082019050919050565b6000614227602683614cb7565b915061423282615208565b604082019050919050565b600061424a602a83614cb7565b915061425582615257565b604082019050919050565b600061426d601183614cb7565b9150614278826152a6565b602082019050919050565b6000614290602383614cb7565b915061429b826152cf565b604082019050919050565b60006142b3602583614cb7565b91506142be8261531e565b604082019050919050565b60006142d6600c83614cb7565b91506142e18261536d565b602082019050919050565b60006142f9601083614cb7565b915061430482615396565b602082019050919050565b600061431c601883614cb7565b9150614327826153bf565b602082019050919050565b600061433f603983614cb7565b915061434a826153e8565b604082019050919050565b6000614362602b83614cb7565b915061436d82615437565b604082019050919050565b6000614385600883614cb7565b915061439082615486565b602082019050919050565b60006143a8602683614cb7565b91506143b3826154af565b604082019050919050565b60006143cb602083614cb7565b91506143d6826154fe565b602082019050919050565b60006143ee601883614cb7565b91506143f982615527565b602082019050919050565b6000614411602f83614cb7565b915061441c82615550565b604082019050919050565b6000614434601a83614cb7565b915061443f8261559f565b602082019050919050565b6000614457603283614cb7565b9150614462826155c8565b604082019050919050565b600061447a601183614cb7565b915061448582615617565b602082019050919050565b600061449d602283614cb7565b91506144a882615640565b604082019050919050565b60006144c0603383614cb7565b91506144cb8261568f565b604082019050919050565b60006144e3601d83614cb7565b91506144ee826156de565b602082019050919050565b6000614506602183614cb7565b915061451182615707565b604082019050919050565b6000614529601683614cb7565b915061453482615756565b602082019050919050565b600061454c601583614cb7565b91506145578261577f565b602082019050919050565b600061456f600d83614cb7565b915061457a826157a8565b602082019050919050565b6000614592602e83614cb7565b915061459d826157d1565b604082019050919050565b60006145b5601f83614cb7565b91506145c082615820565b602082019050919050565b60006145d8602f83614cb7565b91506145e382615849565b604082019050919050565b60006145fb602d83614cb7565b915061460682615898565b604082019050919050565b600061461e602283614cb7565b9150614629826158e7565b604082019050919050565b6000614641601183614cb7565b915061464c82615936565b602082019050919050565b61466081614ef2565b82525050565b61466f81614ef2565b82525050565b6000614681828461409e565b60148201915081905092915050565b600061469c82856141a3565b91506146a882846141a3565b91508190509392505050565b60006020820190506146c9600083018461408f565b92915050565b60006080820190506146e4600083018761408f565b6146f1602083018661408f565b6146fe6040830185614666565b81810360608301526147108184614131565b905095945050505050565b6000602082019050818103600083015261473581846140b5565b905092915050565b60006020820190506147526000830184614113565b92915050565b600060208201905061476d6000830184614122565b92915050565b6000602082019050818103600083015261478d818461416a565b905092915050565b600060208201905081810360008301526147ae816141d4565b9050919050565b600060208201905081810360008301526147ce816141f7565b9050919050565b600060208201905081810360008301526147ee8161421a565b9050919050565b6000602082019050818103600083015261480e8161423d565b9050919050565b6000602082019050818103600083015261482e81614260565b9050919050565b6000602082019050818103600083015261484e81614283565b9050919050565b6000602082019050818103600083015261486e816142a6565b9050919050565b6000602082019050818103600083015261488e816142c9565b9050919050565b600060208201905081810360008301526148ae816142ec565b9050919050565b600060208201905081810360008301526148ce8161430f565b9050919050565b600060208201905081810360008301526148ee81614332565b9050919050565b6000602082019050818103600083015261490e81614355565b9050919050565b6000602082019050818103600083015261492e81614378565b9050919050565b6000602082019050818103600083015261494e8161439b565b9050919050565b6000602082019050818103600083015261496e816143be565b9050919050565b6000602082019050818103600083015261498e816143e1565b9050919050565b600060208201905081810360008301526149ae81614404565b9050919050565b600060208201905081810360008301526149ce81614427565b9050919050565b600060208201905081810360008301526149ee8161444a565b9050919050565b60006020820190508181036000830152614a0e8161446d565b9050919050565b60006020820190508181036000830152614a2e81614490565b9050919050565b60006020820190508181036000830152614a4e816144b3565b9050919050565b60006020820190508181036000830152614a6e816144d6565b9050919050565b60006020820190508181036000830152614a8e816144f9565b9050919050565b60006020820190508181036000830152614aae8161451c565b9050919050565b60006020820190508181036000830152614ace8161453f565b9050919050565b60006020820190508181036000830152614aee81614562565b9050919050565b60006020820190508181036000830152614b0e81614585565b9050919050565b60006020820190508181036000830152614b2e816145a8565b9050919050565b60006020820190508181036000830152614b4e816145cb565b9050919050565b60006020820190508181036000830152614b6e816145ee565b9050919050565b60006020820190508181036000830152614b8e81614611565b9050919050565b60006020820190508181036000830152614bae81614634565b9050919050565b6000602082019050614bca6000830184614666565b92915050565b6000614bda614beb565b9050614be68282614f9a565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1057614c0f615125565b5b614c1982615172565b9050602081019050919050565b600067ffffffffffffffff821115614c4157614c40615125565b5b614c4a82615172565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cde82614eb6565b9150614ce983614eb6565b9250826fffffffffffffffffffffffffffffffff03821115614d0e57614d0d615069565b5b828201905092915050565b6000614d2482614ef2565b9150614d2f83614ef2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d6457614d63615069565b5b828201905092915050565b6000614d7a82614ef2565b9150614d8583614ef2565b925082614d9557614d94615098565b5b828204905092915050565b6000614dab82614ef2565b9150614db683614ef2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614def57614dee615069565b5b828202905092915050565b6000614e0582614eb6565b9150614e1083614eb6565b925082821015614e2357614e22615069565b5b828203905092915050565b6000614e3982614ef2565b9150614e4483614ef2565b925082821015614e5757614e56615069565b5b828203905092915050565b6000614e6d82614ed2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f29578082015181840152602081019050614f0e565b83811115614f38576000848401525b50505050565b6000614f4982614ef2565b91506000821415614f5d57614f5c615069565b5b600182039050919050565b60006002820490506001821680614f8057607f821691505b60208210811415614f9457614f936150c7565b5b50919050565b614fa382615172565b810181811067ffffffffffffffff82111715614fc257614fc1615125565b5b80604052505050565b6000614fd682614ef2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561500957615008615069565b5b600182019050919050565b600061501f82615026565b9050919050565b600061503182615183565b9050919050565b600061504382614ef2565b915061504e83614ef2565b92508261505e5761505d615098565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f50726573616c6520697320636c6f736564000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f207072656f72646572730000000000000000000000000000000000000000600082015250565b7f45786365656473205458206c696d697400000000000000000000000000000000600082015250565b7f5072656f7264657273206d696e7420697320636c6f7365640000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206f776e6572206d696e74206c696d69740000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c657320697320636c6f73656400000000000000000000600082015250565b7f457863656564732061646472657373206c696d69740000000000000000000000600082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473204d4158206c696d6974000000000000000000000000000000600082015250565b61596881614e62565b811461597357600080fd5b50565b61597f81614e74565b811461598a57600080fd5b50565b61599681614e80565b81146159a157600080fd5b50565b6159ad81614e8a565b81146159b857600080fd5b50565b6159c481614ef2565b81146159cf57600080fd5b5056fea264697066735822122025bbb46fa842185214f15360e3ebe089a189f5fcd06d6086266bcc9e64b0da0064736f6c63430008070033

Deployed Bytecode Sourcemap

33039:5281:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22779:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33829:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24354:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25437:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25052:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21746:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33378:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26119:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22029:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33144:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26267:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33637:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36800:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36067:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21846:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35805:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37097:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24230:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23155:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33288:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2049:94;;;;;;;;;;;;;:::i;:::-;;37322:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37813:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35191:484;;;;;;;;;;;;;:::i;:::-;;36204:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37932:383;;;:::i;:::-;;1826:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24454:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33192:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33415:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25647:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34524:659;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37207:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34028:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26430:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37697:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33490:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24558:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33449:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29686:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33544:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33238:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25927:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2151:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22779:370;22906:4;22951:25;22936:40;;;:11;:40;;;;:99;;;;23002:33;22987:48;;;:11;:48;;;;22936:99;:160;;;;23061:35;23046:50;;;:11;:50;;;;22936:160;:207;;;;23107:36;23131:11;23107:23;:36::i;:::-;22936:207;22922:221;;22779:370;;;:::o;33829:31::-;;;;:::o;24354:94::-;24408:13;24437:5;24430:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24354:94;:::o;25437:204::-;25505:7;25529:16;25537:7;25529;:16::i;:::-;25521:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25611:15;:24;25627:7;25611:24;;;;;;;;;;;;;;;;;;;;;25604:31;;25437:204;;;:::o;25052:379::-;25121:13;25137:24;25153:7;25137:15;:24::i;:::-;25121:40;;25182:5;25176:11;;:2;:11;;;;25168:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25267:5;25251:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25276:37;25293:5;25300:12;:10;:12::i;:::-;25276:16;:37::i;:::-;25251:62;25235:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;25397:28;25406:2;25410:7;25419:5;25397:8;:28::i;:::-;25114:317;25052:379;;:::o;21746:94::-;21799:7;21822:12;;21815:19;;21746:94;:::o;33378:30::-;;;;;;;;;;;;;:::o;26119:142::-;26227:28;26237:4;26243:2;26247:7;26227:9;:28::i;:::-;26119:142;;;:::o;22029:744::-;22138:7;22173:16;22183:5;22173:9;:16::i;:::-;22165:5;:24;22157:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22235:22;22260:13;:11;:13::i;:::-;22235:38;;22280:19;22310:25;22360:9;22355:350;22379:14;22375:1;:18;22355:350;;;22409:31;22443:11;:14;22455:1;22443:14;;;;;;;;;;;22409:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22496:1;22470:28;;:9;:14;;;:28;;;22466:89;;22531:9;:14;;;22511:34;;22466:89;22588:5;22567:26;;:17;:26;;;22563:135;;;22625:5;22610:11;:20;22606:59;;;22652:1;22645:8;;;;;;;;;22606:59;22675:13;;;;;:::i;:::-;;;;22563:135;22400:305;22395:3;;;;;:::i;:::-;;;;22355:350;;;;22711:56;;;;;;;;;;:::i;:::-;;;;;;;;22029:744;;;;;:::o;33144:41::-;33181:4;33144:41;:::o;26267:157::-;26379:39;26396:4;26402:2;26406:7;26379:39;;;;;;;;;;;;:16;:39::i;:::-;26267:157;;;:::o;33637:32::-;;;;:::o;36800:289::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33181:4:::1;36883:13;:11;:13::i;:::-;:26;36875:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;36970:12;;36950:16;;36941:6;:25;;;;:::i;:::-;:41;;36933:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;37042:6;37022:16;;:26;;;;;;;:::i;:::-;;;;;;;;37059:22;37069:3;37074:6;37059:9;:22::i;:::-;36800:289:::0;;:::o;36067:125::-;36132:7;36159:15;:25;36175:8;36159:25;;;;;;;;;;;;;;;;36152:32;;36067:125;;;:::o;21846:177::-;21913:7;21945:13;:11;:13::i;:::-;21937:5;:21;21929:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22012:5;22005:12;;21846:177;;;:::o;35805:254::-;35871:7;35895:14;:24;35910:8;35895:24;;;;;;;;;;;;;;;;;;;;;;;;;35891:161;;;35940:1;35933:8;;;;35891:161;35989:21;;;;;;;;;;;35979:51;;;36031:8;35979:61;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35972:68;;35805:254;;;;:::o;37097:102::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37184:7:::1;37168:13;:23;;;;;;;;;;;;:::i;:::-;;37097:102:::0;:::o;24230:118::-;24294:7;24317:20;24329:7;24317:11;:20::i;:::-;:25;;;24310:32;;24230:118;;;:::o;23155:211::-;23219:7;23260:1;23243:19;;:5;:19;;;;23235:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;23332:12;:19;23345:5;23332:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;23324:36;;23317:43;;23155:211;;;:::o;33288:81::-;;;;;;;;;;;;;:::o;2049:94::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2114:21:::1;2132:1;2114:9;:21::i;:::-;2049:94::o:0;37322:367::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37438:14:::1;37420:15;;:32;;;;;;;;;;;;;;;;;;37486:16;37463:20;;:39;;;;;;;;;;;;;;;;;;37518:24;;;;;;;;;;;37513:169;;37585:21;;;;;;;;;;;37575:49;;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37556:16;:70;;;;37666:4;37639:24;;:31;;;;;;;;;;;;;;;;;;37513:169;37322:367:::0;;:::o;37813:111::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37905:11:::1;37885:17;:31;;;;37813:111:::0;:::o;35191:484::-;31606:1;31754:7;;:19;;31746:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31606:1;31820:7;:18;;;;33181:4:::1;35254:13;:11;:13::i;:::-;:26;35246:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;35312:20;;;;;;;;;;;35304:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35372:18;35393:30;35412:10;35393:18;:30::i;:::-;35372:51;;35455:1;35442:10;:14;35434:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;35493:14;:26;35508:10;35493:26;;;;;;;;;;;;;;;;;;;;;;;;;35492:27;35484:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;35578:4;35549:14;:26;35564:10;35549:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;35613:10;35593:16;;:30;;;;;;;:::i;:::-;;;;;;;;35634:33;35644:10;35656;35634:9;:33::i;:::-;35235:440;31562:1:::0;31861:7;:22;;;;35191:484::o;36204:340::-;36265:16;36294:15;36312:17;36322:6;36312:9;:17::i;:::-;36294:35;;36340:25;36382:10;36368:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36340:53;;36408:6;36404:107;36424:10;36420:1;:14;36404:107;;;36469:30;36489:6;36497:1;36469:19;:30::i;:::-;36455:8;36464:1;36455:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;36436:3;;;;;:::i;:::-;;;;36404:107;;;;36528:8;36521:15;;;;36204:340;;;:::o;37932:383::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37990:17:::1;38010:42;37990:62;;38063:23;38119:2;38113:3;38089:21;:27;;;;:::i;:::-;:32;;;;:::i;:::-;38063:58;;38132:19;38178:15;38154:21;:39;;;;:::i;:::-;38132:61;;38220:9;38212:23;;:40;38236:15;38212:40;;;;;;;;;;;;;;;;;;;;;;;38204:49;;;::::0;::::1;;38280:7;:5;:7::i;:::-;38272:21;;:34;38294:11;38272:34;;;;;;;;;;;;;;;;;;;;;;;38264:43;;;::::0;::::1;;37979:336;;;37932:383::o:0;1826:87::-;1872:7;1899:6;;;;;;;;;;;1892:13;;1826:87;:::o;24454:98::-;24510:13;24539:7;24532:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24454:98;:::o;33192:39::-;;;;:::o;33415:27::-;;;;;;;;;;;;;:::o;25647:274::-;25750:12;:10;:12::i;:::-;25738:24;;:8;:24;;;;25730:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25847:8;25802:18;:32;25821:12;:10;:12::i;:::-;25802:32;;;;;;;;;;;;;;;:42;25835:8;25802:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25896:8;25867:48;;25882:12;:10;:12::i;:::-;25867:48;;;25906:8;25867:48;;;;;;:::i;:::-;;;;;;;;25647:274;;:::o;34524:659::-;31606:1;31754:7;;:19;;31746:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31606:1;31820:7;:18;;;;33181:4:::1;34637:13;:11;:13::i;:::-;:26;34629:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;34695:15;;;;;;;;;;;34687:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;34790:16;;33181:4;34777:29;;;;:::i;:::-;34767:6;34751:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:55;;34743:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34889:21;;34856:15;:29;34872:12;:10;:12::i;:::-;34856:29;;;;;;;;;;;;;;;;34847:6;:38;;;;:::i;:::-;:63;;34839:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;34955:35;34963:12;;34977;:10;:12::i;:::-;34955:7;:35::i;:::-;34947:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35055:6;35040:12;;:21;;;;:::i;:::-;35027:9;:34;35019:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35127:6;35094:15;:29;35110:12;:10;:12::i;:::-;35094:29;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;35144:31;35154:12;:10;:12::i;:::-;35168:6;35144:9;:31::i;:::-;31562:1:::0;31861:7;:22;;;;34524:659;;;:::o;37207:107::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37299:7:::1;37278:18;;:28;;;;;;;;;;;;;;;;;;37207:107:::0;:::o;34028:488::-;31606:1;31754:7;;:19;;31746:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31606:1;31820:7;:18;;;;33181:4:::1;34111:13;:11;:13::i;:::-;:26;34103:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;34169:18;;;;;;;;;;;34161:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;34272:16;;33181:4;34259:29;;;;:::i;:::-;34249:6;34233:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:55;;34225:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34339:28;;34329:6;:38;;34321:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34429:15;;34420:6;:24;;;;:::i;:::-;34407:9;:37;34399:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34477:31;34487:12;:10;:12::i;:::-;34501:6;34477:9;:31::i;:::-;31562:1:::0;31861:7;:22;;;;34028:488;:::o;26430:311::-;26567:28;26577:4;26583:2;26587:7;26567:9;:28::i;:::-;26618:48;26641:4;26647:2;26651:7;26660:5;26618:22;:48::i;:::-;26602:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;26430:311;;;;:::o;37697:108::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37791:6:::1;37767:21;:30;;;;37697:108:::0;:::o;33490:47::-;;;;:::o;24558:394::-;24656:13;24697:16;24705:7;24697;:16::i;:::-;24681:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;24787:21;24811:10;:8;:10::i;:::-;24787:34;;24866:1;24848:7;24842:21;:25;:104;;;;;;;;;;;;;;;;;24903:7;24912:18;:7;:16;:18::i;:::-;24886:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24842:104;24828:118;;;24558:394;;;:::o;33449:32::-;;;;;;;;;;;;;:::o;29686:43::-;;;;:::o;33544:40::-;;;;:::o;33238:37::-;;;;:::o;25927:186::-;26049:4;26072:18;:25;26091:5;26072:25;;;;;;;;;;;;;;;:35;26098:8;26072:35;;;;;;;;;;;;;;;;;;;;;;;;;26065:42;;25927:186;;;;:::o;2151:192::-;1972:12;:10;:12::i;:::-;1961:23;;:7;:5;:7::i;:::-;:23;;;1953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2260:1:::1;2240:22;;:8;:22;;;;2232:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2316:19;2326:8;2316:9;:19::i;:::-;2151:192:::0;:::o;4169:157::-;4254:4;4293:25;4278:40;;;:11;:40;;;;4271:47;;4169:157;;;:::o;26747:105::-;26804:4;26834:12;;26824:7;:22;26817:29;;26747:105;;;:::o;1381:98::-;1434:7;1461:10;1454:17;;1381:98;:::o;29508:172::-;29632:2;29605:15;:24;29621:7;29605:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29666:7;29662:2;29646:28;;29655:5;29646:28;;;;;;;;;;;;29508:172;;;:::o;28240:1262::-;28337:35;28375:20;28387:7;28375:11;:20::i;:::-;28337:58;;28404:22;28446:13;:18;;;28430:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;28499:12;:10;:12::i;:::-;28475:36;;:20;28487:7;28475:11;:20::i;:::-;:36;;;28430:81;:142;;;;28522:50;28539:13;:18;;;28559:12;:10;:12::i;:::-;28522:16;:50::i;:::-;28430:142;28404:169;;28598:17;28582:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;28730:4;28708:26;;:13;:18;;;:26;;;28692:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;28819:1;28805:16;;:2;:16;;;;28797:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28872:43;28894:4;28900:2;28904:7;28913:1;28872:21;:43::i;:::-;28924:49;28941:1;28945:7;28954:13;:18;;;28924:8;:49::i;:::-;29012:1;28982:12;:18;28995:4;28982:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29048:1;29020:12;:16;29033:2;29020:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29079:43;;;;;;;;29094:2;29079:43;;;;;;29105:15;29079:43;;;;;29056:11;:20;29068:7;29056:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29131:19;29163:1;29153:7;:11;;;;:::i;:::-;29131:33;;29216:1;29175:43;;:11;:24;29187:11;29175:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;29171:236;;;29233:20;29241:11;29233:7;:20::i;:::-;29229:171;;;29293:97;;;;;;;;29320:13;:18;;;29293:97;;;;;;29351:13;:28;;;29293:97;;;;;29266:11;:24;29278:11;29266:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29229:171;29171:236;29439:7;29435:2;29420:27;;29429:4;29420:27;;;;;;;;;;;;29454:42;29475:4;29481:2;29485:7;29494:1;29454:20;:42::i;:::-;28330:1172;;;28240:1262;;;:::o;26858:98::-;26923:27;26933:2;26937:8;26923:27;;;;;;;;;;;;:9;:27::i;:::-;26858:98;;:::o;23618:606::-;23694:21;;:::i;:::-;23735:16;23743:7;23735;:16::i;:::-;23727:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23807:26;23855:12;23844:7;:23;23840:93;;23924:1;23909:12;23899:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;23878:47;;23840:93;23946:12;23961:7;23946:22;;23941:212;23978:18;23970:4;:26;23941:212;;24015:31;24049:11;:17;24061:4;24049:17;;;;;;;;;;;24015:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24105:1;24079:28;;:9;:14;;;:28;;;24075:71;;24127:9;24120:16;;;;;;;24075:71;24006:147;23998:6;;;;;:::i;:::-;;;;23941:212;;;;24161:57;;;;;;;;;;:::i;:::-;;;;;;;;23618:606;;;;:::o;2351:173::-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2351:173;:::o;36552:236::-;36639:4;36656:12;36698:6;36681:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;36671:35;;;;;;36656:50;;36724:56;36743:11;;36724:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36756:17;;36775:4;36724:18;:56::i;:::-;36717:63;;;36552:236;;;;;:::o;30489:690::-;30626:4;30643:15;:2;:13;;;:15::i;:::-;30639:535;;;30698:2;30682:36;;;30719:12;:10;:12::i;:::-;30733:4;30739:7;30748:5;30682:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30669:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30930:1;30913:6;:13;:18;30909:215;;;30946:61;;;;;;;;;;:::i;:::-;;;;;;;;30909:215;31092:6;31086:13;31077:6;31073:2;31069:15;31062:38;30669:464;30814:45;;;30804:55;;;:6;:55;;;;30797:62;;;;;30639:535;31162:4;31155:11;;30489:690;;;;;;;:::o;35683:114::-;35743:13;35776;35769:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35683:114;:::o;4423:534::-;4479:13;4520:1;4511:5;:10;4507:53;;;4538:10;;;;;;;;;;;;;;;;;;;;;4507:53;4570:12;4585:5;4570:20;;4601:14;4626:78;4641:1;4633:4;:9;4626:78;;4659:8;;;;;:::i;:::-;;;;4690:2;4682:10;;;;;:::i;:::-;;;4626:78;;;4714:19;4746:6;4736:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4714:39;;4764:154;4780:1;4771:5;:10;4764:154;;4808:1;4798:11;;;;;:::i;:::-;;;4875:2;4867:5;:10;;;;:::i;:::-;4854:2;:24;;;;:::i;:::-;4841:39;;4824:6;4831;4824:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4904:2;4895:11;;;;;:::i;:::-;;;4764:154;;;4942:6;4928:21;;;;;4423:534;;;;:::o;31185:141::-;;;;;:::o;31332:140::-;;;;;:::o;26962:1272::-;27067:20;27090:12;;27067:35;;27131:1;27117:16;;:2;:16;;;;27109:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27308:21;27316:12;27308:7;:21::i;:::-;27307:22;27299:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27390:12;27378:8;:24;;27370:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27450:61;27480:1;27484:2;27488:12;27502:8;27450:21;:61::i;:::-;27520:30;27553:12;:16;27566:2;27553:16;;;;;;;;;;;;;;;27520:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27595:119;;;;;;;;27645:8;27615:11;:19;;;:39;;;;:::i;:::-;27595:119;;;;;;27698:8;27663:11;:24;;;:44;;;;:::i;:::-;27595:119;;;;;27576:12;:16;27589:2;27576:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27749:43;;;;;;;;27764:2;27749:43;;;;;;27775:15;27749:43;;;;;27721:11;:25;27733:12;27721:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27801:20;27824:12;27801:35;;27850:9;27845:281;27869:8;27865:1;:12;27845:281;;;27923:12;27919:2;27898:38;;27915:1;27898:38;;;;;;;;;;;;27963:59;27994:1;27998:2;28002:12;28016:5;27963:22;:59::i;:::-;27945:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;28104:14;;;;;:::i;:::-;;;;27879:3;;;;;:::i;:::-;;;;27845:281;;;;28149:12;28134;:27;;;;28168:60;28197:1;28201:2;28205:12;28219:8;28168:20;:60::i;:::-;27060:1174;;;26962:1272;;;:::o;31927:190::-;32052:4;32105;32076:25;32089:5;32096:4;32076:12;:25::i;:::-;:33;32069:40;;31927:190;;;;;:::o;5796:198::-;5856:4;5875:12;5942:7;5930:20;5922:28;;5985:1;5978:4;:8;5971:15;;;5796:198;;;:::o;32125:675::-;32208:7;32228:20;32251:4;32228:27;;32271:9;32266:497;32290:5;:12;32286:1;:16;32266:497;;;32324:20;32347:5;32353:1;32347:8;;;;;;;;:::i;:::-;;;;;;;;32324:31;;32390:12;32374;:28;32370:382;;32517:42;32532:12;32546;32517:14;:42::i;:::-;32502:57;;32370:382;;;32694:42;32709:12;32723;32694:14;:42::i;:::-;32679:57;;32370:382;32309:454;32304:3;;;;;:::i;:::-;;;;32266:497;;;;32780:12;32773:19;;;32125:675;;;;:::o;32808:224::-;32876:13;32939:1;32933:4;32926:15;32968:1;32962:4;32955:15;33009:4;33003;32993:21;32984:30;;32808:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:143::-;3070:5;3101:6;3095:13;3086:22;;3117:33;3144:5;3117:33;:::i;:::-;3013:143;;;;:::o;3162:329::-;3221:6;3270:2;3258:9;3249:7;3245:23;3241:32;3238:119;;;3276:79;;:::i;:::-;3238:119;3396:1;3421:53;3466:7;3457:6;3446:9;3442:22;3421:53;:::i;:::-;3411:63;;3367:117;3162:329;;;;:::o;3497:474::-;3565:6;3573;3622:2;3610:9;3601:7;3597:23;3593:32;3590:119;;;3628:79;;:::i;:::-;3590:119;3748:1;3773:53;3818:7;3809:6;3798:9;3794:22;3773:53;:::i;:::-;3763:63;;3719:117;3875:2;3901:53;3946:7;3937:6;3926:9;3922:22;3901:53;:::i;:::-;3891:63;;3846:118;3497:474;;;;;:::o;3977:619::-;4054:6;4062;4070;4119:2;4107:9;4098:7;4094:23;4090:32;4087:119;;;4125:79;;:::i;:::-;4087:119;4245:1;4270:53;4315:7;4306:6;4295:9;4291:22;4270:53;:::i;:::-;4260:63;;4216:117;4372:2;4398:53;4443:7;4434:6;4423:9;4419:22;4398:53;:::i;:::-;4388:63;;4343:118;4500:2;4526:53;4571:7;4562:6;4551:9;4547:22;4526:53;:::i;:::-;4516:63;;4471:118;3977:619;;;;;:::o;4602:943::-;4697:6;4705;4713;4721;4770:3;4758:9;4749:7;4745:23;4741:33;4738:120;;;4777:79;;:::i;:::-;4738:120;4897:1;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4868:117;5024:2;5050:53;5095:7;5086:6;5075:9;5071:22;5050:53;:::i;:::-;5040:63;;4995:118;5152:2;5178:53;5223:7;5214:6;5203:9;5199:22;5178:53;:::i;:::-;5168:63;;5123:118;5308:2;5297:9;5293:18;5280:32;5339:18;5331:6;5328:30;5325:117;;;5361:79;;:::i;:::-;5325:117;5466:62;5520:7;5511:6;5500:9;5496:22;5466:62;:::i;:::-;5456:72;;5251:287;4602:943;;;;;;;:::o;5551:468::-;5616:6;5624;5673:2;5661:9;5652:7;5648:23;5644:32;5641:119;;;5679:79;;:::i;:::-;5641:119;5799:1;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5770:117;5926:2;5952:50;5994:7;5985:6;5974:9;5970:22;5952:50;:::i;:::-;5942:60;;5897:115;5551:468;;;;;:::o;6025:474::-;6093:6;6101;6150:2;6138:9;6129:7;6125:23;6121:32;6118:119;;;6156:79;;:::i;:::-;6118:119;6276:1;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6247:117;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;6025:474;;;;;:::o;6505:323::-;6561:6;6610:2;6598:9;6589:7;6585:23;6581:32;6578:119;;;6616:79;;:::i;:::-;6578:119;6736:1;6761:50;6803:7;6794:6;6783:9;6779:22;6761:50;:::i;:::-;6751:60;;6707:114;6505:323;;;;:::o;6834:462::-;6896:6;6904;6953:2;6941:9;6932:7;6928:23;6924:32;6921:119;;;6959:79;;:::i;:::-;6921:119;7079:1;7104:50;7146:7;7137:6;7126:9;7122:22;7104:50;:::i;:::-;7094:60;;7050:114;7203:2;7229:50;7271:7;7262:6;7251:9;7247:22;7229:50;:::i;:::-;7219:60;;7174:115;6834:462;;;;;:::o;7302:329::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:119;;;7416:79;;:::i;:::-;7378:119;7536:1;7561:53;7606:7;7597:6;7586:9;7582:22;7561:53;:::i;:::-;7551:63;;7507:117;7302:329;;;;:::o;7637:327::-;7695:6;7744:2;7732:9;7723:7;7719:23;7715:32;7712:119;;;7750:79;;:::i;:::-;7712:119;7870:1;7895:52;7939:7;7930:6;7919:9;7915:22;7895:52;:::i;:::-;7885:62;;7841:116;7637:327;;;;:::o;7970:349::-;8039:6;8088:2;8076:9;8067:7;8063:23;8059:32;8056:119;;;8094:79;;:::i;:::-;8056:119;8214:1;8239:63;8294:7;8285:6;8274:9;8270:22;8239:63;:::i;:::-;8229:73;;8185:127;7970:349;;;;:::o;8325:509::-;8394:6;8443:2;8431:9;8422:7;8418:23;8414:32;8411:119;;;8449:79;;:::i;:::-;8411:119;8597:1;8586:9;8582:17;8569:31;8627:18;8619:6;8616:30;8613:117;;;8649:79;;:::i;:::-;8613:117;8754:63;8809:7;8800:6;8789:9;8785:22;8754:63;:::i;:::-;8744:73;;8540:287;8325:509;;;;:::o;8840:329::-;8899:6;8948:2;8936:9;8927:7;8923:23;8919:32;8916:119;;;8954:79;;:::i;:::-;8916:119;9074:1;9099:53;9144:7;9135:6;9124:9;9120:22;9099:53;:::i;:::-;9089:63;;9045:117;8840:329;;;;:::o;9175:351::-;9245:6;9294:2;9282:9;9273:7;9269:23;9265:32;9262:119;;;9300:79;;:::i;:::-;9262:119;9420:1;9445:64;9501:7;9492:6;9481:9;9477:22;9445:64;:::i;:::-;9435:74;;9391:128;9175:351;;;;:::o;9532:704::-;9627:6;9635;9643;9692:2;9680:9;9671:7;9667:23;9663:32;9660:119;;;9698:79;;:::i;:::-;9660:119;9818:1;9843:53;9888:7;9879:6;9868:9;9864:22;9843:53;:::i;:::-;9833:63;;9789:117;9973:2;9962:9;9958:18;9945:32;10004:18;9996:6;9993:30;9990:117;;;10026:79;;:::i;:::-;9990:117;10139:80;10211:7;10202:6;10191:9;10187:22;10139:80;:::i;:::-;10121:98;;;;9916:313;9532:704;;;;;:::o;10242:179::-;10311:10;10332:46;10374:3;10366:6;10332:46;:::i;:::-;10410:4;10405:3;10401:14;10387:28;;10242:179;;;;:::o;10427:118::-;10514:24;10532:5;10514:24;:::i;:::-;10509:3;10502:37;10427:118;;:::o;10551:157::-;10656:45;10676:24;10694:5;10676:24;:::i;:::-;10656:45;:::i;:::-;10651:3;10644:58;10551:157;;:::o;10744:732::-;10863:3;10892:54;10940:5;10892:54;:::i;:::-;10962:86;11041:6;11036:3;10962:86;:::i;:::-;10955:93;;11072:56;11122:5;11072:56;:::i;:::-;11151:7;11182:1;11167:284;11192:6;11189:1;11186:13;11167:284;;;11268:6;11262:13;11295:63;11354:3;11339:13;11295:63;:::i;:::-;11288:70;;11381:60;11434:6;11381:60;:::i;:::-;11371:70;;11227:224;11214:1;11211;11207:9;11202:14;;11167:284;;;11171:14;11467:3;11460:10;;10868:608;;;10744:732;;;;:::o;11482:109::-;11563:21;11578:5;11563:21;:::i;:::-;11558:3;11551:34;11482:109;;:::o;11597:118::-;11684:24;11702:5;11684:24;:::i;:::-;11679:3;11672:37;11597:118;;:::o;11721:360::-;11807:3;11835:38;11867:5;11835:38;:::i;:::-;11889:70;11952:6;11947:3;11889:70;:::i;:::-;11882:77;;11968:52;12013:6;12008:3;12001:4;11994:5;11990:16;11968:52;:::i;:::-;12045:29;12067:6;12045:29;:::i;:::-;12040:3;12036:39;12029:46;;11811:270;11721:360;;;;:::o;12087:364::-;12175:3;12203:39;12236:5;12203:39;:::i;:::-;12258:71;12322:6;12317:3;12258:71;:::i;:::-;12251:78;;12338:52;12383:6;12378:3;12371:4;12364:5;12360:16;12338:52;:::i;:::-;12415:29;12437:6;12415:29;:::i;:::-;12410:3;12406:39;12399:46;;12179:272;12087:364;;;;:::o;12457:377::-;12563:3;12591:39;12624:5;12591:39;:::i;:::-;12646:89;12728:6;12723:3;12646:89;:::i;:::-;12639:96;;12744:52;12789:6;12784:3;12777:4;12770:5;12766:16;12744:52;:::i;:::-;12821:6;12816:3;12812:16;12805:23;;12567:267;12457:377;;;;:::o;12840:366::-;12982:3;13003:67;13067:2;13062:3;13003:67;:::i;:::-;12996:74;;13079:93;13168:3;13079:93;:::i;:::-;13197:2;13192:3;13188:12;13181:19;;12840:366;;;:::o;13212:::-;13354:3;13375:67;13439:2;13434:3;13375:67;:::i;:::-;13368:74;;13451:93;13540:3;13451:93;:::i;:::-;13569:2;13564:3;13560:12;13553:19;;13212:366;;;:::o;13584:::-;13726:3;13747:67;13811:2;13806:3;13747:67;:::i;:::-;13740:74;;13823:93;13912:3;13823:93;:::i;:::-;13941:2;13936:3;13932:12;13925:19;;13584:366;;;:::o;13956:::-;14098:3;14119:67;14183:2;14178:3;14119:67;:::i;:::-;14112:74;;14195:93;14284:3;14195:93;:::i;:::-;14313:2;14308:3;14304:12;14297:19;;13956:366;;;:::o;14328:::-;14470:3;14491:67;14555:2;14550:3;14491:67;:::i;:::-;14484:74;;14567:93;14656:3;14567:93;:::i;:::-;14685:2;14680:3;14676:12;14669:19;;14328:366;;;:::o;14700:::-;14842:3;14863:67;14927:2;14922:3;14863:67;:::i;:::-;14856:74;;14939:93;15028:3;14939:93;:::i;:::-;15057:2;15052:3;15048:12;15041:19;;14700:366;;;:::o;15072:::-;15214:3;15235:67;15299:2;15294:3;15235:67;:::i;:::-;15228:74;;15311:93;15400:3;15311:93;:::i;:::-;15429:2;15424:3;15420:12;15413:19;;15072:366;;;:::o;15444:::-;15586:3;15607:67;15671:2;15666:3;15607:67;:::i;:::-;15600:74;;15683:93;15772:3;15683:93;:::i;:::-;15801:2;15796:3;15792:12;15785:19;;15444:366;;;:::o;15816:::-;15958:3;15979:67;16043:2;16038:3;15979:67;:::i;:::-;15972:74;;16055:93;16144:3;16055:93;:::i;:::-;16173:2;16168:3;16164:12;16157:19;;15816:366;;;:::o;16188:::-;16330:3;16351:67;16415:2;16410:3;16351:67;:::i;:::-;16344:74;;16427:93;16516:3;16427:93;:::i;:::-;16545:2;16540:3;16536:12;16529:19;;16188:366;;;:::o;16560:::-;16702:3;16723:67;16787:2;16782:3;16723:67;:::i;:::-;16716:74;;16799:93;16888:3;16799:93;:::i;:::-;16917:2;16912:3;16908:12;16901:19;;16560:366;;;:::o;16932:::-;17074:3;17095:67;17159:2;17154:3;17095:67;:::i;:::-;17088:74;;17171:93;17260:3;17171:93;:::i;:::-;17289:2;17284:3;17280:12;17273:19;;16932:366;;;:::o;17304:365::-;17446:3;17467:66;17531:1;17526:3;17467:66;:::i;:::-;17460:73;;17542:93;17631:3;17542:93;:::i;:::-;17660:2;17655:3;17651:12;17644:19;;17304:365;;;:::o;17675:366::-;17817:3;17838:67;17902:2;17897:3;17838:67;:::i;:::-;17831:74;;17914:93;18003:3;17914:93;:::i;:::-;18032:2;18027:3;18023:12;18016:19;;17675:366;;;:::o;18047:::-;18189:3;18210:67;18274:2;18269:3;18210:67;:::i;:::-;18203:74;;18286:93;18375:3;18286:93;:::i;:::-;18404:2;18399:3;18395:12;18388:19;;18047:366;;;:::o;18419:::-;18561:3;18582:67;18646:2;18641:3;18582:67;:::i;:::-;18575:74;;18658:93;18747:3;18658:93;:::i;:::-;18776:2;18771:3;18767:12;18760:19;;18419:366;;;:::o;18791:::-;18933:3;18954:67;19018:2;19013:3;18954:67;:::i;:::-;18947:74;;19030:93;19119:3;19030:93;:::i;:::-;19148:2;19143:3;19139:12;19132:19;;18791:366;;;:::o;19163:::-;19305:3;19326:67;19390:2;19385:3;19326:67;:::i;:::-;19319:74;;19402:93;19491:3;19402:93;:::i;:::-;19520:2;19515:3;19511:12;19504:19;;19163:366;;;:::o;19535:::-;19677:3;19698:67;19762:2;19757:3;19698:67;:::i;:::-;19691:74;;19774:93;19863:3;19774:93;:::i;:::-;19892:2;19887:3;19883:12;19876:19;;19535:366;;;:::o;19907:::-;20049:3;20070:67;20134:2;20129:3;20070:67;:::i;:::-;20063:74;;20146:93;20235:3;20146:93;:::i;:::-;20264:2;20259:3;20255:12;20248:19;;19907:366;;;:::o;20279:::-;20421:3;20442:67;20506:2;20501:3;20442:67;:::i;:::-;20435:74;;20518:93;20607:3;20518:93;:::i;:::-;20636:2;20631:3;20627:12;20620:19;;20279:366;;;:::o;20651:::-;20793:3;20814:67;20878:2;20873:3;20814:67;:::i;:::-;20807:74;;20890:93;20979:3;20890:93;:::i;:::-;21008:2;21003:3;20999:12;20992:19;;20651:366;;;:::o;21023:::-;21165:3;21186:67;21250:2;21245:3;21186:67;:::i;:::-;21179:74;;21262:93;21351:3;21262:93;:::i;:::-;21380:2;21375:3;21371:12;21364:19;;21023:366;;;:::o;21395:::-;21537:3;21558:67;21622:2;21617:3;21558:67;:::i;:::-;21551:74;;21634:93;21723:3;21634:93;:::i;:::-;21752:2;21747:3;21743:12;21736:19;;21395:366;;;:::o;21767:::-;21909:3;21930:67;21994:2;21989:3;21930:67;:::i;:::-;21923:74;;22006:93;22095:3;22006:93;:::i;:::-;22124:2;22119:3;22115:12;22108:19;;21767:366;;;:::o;22139:::-;22281:3;22302:67;22366:2;22361:3;22302:67;:::i;:::-;22295:74;;22378:93;22467:3;22378:93;:::i;:::-;22496:2;22491:3;22487:12;22480:19;;22139:366;;;:::o;22511:::-;22653:3;22674:67;22738:2;22733:3;22674:67;:::i;:::-;22667:74;;22750:93;22839:3;22750:93;:::i;:::-;22868:2;22863:3;22859:12;22852:19;;22511:366;;;:::o;22883:::-;23025:3;23046:67;23110:2;23105:3;23046:67;:::i;:::-;23039:74;;23122:93;23211:3;23122:93;:::i;:::-;23240:2;23235:3;23231:12;23224:19;;22883:366;;;:::o;23255:::-;23397:3;23418:67;23482:2;23477:3;23418:67;:::i;:::-;23411:74;;23494:93;23583:3;23494:93;:::i;:::-;23612:2;23607:3;23603:12;23596:19;;23255:366;;;:::o;23627:::-;23769:3;23790:67;23854:2;23849:3;23790:67;:::i;:::-;23783:74;;23866:93;23955:3;23866:93;:::i;:::-;23984:2;23979:3;23975:12;23968:19;;23627:366;;;:::o;23999:::-;24141:3;24162:67;24226:2;24221:3;24162:67;:::i;:::-;24155:74;;24238:93;24327:3;24238:93;:::i;:::-;24356:2;24351:3;24347:12;24340:19;;23999:366;;;:::o;24371:::-;24513:3;24534:67;24598:2;24593:3;24534:67;:::i;:::-;24527:74;;24610:93;24699:3;24610:93;:::i;:::-;24728:2;24723:3;24719:12;24712:19;;24371:366;;;:::o;24743:::-;24885:3;24906:67;24970:2;24965:3;24906:67;:::i;:::-;24899:74;;24982:93;25071:3;24982:93;:::i;:::-;25100:2;25095:3;25091:12;25084:19;;24743:366;;;:::o;25115:108::-;25192:24;25210:5;25192:24;:::i;:::-;25187:3;25180:37;25115:108;;:::o;25229:118::-;25316:24;25334:5;25316:24;:::i;:::-;25311:3;25304:37;25229:118;;:::o;25353:256::-;25465:3;25480:75;25551:3;25542:6;25480:75;:::i;:::-;25580:2;25575:3;25571:12;25564:19;;25600:3;25593:10;;25353:256;;;;:::o;25615:435::-;25795:3;25817:95;25908:3;25899:6;25817:95;:::i;:::-;25810:102;;25929:95;26020:3;26011:6;25929:95;:::i;:::-;25922:102;;26041:3;26034:10;;25615:435;;;;;:::o;26056:222::-;26149:4;26187:2;26176:9;26172:18;26164:26;;26200:71;26268:1;26257:9;26253:17;26244:6;26200:71;:::i;:::-;26056:222;;;;:::o;26284:640::-;26479:4;26517:3;26506:9;26502:19;26494:27;;26531:71;26599:1;26588:9;26584:17;26575:6;26531:71;:::i;:::-;26612:72;26680:2;26669:9;26665:18;26656:6;26612:72;:::i;:::-;26694;26762:2;26751:9;26747:18;26738:6;26694:72;:::i;:::-;26813:9;26807:4;26803:20;26798:2;26787:9;26783:18;26776:48;26841:76;26912:4;26903:6;26841:76;:::i;:::-;26833:84;;26284:640;;;;;;;:::o;26930:373::-;27073:4;27111:2;27100:9;27096:18;27088:26;;27160:9;27154:4;27150:20;27146:1;27135:9;27131:17;27124:47;27188:108;27291:4;27282:6;27188:108;:::i;:::-;27180:116;;26930:373;;;;:::o;27309:210::-;27396:4;27434:2;27423:9;27419:18;27411:26;;27447:65;27509:1;27498:9;27494:17;27485:6;27447:65;:::i;:::-;27309:210;;;;:::o;27525:222::-;27618:4;27656:2;27645:9;27641:18;27633:26;;27669:71;27737:1;27726:9;27722:17;27713:6;27669:71;:::i;:::-;27525:222;;;;:::o;27753:313::-;27866:4;27904:2;27893:9;27889:18;27881:26;;27953:9;27947:4;27943:20;27939:1;27928:9;27924:17;27917:47;27981:78;28054:4;28045:6;27981:78;:::i;:::-;27973:86;;27753:313;;;;:::o;28072:419::-;28238:4;28276:2;28265:9;28261:18;28253:26;;28325:9;28319:4;28315:20;28311:1;28300:9;28296:17;28289:47;28353:131;28479:4;28353:131;:::i;:::-;28345:139;;28072:419;;;:::o;28497:::-;28663:4;28701:2;28690:9;28686:18;28678:26;;28750:9;28744:4;28740:20;28736:1;28725:9;28721:17;28714:47;28778:131;28904:4;28778:131;:::i;:::-;28770:139;;28497:419;;;:::o;28922:::-;29088:4;29126:2;29115:9;29111:18;29103:26;;29175:9;29169:4;29165:20;29161:1;29150:9;29146:17;29139:47;29203:131;29329:4;29203:131;:::i;:::-;29195:139;;28922:419;;;:::o;29347:::-;29513:4;29551:2;29540:9;29536:18;29528:26;;29600:9;29594:4;29590:20;29586:1;29575:9;29571:17;29564:47;29628:131;29754:4;29628:131;:::i;:::-;29620:139;;29347:419;;;:::o;29772:::-;29938:4;29976:2;29965:9;29961:18;29953:26;;30025:9;30019:4;30015:20;30011:1;30000:9;29996:17;29989:47;30053:131;30179:4;30053:131;:::i;:::-;30045:139;;29772:419;;;:::o;30197:::-;30363:4;30401:2;30390:9;30386:18;30378:26;;30450:9;30444:4;30440:20;30436:1;30425:9;30421:17;30414:47;30478:131;30604:4;30478:131;:::i;:::-;30470:139;;30197:419;;;:::o;30622:::-;30788:4;30826:2;30815:9;30811:18;30803:26;;30875:9;30869:4;30865:20;30861:1;30850:9;30846:17;30839:47;30903:131;31029:4;30903:131;:::i;:::-;30895:139;;30622:419;;;:::o;31047:::-;31213:4;31251:2;31240:9;31236:18;31228:26;;31300:9;31294:4;31290:20;31286:1;31275:9;31271:17;31264:47;31328:131;31454:4;31328:131;:::i;:::-;31320:139;;31047:419;;;:::o;31472:::-;31638:4;31676:2;31665:9;31661:18;31653:26;;31725:9;31719:4;31715:20;31711:1;31700:9;31696:17;31689:47;31753:131;31879:4;31753:131;:::i;:::-;31745:139;;31472:419;;;:::o;31897:::-;32063:4;32101:2;32090:9;32086:18;32078:26;;32150:9;32144:4;32140:20;32136:1;32125:9;32121:17;32114:47;32178:131;32304:4;32178:131;:::i;:::-;32170:139;;31897:419;;;:::o;32322:::-;32488:4;32526:2;32515:9;32511:18;32503:26;;32575:9;32569:4;32565:20;32561:1;32550:9;32546:17;32539:47;32603:131;32729:4;32603:131;:::i;:::-;32595:139;;32322:419;;;:::o;32747:::-;32913:4;32951:2;32940:9;32936:18;32928:26;;33000:9;32994:4;32990:20;32986:1;32975:9;32971:17;32964:47;33028:131;33154:4;33028:131;:::i;:::-;33020:139;;32747:419;;;:::o;33172:::-;33338:4;33376:2;33365:9;33361:18;33353:26;;33425:9;33419:4;33415:20;33411:1;33400:9;33396:17;33389:47;33453:131;33579:4;33453:131;:::i;:::-;33445:139;;33172:419;;;:::o;33597:::-;33763:4;33801:2;33790:9;33786:18;33778:26;;33850:9;33844:4;33840:20;33836:1;33825:9;33821:17;33814:47;33878:131;34004:4;33878:131;:::i;:::-;33870:139;;33597:419;;;:::o;34022:::-;34188:4;34226:2;34215:9;34211:18;34203:26;;34275:9;34269:4;34265:20;34261:1;34250:9;34246:17;34239:47;34303:131;34429:4;34303:131;:::i;:::-;34295:139;;34022:419;;;:::o;34447:::-;34613:4;34651:2;34640:9;34636:18;34628:26;;34700:9;34694:4;34690:20;34686:1;34675:9;34671:17;34664:47;34728:131;34854:4;34728:131;:::i;:::-;34720:139;;34447:419;;;:::o;34872:::-;35038:4;35076:2;35065:9;35061:18;35053:26;;35125:9;35119:4;35115:20;35111:1;35100:9;35096:17;35089:47;35153:131;35279:4;35153:131;:::i;:::-;35145:139;;34872:419;;;:::o;35297:::-;35463:4;35501:2;35490:9;35486:18;35478:26;;35550:9;35544:4;35540:20;35536:1;35525:9;35521:17;35514:47;35578:131;35704:4;35578:131;:::i;:::-;35570:139;;35297:419;;;:::o;35722:::-;35888:4;35926:2;35915:9;35911:18;35903:26;;35975:9;35969:4;35965:20;35961:1;35950:9;35946:17;35939:47;36003:131;36129:4;36003:131;:::i;:::-;35995:139;;35722:419;;;:::o;36147:::-;36313:4;36351:2;36340:9;36336:18;36328:26;;36400:9;36394:4;36390:20;36386:1;36375:9;36371:17;36364:47;36428:131;36554:4;36428:131;:::i;:::-;36420:139;;36147:419;;;:::o;36572:::-;36738:4;36776:2;36765:9;36761:18;36753:26;;36825:9;36819:4;36815:20;36811:1;36800:9;36796:17;36789:47;36853:131;36979:4;36853:131;:::i;:::-;36845:139;;36572:419;;;:::o;36997:::-;37163:4;37201:2;37190:9;37186:18;37178:26;;37250:9;37244:4;37240:20;37236:1;37225:9;37221:17;37214:47;37278:131;37404:4;37278:131;:::i;:::-;37270:139;;36997:419;;;:::o;37422:::-;37588:4;37626:2;37615:9;37611:18;37603:26;;37675:9;37669:4;37665:20;37661:1;37650:9;37646:17;37639:47;37703:131;37829:4;37703:131;:::i;:::-;37695:139;;37422:419;;;:::o;37847:::-;38013:4;38051:2;38040:9;38036:18;38028:26;;38100:9;38094:4;38090:20;38086:1;38075:9;38071:17;38064:47;38128:131;38254:4;38128:131;:::i;:::-;38120:139;;37847:419;;;:::o;38272:::-;38438:4;38476:2;38465:9;38461:18;38453:26;;38525:9;38519:4;38515:20;38511:1;38500:9;38496:17;38489:47;38553:131;38679:4;38553:131;:::i;:::-;38545:139;;38272:419;;;:::o;38697:::-;38863:4;38901:2;38890:9;38886:18;38878:26;;38950:9;38944:4;38940:20;38936:1;38925:9;38921:17;38914:47;38978:131;39104:4;38978:131;:::i;:::-;38970:139;;38697:419;;;:::o;39122:::-;39288:4;39326:2;39315:9;39311:18;39303:26;;39375:9;39369:4;39365:20;39361:1;39350:9;39346:17;39339:47;39403:131;39529:4;39403:131;:::i;:::-;39395:139;;39122:419;;;:::o;39547:::-;39713:4;39751:2;39740:9;39736:18;39728:26;;39800:9;39794:4;39790:20;39786:1;39775:9;39771:17;39764:47;39828:131;39954:4;39828:131;:::i;:::-;39820:139;;39547:419;;;:::o;39972:::-;40138:4;40176:2;40165:9;40161:18;40153:26;;40225:9;40219:4;40215:20;40211:1;40200:9;40196:17;40189:47;40253:131;40379:4;40253:131;:::i;:::-;40245:139;;39972:419;;;:::o;40397:::-;40563:4;40601:2;40590:9;40586:18;40578:26;;40650:9;40644:4;40640:20;40636:1;40625:9;40621:17;40614:47;40678:131;40804:4;40678:131;:::i;:::-;40670:139;;40397:419;;;:::o;40822:::-;40988:4;41026:2;41015:9;41011:18;41003:26;;41075:9;41069:4;41065:20;41061:1;41050:9;41046:17;41039:47;41103:131;41229:4;41103:131;:::i;:::-;41095:139;;40822:419;;;:::o;41247:::-;41413:4;41451:2;41440:9;41436:18;41428:26;;41500:9;41494:4;41490:20;41486:1;41475:9;41471:17;41464:47;41528:131;41654:4;41528:131;:::i;:::-;41520:139;;41247:419;;;:::o;41672:::-;41838:4;41876:2;41865:9;41861:18;41853:26;;41925:9;41919:4;41915:20;41911:1;41900:9;41896:17;41889:47;41953:131;42079:4;41953:131;:::i;:::-;41945:139;;41672:419;;;:::o;42097:222::-;42190:4;42228:2;42217:9;42213:18;42205:26;;42241:71;42309:1;42298:9;42294:17;42285:6;42241:71;:::i;:::-;42097:222;;;;:::o;42325:129::-;42359:6;42386:20;;:::i;:::-;42376:30;;42415:33;42443:4;42435:6;42415:33;:::i;:::-;42325:129;;;:::o;42460:75::-;42493:6;42526:2;42520:9;42510:19;;42460:75;:::o;42541:307::-;42602:4;42692:18;42684:6;42681:30;42678:56;;;42714:18;;:::i;:::-;42678:56;42752:29;42774:6;42752:29;:::i;:::-;42744:37;;42836:4;42830;42826:15;42818:23;;42541:307;;;:::o;42854:308::-;42916:4;43006:18;42998:6;42995:30;42992:56;;;43028:18;;:::i;:::-;42992:56;43066:29;43088:6;43066:29;:::i;:::-;43058:37;;43150:4;43144;43140:15;43132:23;;42854:308;;;:::o;43168:132::-;43235:4;43258:3;43250:11;;43288:4;43283:3;43279:14;43271:22;;43168:132;;;:::o;43306:114::-;43373:6;43407:5;43401:12;43391:22;;43306:114;;;:::o;43426:98::-;43477:6;43511:5;43505:12;43495:22;;43426:98;;;:::o;43530:99::-;43582:6;43616:5;43610:12;43600:22;;43530:99;;;:::o;43635:113::-;43705:4;43737;43732:3;43728:14;43720:22;;43635:113;;;:::o;43754:184::-;43853:11;43887:6;43882:3;43875:19;43927:4;43922:3;43918:14;43903:29;;43754:184;;;;:::o;43944:168::-;44027:11;44061:6;44056:3;44049:19;44101:4;44096:3;44092:14;44077:29;;43944:168;;;;:::o;44118:169::-;44202:11;44236:6;44231:3;44224:19;44276:4;44271:3;44267:14;44252:29;;44118:169;;;;:::o;44293:148::-;44395:11;44432:3;44417:18;;44293:148;;;;:::o;44447:273::-;44487:3;44506:20;44524:1;44506:20;:::i;:::-;44501:25;;44540:20;44558:1;44540:20;:::i;:::-;44535:25;;44662:1;44626:34;44622:42;44619:1;44616:49;44613:75;;;44668:18;;:::i;:::-;44613:75;44712:1;44709;44705:9;44698:16;;44447:273;;;;:::o;44726:305::-;44766:3;44785:20;44803:1;44785:20;:::i;:::-;44780:25;;44819:20;44837:1;44819:20;:::i;:::-;44814:25;;44973:1;44905:66;44901:74;44898:1;44895:81;44892:107;;;44979:18;;:::i;:::-;44892:107;45023:1;45020;45016:9;45009:16;;44726:305;;;;:::o;45037:185::-;45077:1;45094:20;45112:1;45094:20;:::i;:::-;45089:25;;45128:20;45146:1;45128:20;:::i;:::-;45123:25;;45167:1;45157:35;;45172:18;;:::i;:::-;45157:35;45214:1;45211;45207:9;45202:14;;45037:185;;;;:::o;45228:348::-;45268:7;45291:20;45309:1;45291:20;:::i;:::-;45286:25;;45325:20;45343:1;45325:20;:::i;:::-;45320:25;;45513:1;45445:66;45441:74;45438:1;45435:81;45430:1;45423:9;45416:17;45412:105;45409:131;;;45520:18;;:::i;:::-;45409:131;45568:1;45565;45561:9;45550:20;;45228:348;;;;:::o;45582:191::-;45622:4;45642:20;45660:1;45642:20;:::i;:::-;45637:25;;45676:20;45694:1;45676:20;:::i;:::-;45671:25;;45715:1;45712;45709:8;45706:34;;;45720:18;;:::i;:::-;45706:34;45765:1;45762;45758:9;45750:17;;45582:191;;;;:::o;45779:::-;45819:4;45839:20;45857:1;45839:20;:::i;:::-;45834:25;;45873:20;45891:1;45873:20;:::i;:::-;45868:25;;45912:1;45909;45906:8;45903:34;;;45917:18;;:::i;:::-;45903:34;45962:1;45959;45955:9;45947:17;;45779:191;;;;:::o;45976:96::-;46013:7;46042:24;46060:5;46042:24;:::i;:::-;46031:35;;45976:96;;;:::o;46078:90::-;46112:7;46155:5;46148:13;46141:21;46130:32;;46078:90;;;:::o;46174:77::-;46211:7;46240:5;46229:16;;46174:77;;;:::o;46257:149::-;46293:7;46333:66;46326:5;46322:78;46311:89;;46257:149;;;:::o;46412:118::-;46449:7;46489:34;46482:5;46478:46;46467:57;;46412:118;;;:::o;46536:126::-;46573:7;46613:42;46606:5;46602:54;46591:65;;46536:126;;;:::o;46668:77::-;46705:7;46734:5;46723:16;;46668:77;;;:::o;46751:154::-;46835:6;46830:3;46825;46812:30;46897:1;46888:6;46883:3;46879:16;46872:27;46751:154;;;:::o;46911:307::-;46979:1;46989:113;47003:6;47000:1;46997:13;46989:113;;;47088:1;47083:3;47079:11;47073:18;47069:1;47064:3;47060:11;47053:39;47025:2;47022:1;47018:10;47013:15;;46989:113;;;47120:6;47117:1;47114:13;47111:101;;;47200:1;47191:6;47186:3;47182:16;47175:27;47111:101;46960:258;46911:307;;;:::o;47224:171::-;47263:3;47286:24;47304:5;47286:24;:::i;:::-;47277:33;;47332:4;47325:5;47322:15;47319:41;;;47340:18;;:::i;:::-;47319:41;47387:1;47380:5;47376:13;47369:20;;47224:171;;;:::o;47401:320::-;47445:6;47482:1;47476:4;47472:12;47462:22;;47529:1;47523:4;47519:12;47550:18;47540:81;;47606:4;47598:6;47594:17;47584:27;;47540:81;47668:2;47660:6;47657:14;47637:18;47634:38;47631:84;;;47687:18;;:::i;:::-;47631:84;47452:269;47401:320;;;:::o;47727:281::-;47810:27;47832:4;47810:27;:::i;:::-;47802:6;47798:40;47940:6;47928:10;47925:22;47904:18;47892:10;47889:34;47886:62;47883:88;;;47951:18;;:::i;:::-;47883:88;47991:10;47987:2;47980:22;47770:238;47727:281;;:::o;48014:233::-;48053:3;48076:24;48094:5;48076:24;:::i;:::-;48067:33;;48122:66;48115:5;48112:77;48109:103;;;48192:18;;:::i;:::-;48109:103;48239:1;48232:5;48228:13;48221:20;;48014:233;;;:::o;48253:100::-;48292:7;48321:26;48341:5;48321:26;:::i;:::-;48310:37;;48253:100;;;:::o;48359:94::-;48398:7;48427:20;48441:5;48427:20;:::i;:::-;48416:31;;48359:94;;;:::o;48459:176::-;48491:1;48508:20;48526:1;48508:20;:::i;:::-;48503:25;;48542:20;48560:1;48542:20;:::i;:::-;48537:25;;48581:1;48571:35;;48586:18;;:::i;:::-;48571:35;48627:1;48624;48620:9;48615:14;;48459:176;;;;:::o;48641:180::-;48689:77;48686:1;48679:88;48786:4;48783:1;48776:15;48810:4;48807:1;48800:15;48827:180;48875:77;48872:1;48865:88;48972:4;48969:1;48962:15;48996:4;48993:1;48986:15;49013:180;49061:77;49058:1;49051:88;49158:4;49155:1;49148:15;49182:4;49179:1;49172:15;49199:180;49247:77;49244:1;49237:88;49344:4;49341:1;49334:15;49368:4;49365:1;49358:15;49385:180;49433:77;49430:1;49423:88;49530:4;49527:1;49520:15;49554:4;49551:1;49544:15;49571:117;49680:1;49677;49670:12;49694:117;49803:1;49800;49793:12;49817:117;49926:1;49923;49916:12;49940:117;50049:1;50046;50039:12;50063:117;50172:1;50169;50162:12;50186:117;50295:1;50292;50285:12;50309:102;50350:6;50401:2;50397:7;50392:2;50385:5;50381:14;50377:28;50367:38;;50309:102;;;:::o;50417:94::-;50450:8;50498:5;50494:2;50490:14;50469:35;;50417:94;;;:::o;50517:221::-;50657:34;50653:1;50645:6;50641:14;50634:58;50726:4;50721:2;50713:6;50709:15;50702:29;50517:221;:::o;50744:164::-;50884:16;50880:1;50872:6;50868:14;50861:40;50744:164;:::o;50914:225::-;51054:34;51050:1;51042:6;51038:14;51031:58;51123:8;51118:2;51110:6;51106:15;51099:33;50914:225;:::o;51145:229::-;51285:34;51281:1;51273:6;51269:14;51262:58;51354:12;51349:2;51341:6;51337:15;51330:37;51145:229;:::o;51380:167::-;51520:19;51516:1;51508:6;51504:14;51497:43;51380:167;:::o;51553:222::-;51693:34;51689:1;51681:6;51677:14;51670:58;51762:5;51757:2;51749:6;51745:15;51738:30;51553:222;:::o;51781:224::-;51921:34;51917:1;51909:6;51905:14;51898:58;51990:7;51985:2;51977:6;51973:15;51966:32;51781:224;:::o;52011:162::-;52151:14;52147:1;52139:6;52135:14;52128:38;52011:162;:::o;52179:166::-;52319:18;52315:1;52307:6;52303:14;52296:42;52179:166;:::o;52351:174::-;52491:26;52487:1;52479:6;52475:14;52468:50;52351:174;:::o;52531:244::-;52671:34;52667:1;52659:6;52655:14;52648:58;52740:27;52735:2;52727:6;52723:15;52716:52;52531:244;:::o;52781:230::-;52921:34;52917:1;52909:6;52905:14;52898:58;52990:13;52985:2;52977:6;52973:15;52966:38;52781:230;:::o;53017:158::-;53157:10;53153:1;53145:6;53141:14;53134:34;53017:158;:::o;53181:225::-;53321:34;53317:1;53309:6;53305:14;53298:58;53390:8;53385:2;53377:6;53373:15;53366:33;53181:225;:::o;53412:182::-;53552:34;53548:1;53540:6;53536:14;53529:58;53412:182;:::o;53600:174::-;53740:26;53736:1;53728:6;53724:14;53717:50;53600:174;:::o;53780:234::-;53920:34;53916:1;53908:6;53904:14;53897:58;53989:17;53984:2;53976:6;53972:15;53965:42;53780:234;:::o;54020:176::-;54160:28;54156:1;54148:6;54144:14;54137:52;54020:176;:::o;54202:237::-;54342:34;54338:1;54330:6;54326:14;54319:58;54411:20;54406:2;54398:6;54394:15;54387:45;54202:237;:::o;54445:167::-;54585:19;54581:1;54573:6;54569:14;54562:43;54445:167;:::o;54618:221::-;54758:34;54754:1;54746:6;54742:14;54735:58;54827:4;54822:2;54814:6;54810:15;54803:29;54618:221;:::o;54845:238::-;54985:34;54981:1;54973:6;54969:14;54962:58;55054:21;55049:2;55041:6;55037:15;55030:46;54845:238;:::o;55089:179::-;55229:31;55225:1;55217:6;55213:14;55206:55;55089:179;:::o;55274:220::-;55414:34;55410:1;55402:6;55398:14;55391:58;55483:3;55478:2;55470:6;55466:15;55459:28;55274:220;:::o;55500:172::-;55640:24;55636:1;55628:6;55624:14;55617:48;55500:172;:::o;55678:171::-;55818:23;55814:1;55806:6;55802:14;55795:47;55678:171;:::o;55855:163::-;55995:15;55991:1;55983:6;55979:14;55972:39;55855:163;:::o;56024:233::-;56164:34;56160:1;56152:6;56148:14;56141:58;56233:16;56228:2;56220:6;56216:15;56209:41;56024:233;:::o;56263:181::-;56403:33;56399:1;56391:6;56387:14;56380:57;56263:181;:::o;56450:234::-;56590:34;56586:1;56578:6;56574:14;56567:58;56659:17;56654:2;56646:6;56642:15;56635:42;56450:234;:::o;56690:232::-;56830:34;56826:1;56818:6;56814:14;56807:58;56899:15;56894:2;56886:6;56882:15;56875:40;56690:232;:::o;56928:221::-;57068:34;57064:1;57056:6;57052:14;57045:58;57137:4;57132:2;57124:6;57120:15;57113:29;56928:221;:::o;57155:167::-;57295:19;57291:1;57283:6;57279:14;57272:43;57155:167;:::o;57328:122::-;57401:24;57419:5;57401:24;:::i;:::-;57394:5;57391:35;57381:63;;57440:1;57437;57430:12;57381:63;57328:122;:::o;57456:116::-;57526:21;57541:5;57526:21;:::i;:::-;57519:5;57516:32;57506:60;;57562:1;57559;57552:12;57506:60;57456:116;:::o;57578:122::-;57651:24;57669:5;57651:24;:::i;:::-;57644:5;57641:35;57631:63;;57690:1;57687;57680:12;57631:63;57578:122;:::o;57706:120::-;57778:23;57795:5;57778:23;:::i;:::-;57771:5;57768:34;57758:62;;57816:1;57813;57806:12;57758:62;57706:120;:::o;57832:122::-;57905:24;57923:5;57905:24;:::i;:::-;57898:5;57895:35;57885:63;;57944:1;57941;57934:12;57885:63;57832:122;:::o

Swarm Source

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