Token GreenStix Gen2 Candles

Overview CRC721

Total Supply:
777 Grnstxg2

Holders:
19 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Grnstxg2

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-05
*/

//SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.8.19;

library Counters {
    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

library SafeMath {

    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {

            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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 IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

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

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 {
        //solhint-disable-next-line max-line-length
        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);

        // Clear approvals
        _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);

        // Clear approvals from the previous owner
        _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();
    }
}

interface IERC20 {

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

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

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

    function allowance(address owner, address spender) external view returns (uint256);

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

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract Grnstxg2 is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    // Constants
    string public baseExtension = ".json";
    uint256 public cost = 350 ether;

    // Whitelist
    address public whitelistAddress = 0x3ed598C23Bd46a171158aaC2035b0282AC1f9217;
    uint256 public wlCost = 250 ether;
    IERC721 public whitelistContract;

    // Supply
    uint256 public mintReward = 10;
    uint256 public maxSupply = 777;
    uint256 public lastSupply = maxSupply;
    uint256 public maxMintAmount = 10;

    // Reflection
    uint256 public reflectionBalance;
    uint256 public totalDividend;

    // Lists
    uint256[777] public remainingIds;
    mapping(uint256 => uint256) public lastDividendAt;
    mapping(uint256 => address) public minters;

    // Params
    bool public paused = true;
    string private _baseTokenURI;
    address private _wallet;

    // Addresses
    address public DexRouter = 0xeC0A7a0C2439E8Cb67b992b12ecd020Ea943c7Be;
    address public RewardToken = 0x16a19Ae876272fb9Cc8dF78a116C63Cc1562270b;
    address public FeeReceiver;

    //Contracts
    IUniswapV2Router02 public router;
    IERC20 public token;

    // Constructor
    constructor() ERC721("GreenStix Gen2 Candles", "Grnstxg2") {
        whitelistContract = IERC721(whitelistAddress);
        _baseTokenURI = "ipfs://bafybeibhqeo3dj6fnpwksctpdqixgbv4rjzsuro6cagrcsqpdmncxjp2uy/";
        FeeReceiver = msg.sender;
        _wallet = msg.sender;
        router = IUniswapV2Router02(DexRouter);
        token = IERC20(RewardToken);
        _regularMint();
    }

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

    // Setters
    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setRewardToken(address _newRewardToken) public onlyOwner {
        RewardToken = _newRewardToken;
        token = IERC20(RewardToken);
    }

    function setDexRouter(address _newDexRouter) public onlyOwner {
        DexRouter = _newDexRouter;
        router = IUniswapV2Router02(DexRouter);
    }

    function setFeeReceiver(address _newFeeReceiver) public onlyOwner {
        FeeReceiver = _newFeeReceiver;
    }

    function setWhitelistAddress(address _newWhitelistAddress)
        public
        onlyOwner
    {
        whitelistAddress = _newWhitelistAddress;
        whitelistContract = IERC721(whitelistAddress);
    }

    // Minting
    function mint(uint256 _mintAmount) public payable {
        // Checks
        require(!paused, "Grnstxg2: minting has not started yet");
        require(_mintAmount > 0, "Grnstxg2: you have to mint at least one");
        require(
            _mintAmount <= maxMintAmount,
            "Grnstxg2: you can only mint 10 at a time"
        );
        require(
            lastSupply >= _mintAmount,
            "Grnstxg2: the collection is sold out"
        );
        if (msg.sender != owner()) {
            require(
                msg.value >= cost * _mintAmount,
                "Grnstxg2: total cost isn't match"
            );
        }
        // Minting
        for (uint256 i = 1; i <= _mintAmount; i++) {
            // Mint for caller
            _randomMint(msg.sender);
            // Split cost
            handleMintReward(msg.value / _mintAmount);
        }
    }

    // Minting for whitelist
    function wlMint(uint256 _mintAmount) public payable {
       // Checks
        require(!paused, "Grnstxg2: minting has not started yet");
        require(_mintAmount > 0, "Grnstxg2: you have to mint at least one");
        require(
            _mintAmount <= maxMintAmount,
            "Grnstxg2: you can only mint 10 at a time"
        );
        require(
            lastSupply >= _mintAmount,
            "Grnstxg2: the collection is sold out"
        );
        if (msg.sender != owner()) {
            require(
                msg.value >= wlCost * _mintAmount,
                "Grnstxg2: total cost isn't match"
            );
        }
        // Check if the user holds the whitelist NFT
        require(
            whitelistContract.balanceOf(msg.sender) > 0,
            "Grnstxg2: you don't have a whitelist NFT"
        );
        // Minting
        for (uint256 i = 1; i <= _mintAmount; i++) {
            // Mint for caller
            _randomMint(msg.sender);
            // Split cost
            handleMintReward(msg.value / _mintAmount);
        }
    }

    // Give a random NFT to a contest winner
    function randomGiveaway(address _winner, uint256 _amount)
        external
        onlyOwner
    {
        // Checks
        require(_winner != address(0), "Grnstxg2: zero address");
        require(_amount > 0, "Grnstxg2: you have to mint at least one");
        require(lastSupply != 0, "Grnstxg2: the collection is sold out");
        // Mint random NFTs for a winner
        for (uint256 i = 1; i <= _amount; i++) {
            _randomMint(_winner);
        }
    }

    // Random mint
    function _randomMint(address _target) internal returns (uint256) {
        // Get Random id to mint
        uint256 _index = _getRandom() % lastSupply;
        uint256 _realIndex = getValue(_index) + 1;
        // Reduce supply
        lastSupply--;
        // Replace used id by last
        remainingIds[_index] = getValue(lastSupply);
        // Mint
        _safeMint(_target, _realIndex);
        // Save Original minters
        minters[_realIndex] = msg.sender;
        // Save dividend
        lastDividendAt[_realIndex] = totalDividend;
        return _realIndex;
    }

    // Mint for reserved spots
    function _regularMint() internal returns (uint256) {
        // Get Actual id to mint
        uint256 _index = totalSupply();
        uint256 _realIndex = getValue(_index) + 1;
        // Reduce supply
        lastSupply--;
        // Replace used id by last
        remainingIds[_index] = getValue(lastSupply);
        // Mint
        _safeMint(msg.sender, _realIndex);
        // Save Original minters
        minters[_realIndex] = msg.sender;
        // Save dividend
        lastDividendAt[_realIndex] = totalDividend;
        return _realIndex;
    }

    // Get Token List
    function getTokenIds(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        // Count owned Token
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        // Get ids of owned Token
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    // Return compiled Token URI
    function tokenURI(uint256 _id)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_id), "Grnstxg2: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        _id.toString(),
                        baseExtension
                    )
                )
                : "";
    }
    // Reflections
    function handleMintReward(uint256 _amount) private {
        // Split payment
        uint256 mintShare = _amount.mul(mintReward).div(100);
        uint256 devShare = _amount.sub(mintShare);
        // Save dividend for community
        reflectDividend(mintShare);
        // Send owner share
        payable(FeeReceiver).transfer(devShare);
    }

    // Add dividend
    function reflectDividend(uint256 _amount) private {
        reflectionBalance = reflectionBalance.add(_amount);
        totalDividend = totalDividend.add((_amount.div(totalSupply())));
    }

    function reflectToOwners() public payable {
        reflectDividend(msg.value);
    }

    function getReflectionBalances(address _owner)
        public
        view
        returns (uint256)
    {
        uint256 count = balanceOf(_owner);
        uint256 total = 0;
        for (uint256 i = 0; i < count; i++) {
            uint256 tokenId = tokenOfOwnerByIndex(_owner, i);
            total = total.add(getReflectionBalance(tokenId));
        }
        return total;
    }

    function getReflectionBalance(uint256 tokenId)
        public
        view
        returns (uint256)
    {
        return totalDividend.sub(lastDividendAt[tokenId]);
    }

    function claimRewardsTokens() public {
        uint256 count = balanceOf(msg.sender);
        uint256 initialBalanceOf = token.balanceOf(address(this));
        uint256 balance = 0;
        for (uint256 i = 0; i < count; i++) {
            uint256 tokenId = tokenOfOwnerByIndex(msg.sender, i);
            balance = balance.add(getReflectionBalance(tokenId));
            lastDividendAt[tokenId] = totalDividend;
        }
        // Covert Balance to Tokens
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = RewardToken;

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : balance}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 finalBalanceOf = token.balanceOf(address(this));
        uint256 tokens = finalBalanceOf.sub(initialBalanceOf);
        token.transfer(msg.sender, tokens);
    }
    // Utils

    // Get value from a remaining id node
    function getValue(uint256 _index) internal view returns (uint256) {
        if (remainingIds[_index] != 0) return remainingIds[_index];
        else return _index;
    }

    // Create a random id for minting
    function _getRandom() internal view returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        block.prevrandao,
                        block.timestamp,
                        lastSupply
                    )
                )
            );
    }
}

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":"DexRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewardsTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getReflectionBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getReflectionBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastDividendAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_winner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"randomGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectToOwners","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"reflectionBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"remainingIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newDexRouter","type":"address"}],"name":"setDexRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeReceiver","type":"address"}],"name":"setFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWhitelistAddress","type":"address"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividend","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":"whitelistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistContract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608090815264173539b7b760d91b60a052600b9062000026908262000a31565b506812f939c99edab80000600c55600d80546001600160a01b0319908116733ed598c23bd46a171158aac2035b0282ac1f921717909155680d8d726b7177a80000600e55600a60108190556103096011819055601255601355610321805460ff191660011790556103248054821673ec0a7a0c2439e8cb67b992b12ecd020ea943c7be17905561032580549091167316a19ae876272fb9cc8df78a116c63cc1562270b179055348015620000d957600080fd5b506040518060400160405280601681526020017f477265656e537469782047656e322043616e646c6573000000000000000000008152506040518060400160405280600881526020016723b93739ba3c339960c11b815250816000908162000142919062000a31565b50600162000151828262000a31565b5050506200016e620001686200021a60201b60201c565b6200021e565b600d54600f80546001600160a01b0319166001600160a01b039092169190911790556040805160808101909152604380825262003ed6602083013961032290620001b9908262000a31565b5061032680546001600160a01b0319908116339081179092556103238054821690921790915561032454610327805483166001600160a01b0392831617905561032554610328805490931691161790556200021362000270565b5062000c31565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806200027d60085490565b905060006200028c826200031a565b6200029990600162000b13565b601280549192506000620002ad8362000b2f565b9091555050601254620002c0906200031a565b6016836103098110620002d757620002d762000b49565b0155620002e533826200035e565b60008181526103206020908152604080832080546001600160a01b0319163317905560155461031f9092529091205592915050565b6000601682610309811062000333576200033362000b49565b0154156200035a57601682610309811062000352576200035262000b49565b015492915050565b5090565b620003808282604051806020016040528060008152506200038460201b60201c565b5050565b62000390838362000400565b6200039f600084848462000556565b620003fb5760405162461bcd60e51b8152602060048201526032602482015260008051602062003eb683398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620004585760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620003f2565b6000818152600260205260409020546001600160a01b031615620004bf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620003f2565b620004cd600083836200069e565b6001600160a01b0382166000908152600360205260408120805460019290620004f890849062000b13565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156200069257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200059d90339089908890889060040162000b5f565b6020604051808303816000875af1925050508015620005db575060408051601f3d908101601f19168201909252620005d89181019062000bd2565b60015b62000677573d8080156200060c576040519150601f19603f3d011682016040523d82523d6000602084013e62000611565b606091505b5080516000036200066f5760405162461bcd60e51b8152602060048201526032602482015260008051602062003eb683398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620003f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000696565b5060015b949350505050565b6001600160a01b038316620006fc57620006f681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000722565b816001600160a01b0316836001600160a01b031614620007225762000722838262000762565b6001600160a01b0382166200073c57620003fb8162000804565b826001600160a01b0316826001600160a01b031614620003fb57620003fb8282620008be565b60006001620007718462000904565b6200077d919062000c05565b600083815260076020526040902054909150808214620007d1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090620008189060019062000c05565b6000838152600960205260408120546008805493945090928490811062000843576200084362000b49565b90600052602060002001549050806008838154811062000867576200086762000b49565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480620008a257620008a262000c1b565b6001900381819060005260206000200160009055905550505050565b6000620008cb8362000904565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b038216620009715760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620003f2565b506001600160a01b031660009081526003602052604090205490565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620009b857607f821691505b602082108103620009d957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003fb57600081815260208120601f850160051c8101602086101562000a085750805b601f850160051c820191505b8181101562000a295782815560010162000a14565b505050505050565b81516001600160401b0381111562000a4d5762000a4d6200098d565b62000a658162000a5e8454620009a3565b84620009df565b602080601f83116001811462000a9d576000841562000a845750858301515b600019600386901b1c1916600185901b17855562000a29565b600085815260208120601f198616915b8281101562000ace5788860151825594840194600190910190840162000aad565b508582101562000aed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000b295762000b2962000afd565b92915050565b60008162000b415762000b4162000afd565b506000190190565b634e487b7160e01b600052603260045260246000fd5b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b8281101562000bae5785810182015185820160a00152810162000b90565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b60006020828403121562000be557600080fd5b81516001600160e01b03198116811462000bfe57600080fd5b9392505050565b8181038181111562000b295762000b2962000afd565b634e487b7160e01b600052603160045260246000fd5b6132758062000c416000396000f3fe6080604052600436106103695760003560e01c806384900b04116101c6578063d2068857116100f7578063efdcd97411610095578063f72f863b1161006f578063f72f863b146109d5578063f75b8c5f146109f5578063f887ea4014610a0b578063fc0c546a14610a2c57600080fd5b8063efdcd97414610974578063f1e9f1e514610994578063f2fde38b146109b557600080fd5b8063da3ef23f116100d1578063da3ef23f146108cb578063e5002a05146108eb578063e985e9c51461090b578063ee6d9d6d1461095457600080fd5b8063d206885714610871578063d5abeb011461089f578063d70a28d1146108b557600080fd5b8063a22cb46511610164578063b88d4fde1161013e578063b88d4fde146107ef578063c66828621461080f578063c87b56dd14610824578063d004b0361461084457600080fd5b8063a22cb4651461078f578063a708d404146107af578063b3ef77f2146107cf57600080fd5b80638da5cb5b116101a05780638da5cb5b1461072957806395d89b4114610747578063a0712d681461075c578063a224c7451461076f57600080fd5b806384900b04146106b25780638623ec7b146106d25780638aee81271461070957600080fd5b80634131ff99116102a05780635c975abb1161023e57806370a082311161021857806370a082311461063c578063715018a61461065c578063736ce0d4146106715780637f00c7a61461069257600080fd5b80635c975abb146105ee5780636352211e146106095780636aabb9471461062957600080fd5b80634b6acafb1161027a5780634b6acafb146105835780634f6ccce714610599578063521133d1146105b957806355f804b3146105ce57600080fd5b80634131ff991461052d57806342842e0e1461054357806344a0d68a1461056357600080fd5b8063095ea7b31161030d57806318160ddd116102e757806318160ddd146104c2578063239c70ae146104d757806323b872dd146104ed5780632f745c591461050d57600080fd5b8063095ea7b31461047657806313faede614610496578063174f57af146104ac57600080fd5b806302329a291161034957806302329a291461040a578063047d5e801461042c57806306fdde0314610434578063081812fc1461045657600080fd5b80620251641461036e578062fe50c6146103ac57806301ffc9a7146103da575b600080fd5b34801561037a57600080fd5b506103265461038f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103b857600080fd5b506103cc6103c73660046128ea565b610a4d565b6040519081526020016103a3565b3480156103e657600080fd5b506103fa6103f5366004612919565b610a6f565b60405190151581526020016103a3565b34801561041657600080fd5b5061042a610425366004612944565b610a94565b005b61042a610adb565b34801561044057600080fd5b50610449610ae6565b6040516103a391906129b1565b34801561046257600080fd5b5061038f6104713660046128ea565b610b78565b34801561048257600080fd5b5061042a6104913660046129d9565b610c0d565b3480156104a257600080fd5b506103cc600c5481565b3480156104b857600080fd5b506103cc60105481565b3480156104ce57600080fd5b506008546103cc565b3480156104e357600080fd5b506103cc60135481565b3480156104f957600080fd5b5061042a610508366004612a05565b610d22565b34801561051957600080fd5b506103cc6105283660046129d9565b610d53565b34801561053957600080fd5b506103cc60145481565b34801561054f57600080fd5b5061042a61055e366004612a05565b610de9565b34801561056f57600080fd5b5061042a61057e3660046128ea565b610e04565b34801561058f57600080fd5b506103cc60155481565b3480156105a557600080fd5b506103cc6105b43660046128ea565b610e33565b3480156105c557600080fd5b5061042a610ec6565b3480156105da57600080fd5b5061042a6105e9366004612ad2565b6111ea565b3480156105fa57600080fd5b50610321546103fa9060ff1681565b34801561061557600080fd5b5061038f6106243660046128ea565b611225565b61042a6106373660046128ea565b61129c565b34801561064857600080fd5b506103cc610657366004612b1b565b611496565b34801561066857600080fd5b5061042a61151d565b34801561067d57600080fd5b506103245461038f906001600160a01b031681565b34801561069e57600080fd5b5061042a6106ad3660046128ea565b611551565b3480156106be57600080fd5b50600f5461038f906001600160a01b031681565b3480156106de57600080fd5b5061038f6106ed3660046128ea565b610320602052600090815260409020546001600160a01b031681565b34801561071557600080fd5b5061042a610724366004612b1b565b611580565b34801561073557600080fd5b50600a546001600160a01b031661038f565b34801561075357600080fd5b506104496115d8565b61042a61076a3660046128ea565b6115e7565b34801561077b57600080fd5b5061042a61078a366004612b1b565b611711565b34801561079b57600080fd5b5061042a6107aa366004612b38565b611767565b3480156107bb57600080fd5b506103cc6107ca366004612b1b565b61182b565b3480156107db57600080fd5b5061042a6107ea3660046129d9565b61187d565b3480156107fb57600080fd5b5061042a61080a366004612b71565b61195e565b34801561081b57600080fd5b50610449611996565b34801561083057600080fd5b5061044961083f3660046128ea565b611a24565b34801561085057600080fd5b5061086461085f366004612b1b565b611afc565b6040516103a39190612bf1565b34801561087d57600080fd5b506103cc61088c3660046128ea565b61031f6020526000908152604090205481565b3480156108ab57600080fd5b506103cc60115481565b3480156108c157600080fd5b506103cc600e5481565b3480156108d757600080fd5b5061042a6108e6366004612ad2565b611b96565b3480156108f757600080fd5b50600d5461038f906001600160a01b031681565b34801561091757600080fd5b506103fa610926366004612c35565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561096057600080fd5b506103cc61096f3660046128ea565b611bcc565b34801561098057600080fd5b5061042a61098f366004612b1b565b611be4565b3480156109a057600080fd5b506103255461038f906001600160a01b031681565b3480156109c157600080fd5b5061042a6109d0366004612b1b565b611c31565b3480156109e157600080fd5b5061042a6109f0366004612b1b565b611ccc565b348015610a0157600080fd5b506103cc60125481565b348015610a1757600080fd5b506103275461038f906001600160a01b031681565b348015610a3857600080fd5b506103285461038f906001600160a01b031681565b600081815261031f6020526040812054601554610a6991611d24565b92915050565b60006001600160e01b0319821663780e9d6360e01b1480610a695750610a6982611d30565b600a546001600160a01b03163314610ac75760405162461bcd60e51b8152600401610abe90612c63565b60405180910390fd5b610321805460ff1916911515919091179055565b610ae434611d80565b565b606060008054610af590612c98565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190612c98565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bf15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610abe565b506000908152600460205260409020546001600160a01b031690565b6000610c1882611225565b9050806001600160a01b0316836001600160a01b031603610c855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610abe565b336001600160a01b0382161480610ca15750610ca18133610926565b610d135760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610abe565b610d1d8383611db5565b505050565b610d2c3382611e23565b610d485760405162461bcd60e51b8152600401610abe90612cd2565b610d1d838383611f1a565b6000610d5e83611496565b8210610dc05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610abe565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d1d8383836040518060200160405280600081525061195e565b600a546001600160a01b03163314610e2e5760405162461bcd60e51b8152600401610abe90612c63565b600c55565b6000610e3e60085490565b8210610ea15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610abe565b60088281548110610eb457610eb4612d23565b90600052602060002001549050919050565b6000610ed133611496565b610328546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f449190612d39565b90506000805b83811015610f9e576000610f5e3383610d53565b9050610f73610f6c82610a4d565b84906120c5565b601554600092835261031f602052604090922091909155915080610f9681612d68565b915050610f4a565b50604080516002808252606082018352600092602083019080368337505061032754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e9190612d81565b8160008151811061104157611041612d23565b6001600160a01b0392831660209182029290920101526103255482519116908290600190811061107357611073612d23565b6001600160a01b0392831660209182029290920101526103275460405163b6f9de9560e01b815291169063b6f9de959084906110ba90600090869030904290600401612d9e565b6000604051808303818588803b1580156110d357600080fd5b505af11580156110e7573d6000803e3d6000fd5b5050610328546040516370a0823160e01b8152306004820152600094506001600160a01b0390911692506370a082319150602401602060405180830381865afa158015611138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115c9190612d39565b9050600061116a8286611d24565b6103285460405163a9059cbb60e01b8152336004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156111bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e19190612e08565b50505050505050565b600a546001600160a01b031633146112145760405162461bcd60e51b8152600401610abe90612c63565b6103226112218282612e73565b5050565b6000818152600260205260408120546001600160a01b031680610a695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610abe565b6103215460ff16156112c05760405162461bcd60e51b8152600401610abe90612f33565b600081116112e05760405162461bcd60e51b8152600401610abe90612f78565b6013548111156113025760405162461bcd60e51b8152600401610abe90612fbf565b8060125410156113245760405162461bcd60e51b8152600401610abe90613007565b600a546001600160a01b031633146113935780600e54611344919061304b565b3410156113935760405162461bcd60e51b815260206004820181905260248201527f47726e73747867323a20746f74616c20636f73742069736e2774206d617463686044820152606401610abe565b600f546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114009190612d39565b1161145e5760405162461bcd60e51b815260206004820152602860248201527f47726e73747867323a20796f7520646f6e2774206861766520612077686974656044820152671b1a5cdd0813919560c21b6064820152608401610abe565b60015b81811161122157611471336120d1565b5061148461147f8334613078565b6121a5565b8061148e81612d68565b915050611461565b60006001600160a01b0382166115015760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610abe565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146115475760405162461bcd60e51b8152600401610abe90612c63565b610ae4600061221b565b600a546001600160a01b0316331461157b5760405162461bcd60e51b8152600401610abe90612c63565b601355565b600a546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610abe90612c63565b61032580546001600160a01b039092166001600160a01b031992831681179091556103288054909216179055565b606060018054610af590612c98565b6103215460ff161561160b5760405162461bcd60e51b8152600401610abe90612f33565b6000811161162b5760405162461bcd60e51b8152600401610abe90612f78565b60135481111561164d5760405162461bcd60e51b8152600401610abe90612fbf565b80601254101561166f5760405162461bcd60e51b8152600401610abe90613007565b600a546001600160a01b031633146116de5780600c5461168f919061304b565b3410156116de5760405162461bcd60e51b815260206004820181905260248201527f47726e73747867323a20746f74616c20636f73742069736e2774206d617463686044820152606401610abe565b60015b818111611221576116f1336120d1565b506116ff61147f8334613078565b8061170981612d68565b9150506116e1565b600a546001600160a01b0316331461173b5760405162461bcd60e51b8152600401610abe90612c63565b600d80546001600160a01b039092166001600160a01b03199283168117909155600f8054909216179055565b336001600160a01b038316036117bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610abe565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008061183783611496565b90506000805b828110156118755760006118518683610d53565b905061185f610f6c82610a4d565b925050808061186d90612d68565b91505061183d565b509392505050565b600a546001600160a01b031633146118a75760405162461bcd60e51b8152600401610abe90612c63565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152601660248201527547726e73747867323a207a65726f206164647265737360501b6044820152606401610abe565b600081116119165760405162461bcd60e51b8152600401610abe90612f78565b6012546000036119385760405162461bcd60e51b8152600401610abe90613007565b60015b818111610d1d5761194b836120d1565b508061195681612d68565b91505061193b565b6119683383611e23565b6119845760405162461bcd60e51b8152600401610abe90612cd2565b6119908484848461226d565b50505050565b600b80546119a390612c98565b80601f01602080910402602001604051908101604052809291908181526020018280546119cf90612c98565b8015611a1c5780601f106119f157610100808354040283529160200191611a1c565b820191906000526020600020905b8154815290600101906020018083116119ff57829003601f168201915b505050505081565b6000818152600260205260409020546060906001600160a01b0316611a9d5760405162461bcd60e51b815260206004820152602960248201527f47726e73747867323a2055524920717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610abe565b6000611aa76122a0565b90506000815111611ac75760405180602001604052806000815250611af5565b80611ad1846122b0565b600b604051602001611ae59392919061308c565b6040516020818303038152906040525b9392505050565b60606000611b0983611496565b905060008167ffffffffffffffff811115611b2657611b26612a46565b604051908082528060200260200182016040528015611b4f578160200160208202803683370190505b50905060005b8281101561187557611b678582610d53565b828281518110611b7957611b79612d23565b602090810291909101015280611b8e81612d68565b915050611b55565b600a546001600160a01b03163314611bc05760405162461bcd60e51b8152600401610abe90612c63565b600b6112218282612e73565b6016816103098110611bdd57600080fd5b0154905081565b600a546001600160a01b03163314611c0e5760405162461bcd60e51b8152600401610abe90612c63565b61032680546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611c5b5760405162461bcd60e51b8152600401610abe90612c63565b6001600160a01b038116611cc05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abe565b611cc98161221b565b50565b600a546001600160a01b03163314611cf65760405162461bcd60e51b8152600401610abe90612c63565b61032480546001600160a01b039092166001600160a01b031992831681179091556103278054909216179055565b6000611af5828461312c565b60006001600160e01b031982166380ac58cd60e01b1480611d6157506001600160e01b03198216635b5e139f60e01b145b80610a6957506301ffc9a760e01b6001600160e01b0319831614610a69565b601454611d8d90826120c5565b601455611daf611da6611d9f60085490565b83906123b1565b601554906120c5565b60155550565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dea82611225565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e9c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610abe565b6000611ea783611225565b9050806001600160a01b0316846001600160a01b03161480611ee25750836001600160a01b0316611ed784610b78565b6001600160a01b0316145b80611f1257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f2d82611225565b6001600160a01b031614611f955760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610abe565b6001600160a01b038216611ff75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610abe565b6120028383836123bd565b61200d600082611db5565b6001600160a01b038316600090815260036020526040812080546001929061203690849061312c565b90915550506001600160a01b038216600090815260036020526040812080546001929061206490849061313f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611af5828461313f565b601254604080514460208083019190915242828401526060808301859052835180840390910181526080909201909252805191012060009182916121159190613152565b9050600061212282612475565b61212d90600161313f565b60128054919250600061213f83613166565b919050555061214f601254612475565b601683610309811061216357612163612d23565b015561216f84826124b2565b60008181526103206020908152604080832080546001600160a01b0319163317905560155461031f909252909120559392505050565b60006121c760646121c1601054856124cc90919063ffffffff16565b906123b1565b905060006121d58383611d24565b90506121e082611d80565b610326546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611990573d6000803e3d6000fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612278848484611f1a565b612284848484846124d8565b6119905760405162461bcd60e51b8152600401610abe9061317d565b60606103228054610af590612c98565b6060816000036122d75750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230157806122eb81612d68565b91506122fa9050600a83613078565b91506122db565b60008167ffffffffffffffff81111561231c5761231c612a46565b6040519080825280601f01601f191660200182016040528015612346576020820181803683370190505b5090505b8415611f125761235b60018361312c565b9150612368600a86613152565b61237390603061313f565b60f81b81838151811061238857612388612d23565b60200101906001600160f81b031916908160001a9053506123aa600a86613078565b945061234a565b6000611af58284613078565b6001600160a01b0383166124185761241381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61243b565b816001600160a01b0316836001600160a01b03161461243b5761243b83826125d9565b6001600160a01b03821661245257610d1d81612676565b826001600160a01b0316826001600160a01b031614610d1d57610d1d8282612725565b6000601682610309811061248b5761248b612d23565b0154156124ae5760168261030981106124a6576124a6612d23565b015492915050565b5090565b611221828260405180602001604052806000815250612769565b6000611af5828461304b565b60006001600160a01b0384163b156125ce57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061251c9033908990889088906004016131cf565b6020604051808303816000875af1925050508015612557575060408051601f3d908101601f191682019092526125549181019061320c565b60015b6125b4573d808015612585576040519150601f19603f3d011682016040523d82523d6000602084013e61258a565b606091505b5080516000036125ac5760405162461bcd60e51b8152600401610abe9061317d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f12565b506001949350505050565b600060016125e684611496565b6125f0919061312c565b600083815260076020526040902054909150808214612643576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126889060019061312c565b600083815260096020526040812054600880549394509092849081106126b0576126b0612d23565b9060005260206000200154905080600883815481106126d1576126d1612d23565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061270957612709613229565b6001900381819060005260206000200160009055905550505050565b600061273083611496565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b612773838361279c565b61278060008484846124d8565b610d1d5760405162461bcd60e51b8152600401610abe9061317d565b6001600160a01b0382166127f25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610abe565b6000818152600260205260409020546001600160a01b0316156128575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610abe565b612863600083836123bd565b6001600160a01b038216600090815260036020526040812080546001929061288c90849061313f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000602082840312156128fc57600080fd5b5035919050565b6001600160e01b031981168114611cc957600080fd5b60006020828403121561292b57600080fd5b8135611af581612903565b8015158114611cc957600080fd5b60006020828403121561295657600080fd5b8135611af581612936565b60005b8381101561297c578181015183820152602001612964565b50506000910152565b6000815180845261299d816020860160208601612961565b601f01601f19169290920160200192915050565b602081526000611af56020830184612985565b6001600160a01b0381168114611cc957600080fd5b600080604083850312156129ec57600080fd5b82356129f7816129c4565b946020939093013593505050565b600080600060608486031215612a1a57600080fd5b8335612a25816129c4565b92506020840135612a35816129c4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612a7757612a77612a46565b604051601f8501601f19908116603f01168101908282118183101715612a9f57612a9f612a46565b81604052809350858152868686011115612ab857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ae457600080fd5b813567ffffffffffffffff811115612afb57600080fd5b8201601f81018413612b0c57600080fd5b611f1284823560208401612a5c565b600060208284031215612b2d57600080fd5b8135611af5816129c4565b60008060408385031215612b4b57600080fd5b8235612b56816129c4565b91506020830135612b6681612936565b809150509250929050565b60008060008060808587031215612b8757600080fd5b8435612b92816129c4565b93506020850135612ba2816129c4565b925060408501359150606085013567ffffffffffffffff811115612bc557600080fd5b8501601f81018713612bd657600080fd5b612be587823560208401612a5c565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015612c2957835183529284019291840191600101612c0d565b50909695505050505050565b60008060408385031215612c4857600080fd5b8235612c53816129c4565b91506020830135612b66816129c4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612cac57607f821691505b602082108103612ccc57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612d4b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600060018201612d7a57612d7a612d52565b5060010190565b600060208284031215612d9357600080fd5b8151611af5816129c4565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015612de85784516001600160a01b031683529383019391830191600101612dc3565b50506001600160a01b039690961660408501525050506060015292915050565b600060208284031215612e1a57600080fd5b8151611af581612936565b601f821115610d1d57600081815260208120601f850160051c81016020861015612e4c5750805b601f850160051c820191505b81811015612e6b57828155600101612e58565b505050505050565b815167ffffffffffffffff811115612e8d57612e8d612a46565b612ea181612e9b8454612c98565b84612e25565b602080601f831160018114612ed65760008415612ebe5750858301515b600019600386901b1c1916600185901b178555612e6b565b600085815260208120601f198616915b82811015612f0557888601518255948401946001909101908401612ee6565b5085821015612f235787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526025908201527f47726e73747867323a206d696e74696e6720686173206e6f742073746172746560408201526419081e595d60da1b606082015260800190565b60208082526027908201527f47726e73747867323a20796f75206861766520746f206d696e74206174206c65604082015266617374206f6e6560c81b606082015260800190565b60208082526028908201527f47726e73747867323a20796f752063616e206f6e6c79206d696e7420313020616040820152677420612074696d6560c01b606082015260800190565b60208082526024908201527f47726e73747867323a2074686520636f6c6c656374696f6e20697320736f6c64604082015263081bdd5d60e21b606082015260800190565b8082028115828204841417610a6957610a69612d52565b634e487b7160e01b600052601260045260246000fd5b60008261308757613087613062565b500490565b60008451602061309f8285838a01612961565b8551918401916130b28184848a01612961565b85549201916000906130c381612c98565b600182811680156130db57600181146130f05761311c565b60ff198416875282151583028701945061311c565b896000528560002060005b84811015613114578154898201529083019087016130fb565b505082870194505b50929a9950505050505050505050565b81810381811115610a6957610a69612d52565b80820180821115610a6957610a69612d52565b60008261316157613161613062565b500690565b60008161317557613175612d52565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061320290830184612985565b9695505050505050565b60006020828403121561321e57600080fd5b8151611af581612903565b634e487b7160e01b600052603160045260246000fdfea26469706673582212202a1a69626aeb609efbdffc4358d5f431cb302c638d834e754a8dffbbd8f021ba64736f6c634300081300334552433732313a207472616e7366657220746f206e6f6e204552433732315265697066733a2f2f62616679626569626871656f33646a36666e70776b736374706471697867627634726a7a7375726f366361677263737170646d6e63786a703275792f

Deployed ByteCode Sourcemap

30230:10936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31393:26;;;;;;;;;;-1:-1:-1;31393:26:0;;;;-1:-1:-1;;;;;31393:26:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;31393:26:0;;;;;;;;39389:177;;;;;;;;;;-1:-1:-1;39389:177:0;;;;;:::i;:::-;;:::i;:::-;;;553:25:1;;;541:2;526:18;39389:177:0;407::1;21541:300:0;;;;;;;;;;-1:-1:-1;21541:300:0;;;;;:::i;:::-;;:::i;:::-;;;1140:14:1;;1133:22;1115:41;;1103:2;1088:18;21541:300:0;975:187:1;32591:79:0;;;;;;;;;;-1:-1:-1;32591:79:0;;;;;:::i;:::-;;:::i;:::-;;38890:87;;;:::i;14103:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15320:308::-;;;;;;;;;;-1:-1:-1;15320:308:0;;;;;:::i;:::-;;:::i;14901:411::-;;;;;;;;;;-1:-1:-1;14901:411:0;;;;;:::i;:::-;;:::i;30455:31::-;;;;;;;;;;;;;;;;30692:30;;;;;;;;;;;;;;;;22200:113;;;;;;;;;;-1:-1:-1;22288:10:0;:17;22200:113;;30810:33;;;;;;;;;;;;;;;;16193:376;;;;;;;;;;-1:-1:-1;16193:376:0;;;;;:::i;:::-;;:::i;21849:343::-;;;;;;;;;;-1:-1:-1;21849:343:0;;;;;:::i;:::-;;:::i;30871:32::-;;;;;;;;;;;;;;;;16577:185;;;;;;;;;;-1:-1:-1;16577:185:0;;;;;:::i;:::-;;:::i;32208:86::-;;;;;;;;;;-1:-1:-1;32208:86:0;;;;;:::i;:::-;;:::i;30910:28::-;;;;;;;;;;;;;;;;22321:320;;;;;;;;;;-1:-1:-1;22321:320:0;;;;;:::i;:::-;;:::i;39574:959::-;;;;;;;;;;;;;:::i;32096:104::-;;;;;;;;;;-1:-1:-1;32096:104:0;;;;;:::i;:::-;;:::i;31122:25::-;;;;;;;;;;-1:-1:-1;31122:25:0;;;;;;;;13769:326;;;;;;;;;;-1:-1:-1;13769:326:0;;;;;:::i;:::-;;:::i;34299:1102::-;;;;;;:::i;:::-;;:::i;13466:295::-;;;;;;;;;;-1:-1:-1;13466:295:0;;;;;:::i;:::-;;:::i;5526:94::-;;;;;;;;;;;;;:::i;31239:69::-;;;;;;;;;;-1:-1:-1;31239:69:0;;;;-1:-1:-1;;;;;31239:69:0;;;32302:122;;;;;;;;;;-1:-1:-1;32302:122:0;;;;;:::i;:::-;;:::i;30636:32::-;;;;;;;;;;-1:-1:-1;30636:32:0;;;;-1:-1:-1;;;;;30636:32:0;;;31056:42;;;;;;;;;;-1:-1:-1;31056:42:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;31056:42:0;;;32678:152;;;;;;;;;;-1:-1:-1;32678:152:0;;;;;:::i;:::-;;:::i;5303:87::-;;;;;;;;;;-1:-1:-1;5376:6:0;;-1:-1:-1;;;;;5376:6:0;5303:87;;14211:104;;;;;;;;;;;;;:::i;33360:901::-;;;;;;:::i;:::-;;:::i;33123:213::-;;;;;;;;;;-1:-1:-1;33123:213:0;;;;;:::i;:::-;;:::i;15636:327::-;;;;;;;;;;-1:-1:-1;15636:327:0;;;;;:::i;:::-;;:::i;38985:396::-;;;;;;;;;;-1:-1:-1;38985:396:0;;;;;:::i;:::-;;:::i;35455:481::-;;;;;;;;;;-1:-1:-1;35455:481:0;;;;;:::i;:::-;;:::i;16770:365::-;;;;;;;;;;-1:-1:-1;16770:365:0;;;;;:::i;:::-;;:::i;30411:37::-;;;;;;;;;;;;;:::i;37693:585::-;;;;;;;;;;-1:-1:-1;37693:585:0;;;;;:::i;:::-;;:::i;37198:453::-;;;;;;;;;;-1:-1:-1;37198:453:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31000:49::-;;;;;;;;;;-1:-1:-1;31000:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;30729:30;;;;;;;;;;;;;;;;30596:33;;;;;;;;;;;;;;;;32432:151;;;;;;;;;;-1:-1:-1;32432:151:0;;;;;:::i;:::-;;:::i;30513:76::-;;;;;;;;;;-1:-1:-1;30513:76:0;;;;-1:-1:-1;;;;;30513:76:0;;;15971:214;;;;;;;;;;-1:-1:-1;15971:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;16142:25:0;;;16113:4;16142:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;15971:214;30961:32;;;;;;;;;;-1:-1:-1;30961:32:0;;;;;:::i;:::-;;:::i;33001:114::-;;;;;;;;;;-1:-1:-1;33001:114:0;;;;;:::i;:::-;;:::i;31315:71::-;;;;;;;;;;-1:-1:-1;31315:71:0;;;;-1:-1:-1;;;;;31315:71:0;;;5628:229;;;;;;;;;;-1:-1:-1;5628:229:0;;;;;:::i;:::-;;:::i;32838:155::-;;;;;;;;;;-1:-1:-1;32838:155:0;;;;;:::i;:::-;;:::i;30766:37::-;;;;;;;;;;;;;;;;31445:32;;;;;;;;;;-1:-1:-1;31445:32:0;;;;-1:-1:-1;;;;;31445:32:0;;;31484:19;;;;;;;;;;-1:-1:-1;31484:19:0;;;;-1:-1:-1;;;;;31484:19:0;;;39389:177;39484:7;39534:23;;;:14;:23;;;;;;39516:13;;:42;;:17;:42::i;:::-;39509:49;39389:177;-1:-1:-1;;39389:177:0:o;21541:300::-;21688:4;-1:-1:-1;;;;;;21730:50:0;;-1:-1:-1;;;21730:50:0;;:103;;;21797:36;21821:11;21797:23;:36::i;32591:79::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;;;;;;;;;32647:6:::1;:15:::0;;-1:-1:-1;;32647:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32591:79::o;38890:87::-;38943:26;38959:9;38943:15;:26::i;:::-;38890:87::o;14103:100::-;14157:13;14190:5;14183:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14103:100;:::o;15320:308::-;15441:7;17592:16;;;:7;:16;;;;;;-1:-1:-1;;;;;17592:16:0;15466:110;;;;-1:-1:-1;;;15466:110:0;;8533:2:1;15466:110:0;;;8515:21:1;8572:2;8552:18;;;8545:30;8611:34;8591:18;;;8584:62;-1:-1:-1;;;8662:18:1;;;8655:42;8714:19;;15466:110:0;8331:408:1;15466:110:0;-1:-1:-1;15596:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;15596:24:0;;15320:308::o;14901:411::-;14982:13;14998:23;15013:7;14998:14;:23::i;:::-;14982:39;;15046:5;-1:-1:-1;;;;;15040:11:0;:2;-1:-1:-1;;;;;15040:11:0;;15032:57;;;;-1:-1:-1;;;15032:57:0;;8946:2:1;15032:57:0;;;8928:21:1;8985:2;8965:18;;;8958:30;9024:34;9004:18;;;8997:62;-1:-1:-1;;;9075:18:1;;;9068:31;9116:19;;15032:57:0;8744:397:1;15032:57:0;4913:10;-1:-1:-1;;;;;15124:21:0;;;;:62;;-1:-1:-1;15149:37:0;15166:5;4913:10;15971:214;:::i;15149:37::-;15102:168;;;;-1:-1:-1;;;15102:168:0;;9348:2:1;15102:168:0;;;9330:21:1;9387:2;9367:18;;;9360:30;9426:34;9406:18;;;9399:62;9497:26;9477:18;;;9470:54;9541:19;;15102:168:0;9146:420:1;15102:168:0;15283:21;15292:2;15296:7;15283:8;:21::i;:::-;14971:341;14901:411;;:::o;16193:376::-;16402:41;4913:10;16435:7;16402:18;:41::i;:::-;16380:140;;;;-1:-1:-1;;;16380:140:0;;;;;;;:::i;:::-;16533:28;16543:4;16549:2;16553:7;16533:9;:28::i;21849:343::-;21991:7;22046:23;22063:5;22046:16;:23::i;:::-;22038:5;:31;22016:124;;;;-1:-1:-1;;;22016:124:0;;10191:2:1;22016:124:0;;;10173:21:1;10230:2;10210:18;;;10203:30;10269:34;10249:18;;;10242:62;-1:-1:-1;;;10320:18:1;;;10313:41;10371:19;;22016:124:0;9989:407:1;22016:124:0;-1:-1:-1;;;;;;22158:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;21849:343::o;16577:185::-;16715:39;16732:4;16738:2;16742:7;16715:39;;;;;;;;;;;;:16;:39::i;32208:86::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;32271:4:::1;:15:::0;32208:86::o;22321:320::-;22441:7;22496:30;22288:10;:17;;22200:113;22496:30;22488:5;:38;22466:132;;;;-1:-1:-1;;;22466:132:0;;10603:2:1;22466:132:0;;;10585:21:1;10642:2;10622:18;;;10615:30;10681:34;10661:18;;;10654:62;-1:-1:-1;;;10732:18:1;;;10725:42;10784:19;;22466:132:0;10401:408:1;22466:132:0;22616:10;22627:5;22616:17;;;;;;;;:::i;:::-;;;;;;;;;22609:24;;22321:320;;;:::o;39574:959::-;39622:13;39638:21;39648:10;39638:9;:21::i;:::-;39697:5;;:30;;-1:-1:-1;;;39697:30:0;;39721:4;39697:30;;;160:51:1;39622:37:0;;-1:-1:-1;39670:24:0;;-1:-1:-1;;;;;39697:5:0;;;;:15;;133:18:1;;39697:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39670:57;;39738:15;39773:9;39768:236;39792:5;39788:1;:9;39768:236;;;39819:15;39837:34;39857:10;39869:1;39837:19;:34::i;:::-;39819:52;;39896:42;39908:29;39929:7;39908:20;:29::i;:::-;39896:7;;:11;:42::i;:::-;39979:13;;39953:23;;;;:14;:23;;;;;;:39;;;;39886:52;-1:-1:-1;39799:3:0;;;;:::i;:::-;;;;39768:236;;;-1:-1:-1;40075:16:0;;;40089:1;40075:16;;;;;;;;40051:21;;40075:16;;;;;;;;-1:-1:-1;;40112:6:0;;:13;;;-1:-1:-1;;;40112:13:0;;;;40051:40;;-1:-1:-1;;;;;;40112:6:0;;;;:11;;-1:-1:-1;40112:13:0;;;;;;;;;;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40102:4;40107:1;40102:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40102:23:0;;;:7;;;;;;;;;:23;40146:11;;40136:7;;40146:11;;;40136:4;;40146:11;;40136:7;;;;;;:::i;:::-;-1:-1:-1;;;;;40136:21:0;;;:7;;;;;;;;;:21;40170:6;;:178;;-1:-1:-1;;;40170:178:0;;:6;;;:57;;40236:7;;40170:178;;:6;;40275:4;;40302;;40322:15;;40170:178;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40386:5:0;;:30;;-1:-1:-1;;;40386:30:0;;40410:4;40386:30;;;160:51:1;40361:22:0;;-1:-1:-1;;;;;;40386:5:0;;;;-1:-1:-1;40386:15:0;;-1:-1:-1;133:18:1;;40386:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40361:55;-1:-1:-1;40427:14:0;40444:36;40361:55;40463:16;40444:18;:36::i;:::-;40491:5;;:34;;-1:-1:-1;;;40491:34:0;;40506:10;40491:34;;;12750:51:1;12817:18;;;12810:34;;;40427:53:0;;-1:-1:-1;;;;;;40491:5:0;;:14;;12723:18:1;;40491:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39611:922;;;;;;39574:959::o;32096:104::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;32169:13:::1;:23;32185:7:::0;32169:13;:23:::1;:::i;:::-;;32096:104:::0;:::o;13769:326::-;13886:7;13927:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13927:16:0;;13954:110;;;;-1:-1:-1;;;13954:110:0;;15511:2:1;13954:110:0;;;15493:21:1;15550:2;15530:18;;;15523:30;15589:34;15569:18;;;15562:62;-1:-1:-1;;;15640:18:1;;;15633:39;15689:19;;13954:110:0;15309:405:1;34299:1102:0;34389:6;;;;34388:7;34380:57;;;;-1:-1:-1;;;34380:57:0;;;;;;;:::i;:::-;34470:1;34456:11;:15;34448:67;;;;-1:-1:-1;;;34448:67:0;;;;;;;:::i;:::-;34563:13;;34548:11;:28;;34526:118;;;;-1:-1:-1;;;34526:118:0;;;;;;;:::i;:::-;34691:11;34677:10;;:25;;34655:111;;;;-1:-1:-1;;;34655:111:0;;;;;;;:::i;:::-;5376:6;;-1:-1:-1;;;;;5376:6:0;34781:10;:21;34777:181;;34867:11;34858:6;;:20;;;;:::i;:::-;34845:9;:33;;34819:127;;;;-1:-1:-1;;;34819:127:0;;17722:2:1;34819:127:0;;;17704:21:1;;;17741:18;;;17734:30;17800:34;17780:18;;;17773:62;17852:18;;34819:127:0;17520:356:1;34819:127:0;35044:17;;:39;;-1:-1:-1;;;35044:39:0;;35072:10;35044:39;;;160:51:1;35086:1:0;;-1:-1:-1;;;;;35044:17:0;;:27;;133:18:1;;35044:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;35022:133;;;;-1:-1:-1;;;35022:133:0;;18083:2:1;35022:133:0;;;18065:21:1;18122:2;18102:18;;;18095:30;18161:34;18141:18;;;18134:62;-1:-1:-1;;;18212:18:1;;;18205:38;18260:19;;35022:133:0;17881:404:1;35022:133:0;35203:1;35186:208;35211:11;35206:1;:16;35186:208;;35276:23;35288:10;35276:11;:23::i;:::-;-1:-1:-1;35341:41:0;35358:23;35370:11;35358:9;:23;:::i;:::-;35341:16;:41::i;:::-;35224:3;;;;:::i;:::-;;;;35186:208;;13466:295;13583:7;-1:-1:-1;;;;;13630:19:0;;13608:111;;;;-1:-1:-1;;;13608:111:0;;18749:2:1;13608:111:0;;;18731:21:1;18788:2;18768:18;;;18761:30;18827:34;18807:18;;;18800:62;-1:-1:-1;;;18878:18:1;;;18871:40;18928:19;;13608:111:0;18547:406:1;13608:111:0;-1:-1:-1;;;;;;13737:16:0;;;;;:9;:16;;;;;;;13466:295::o;5526:94::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;5591:21:::1;5609:1;5591:9;:21::i;32302:122::-:0;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;32383:13:::1;:33:::0;32302:122::o;32678:152::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;32755:11:::1;:29:::0;;-1:-1:-1;;;;;32755:29:0;;::::1;-1:-1:-1::0;;;;;;32755:29:0;;::::1;::::0;::::1;::::0;;;32795:5:::1;:27:::0;;;;::::1;;::::0;;32678:152::o;14211:104::-;14267:13;14300:7;14293:14;;;;;:::i;33360:901::-;33449:6;;;;33448:7;33440:57;;;;-1:-1:-1;;;33440:57:0;;;;;;;:::i;:::-;33530:1;33516:11;:15;33508:67;;;;-1:-1:-1;;;33508:67:0;;;;;;;:::i;:::-;33623:13;;33608:11;:28;;33586:118;;;;-1:-1:-1;;;33586:118:0;;;;;;;:::i;:::-;33751:11;33737:10;;:25;;33715:111;;;;-1:-1:-1;;;33715:111:0;;;;;;;:::i;:::-;5376:6;;-1:-1:-1;;;;;5376:6:0;33841:10;:21;33837:179;;33925:11;33918:4;;:18;;;;:::i;:::-;33905:9;:31;;33879:125;;;;-1:-1:-1;;;33879:125:0;;17722:2:1;33879:125:0;;;17704:21:1;;;17741:18;;;17734:30;17800:34;17780:18;;;17773:62;17852:18;;33879:125:0;17520:356:1;33879:125:0;34063:1;34046:208;34071:11;34066:1;:16;34046:208;;34136:23;34148:10;34136:11;:23::i;:::-;-1:-1:-1;34201:41:0;34218:23;34230:11;34218:9;:23;:::i;34201:41::-;34084:3;;;;:::i;:::-;;;;34046:208;;33123:213;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;33233:16:::1;:39:::0;;-1:-1:-1;;;;;33233:39:0;;::::1;-1:-1:-1::0;;;;;;33233:39:0;;::::1;::::0;::::1;::::0;;;33283:17:::1;:45:::0;;;;::::1;;::::0;;33123:213::o;15636:327::-;4913:10;-1:-1:-1;;;;;15771:24:0;;;15763:62;;;;-1:-1:-1;;;15763:62:0;;19160:2:1;15763:62:0;;;19142:21:1;19199:2;19179:18;;;19172:30;19238:27;19218:18;;;19211:55;19283:18;;15763:62:0;18958:349:1;15763:62:0;4913:10;15838:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;15838:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;15838:53:0;;;;;;;;;;15907:48;;1115:41:1;;;15838:42:0;;4913:10;15907:48;;1088:18:1;15907:48:0;;;;;;;15636:327;;:::o;38985:396::-;39080:7;39105:13;39121:17;39131:6;39121:9;:17::i;:::-;39105:33;;39149:13;39182:9;39177:174;39201:5;39197:1;:9;39177:174;;;39228:15;39246:30;39266:6;39274:1;39246:19;:30::i;:::-;39228:48;;39299:40;39309:29;39330:7;39309:20;:29::i;39299:40::-;39291:48;;39213:138;39208:3;;;;;:::i;:::-;;;;39177:174;;;-1:-1:-1;39368:5:0;38985:396;-1:-1:-1;;;38985:396:0:o;35455:481::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35593:21:0;::::1;35585:56;;;::::0;-1:-1:-1;;;35585:56:0;;19514:2:1;35585:56:0::1;::::0;::::1;19496:21:1::0;19553:2;19533:18;;;19526:30;-1:-1:-1;;;19572:18:1;;;19565:52;19634:18;;35585:56:0::1;19312:346:1::0;35585:56:0::1;35670:1;35660:7;:11;35652:63;;;;-1:-1:-1::0;;;35652:63:0::1;;;;;;;:::i;:::-;35734:10;;35748:1;35734:15:::0;35726:64:::1;;;;-1:-1:-1::0;;;35726:64:0::1;;;;;;;:::i;:::-;35860:1;35843:86;35868:7;35863:1;:12;35843:86;;35897:20;35909:7;35897:11;:20::i;:::-;-1:-1:-1::0;35877:3:0;::::1;::::0;::::1;:::i;:::-;;;;35843:86;;16770:365:::0;16959:41;4913:10;16992:7;16959:18;:41::i;:::-;16937:140;;;;-1:-1:-1;;;16937:140:0;;;;;;;:::i;:::-;17088:39;17102:4;17108:2;17112:7;17121:5;17088:13;:39::i;:::-;16770:365;;;;:::o;30411:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37693:585::-;17568:4;17592:16;;;:7;:16;;;;;;37807:13;;-1:-1:-1;;;;;17592:16:0;37838:66;;;;-1:-1:-1;;;37838:66:0;;19865:2:1;37838:66:0;;;19847:21:1;19904:2;19884:18;;;19877:30;19943:34;19923:18;;;19916:62;-1:-1:-1;;;19994:18:1;;;19987:39;20043:19;;37838:66:0;19663:405:1;37838:66:0;37915:28;37946:10;:8;:10::i;:::-;37915:41;;38018:1;37993:14;37987:28;:32;:283;;;;;;;;;;;;;;;;;38111:14;38152;:3;:12;:14::i;:::-;38193:13;38068:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37987:283;37967:303;37693:585;-1:-1:-1;;;37693:585:0:o;37198:453::-;37283:16;37347:23;37373:17;37383:6;37373:9;:17::i;:::-;37347:43;;37401:25;37443:15;37429:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37429:30:0;;37401:58;;37510:9;37505:113;37525:15;37521:1;:19;37505:113;;;37576:30;37596:6;37604:1;37576:19;:30::i;:::-;37562:8;37571:1;37562:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;37542:3;;;;:::i;:::-;;;;37505:113;;32432:151;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;32542:13:::1;:33;32558:17:::0;32542:13;:33:::1;:::i;30961:32::-:0;;;;;;;;;;;;;;;-1:-1:-1;30961:32:0;:::o;33001:114::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;33078:11:::1;:29:::0;;-1:-1:-1;;;;;;33078:29:0::1;-1:-1:-1::0;;;;;33078:29:0;;;::::1;::::0;;;::::1;::::0;;33001:114::o;5628:229::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5731:22:0;::::1;5709:110;;;::::0;-1:-1:-1;;;5709:110:0;;21536:2:1;5709:110:0::1;::::0;::::1;21518:21:1::0;21575:2;21555:18;;;21548:30;21614:34;21594:18;;;21587:62;-1:-1:-1;;;21665:18:1;;;21658:36;21711:19;;5709:110:0::1;21334:402:1::0;5709:110:0::1;5830:19;5840:8;5830:9;:19::i;:::-;5628:229:::0;:::o;32838:155::-;5376:6;;-1:-1:-1;;;;;5376:6:0;4913:10;5438:23;5430:68;;;;-1:-1:-1;;;5430:68:0;;;;;;;:::i;:::-;32911:9:::1;:25:::0;;-1:-1:-1;;;;;32911:25:0;;::::1;-1:-1:-1::0;;;;;;32911:25:0;;::::1;::::0;::::1;::::0;;;32947:6:::1;:38:::0;;;;::::1;;::::0;;32838:155::o;2167:98::-;2225:7;2252:5;2256:1;2252;:5;:::i;13103:355::-;13250:4;-1:-1:-1;;;;;;13292:40:0;;-1:-1:-1;;;13292:40:0;;:105;;-1:-1:-1;;;;;;;13349:48:0;;-1:-1:-1;;;13349:48:0;13292:105;:158;;;-1:-1:-1;;;;;;;;;;10568:40:0;;;13414:36;10409:207;38689:193;38770:17;;:30;;38792:7;38770:21;:30::i;:::-;38750:17;:50;38827:47;38846:26;38858:13;22288:10;:17;;22200:113;38858:13;38846:7;;:11;:26::i;:::-;38827:13;;;:17;:47::i;:::-;38811:13;:63;-1:-1:-1;38689:193:0:o;19926:174::-;20001:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;20001:29:0;-1:-1:-1;;;;;20001:29:0;;;;;;;;:24;;20055:23;20001:24;20055:14;:23::i;:::-;-1:-1:-1;;;;;20046:46:0;;;;;;;;;;;19926:174;;:::o;17638:452::-;17767:4;17592:16;;;:7;:16;;;;;;-1:-1:-1;;;;;17592:16:0;17789:110;;;;-1:-1:-1;;;17789:110:0;;22076:2:1;17789:110:0;;;22058:21:1;22115:2;22095:18;;;22088:30;22154:34;22134:18;;;22127:62;-1:-1:-1;;;22205:18:1;;;22198:42;22257:19;;17789:110:0;21874:408:1;17789:110:0;17910:13;17926:23;17941:7;17926:14;:23::i;:::-;17910:39;;17979:5;-1:-1:-1;;;;;17968:16:0;:7;-1:-1:-1;;;;;17968:16:0;;:64;;;;18025:7;-1:-1:-1;;;;;18001:31:0;:20;18013:7;18001:11;:20::i;:::-;-1:-1:-1;;;;;18001:31:0;;17968:64;:113;;;-1:-1:-1;;;;;;16142:25:0;;;16113:4;16142:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;18049:32;17960:122;17638:452;-1:-1:-1;;;;17638:452:0:o;19303:615::-;19476:4;-1:-1:-1;;;;;19449:31:0;:23;19464:7;19449:14;:23::i;:::-;-1:-1:-1;;;;;19449:31:0;;19427:122;;;;-1:-1:-1;;;19427:122:0;;22489:2:1;19427:122:0;;;22471:21:1;22528:2;22508:18;;;22501:30;22567:34;22547:18;;;22540:62;-1:-1:-1;;;22618:18:1;;;22611:39;22667:19;;19427:122:0;22287:405:1;19427:122:0;-1:-1:-1;;;;;19568:16:0;;19560:65;;;;-1:-1:-1;;;19560:65:0;;22899:2:1;19560:65:0;;;22881:21:1;22938:2;22918:18;;;22911:30;22977:34;22957:18;;;22950:62;-1:-1:-1;;;23028:18:1;;;23021:34;23072:19;;19560:65:0;22697:400:1;19560:65:0;19638:39;19659:4;19665:2;19669:7;19638:20;:39::i;:::-;19742:29;19759:1;19763:7;19742:8;:29::i;:::-;-1:-1:-1;;;;;19784:15:0;;;;;;:9;:15;;;;;:20;;19803:1;;19784:15;:20;;19803:1;;19784:20;:::i;:::-;;;;-1:-1:-1;;;;;;;19815:13:0;;;;;;:9;:13;;;;;:18;;19832:1;;19815:13;:18;;19832:1;;19815:18;:::i;:::-;;;;-1:-1:-1;;19844:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;19844:21:0;-1:-1:-1;;;;;19844:21:0;;;;;;;;;19883:27;;19844:16;;19883:27;;;;;;;19303:615;;;:::o;2061:98::-;2119:7;2146:5;2150:1;2146;:5;:::i;35964:593::-;36106:10;;40960:161;;;41003:16;40960:161;;;;24094:19:1;;;;41046:15:0;24129:12:1;;;24122:28;24166:12;;;;24159:28;;;40960:161:0;;;;;;;;;;24203:12:1;;;;40960:161:0;;;40928:212;;;;;36020:7;;;;36091:25;;;;:::i;:::-;36074:42;;36127:18;36148:16;36157:6;36148:8;:16::i;:::-;:20;;36167:1;36148:20;:::i;:::-;36205:10;:12;;36127:41;;-1:-1:-1;36205:10:0;:12;;;:::i;:::-;;;;;;36287:20;36296:10;;36287:8;:20::i;:::-;36264:12;36277:6;36264:20;;;;;;;:::i;:::-;;:43;36335:30;36345:7;36354:10;36335:9;:30::i;:::-;36410:19;;;;:7;:19;;;;;;;;:32;;-1:-1:-1;;;;;;36410:32:0;36432:10;36410:32;;;36508:13;;36479:14;:26;;;;;;:42;36418:10;35964:593;-1:-1:-1;;;35964:593:0:o;38304:356::-;38392:17;38412:32;38440:3;38412:23;38424:10;;38412:7;:11;;:23;;;;:::i;:::-;:27;;:32::i;:::-;38392:52;-1:-1:-1;38455:16:0;38474:22;:7;38392:52;38474:11;:22::i;:::-;38455:41;;38547:26;38563:9;38547:15;:26::i;:::-;38621:11;;38613:39;;-1:-1:-1;;;;;38621:11:0;;;;38613:39;;;;;38643:8;;38621:11;38613:39;38621:11;38613:39;38643:8;38621:11;38613:39;;;;;;;;;;;;;;;;;;;5865:173;5940:6;;;-1:-1:-1;;;;;5957:17:0;;;-1:-1:-1;;;;;;5957:17:0;;;;;;;5990:40;;5940:6;;;5957:17;5940:6;;5990:40;;5921:16;;5990:40;5910:128;5865:173;:::o;17143:352::-;17300:28;17310:4;17316:2;17320:7;17300:9;:28::i;:::-;17361:48;17384:4;17390:2;17394:7;17403:5;17361:22;:48::i;:::-;17339:148;;;;-1:-1:-1;;;17339:148:0;;;;;;;:::i;31958:114::-;32018:13;32051;32044:20;;;;;:::i;3422:534::-;3478:13;3510:5;3519:1;3510:10;3506:53;;-1:-1:-1;;3537:10:0;;;;;;;;;;;;-1:-1:-1;;;3537:10:0;;;;;3422:534::o;3506:53::-;3584:5;3569:12;3625:78;3632:9;;3625:78;;3658:8;;;;:::i;:::-;;-1:-1:-1;3681:10:0;;-1:-1:-1;3689:2:0;3681:10;;:::i;:::-;;;3625:78;;;3713:19;3745:6;3735:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3735:17:0;;3713:39;;3763:154;3770:10;;3763:154;;3797:11;3807:1;3797:11;;:::i;:::-;;-1:-1:-1;3866:10:0;3874:2;3866:5;:10;:::i;:::-;3853:24;;:2;:24;:::i;:::-;3840:39;;3823:6;3830;3823:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3823:56:0;;;;;;;;-1:-1:-1;3894:11:0;3903:2;3894:11;;:::i;:::-;;;3763:154;;2379:98;2437:7;2464:5;2468:1;2464;:5;:::i;22649:589::-;-1:-1:-1;;;;;22855:18:0;;22851:187;;22890:40;22922:7;23579:10;:17;;23552:24;;;;:15;:24;;;;;:44;;;23607:24;;;;;;;;;;;;23475:164;22890:40;22851:187;;;22960:2;-1:-1:-1;;;;;22952:10:0;:4;-1:-1:-1;;;;;22952:10:0;;22948:90;;22979:47;23012:4;23018:7;22979:32;:47::i;:::-;-1:-1:-1;;;;;23052:16:0;;23048:183;;23085:45;23122:7;23085:36;:45::i;23048:183::-;23158:4;-1:-1:-1;;;;;23152:10:0;:2;-1:-1:-1;;;;;23152:10:0;;23148:83;;23179:40;23207:2;23211:7;23179:27;:40::i;40598:172::-;40655:7;40679:12;40692:6;40679:20;;;;;;;:::i;:::-;;;:25;40675:87;;40713:12;40726:6;40713:20;;;;;;;:::i;:::-;;;;40598:172;-1:-1:-1;;40598:172:0:o;40675:87::-;-1:-1:-1;40756:6:0;40598:172::o;18098:110::-;18174:26;18184:2;18188:7;18174:26;;;;;;;;;;;;:9;:26::i;2273:98::-;2331:7;2358:5;2362:1;2358;:5;:::i;20108:980::-;20263:4;-1:-1:-1;;;;;20284:13:0;;6204:20;6252:8;20280:801;;20337:175;;-1:-1:-1;;;20337:175:0;;-1:-1:-1;;;;;20337:36:0;;;;;:175;;4913:10;;20431:4;;20458:7;;20488:5;;20337:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20337:175:0;;;;;;;;-1:-1:-1;;20337:175:0;;;;;;;;;;;;:::i;:::-;;;20316:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20695:6;:13;20712:1;20695:18;20691:320;;20738:108;;-1:-1:-1;;;20738:108:0;;;;;;;:::i;20691:320::-;20961:6;20955:13;20946:6;20942:2;20938:15;20931:38;20316:710;-1:-1:-1;;;;;;20576:51:0;-1:-1:-1;;;20576:51:0;;-1:-1:-1;20569:58:0;;20280:801;-1:-1:-1;21065:4:0;20108:980;;;;;;:::o;23647:569::-;23753:22;23803:1;23778:22;23795:4;23778:16;:22::i;:::-;:26;;;;:::i;:::-;23815:18;23836:26;;;:17;:26;;;;;;23753:51;;-1:-1:-1;23879:28:0;;;23875:236;;-1:-1:-1;;;;;23946:18:0;;23924:19;23946:18;;;:12;:18;;;;;;;;:34;;;;;;;;;23997:30;;;;;;:44;;;24056:30;;:17;:30;;;;;:43;;;23875:236;-1:-1:-1;24130:26:0;;;;:17;:26;;;;;;;;24123:33;;;-1:-1:-1;;;;;24174:18:0;;;;;:12;:18;;;;;:34;;;;;;;24167:41;23647:569::o;24224:427::-;24333:10;:17;24308:22;;24333:21;;24353:1;;24333:21;:::i;:::-;24365:18;24386:24;;;:15;:24;;;;;;24445:10;:26;;24308:46;;-1:-1:-1;24386:24:0;;24308:46;;24445:26;;;;;;:::i;:::-;;;;;;;;;24423:48;;24509:11;24484:10;24495;24484:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;24531:28;;;:15;:28;;;;;;;:41;;;24592:24;;;;;24585:31;24627:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;24295:356;;;24224:427;:::o;23246:221::-;23331:14;23348:20;23365:2;23348:16;:20::i;:::-;-1:-1:-1;;;;;23379:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;23424:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;23246:221:0:o;18216:321::-;18346:18;18352:2;18356:7;18346:5;:18::i;:::-;18397:54;18428:1;18432:2;18436:7;18445:5;18397:22;:54::i;:::-;18375:154;;;;-1:-1:-1;;;18375:154:0;;;;;;;:::i;18545:382::-;-1:-1:-1;;;;;18625:16:0;;18617:61;;;;-1:-1:-1;;;18617:61:0;;25308:2:1;18617:61:0;;;25290:21:1;;;25327:18;;;25320:30;25386:34;25366:18;;;25359:62;25438:18;;18617:61:0;25106:356:1;18617:61:0;17568:4;17592:16;;;:7;:16;;;;;;-1:-1:-1;;;;;17592:16:0;:30;18689:58;;;;-1:-1:-1;;;18689:58:0;;25669:2:1;18689:58:0;;;25651:21:1;25708:2;25688:18;;;25681:30;25747;25727:18;;;25720:58;25795:18;;18689:58:0;25467:352:1;18689:58:0;18760:45;18789:1;18793:2;18797:7;18760:20;:45::i;:::-;-1:-1:-1;;;;;18818:13:0;;;;;;:9;:13;;;;;:18;;18835:1;;18818:13;:18;;18835:1;;18818:18;:::i;:::-;;;;-1:-1:-1;;18847:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;18847:21:0;-1:-1:-1;;;;;18847:21:0;;;;;;;;18886:33;;18847:16;;;18886:33;;18847:16;;18886:33;18545:382;;:::o;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;589:131::-;-1:-1:-1;;;;;;663:32:1;;653:43;;643:71;;710:1;707;700:12;725:245;783:6;836:2;824:9;815:7;811:23;807:32;804:52;;;852:1;849;842:12;804:52;891:9;878:23;910:30;934:5;910:30;:::i;1167:118::-;1253:5;1246:13;1239:21;1232:5;1229:32;1219:60;;1275:1;1272;1265:12;1290:241;1346:6;1399:2;1387:9;1378:7;1374:23;1370:32;1367:52;;;1415:1;1412;1405:12;1367:52;1454:9;1441:23;1473:28;1495:5;1473:28;:::i;1536:250::-;1621:1;1631:113;1645:6;1642:1;1639:13;1631:113;;;1721:11;;;1715:18;1702:11;;;1695:39;1667:2;1660:10;1631:113;;;-1:-1:-1;;1778:1:1;1760:16;;1753:27;1536:250::o;1791:271::-;1833:3;1871:5;1865:12;1898:6;1893:3;1886:19;1914:76;1983:6;1976:4;1971:3;1967:14;1960:4;1953:5;1949:16;1914:76;:::i;:::-;2044:2;2023:15;-1:-1:-1;;2019:29:1;2010:39;;;;2051:4;2006:50;;1791:271;-1:-1:-1;;1791:271:1:o;2067:220::-;2216:2;2205:9;2198:21;2179:4;2236:45;2277:2;2266:9;2262:18;2254:6;2236:45;:::i;2292:131::-;-1:-1:-1;;;;;2367:31:1;;2357:42;;2347:70;;2413:1;2410;2403:12;2428:315;2496:6;2504;2557:2;2545:9;2536:7;2532:23;2528:32;2525:52;;;2573:1;2570;2563:12;2525:52;2612:9;2599:23;2631:31;2656:5;2631:31;:::i;:::-;2681:5;2733:2;2718:18;;;;2705:32;;-1:-1:-1;;;2428:315:1:o;2748:456::-;2825:6;2833;2841;2894:2;2882:9;2873:7;2869:23;2865:32;2862:52;;;2910:1;2907;2900:12;2862:52;2949:9;2936:23;2968:31;2993:5;2968:31;:::i;:::-;3018:5;-1:-1:-1;3075:2:1;3060:18;;3047:32;3088:33;3047:32;3088:33;:::i;:::-;2748:456;;3140:7;;-1:-1:-1;;;3194:2:1;3179:18;;;;3166:32;;2748:456::o;3209:127::-;3270:10;3265:3;3261:20;3258:1;3251:31;3301:4;3298:1;3291:15;3325:4;3322:1;3315:15;3341:632;3406:5;3436:18;3477:2;3469:6;3466:14;3463:40;;;3483:18;;:::i;:::-;3558:2;3552:9;3526:2;3612:15;;-1:-1:-1;;3608:24:1;;;3634:2;3604:33;3600:42;3588:55;;;3658:18;;;3678:22;;;3655:46;3652:72;;;3704:18;;:::i;:::-;3744:10;3740:2;3733:22;3773:6;3764:15;;3803:6;3795;3788:22;3843:3;3834:6;3829:3;3825:16;3822:25;3819:45;;;3860:1;3857;3850:12;3819:45;3910:6;3905:3;3898:4;3890:6;3886:17;3873:44;3965:1;3958:4;3949:6;3941;3937:19;3933:30;3926:41;;;;3341:632;;;;;:::o;3978:451::-;4047:6;4100:2;4088:9;4079:7;4075:23;4071:32;4068:52;;;4116:1;4113;4106:12;4068:52;4156:9;4143:23;4189:18;4181:6;4178:30;4175:50;;;4221:1;4218;4211:12;4175:50;4244:22;;4297:4;4289:13;;4285:27;-1:-1:-1;4275:55:1;;4326:1;4323;4316:12;4275:55;4349:74;4415:7;4410:2;4397:16;4392:2;4388;4384:11;4349:74;:::i;4434:247::-;4493:6;4546:2;4534:9;4525:7;4521:23;4517:32;4514:52;;;4562:1;4559;4552:12;4514:52;4601:9;4588:23;4620:31;4645:5;4620:31;:::i;4910:382::-;4975:6;4983;5036:2;5024:9;5015:7;5011:23;5007:32;5004:52;;;5052:1;5049;5042:12;5004:52;5091:9;5078:23;5110:31;5135:5;5110:31;:::i;:::-;5160:5;-1:-1:-1;5217:2:1;5202:18;;5189:32;5230:30;5189:32;5230:30;:::i;:::-;5279:7;5269:17;;;4910:382;;;;;:::o;5297:795::-;5392:6;5400;5408;5416;5469:3;5457:9;5448:7;5444:23;5440:33;5437:53;;;5486:1;5483;5476:12;5437:53;5525:9;5512:23;5544:31;5569:5;5544:31;:::i;:::-;5594:5;-1:-1:-1;5651:2:1;5636:18;;5623:32;5664:33;5623:32;5664:33;:::i;:::-;5716:7;-1:-1:-1;5770:2:1;5755:18;;5742:32;;-1:-1:-1;5825:2:1;5810:18;;5797:32;5852:18;5841:30;;5838:50;;;5884:1;5881;5874:12;5838:50;5907:22;;5960:4;5952:13;;5948:27;-1:-1:-1;5938:55:1;;5989:1;5986;5979:12;5938:55;6012:74;6078:7;6073:2;6060:16;6055:2;6051;6047:11;6012:74;:::i;:::-;6002:84;;;5297:795;;;;;;;:::o;6097:632::-;6268:2;6320:21;;;6390:13;;6293:18;;;6412:22;;;6239:4;;6268:2;6491:15;;;;6465:2;6450:18;;;6239:4;6534:169;6548:6;6545:1;6542:13;6534:169;;;6609:13;;6597:26;;6678:15;;;;6643:12;;;;6570:1;6563:9;6534:169;;;-1:-1:-1;6720:3:1;;6097:632;-1:-1:-1;;;;;;6097:632:1:o;6734:388::-;6802:6;6810;6863:2;6851:9;6842:7;6838:23;6834:32;6831:52;;;6879:1;6876;6869:12;6831:52;6918:9;6905:23;6937:31;6962:5;6937:31;:::i;:::-;6987:5;-1:-1:-1;7044:2:1;7029:18;;7016:32;7057:33;7016:32;7057:33;:::i;7585:356::-;7787:2;7769:21;;;7806:18;;;7799:30;7865:34;7860:2;7845:18;;7838:62;7932:2;7917:18;;7585:356::o;7946:380::-;8025:1;8021:12;;;;8068;;;8089:61;;8143:4;8135:6;8131:17;8121:27;;8089:61;8196:2;8188:6;8185:14;8165:18;8162:38;8159:161;;8242:10;8237:3;8233:20;8230:1;8223:31;8277:4;8274:1;8267:15;8305:4;8302:1;8295:15;8159:161;;7946:380;;;:::o;9571:413::-;9773:2;9755:21;;;9812:2;9792:18;;;9785:30;9851:34;9846:2;9831:18;;9824:62;-1:-1:-1;;;9917:2:1;9902:18;;9895:47;9974:3;9959:19;;9571:413::o;10814:127::-;10875:10;10870:3;10866:20;10863:1;10856:31;10906:4;10903:1;10896:15;10930:4;10927:1;10920:15;10946:184;11016:6;11069:2;11057:9;11048:7;11044:23;11040:32;11037:52;;;11085:1;11082;11075:12;11037:52;-1:-1:-1;11108:16:1;;10946:184;-1:-1:-1;10946:184:1:o;11135:127::-;11196:10;11191:3;11187:20;11184:1;11177:31;11227:4;11224:1;11217:15;11251:4;11248:1;11241:15;11267:135;11306:3;11327:17;;;11324:43;;11347:18;;:::i;:::-;-1:-1:-1;11394:1:1;11383:13;;11267:135::o;11407:251::-;11477:6;11530:2;11518:9;11509:7;11505:23;11501:32;11498:52;;;11546:1;11543;11536:12;11498:52;11578:9;11572:16;11597:31;11622:5;11597:31;:::i;11663:908::-;11897:4;11945:3;11934:9;11930:19;11976:6;11965:9;11958:25;12002:2;12040:3;12035:2;12024:9;12020:18;12013:31;12064:6;12099;12093:13;12130:6;12122;12115:22;12168:3;12157:9;12153:19;12146:26;;12207:2;12199:6;12195:15;12181:29;;12228:1;12238:195;12252:6;12249:1;12246:13;12238:195;;;12317:13;;-1:-1:-1;;;;;12313:39:1;12301:52;;12408:15;;;;12373:12;;;;12349:1;12267:9;12238:195;;;-1:-1:-1;;;;;;;12489:32:1;;;;12484:2;12469:18;;12462:60;-1:-1:-1;;;12553:2:1;12538:18;12531:34;12450:3;11663:908;-1:-1:-1;;11663:908:1:o;12855:245::-;12922:6;12975:2;12963:9;12954:7;12950:23;12946:32;12943:52;;;12991:1;12988;12981:12;12943:52;13023:9;13017:16;13042:28;13064:5;13042:28;:::i;13231:545::-;13333:2;13328:3;13325:11;13322:448;;;13369:1;13394:5;13390:2;13383:17;13439:4;13435:2;13425:19;13509:2;13497:10;13493:19;13490:1;13486:27;13480:4;13476:38;13545:4;13533:10;13530:20;13527:47;;;-1:-1:-1;13568:4:1;13527:47;13623:2;13618:3;13614:12;13611:1;13607:20;13601:4;13597:31;13587:41;;13678:82;13696:2;13689:5;13686:13;13678:82;;;13741:17;;;13722:1;13711:13;13678:82;;;13682:3;;;13231:545;;;:::o;13952:1352::-;14078:3;14072:10;14105:18;14097:6;14094:30;14091:56;;;14127:18;;:::i;:::-;14156:97;14246:6;14206:38;14238:4;14232:11;14206:38;:::i;:::-;14200:4;14156:97;:::i;:::-;14308:4;;14372:2;14361:14;;14389:1;14384:663;;;;15091:1;15108:6;15105:89;;;-1:-1:-1;15160:19:1;;;15154:26;15105:89;-1:-1:-1;;13909:1:1;13905:11;;;13901:24;13897:29;13887:40;13933:1;13929:11;;;13884:57;15207:81;;14354:944;;14384:663;13178:1;13171:14;;;13215:4;13202:18;;-1:-1:-1;;14420:20:1;;;14538:236;14552:7;14549:1;14546:14;14538:236;;;14641:19;;;14635:26;14620:42;;14733:27;;;;14701:1;14689:14;;;;14568:19;;14538:236;;;14542:3;14802:6;14793:7;14790:19;14787:201;;;14863:19;;;14857:26;-1:-1:-1;;14946:1:1;14942:14;;;14958:3;14938:24;14934:37;14930:42;14915:58;14900:74;;14787:201;-1:-1:-1;;;;;15034:1:1;15018:14;;;15014:22;15001:36;;-1:-1:-1;13952:1352:1:o;15719:401::-;15921:2;15903:21;;;15960:2;15940:18;;;15933:30;15999:34;15994:2;15979:18;;15972:62;-1:-1:-1;;;16065:2:1;16050:18;;16043:35;16110:3;16095:19;;15719:401::o;16125:403::-;16327:2;16309:21;;;16366:2;16346:18;;;16339:30;16405:34;16400:2;16385:18;;16378:62;-1:-1:-1;;;16471:2:1;16456:18;;16449:37;16518:3;16503:19;;16125:403::o;16533:404::-;16735:2;16717:21;;;16774:2;16754:18;;;16747:30;16813:34;16808:2;16793:18;;16786:62;-1:-1:-1;;;16879:2:1;16864:18;;16857:38;16927:3;16912:19;;16533:404::o;16942:400::-;17144:2;17126:21;;;17183:2;17163:18;;;17156:30;17222:34;17217:2;17202:18;;17195:62;-1:-1:-1;;;17288:2:1;17273:18;;17266:34;17332:3;17317:19;;16942:400::o;17347:168::-;17420:9;;;17451;;17468:15;;;17462:22;;17448:37;17438:71;;17489:18;;:::i;18290:127::-;18351:10;18346:3;18342:20;18339:1;18332:31;18382:4;18379:1;18372:15;18406:4;18403:1;18396:15;18422:120;18462:1;18488;18478:35;;18493:18;;:::i;:::-;-1:-1:-1;18527:9:1;;18422:120::o;20073:1256::-;20297:3;20335:6;20329:13;20361:4;20374:64;20431:6;20426:3;20421:2;20413:6;20409:15;20374:64;:::i;:::-;20501:13;;20460:16;;;;20523:68;20501:13;20460:16;20558:15;;;20523:68;:::i;:::-;20680:13;;20613:20;;;20653:1;;20718:36;20680:13;20718:36;:::i;:::-;20773:1;20790:18;;;20817:141;;;;20972:1;20967:337;;;;20783:521;;20817:141;-1:-1:-1;;20852:24:1;;20838:39;;20929:16;;20922:24;20908:39;;20897:51;;;-1:-1:-1;20817:141:1;;20967:337;20998:6;20995:1;20988:17;21046:2;21043:1;21033:16;21071:1;21085:169;21099:8;21096:1;21093:15;21085:169;;;21181:14;;21166:13;;;21159:37;21224:16;;;;21116:10;;21085:169;;;21089:3;;21285:8;21278:5;21274:20;21267:27;;20783:521;-1:-1:-1;21320:3:1;;20073:1256;-1:-1:-1;;;;;;;;;;20073:1256:1:o;21741:128::-;21808:9;;;21829:11;;;21826:37;;;21843:18;;:::i;23102:125::-;23167:9;;;23188:10;;;23185:36;;;23201:18;;:::i;23232:112::-;23264:1;23290;23280:35;;23295:18;;:::i;:::-;-1:-1:-1;23329:9:1;;23232:112::o;23349:136::-;23388:3;23416:5;23406:39;;23425:18;;:::i;:::-;-1:-1:-1;;;23461:18:1;;23349:136::o;23490:414::-;23692:2;23674:21;;;23731:2;23711:18;;;23704:30;23770:34;23765:2;23750:18;;23743:62;-1:-1:-1;;;23836:2:1;23821:18;;23814:48;23894:3;23879:19;;23490:414::o;24226:489::-;-1:-1:-1;;;;;24495:15:1;;;24477:34;;24547:15;;24542:2;24527:18;;24520:43;24594:2;24579:18;;24572:34;;;24642:3;24637:2;24622:18;;24615:31;;;24420:4;;24663:46;;24689:19;;24681:6;24663:46;:::i;:::-;24655:54;24226:489;-1:-1:-1;;;;;;24226:489:1:o;24720:249::-;24789:6;24842:2;24830:9;24821:7;24817:23;24813:32;24810:52;;;24858:1;24855;24848:12;24810:52;24890:9;24884:16;24909:30;24933:5;24909:30;:::i;24974:127::-;25035:10;25030:3;25026:20;25023:1;25016:31;25066:4;25063:1;25056:15;25090:4;25087:1;25080:15

Swarm Source

ipfs://2a1a69626aeb609efbdffc4358d5f431cb302c638d834e754a8dffbbd8f021ba
Loading