ETH Price: $3,401.93 (-0.90%)

Token

NinjalertsLifetimeNFT ()
 

Overview

Max Total Supply

3,529

Holders

1,044

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x223db826013eaf2c46aab1cb2ae6e8b652f9dad6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NinjalertsLifetimeNFT

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

import "./ERC1155.sol";
import "./Ownable.sol";
import { MerkleProof } from "./MerkleProof.sol";


contract NinjalertsLifetimeNFT is ERC1155, Ownable {
    enum SaleStatus{STOPPED, WHITE_LIST, PUBLIC}
    using MerkleProof for bytes32[];
    SaleStatus public saleStatus;
    uint256 public tokensRemaining = 3529;
    uint256 public maxPublicMintPerTx = 5;
    uint256 public cost = 0.25 ether;
    uint256 public constant NINJALERT_NFT = 0;
    bytes32 merkleRoot1;
    bytes32 merkleRoot2;
    mapping (address => uint256) public whitelistMintCount;
    
    constructor() ERC1155("https://dknz9qml3u41j.cloudfront.net/ninjalerts/token/{id}.json") {
        saleStatus = SaleStatus.STOPPED;
    }
    
    function withdraw() public payable onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
    
    function setWhitelist(bytes32 list1Root, bytes32 list2Root) public onlyOwner {
        merkleRoot1 = list1Root;
        merkleRoot2 = list2Root;
    }
    
    function startWhitelistSale(bytes32 list1Root, bytes32 list2Root) public onlyOwner {
        setWhitelist(list1Root, list2Root);
        saleStatus = SaleStatus.WHITE_LIST;
    }
    
    function startPublicSale() public onlyOwner {
        saleStatus = SaleStatus.PUBLIC;
    }
    
    function stopMint() public onlyOwner {
        saleStatus = SaleStatus.STOPPED;
    }
    
    modifier whiteList(bytes32 merkleRoot, bytes32[] memory proof) {
        require(saleStatus == SaleStatus.WHITE_LIST, "whitelist sale currently unavailable.");
        require(proof.verify(merkleRoot, keccak256(abi.encodePacked(msg.sender))));
        _;
    }
    
    modifier mintable(uint256 amount) {
        require(amount>0,"amount must be positive integer.");
        require(msg.value >= amount * cost, "Ether insufficient.");
        require(amount <= tokensRemaining);
        _;
    }
    
    function mint(uint256 amount) internal {
        _mint(msg.sender, NINJALERT_NFT, amount, "");
        tokensRemaining -= amount; 
    }
    
    
    function whitelist1Mint(bytes32[] memory proof) public payable whiteList(merkleRoot1, proof) mintable(1) {
        require(whitelistMintCount[msg.sender] == 0, "You have already minted");
        whitelistMintCount[msg.sender] += 1;
        mint(1); 
    }
    
    function whitelist2Mint(uint256 amount, bytes32[] memory proof) public payable whiteList(merkleRoot2, proof) mintable(amount) {
        require(whitelistMintCount[msg.sender] + amount <=2, "You have already minted");
        whitelistMintCount[msg.sender] += amount;
        mint(amount);
    }
    
    function publicMint(uint256 amount) public payable mintable(amount) {
        require(saleStatus == SaleStatus.PUBLIC, "public sale currently unavailable.");
        require(amount <= maxPublicMintPerTx, "You can mint at most 20 times per transaction.");
        mint(amount);
    }
    
    function devMint(uint256 amount, address targetAddress) public onlyOwner {
        require(amount <= tokensRemaining);
        _mint(targetAddress, NINJALERT_NFT, amount, "");
        tokensRemaining -= amount;
    }
    
    function setURI(string memory uri_) public onlyOwner {
        _setURI(uri_);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 11: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 3 of 11: ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

        return array;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 11: IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

File 6 of 11: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";

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

File 7 of 11: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

File 8 of 11: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 9 of 11: MerkleProof.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"NINJALERT_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"targetAddress","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"enum NinjalertsLifetimeNFT.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"list1Root","type":"bytes32"},{"internalType":"bytes32","name":"list2Root","type":"bytes32"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"list1Root","type":"bytes32"},{"internalType":"bytes32","name":"list2Root","type":"bytes32"}],"name":"startWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMint","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":"tokensRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelist1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelist2Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052610dc9600455600580556703782dace9d900006006553480156200002757600080fd5b506040518060600160405280603f8152602001620047a7603f91396200005381620000cc60201b60201c565b506200007462000068620000e860201b60201c565b620000f060201b60201c565b6000600360146101000a81548160ff02191690836002811115620000c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550620002cb565b8060029080519060200190620000e4929190620001b6565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c49062000266565b90600052602060002090601f016020900481019282620001e8576000855562000234565b82601f106200020357805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023357825182559160200191906001019062000216565b5b50905062000243919062000247565b5090565b5b808211156200026257600081600090555060010162000248565b5090565b600060028204905060018216806200027f57607f821691505b602082108114156200029657620002956200029c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6144cc80620002db6000396000f3fe60806040526004361061019b5760003560e01c8063485c4f7e116100ec578063c8b081251161008a578063e985e9c511610064578063e985e9c514610541578063f242432a1461057e578063f2fde38b146105a7578063f9020e33146105d05761019b565b8063c8b08125146104d6578063d141843c14610501578063d55829651461052a5761019b565b8063715018a6116100c6578063715018a61461044257806382204b84146104595780638da5cb5b14610482578063a22cb465146104ad5761019b565b8063485c4f7e146103af5780634e1273f4146103da578063503ca789146104175761019b565b8063294797ee116101595780632eb2c2d6116101335780632eb2c2d6146103235780633bdf4ac61461034c5780633ccfd60b1461038957806340b5ddc2146103935761019b565b8063294797ee146102c25780632d1a12f6146102de5780632db11544146103075761019b565b8062fdd58e146101a057806301ffc9a7146101dd57806302fe53051461021a5780630c1c972a146102435780630e89341c1461025a57806313faede614610297575b600080fd5b3480156101ac57600080fd5b506101c760048036038101906101c29190612f35565b6105fb565b6040516101d49190613e36565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff919061305a565b6106c4565b6040516102119190613b7e565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c91906130ac565b6107a6565b005b34801561024f57600080fd5b5061025861082e565b005b34801561026657600080fd5b50610281600480360381019061027c91906130ed565b6108fd565b60405161028e9190613bb4565b60405180910390f35b3480156102a357600080fd5b506102ac610991565b6040516102b99190613e36565b60405180910390f35b6102dc60048036038101906102d79190613152565b610997565b005b3480156102ea57600080fd5b5061030560048036038101906103009190613116565b610c38565b005b610321600480360381019061031c91906130ed565b610cfc565b005b34801561032f57600080fd5b5061034a60048036038101906103459190612dab565b610eb2565b005b34801561035857600080fd5b50610373600480360381019061036e9190612d46565b610f53565b6040516103809190613e36565b60405180910390f35b610391610f6b565b005b6103ad60048036038101906103a89190612fdd565b611030565b005b3480156103bb57600080fd5b506103c46112c7565b6040516103d19190613e36565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612f71565b6112cc565b60405161040e9190613b25565b60405180910390f35b34801561042357600080fd5b5061042c61147d565b6040516104399190613e36565b60405180910390f35b34801561044e57600080fd5b50610457611483565b005b34801561046557600080fd5b50610480600480360381019061047b919061301e565b61150b565b005b34801561048e57600080fd5b506104976115e6565b6040516104a49190613a48565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612ef9565b611610565b005b3480156104e257600080fd5b506104eb611791565b6040516104f89190613e36565b60405180910390f35b34801561050d57600080fd5b506105286004803603810190610523919061301e565b611797565b005b34801561053657600080fd5b5061053f611825565b005b34801561054d57600080fd5b5061056860048036038101906105639190612d6f565b6118f4565b6040516105759190613b7e565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612e6a565b611988565b005b3480156105b357600080fd5b506105ce60048036038101906105c99190612d46565b611a29565b005b3480156105dc57600080fd5b506105e5611b21565b6040516105f29190613b99565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561066c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066390613c36565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079f575061079e82611b34565b5b9050919050565b6107ae611b9e565b73ffffffffffffffffffffffffffffffffffffffff166107cc6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081990613d76565b60405180910390fd5b61082b81611ba6565b50565b610836611b9e565b73ffffffffffffffffffffffffffffffffffffffff166108546115e6565b73ffffffffffffffffffffffffffffffffffffffff16146108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a190613d76565b60405180910390fd5b6002600360146101000a81548160ff021916908360028111156108f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b60606002805461090c906141c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610938906141c9565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b50505050509050919050565b60065481565b60085481600160028111156109d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600360149054906101000a900460ff166002811115610a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613c16565b60405180910390fd5b610a988233604051602001610a729190613a01565b6040516020818303038152906040528051906020012083611bc09092919063ffffffff16565b610aa157600080fd5b8360008111610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613cf6565b60405180910390fd5b60065481610af39190614056565b341015610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c90613c76565b60405180910390fd5b600454811115610b4457600080fd5b600285600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b919190614000565b1115610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613cb6565b60405180910390fd5b84600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c219190614000565b92505081905550610c3185611c9c565b5050505050565b610c40611b9e565b73ffffffffffffffffffffffffffffffffffffffff16610c5e6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90613d76565b60405180910390fd5b600454821115610cc357600080fd5b610cdf8160008460405180602001604052806000815250611cd4565b8160046000828254610cf191906140b0565b925050819055505050565b8060008111610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613cf6565b60405180910390fd5b60065481610d4e9190614056565b341015610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790613c76565b60405180910390fd5b600454811115610d9f57600080fd5b600280811115610dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600360149054906101000a900460ff166002811115610e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5790613dd6565b60405180910390fd5b600554821115610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613c96565b60405180910390fd5b610eae82611c9c565b5050565b610eba611b9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f005750610eff85610efa611b9e565b6118f4565b5b610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690613d36565b60405180910390fd5b610f4c8585858585611e6a565b5050505050565b60096020528060005260406000206000915090505481565b610f73611b9e565b73ffffffffffffffffffffffffffffffffffffffff16610f916115e6565b73ffffffffffffffffffffffffffffffffffffffff1614610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613d76565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561102d573d6000803e3d6000fd5b50565b600754816001600281111561106e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600360149054906101000a900460ff1660028111156110b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90613c16565b60405180910390fd5b611131823360405160200161110b9190613a01565b6040516020818303038152906040528051906020012083611bc09092919063ffffffff16565b61113a57600080fd5b60016000811161117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690613cf6565b60405180910390fd5b6006548161118d9190614056565b3410156111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690613c76565b60405180910390fd5b6004548111156111de57600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125790613cb6565b60405180910390fd5b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112b09190614000565b925050819055506112c16001611c9c565b50505050565b600081565b60608151835114611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613db6565b60405180910390fd5b6000835167ffffffffffffffff811115611355577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156113835781602001602082028036833780820191505090505b50905060005b84518110156114725761141c8582815181106113ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185838151811061140f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516105fb565b828281518110611455577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061146b906141fb565b9050611389565b508091505092915050565b60055481565b61148b611b9e565b73ffffffffffffffffffffffffffffffffffffffff166114a96115e6565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613d76565b60405180910390fd5b61150960006121ca565b565b611513611b9e565b73ffffffffffffffffffffffffffffffffffffffff166115316115e6565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613d76565b60405180910390fd5b6115918282611797565b6001600360146101000a81548160ff021916908360028111156115dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8173ffffffffffffffffffffffffffffffffffffffff1661162f611b9e565b73ffffffffffffffffffffffffffffffffffffffff161415611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613d96565b60405180910390fd5b8060016000611693611b9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611740611b9e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117859190613b7e565b60405180910390a35050565b60045481565b61179f611b9e565b73ffffffffffffffffffffffffffffffffffffffff166117bd6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90613d76565b60405180910390fd5b81600781905550806008819055505050565b61182d611b9e565b73ffffffffffffffffffffffffffffffffffffffff1661184b6115e6565b73ffffffffffffffffffffffffffffffffffffffff16146118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890613d76565b60405180910390fd5b6000600360146101000a81548160ff021916908360028111156118ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611990611b9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806119d657506119d5856119d0611b9e565b6118f4565b5b611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613cd6565b60405180910390fd5b611a228585858585612290565b5050505050565b611a31611b9e565b73ffffffffffffffffffffffffffffffffffffffff16611a4f6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90613d76565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613c56565b60405180910390fd5b611b1e816121ca565b50565b600360149054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060029080519060200190611bbc929190612993565b5050565b60008082905060005b8551811015611c8e576000868281518110611c0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611c4e578281604051602001611c31929190613a1c565b604051602081830303815290604052805190602001209250611c7a565b8083604051602001611c61929190613a1c565b6040516020818303038152906040528051906020012092505b508080611c86906141fb565b915050611bc9565b508381149150509392505050565b611cb83360008360405180602001604052806000815250611cd4565b8060046000828254611cca91906140b0565b9250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90613e16565b60405180910390fd5b6000611d4e611b9e565b9050611d6f81600087611d6088612512565b611d6988612512565b876125d8565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dce9190614000565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611e4c929190613e51565b60405180910390a4611e63816000878787876125e0565b5050505050565b8151835114611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613df6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590613d16565b60405180910390fd5b6000611f28611b9e565b9050611f388187878787876125d8565b60005b8451811015612135576000858281518110611f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611fc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205c90613d56565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211a9190614000565b925050819055505050508061212e906141fb565b9050611f3b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121ac929190613b47565b60405180910390a46121c28187878787876127b0565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790613d16565b60405180910390fd5b600061230a611b9e565b905061232a81878761231b88612512565b61232488612512565b876125d8565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b890613d56565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124769190614000565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516124f3929190613e51565b60405180910390a46125098288888888886125e0565b50505050505050565b60606000600167ffffffffffffffff811115612557577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125855781602001602082028036833780820191505090505b50905082816000815181106125c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b6125ff8473ffffffffffffffffffffffffffffffffffffffff16612980565b156127a8578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612645959493929190613acb565b602060405180830381600087803b15801561265f57600080fd5b505af192505050801561269057506040513d601f19601f8201168201806040525081019061268d9190613083565b60015b61271f5761269c614359565b806126a757506126e4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db9190613bb4565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271690613bd6565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d90613bf6565b60405180910390fd5b505b505050505050565b6127cf8473ffffffffffffffffffffffffffffffffffffffff16612980565b15612978578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612815959493929190613a63565b602060405180830381600087803b15801561282f57600080fd5b505af192505050801561286057506040513d601f19601f8201168201806040525081019061285d9190613083565b60015b6128ef5761286c614359565b8061287757506128b4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab9190613bb4565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e690613bd6565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613bf6565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b82805461299f906141c9565b90600052602060002090601f0160209004810192826129c15760008555612a08565b82601f106129da57805160ff1916838001178555612a08565b82800160010185558215612a08579182015b82811115612a075782518255916020019190600101906129ec565b5b509050612a159190612a19565b5090565b5b80821115612a32576000816000905550600101612a1a565b5090565b6000612a49612a4484613eab565b613e7a565b90508083825260208201905082856020860282011115612a6857600080fd5b60005b85811015612a985781612a7e8882612bf6565b845260208401935060208301925050600181019050612a6b565b5050509392505050565b6000612ab5612ab084613ed7565b613e7a565b90508083825260208201905082856020860282011115612ad457600080fd5b60005b85811015612b045781612aea8882612c9e565b845260208401935060208301925050600181019050612ad7565b5050509392505050565b6000612b21612b1c84613f03565b613e7a565b90508083825260208201905082856020860282011115612b4057600080fd5b60005b85811015612b705781612b568882612d31565b845260208401935060208301925050600181019050612b43565b5050509392505050565b6000612b8d612b8884613f2f565b613e7a565b905082815260208101848484011115612ba557600080fd5b612bb0848285614187565b509392505050565b6000612bcb612bc684613f5f565b613e7a565b905082815260208101848484011115612be357600080fd5b612bee848285614187565b509392505050565b600081359050612c0581614423565b92915050565b600082601f830112612c1c57600080fd5b8135612c2c848260208601612a36565b91505092915050565b600082601f830112612c4657600080fd5b8135612c56848260208601612aa2565b91505092915050565b600082601f830112612c7057600080fd5b8135612c80848260208601612b0e565b91505092915050565b600081359050612c988161443a565b92915050565b600081359050612cad81614451565b92915050565b600081359050612cc281614468565b92915050565b600081519050612cd781614468565b92915050565b600082601f830112612cee57600080fd5b8135612cfe848260208601612b7a565b91505092915050565b600082601f830112612d1857600080fd5b8135612d28848260208601612bb8565b91505092915050565b600081359050612d408161447f565b92915050565b600060208284031215612d5857600080fd5b6000612d6684828501612bf6565b91505092915050565b60008060408385031215612d8257600080fd5b6000612d9085828601612bf6565b9250506020612da185828601612bf6565b9150509250929050565b600080600080600060a08688031215612dc357600080fd5b6000612dd188828901612bf6565b9550506020612de288828901612bf6565b945050604086013567ffffffffffffffff811115612dff57600080fd5b612e0b88828901612c5f565b935050606086013567ffffffffffffffff811115612e2857600080fd5b612e3488828901612c5f565b925050608086013567ffffffffffffffff811115612e5157600080fd5b612e5d88828901612cdd565b9150509295509295909350565b600080600080600060a08688031215612e8257600080fd5b6000612e9088828901612bf6565b9550506020612ea188828901612bf6565b9450506040612eb288828901612d31565b9350506060612ec388828901612d31565b925050608086013567ffffffffffffffff811115612ee057600080fd5b612eec88828901612cdd565b9150509295509295909350565b60008060408385031215612f0c57600080fd5b6000612f1a85828601612bf6565b9250506020612f2b85828601612c89565b9150509250929050565b60008060408385031215612f4857600080fd5b6000612f5685828601612bf6565b9250506020612f6785828601612d31565b9150509250929050565b60008060408385031215612f8457600080fd5b600083013567ffffffffffffffff811115612f9e57600080fd5b612faa85828601612c0b565b925050602083013567ffffffffffffffff811115612fc757600080fd5b612fd385828601612c5f565b9150509250929050565b600060208284031215612fef57600080fd5b600082013567ffffffffffffffff81111561300957600080fd5b61301584828501612c35565b91505092915050565b6000806040838503121561303157600080fd5b600061303f85828601612c9e565b925050602061305085828601612c9e565b9150509250929050565b60006020828403121561306c57600080fd5b600061307a84828501612cb3565b91505092915050565b60006020828403121561309557600080fd5b60006130a384828501612cc8565b91505092915050565b6000602082840312156130be57600080fd5b600082013567ffffffffffffffff8111156130d857600080fd5b6130e484828501612d07565b91505092915050565b6000602082840312156130ff57600080fd5b600061310d84828501612d31565b91505092915050565b6000806040838503121561312957600080fd5b600061313785828601612d31565b925050602061314885828601612bf6565b9150509250929050565b6000806040838503121561316557600080fd5b600061317385828601612d31565b925050602083013567ffffffffffffffff81111561319057600080fd5b61319c85828601612c35565b9150509250929050565b60006131b283836139e3565b60208301905092915050565b6131c7816140e4565b82525050565b6131de6131d9826140e4565b614244565b82525050565b60006131ef82613f9f565b6131f98185613fcd565b935061320483613f8f565b8060005b8381101561323557815161321c88826131a6565b975061322783613fc0565b925050600181019050613208565b5085935050505092915050565b61324b816140f6565b82525050565b61326261325d82614102565b614256565b82525050565b600061327382613faa565b61327d8185613fde565b935061328d818560208601614196565b6132968161432e565b840191505092915050565b6132aa81614175565b82525050565b60006132bb82613fb5565b6132c58185613fef565b93506132d5818560208601614196565b6132de8161432e565b840191505092915050565b60006132f6603483613fef565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b600061335c602883613fef565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133c2602583613fef565b91507f77686974656c6973742073616c652063757272656e746c7920756e617661696c60008301527f61626c652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613428602b83613fef565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b600061348e602683613fef565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134f4601383613fef565b91507f457468657220696e73756666696369656e742e000000000000000000000000006000830152602082019050919050565b6000613534602e83613fef565b91507f596f752063616e206d696e74206174206d6f73742032302074696d657320706560008301527f72207472616e73616374696f6e2e0000000000000000000000000000000000006020830152604082019050919050565b600061359a601783613fef565b91507f596f75206861766520616c7265616479206d696e7465640000000000000000006000830152602082019050919050565b60006135da602983613fef565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000613640602083613fef565b91507f616d6f756e74206d75737420626520706f73697469766520696e74656765722e6000830152602082019050919050565b6000613680602583613fef565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e6603283613fef565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061374c602a83613fef565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b60006137b2602083613fef565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006137f2602983613fef565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000613858602983613fef565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b60006138be602283613fef565b91507f7075626c69632073616c652063757272656e746c7920756e617661696c61626c60008301527f652e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613924602883613fef565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b600061398a602183613fef565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6139ec8161416b565b82525050565b6139fb8161416b565b82525050565b6000613a0d82846131cd565b60148201915081905092915050565b6000613a288285613251565b602082019150613a388284613251565b6020820191508190509392505050565b6000602082019050613a5d60008301846131be565b92915050565b600060a082019050613a7860008301886131be565b613a8560208301876131be565b8181036040830152613a9781866131e4565b90508181036060830152613aab81856131e4565b90508181036080830152613abf8184613268565b90509695505050505050565b600060a082019050613ae060008301886131be565b613aed60208301876131be565b613afa60408301866139f2565b613b0760608301856139f2565b8181036080830152613b198184613268565b90509695505050505050565b60006020820190508181036000830152613b3f81846131e4565b905092915050565b60006040820190508181036000830152613b6181856131e4565b90508181036020830152613b7581846131e4565b90509392505050565b6000602082019050613b936000830184613242565b92915050565b6000602082019050613bae60008301846132a1565b92915050565b60006020820190508181036000830152613bce81846132b0565b905092915050565b60006020820190508181036000830152613bef816132e9565b9050919050565b60006020820190508181036000830152613c0f8161334f565b9050919050565b60006020820190508181036000830152613c2f816133b5565b9050919050565b60006020820190508181036000830152613c4f8161341b565b9050919050565b60006020820190508181036000830152613c6f81613481565b9050919050565b60006020820190508181036000830152613c8f816134e7565b9050919050565b60006020820190508181036000830152613caf81613527565b9050919050565b60006020820190508181036000830152613ccf8161358d565b9050919050565b60006020820190508181036000830152613cef816135cd565b9050919050565b60006020820190508181036000830152613d0f81613633565b9050919050565b60006020820190508181036000830152613d2f81613673565b9050919050565b60006020820190508181036000830152613d4f816136d9565b9050919050565b60006020820190508181036000830152613d6f8161373f565b9050919050565b60006020820190508181036000830152613d8f816137a5565b9050919050565b60006020820190508181036000830152613daf816137e5565b9050919050565b60006020820190508181036000830152613dcf8161384b565b9050919050565b60006020820190508181036000830152613def816138b1565b9050919050565b60006020820190508181036000830152613e0f81613917565b9050919050565b60006020820190508181036000830152613e2f8161397d565b9050919050565b6000602082019050613e4b60008301846139f2565b92915050565b6000604082019050613e6660008301856139f2565b613e7360208301846139f2565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715613ea157613ea06142ff565b5b8060405250919050565b600067ffffffffffffffff821115613ec657613ec56142ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef257613ef16142ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f1e57613f1d6142ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f4a57613f496142ff565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f7a57613f796142ff565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061400b8261416b565b91506140168361416b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561404b5761404a614272565b5b828201905092915050565b60006140618261416b565b915061406c8361416b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140a5576140a4614272565b5b828202905092915050565b60006140bb8261416b565b91506140c68361416b565b9250828210156140d9576140d8614272565b5b828203905092915050565b60006140ef8261414b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506141468261440f565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061418082614138565b9050919050565b82818337600083830152505050565b60005b838110156141b4578082015181840152602081019050614199565b838111156141c3576000848401525b50505050565b600060028204905060018216806141e157607f821691505b602082108114156141f5576141f46142d0565b5b50919050565b60006142068261416b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561423957614238614272565b5b600182019050919050565b600061424f82614260565b9050919050565b6000819050919050565b600061426b8261433f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156143695761440c565b60046000803e61437a60005161434c565b6308c379a0811461438b575061440c565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156143b75750505061440c565b808201805167ffffffffffffffff8111156143d657505050505061440c565b8060208301013d85018111156143f15750505050505061440c565b6143fa8261432e565b60208401016040528296505050505050505b90565b600381106144205761441f6142a1565b5b50565b61442c816140e4565b811461443757600080fd5b50565b614443816140f6565b811461444e57600080fd5b50565b61445a81614102565b811461446557600080fd5b50565b6144718161410c565b811461447c57600080fd5b50565b6144888161416b565b811461449357600080fd5b5056fea26469706673582212203f9403cb2c402fec27da222f80cf43fc11e5970ffafdab2f770ec117c41112be64736f6c6343000800003368747470733a2f2f646b6e7a39716d6c337534316a2e636c6f756466726f6e742e6e65742f6e696e6a616c657274732f746f6b656e2f7b69647d2e6a736f6e

Deployed Bytecode

0x60806040526004361061019b5760003560e01c8063485c4f7e116100ec578063c8b081251161008a578063e985e9c511610064578063e985e9c514610541578063f242432a1461057e578063f2fde38b146105a7578063f9020e33146105d05761019b565b8063c8b08125146104d6578063d141843c14610501578063d55829651461052a5761019b565b8063715018a6116100c6578063715018a61461044257806382204b84146104595780638da5cb5b14610482578063a22cb465146104ad5761019b565b8063485c4f7e146103af5780634e1273f4146103da578063503ca789146104175761019b565b8063294797ee116101595780632eb2c2d6116101335780632eb2c2d6146103235780633bdf4ac61461034c5780633ccfd60b1461038957806340b5ddc2146103935761019b565b8063294797ee146102c25780632d1a12f6146102de5780632db11544146103075761019b565b8062fdd58e146101a057806301ffc9a7146101dd57806302fe53051461021a5780630c1c972a146102435780630e89341c1461025a57806313faede614610297575b600080fd5b3480156101ac57600080fd5b506101c760048036038101906101c29190612f35565b6105fb565b6040516101d49190613e36565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff919061305a565b6106c4565b6040516102119190613b7e565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c91906130ac565b6107a6565b005b34801561024f57600080fd5b5061025861082e565b005b34801561026657600080fd5b50610281600480360381019061027c91906130ed565b6108fd565b60405161028e9190613bb4565b60405180910390f35b3480156102a357600080fd5b506102ac610991565b6040516102b99190613e36565b60405180910390f35b6102dc60048036038101906102d79190613152565b610997565b005b3480156102ea57600080fd5b5061030560048036038101906103009190613116565b610c38565b005b610321600480360381019061031c91906130ed565b610cfc565b005b34801561032f57600080fd5b5061034a60048036038101906103459190612dab565b610eb2565b005b34801561035857600080fd5b50610373600480360381019061036e9190612d46565b610f53565b6040516103809190613e36565b60405180910390f35b610391610f6b565b005b6103ad60048036038101906103a89190612fdd565b611030565b005b3480156103bb57600080fd5b506103c46112c7565b6040516103d19190613e36565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612f71565b6112cc565b60405161040e9190613b25565b60405180910390f35b34801561042357600080fd5b5061042c61147d565b6040516104399190613e36565b60405180910390f35b34801561044e57600080fd5b50610457611483565b005b34801561046557600080fd5b50610480600480360381019061047b919061301e565b61150b565b005b34801561048e57600080fd5b506104976115e6565b6040516104a49190613a48565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190612ef9565b611610565b005b3480156104e257600080fd5b506104eb611791565b6040516104f89190613e36565b60405180910390f35b34801561050d57600080fd5b506105286004803603810190610523919061301e565b611797565b005b34801561053657600080fd5b5061053f611825565b005b34801561054d57600080fd5b5061056860048036038101906105639190612d6f565b6118f4565b6040516105759190613b7e565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612e6a565b611988565b005b3480156105b357600080fd5b506105ce60048036038101906105c99190612d46565b611a29565b005b3480156105dc57600080fd5b506105e5611b21565b6040516105f29190613b99565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561066c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066390613c36565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079f575061079e82611b34565b5b9050919050565b6107ae611b9e565b73ffffffffffffffffffffffffffffffffffffffff166107cc6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081990613d76565b60405180910390fd5b61082b81611ba6565b50565b610836611b9e565b73ffffffffffffffffffffffffffffffffffffffff166108546115e6565b73ffffffffffffffffffffffffffffffffffffffff16146108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a190613d76565b60405180910390fd5b6002600360146101000a81548160ff021916908360028111156108f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b60606002805461090c906141c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610938906141c9565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b50505050509050919050565b60065481565b60085481600160028111156109d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600360149054906101000a900460ff166002811115610a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613c16565b60405180910390fd5b610a988233604051602001610a729190613a01565b6040516020818303038152906040528051906020012083611bc09092919063ffffffff16565b610aa157600080fd5b8360008111610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90613cf6565b60405180910390fd5b60065481610af39190614056565b341015610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c90613c76565b60405180910390fd5b600454811115610b4457600080fd5b600285600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b919190614000565b1115610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613cb6565b60405180910390fd5b84600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c219190614000565b92505081905550610c3185611c9c565b5050505050565b610c40611b9e565b73ffffffffffffffffffffffffffffffffffffffff16610c5e6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90613d76565b60405180910390fd5b600454821115610cc357600080fd5b610cdf8160008460405180602001604052806000815250611cd4565b8160046000828254610cf191906140b0565b925050819055505050565b8060008111610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790613cf6565b60405180910390fd5b60065481610d4e9190614056565b341015610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790613c76565b60405180910390fd5b600454811115610d9f57600080fd5b600280811115610dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600360149054906101000a900460ff166002811115610e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5790613dd6565b60405180910390fd5b600554821115610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613c96565b60405180910390fd5b610eae82611c9c565b5050565b610eba611b9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f005750610eff85610efa611b9e565b6118f4565b5b610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690613d36565b60405180910390fd5b610f4c8585858585611e6a565b5050505050565b60096020528060005260406000206000915090505481565b610f73611b9e565b73ffffffffffffffffffffffffffffffffffffffff16610f916115e6565b73ffffffffffffffffffffffffffffffffffffffff1614610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613d76565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561102d573d6000803e3d6000fd5b50565b600754816001600281111561106e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600360149054906101000a900460ff1660028111156110b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90613c16565b60405180910390fd5b611131823360405160200161110b9190613a01565b6040516020818303038152906040528051906020012083611bc09092919063ffffffff16565b61113a57600080fd5b60016000811161117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690613cf6565b60405180910390fd5b6006548161118d9190614056565b3410156111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690613c76565b60405180910390fd5b6004548111156111de57600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125790613cb6565b60405180910390fd5b6001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112b09190614000565b925050819055506112c16001611c9c565b50505050565b600081565b60608151835114611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613db6565b60405180910390fd5b6000835167ffffffffffffffff811115611355577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156113835781602001602082028036833780820191505090505b50905060005b84518110156114725761141c8582815181106113ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185838151811061140f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516105fb565b828281518110611455577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061146b906141fb565b9050611389565b508091505092915050565b60055481565b61148b611b9e565b73ffffffffffffffffffffffffffffffffffffffff166114a96115e6565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613d76565b60405180910390fd5b61150960006121ca565b565b611513611b9e565b73ffffffffffffffffffffffffffffffffffffffff166115316115e6565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613d76565b60405180910390fd5b6115918282611797565b6001600360146101000a81548160ff021916908360028111156115dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8173ffffffffffffffffffffffffffffffffffffffff1661162f611b9e565b73ffffffffffffffffffffffffffffffffffffffff161415611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613d96565b60405180910390fd5b8060016000611693611b9e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611740611b9e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117859190613b7e565b60405180910390a35050565b60045481565b61179f611b9e565b73ffffffffffffffffffffffffffffffffffffffff166117bd6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90613d76565b60405180910390fd5b81600781905550806008819055505050565b61182d611b9e565b73ffffffffffffffffffffffffffffffffffffffff1661184b6115e6565b73ffffffffffffffffffffffffffffffffffffffff16146118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890613d76565b60405180910390fd5b6000600360146101000a81548160ff021916908360028111156118ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b0217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611990611b9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806119d657506119d5856119d0611b9e565b6118f4565b5b611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613cd6565b60405180910390fd5b611a228585858585612290565b5050505050565b611a31611b9e565b73ffffffffffffffffffffffffffffffffffffffff16611a4f6115e6565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90613d76565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613c56565b60405180910390fd5b611b1e816121ca565b50565b600360149054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060029080519060200190611bbc929190612993565b5050565b60008082905060005b8551811015611c8e576000868281518110611c0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611c4e578281604051602001611c31929190613a1c565b604051602081830303815290604052805190602001209250611c7a565b8083604051602001611c61929190613a1c565b6040516020818303038152906040528051906020012092505b508080611c86906141fb565b915050611bc9565b508381149150509392505050565b611cb83360008360405180602001604052806000815250611cd4565b8060046000828254611cca91906140b0565b9250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90613e16565b60405180910390fd5b6000611d4e611b9e565b9050611d6f81600087611d6088612512565b611d6988612512565b876125d8565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dce9190614000565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611e4c929190613e51565b60405180910390a4611e63816000878787876125e0565b5050505050565b8151835114611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613df6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590613d16565b60405180910390fd5b6000611f28611b9e565b9050611f388187878787876125d8565b60005b8451811015612135576000858281518110611f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611fc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205c90613d56565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211a9190614000565b925050819055505050508061212e906141fb565b9050611f3b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121ac929190613b47565b60405180910390a46121c28187878787876127b0565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790613d16565b60405180910390fd5b600061230a611b9e565b905061232a81878761231b88612512565b61232488612512565b876125d8565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b890613d56565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124769190614000565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516124f3929190613e51565b60405180910390a46125098288888888886125e0565b50505050505050565b60606000600167ffffffffffffffff811115612557577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125855781602001602082028036833780820191505090505b50905082816000815181106125c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b6125ff8473ffffffffffffffffffffffffffffffffffffffff16612980565b156127a8578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612645959493929190613acb565b602060405180830381600087803b15801561265f57600080fd5b505af192505050801561269057506040513d601f19601f8201168201806040525081019061268d9190613083565b60015b61271f5761269c614359565b806126a757506126e4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db9190613bb4565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271690613bd6565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d90613bf6565b60405180910390fd5b505b505050505050565b6127cf8473ffffffffffffffffffffffffffffffffffffffff16612980565b15612978578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612815959493929190613a63565b602060405180830381600087803b15801561282f57600080fd5b505af192505050801561286057506040513d601f19601f8201168201806040525081019061285d9190613083565b60015b6128ef5761286c614359565b8061287757506128b4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab9190613bb4565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e690613bd6565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613bf6565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b82805461299f906141c9565b90600052602060002090601f0160209004810192826129c15760008555612a08565b82601f106129da57805160ff1916838001178555612a08565b82800160010185558215612a08579182015b82811115612a075782518255916020019190600101906129ec565b5b509050612a159190612a19565b5090565b5b80821115612a32576000816000905550600101612a1a565b5090565b6000612a49612a4484613eab565b613e7a565b90508083825260208201905082856020860282011115612a6857600080fd5b60005b85811015612a985781612a7e8882612bf6565b845260208401935060208301925050600181019050612a6b565b5050509392505050565b6000612ab5612ab084613ed7565b613e7a565b90508083825260208201905082856020860282011115612ad457600080fd5b60005b85811015612b045781612aea8882612c9e565b845260208401935060208301925050600181019050612ad7565b5050509392505050565b6000612b21612b1c84613f03565b613e7a565b90508083825260208201905082856020860282011115612b4057600080fd5b60005b85811015612b705781612b568882612d31565b845260208401935060208301925050600181019050612b43565b5050509392505050565b6000612b8d612b8884613f2f565b613e7a565b905082815260208101848484011115612ba557600080fd5b612bb0848285614187565b509392505050565b6000612bcb612bc684613f5f565b613e7a565b905082815260208101848484011115612be357600080fd5b612bee848285614187565b509392505050565b600081359050612c0581614423565b92915050565b600082601f830112612c1c57600080fd5b8135612c2c848260208601612a36565b91505092915050565b600082601f830112612c4657600080fd5b8135612c56848260208601612aa2565b91505092915050565b600082601f830112612c7057600080fd5b8135612c80848260208601612b0e565b91505092915050565b600081359050612c988161443a565b92915050565b600081359050612cad81614451565b92915050565b600081359050612cc281614468565b92915050565b600081519050612cd781614468565b92915050565b600082601f830112612cee57600080fd5b8135612cfe848260208601612b7a565b91505092915050565b600082601f830112612d1857600080fd5b8135612d28848260208601612bb8565b91505092915050565b600081359050612d408161447f565b92915050565b600060208284031215612d5857600080fd5b6000612d6684828501612bf6565b91505092915050565b60008060408385031215612d8257600080fd5b6000612d9085828601612bf6565b9250506020612da185828601612bf6565b9150509250929050565b600080600080600060a08688031215612dc357600080fd5b6000612dd188828901612bf6565b9550506020612de288828901612bf6565b945050604086013567ffffffffffffffff811115612dff57600080fd5b612e0b88828901612c5f565b935050606086013567ffffffffffffffff811115612e2857600080fd5b612e3488828901612c5f565b925050608086013567ffffffffffffffff811115612e5157600080fd5b612e5d88828901612cdd565b9150509295509295909350565b600080600080600060a08688031215612e8257600080fd5b6000612e9088828901612bf6565b9550506020612ea188828901612bf6565b9450506040612eb288828901612d31565b9350506060612ec388828901612d31565b925050608086013567ffffffffffffffff811115612ee057600080fd5b612eec88828901612cdd565b9150509295509295909350565b60008060408385031215612f0c57600080fd5b6000612f1a85828601612bf6565b9250506020612f2b85828601612c89565b9150509250929050565b60008060408385031215612f4857600080fd5b6000612f5685828601612bf6565b9250506020612f6785828601612d31565b9150509250929050565b60008060408385031215612f8457600080fd5b600083013567ffffffffffffffff811115612f9e57600080fd5b612faa85828601612c0b565b925050602083013567ffffffffffffffff811115612fc757600080fd5b612fd385828601612c5f565b9150509250929050565b600060208284031215612fef57600080fd5b600082013567ffffffffffffffff81111561300957600080fd5b61301584828501612c35565b91505092915050565b6000806040838503121561303157600080fd5b600061303f85828601612c9e565b925050602061305085828601612c9e565b9150509250929050565b60006020828403121561306c57600080fd5b600061307a84828501612cb3565b91505092915050565b60006020828403121561309557600080fd5b60006130a384828501612cc8565b91505092915050565b6000602082840312156130be57600080fd5b600082013567ffffffffffffffff8111156130d857600080fd5b6130e484828501612d07565b91505092915050565b6000602082840312156130ff57600080fd5b600061310d84828501612d31565b91505092915050565b6000806040838503121561312957600080fd5b600061313785828601612d31565b925050602061314885828601612bf6565b9150509250929050565b6000806040838503121561316557600080fd5b600061317385828601612d31565b925050602083013567ffffffffffffffff81111561319057600080fd5b61319c85828601612c35565b9150509250929050565b60006131b283836139e3565b60208301905092915050565b6131c7816140e4565b82525050565b6131de6131d9826140e4565b614244565b82525050565b60006131ef82613f9f565b6131f98185613fcd565b935061320483613f8f565b8060005b8381101561323557815161321c88826131a6565b975061322783613fc0565b925050600181019050613208565b5085935050505092915050565b61324b816140f6565b82525050565b61326261325d82614102565b614256565b82525050565b600061327382613faa565b61327d8185613fde565b935061328d818560208601614196565b6132968161432e565b840191505092915050565b6132aa81614175565b82525050565b60006132bb82613fb5565b6132c58185613fef565b93506132d5818560208601614196565b6132de8161432e565b840191505092915050565b60006132f6603483613fef565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b600061335c602883613fef565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133c2602583613fef565b91507f77686974656c6973742073616c652063757272656e746c7920756e617661696c60008301527f61626c652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613428602b83613fef565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b600061348e602683613fef565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134f4601383613fef565b91507f457468657220696e73756666696369656e742e000000000000000000000000006000830152602082019050919050565b6000613534602e83613fef565b91507f596f752063616e206d696e74206174206d6f73742032302074696d657320706560008301527f72207472616e73616374696f6e2e0000000000000000000000000000000000006020830152604082019050919050565b600061359a601783613fef565b91507f596f75206861766520616c7265616479206d696e7465640000000000000000006000830152602082019050919050565b60006135da602983613fef565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000613640602083613fef565b91507f616d6f756e74206d75737420626520706f73697469766520696e74656765722e6000830152602082019050919050565b6000613680602583613fef565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e6603283613fef565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061374c602a83613fef565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b60006137b2602083613fef565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006137f2602983613fef565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000613858602983613fef565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b60006138be602283613fef565b91507f7075626c69632073616c652063757272656e746c7920756e617661696c61626c60008301527f652e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613924602883613fef565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b600061398a602183613fef565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6139ec8161416b565b82525050565b6139fb8161416b565b82525050565b6000613a0d82846131cd565b60148201915081905092915050565b6000613a288285613251565b602082019150613a388284613251565b6020820191508190509392505050565b6000602082019050613a5d60008301846131be565b92915050565b600060a082019050613a7860008301886131be565b613a8560208301876131be565b8181036040830152613a9781866131e4565b90508181036060830152613aab81856131e4565b90508181036080830152613abf8184613268565b90509695505050505050565b600060a082019050613ae060008301886131be565b613aed60208301876131be565b613afa60408301866139f2565b613b0760608301856139f2565b8181036080830152613b198184613268565b90509695505050505050565b60006020820190508181036000830152613b3f81846131e4565b905092915050565b60006040820190508181036000830152613b6181856131e4565b90508181036020830152613b7581846131e4565b90509392505050565b6000602082019050613b936000830184613242565b92915050565b6000602082019050613bae60008301846132a1565b92915050565b60006020820190508181036000830152613bce81846132b0565b905092915050565b60006020820190508181036000830152613bef816132e9565b9050919050565b60006020820190508181036000830152613c0f8161334f565b9050919050565b60006020820190508181036000830152613c2f816133b5565b9050919050565b60006020820190508181036000830152613c4f8161341b565b9050919050565b60006020820190508181036000830152613c6f81613481565b9050919050565b60006020820190508181036000830152613c8f816134e7565b9050919050565b60006020820190508181036000830152613caf81613527565b9050919050565b60006020820190508181036000830152613ccf8161358d565b9050919050565b60006020820190508181036000830152613cef816135cd565b9050919050565b60006020820190508181036000830152613d0f81613633565b9050919050565b60006020820190508181036000830152613d2f81613673565b9050919050565b60006020820190508181036000830152613d4f816136d9565b9050919050565b60006020820190508181036000830152613d6f8161373f565b9050919050565b60006020820190508181036000830152613d8f816137a5565b9050919050565b60006020820190508181036000830152613daf816137e5565b9050919050565b60006020820190508181036000830152613dcf8161384b565b9050919050565b60006020820190508181036000830152613def816138b1565b9050919050565b60006020820190508181036000830152613e0f81613917565b9050919050565b60006020820190508181036000830152613e2f8161397d565b9050919050565b6000602082019050613e4b60008301846139f2565b92915050565b6000604082019050613e6660008301856139f2565b613e7360208301846139f2565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715613ea157613ea06142ff565b5b8060405250919050565b600067ffffffffffffffff821115613ec657613ec56142ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef257613ef16142ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f1e57613f1d6142ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f4a57613f496142ff565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f7a57613f796142ff565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061400b8261416b565b91506140168361416b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561404b5761404a614272565b5b828201905092915050565b60006140618261416b565b915061406c8361416b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140a5576140a4614272565b5b828202905092915050565b60006140bb8261416b565b91506140c68361416b565b9250828210156140d9576140d8614272565b5b828203905092915050565b60006140ef8261414b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506141468261440f565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061418082614138565b9050919050565b82818337600083830152505050565b60005b838110156141b4578082015181840152602081019050614199565b838111156141c3576000848401525b50505050565b600060028204905060018216806141e157607f821691505b602082108114156141f5576141f46142d0565b5b50919050565b60006142068261416b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561423957614238614272565b5b600182019050919050565b600061424f82614260565b9050919050565b6000819050919050565b600061426b8261433f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156143695761440c565b60046000803e61437a60005161434c565b6308c379a0811461438b575061440c565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156143b75750505061440c565b808201805167ffffffffffffffff8111156143d657505050505061440c565b8060208301013d85018111156143f15750505050505061440c565b6143fa8261432e565b60208401016040528296505050505050505b90565b600381106144205761441f6142a1565b5b50565b61442c816140e4565b811461443757600080fd5b50565b614443816140f6565b811461444e57600080fd5b50565b61445a81614102565b811461446557600080fd5b50565b6144718161410c565b811461447c57600080fd5b50565b6144888161416b565b811461449357600080fd5b5056fea26469706673582212203f9403cb2c402fec27da222f80cf43fc11e5970ffafdab2f770ec117c41112be64736f6c63430008000033

Deployed Bytecode Sourcemap

156:3107:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2054:228:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1105:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3178:83:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1237:91;;;;;;;;;;;;;:::i;:::-;;1809:103:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;419:32:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2356:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2952:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2660:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4082:430:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;554:54:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;766:113;;;:::i;:::-;;2090:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;457:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2439:508:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;376:37:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1607:101:10;;;;;;;;;;;;;:::i;:::-;;1049:178:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;975:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3015:306:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;333:37:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;889:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1338:85;;;;;;;;;;;;;:::i;:::-;;3388:166:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3621:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1857:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;299:28:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2054:228:2;2140:7;2186:1;2167:21;;:7;:21;;;;2159:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2253:9;:13;2263:2;2253:13;;;;;;;;;;;:22;2267:7;2253:22;;;;;;;;;;;;;;;;2246:29;;2054:228;;;;:::o;1105:305::-;1207:4;1257:26;1242:41;;;:11;:41;;;;:109;;;;1314:37;1299:52;;;:11;:52;;;;1242:109;:161;;;;1367:36;1391:11;1367:23;:36::i;:::-;1242:161;1223:180;;1105:305;;;:::o;3178:83:9:-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3241:13:9::1;3249:4;3241:7;:13::i;:::-;3178:83:::0;:::o;1237:91::-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1304:17:9::1;1291:10;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1237:91::o:0;1809:103:2:-;1869:13;1901:4;1894:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1809:103;;;:::o;419:32:9:-;;;;:::o;2356:294::-;2445:11;;2458:5;1528:21;1514:35;;;;;;;;;;;;;;;;:10;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;1506:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1609:65;1622:10;1661;1644:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;1634:39;;;;;;1609:5;:12;;:65;;;;;:::i;:::-;1601:74;;;;;;2474:6:::1;1762:1;1755:6;:8;1747:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1839:4;;1830:6;:13;;;;:::i;:::-;1817:9;:26;;1809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1895:15;;1885:6;:25;;1877:34;;;::::0;::::1;;2542:1:::2;2533:6;2500:18;:30;2519:10;2500:30;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:43;;2492:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;2615:6;2581:18;:30;2600:10;2581:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;2631:12;2636:6;2631:4;:12::i;:::-;1685:1:::1;2356:294:::0;;;;:::o;2952:216::-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3053:15:9::1;;3043:6;:25;;3035:34;;;::::0;::::1;;3079:47;3085:13;497:1;3115:6;3079:47;;;;;;;;;;;::::0;:5:::1;:47::i;:::-;3155:6;3136:15;;:25;;;;;;;:::i;:::-;;;;;;;;2952:216:::0;;:::o;2660:282::-;2720:6;1762:1;1755:6;:8;1747:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1839:4;;1830:6;:13;;;;:::i;:::-;1817:9;:26;;1809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1895:15;;1885:6;:25;;1877:34;;;;;;2760:17:::1;2746:31:::0;::::1;;;;;;;;;;;;;;;:10;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;2738:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2844:18;;2834:6;:28;;2826:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:12;2928:6;2923:4;:12::i;:::-;2660:282:::0;;:::o;4082:430:2:-;4315:12;:10;:12::i;:::-;4307:20;;:4;:20;;;:60;;;;4331:36;4348:4;4354:12;:10;:12::i;:::-;4331:16;:36::i;:::-;4307:60;4286:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;4453:52;4476:4;4482:2;4486:3;4491:7;4500:4;4453:22;:52::i;:::-;4082:430;;;;;:::o;554:54:9:-;;;;;;;;;;;;;;;;;:::o;766:113::-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;829:10:9::1;821:28;;:51;850:21;821:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;766:113::o:0;2090:256::-;2163:11;;2176:5;1528:21;1514:35;;;;;;;;;;;;;;;;:10;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;1506:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1609:65;1622:10;1661;1644:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;1634:39;;;;;;1609:5;:12;;:65;;;;;:::i;:::-;1601:74;;;;;;2192:1:::1;1762;1755:6;:8;1747:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1839:4;;1830:6;:13;;;;:::i;:::-;1817:9;:26;;1809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1895:15;;1885:6;:25;;1877:34;;;::::0;::::1;;2247:1:::2;2213:18;:30;2232:10;2213:30;;;;;;;;;;;;;;;;:35;2205:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2320:1;2286:18;:30;2305:10;2286:30;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;2331:7;2336:1;2331:4;:7::i;:::-;1685:1:::1;2090:256:::0;;;:::o;457:41::-;497:1;457:41;:::o;2439:508:2:-;2590:16;2649:3;:10;2630:8;:15;:29;2622:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2716:30;2763:8;:15;2749:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2716:63;;2795:9;2790:120;2814:8;:15;2810:1;:19;2790:120;;;2869:30;2879:8;2888:1;2879:11;;;;;;;;;;;;;;;;;;;;;;2892:3;2896:1;2892:6;;;;;;;;;;;;;;;;;;;;;;2869:9;:30::i;:::-;2850:13;2864:1;2850:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;2831:3;;;;:::i;:::-;;;2790:120;;;;2927:13;2920:20;;;2439:508;;;;:::o;376:37:9:-;;;;:::o;1607:101:10:-;1198:12;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1671:30:::1;1698:1;1671:18;:30::i;:::-;1607:101::o:0;1049:178:9:-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1142:34:9::1;1155:9;1166;1142:12;:34::i;:::-;1199:21;1186:10;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1049:178:::0;;:::o;975:85:10:-;1021:7;1047:6;;;;;;;;;;;1040:13;;975:85;:::o;3015:306:2:-;3133:8;3117:24;;:12;:10;:12::i;:::-;:24;;;;3109:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3243:8;3198:18;:32;3217:12;:10;:12::i;:::-;3198:32;;;;;;;;;;;;;;;:42;3231:8;3198:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;3295:8;3266:48;;3281:12;:10;:12::i;:::-;3266:48;;;3305:8;3266:48;;;;;;:::i;:::-;;;;;;;;3015:306;;:::o;333:37:9:-;;;;:::o;889:150::-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;990:9:9::1;976:11;:23;;;;1023:9;1009:11;:23;;;;889:150:::0;;:::o;1338:85::-;1198:12:10;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1398:18:9::1;1385:10;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1338:85::o:0;3388:166:2:-;3487:4;3510:18;:27;3529:7;3510:27;;;;;;;;;;;;;;;:37;3538:8;3510:37;;;;;;;;;;;;;;;;;;;;;;;;;3503:44;;3388:166;;;;:::o;3621:389::-;3829:12;:10;:12::i;:::-;3821:20;;:4;:20;;;:60;;;;3845:36;3862:4;3868:12;:10;:12::i;:::-;3845:16;:36::i;:::-;3821:60;3800:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;3958:45;3976:4;3982:2;3986;3990:6;3998:4;3958:17;:45::i;:::-;3621:389;;;;;:::o;1857:198:10:-;1198:12;:10;:12::i;:::-;1187:23;;:7;:5;:7::i;:::-;:23;;;1179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1965:1:::1;1945:22;;:8;:22;;;;1937:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2020:28;2039:8;2020:18;:28::i;:::-;1857:198:::0;:::o;299:28:9:-;;;;;;;;;;;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;7973:86:2:-;8046:6;8039:4;:13;;;;;;;;;;;;:::i;:::-;;7973:86;:::o;777:809:8:-;898:4;914:20;937:4;914:27;;957:9;952:515;976:5;:12;972:1;:16;952:515;;;1009:20;1032:5;1038:1;1032:8;;;;;;;;;;;;;;;;;;;;;;1009:31;;1075:12;1059;:28;1055:402;;1227:12;1241;1210:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1200:55;;;;;;1185:70;;1055:402;;;1414:12;1428;1397:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1387:55;;;;;;1372:70;;1055:402;952:515;990:3;;;;;:::i;:::-;;;;952:515;;;;1575:4;1559:12;:20;1552:27;;;777:809;;;;;:::o;1939:136:9:-;1988:44;1994:10;497:1;2021:6;1988:44;;;;;;;;;;;;:5;:44::i;:::-;2061:6;2042:15;;:25;;;;;;;:::i;:::-;;;;;;;;1939:136;:::o;8447:583:2:-;8618:1;8599:21;;:7;:21;;;;8591:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8669:16;8688:12;:10;:12::i;:::-;8669:31;;8711:107;8732:8;8750:1;8754:7;8763:21;8781:2;8763:17;:21::i;:::-;8786:25;8804:6;8786:17;:25::i;:::-;8813:4;8711:20;:107::i;:::-;8855:6;8829:9;:13;8839:2;8829:13;;;;;;;;;;;:22;8843:7;8829:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;8913:7;8876:57;;8909:1;8876:57;;8891:8;8876:57;;;8922:2;8926:6;8876:57;;;;;;;:::i;:::-;;;;;;;;8944:79;8975:8;8993:1;8997:7;9006:2;9010:6;9018:4;8944:30;:79::i;:::-;8447:583;;;;;:::o;6105:1045::-;6325:7;:14;6311:3;:10;:28;6303:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6416:1;6402:16;;:2;:16;;;;6394:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6471:16;6490:12;:10;:12::i;:::-;6471:31;;6513:60;6534:8;6544:4;6550:2;6554:3;6559:7;6568:4;6513:20;:60::i;:::-;6589:9;6584:411;6608:3;:10;6604:1;:14;6584:411;;;6639:10;6652:3;6656:1;6652:6;;;;;;;;;;;;;;;;;;;;;;6639:19;;6672:14;6689:7;6697:1;6689:10;;;;;;;;;;;;;;;;;;;;;;6672:27;;6714:19;6736:9;:13;6746:2;6736:13;;;;;;;;;;;:19;6750:4;6736:19;;;;;;;;;;;;;;;;6714:41;;6792:6;6777:11;:21;;6769:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6923:6;6909:11;:20;6887:9;:13;6897:2;6887:13;;;;;;;;;;;:19;6901:4;6887:19;;;;;;;;;;;;;;;:42;;;;6978:6;6957:9;:13;6967:2;6957:13;;;;;;;;;;;:17;6971:2;6957:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6584:411;;;6620:3;;;;:::i;:::-;;;6584:411;;;;7040:2;7010:47;;7034:4;7010:47;;7024:8;7010:47;;;7044:3;7049:7;7010:47;;;;;;;:::i;:::-;;;;;;;;7068:75;7104:8;7114:4;7120:2;7124:3;7129:7;7138:4;7068:35;:75::i;:::-;6105:1045;;;;;;:::o;2209:187:10:-;2282:16;2301:6;;;;;;;;;;;2282:25;;2326:8;2317:6;;:17;;;;;;;;;;;;;;;;;;2380:8;2349:40;;2370:8;2349:40;;;;;;;;;;;;2209:187;;:::o;4962:797:2:-;5157:1;5143:16;;:2;:16;;;;5135:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5212:16;5231:12;:10;:12::i;:::-;5212:31;;5254:96;5275:8;5285:4;5291:2;5295:21;5313:2;5295:17;:21::i;:::-;5318:25;5336:6;5318:17;:25::i;:::-;5345:4;5254:20;:96::i;:::-;5361:19;5383:9;:13;5393:2;5383:13;;;;;;;;;;;:19;5397:4;5383:19;;;;;;;;;;;;;;;;5361:41;;5435:6;5420:11;:21;;5412:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5558:6;5544:11;:20;5522:9;:13;5532:2;5522:13;;;;;;;;;;;:19;5536:4;5522:19;;;;;;;;;;;;;;;:42;;;;5605:6;5584:9;:13;5594:2;5584:13;;;;;;;;;;;:17;5598:2;5584:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5658:2;5627:46;;5652:4;5627:46;;5642:8;5627:46;;;5662:2;5666:6;5627:46;;;;;;;:::i;:::-;;;;;;;;5684:68;5715:8;5725:4;5731:2;5735;5739:6;5747:4;5684:30;:68::i;:::-;4962:797;;;;;;;:::o;14767:193::-;14833:16;14861:22;14900:1;14886:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14861:41;;14923:7;14912:5;14918:1;14912:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;14948:5;14941:12;;;14767:193;;;:::o;13018:214::-;;;;;;;:::o;13238:725::-;13445:15;:2;:13;;;:15::i;:::-;13441:516;;;13497:2;13480:38;;;13519:8;13529:4;13535:2;13539:6;13547:4;13480:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13476:471;;;;:::i;:::-;;;;;;;;13823:6;13816:14;;;;;;;;;;;:::i;:::-;;;;;;;;13476:471;13870:62;;;;;;;;;;:::i;:::-;;;;;;;;13476:471;13613:43;;;13601:55;;;:8;:55;;;;13597:152;;13680:50;;;;;;;;;;:::i;:::-;;;;;;;;13597:152;13553:210;13441:516;13238:725;;;;;;:::o;13969:792::-;14201:15;:2;:13;;;:15::i;:::-;14197:558;;;14253:2;14236:43;;;14280:8;14290:4;14296:3;14301:7;14310:4;14236:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14232:513;;;;:::i;:::-;;;;;;;;14621:6;14614:14;;;;;;;;;;;:::i;:::-;;;;;;;;14232:513;14668:62;;;;;;;;;;:::i;:::-;;;;;;;;14232:513;14406:48;;;14394:60;;;:8;:60;;;;14390:157;;14478:50;;;;;;;;;;:::i;:::-;;;;;;;;14390:157;14316:245;14197:558;13969:792;;;;;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:11:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1314:622::-;;1435:80;1450:64;1507:6;1450:64;:::i;:::-;1435:80;:::i;:::-;1426:89;;1535:5;1563:6;1556:5;1549:21;1589:4;1582:5;1578:16;1571:23;;1614:6;1664:3;1656:4;1648:6;1644:17;1639:3;1635:27;1632:36;1629:2;;;1681:1;1678;1671:12;1629:2;1709:1;1694:236;1719:6;1716:1;1713:13;1694:236;;;1786:3;1814:37;1847:3;1835:10;1814:37;:::i;:::-;1809:3;1802:50;1881:4;1876:3;1872:14;1865:21;;1915:4;1910:3;1906:14;1899:21;;1754:176;1741:1;1738;1734:9;1729:14;;1694:236;;;1698:14;1416:520;;;;;;;:::o;1942:342::-;;2044:64;2059:48;2100:6;2059:48;:::i;:::-;2044:64;:::i;:::-;2035:73;;2131:6;2124:5;2117:21;2169:4;2162:5;2158:16;2207:3;2198:6;2193:3;2189:16;2186:25;2183:2;;;2224:1;2221;2214:12;2183:2;2237:41;2271:6;2266:3;2261;2237:41;:::i;:::-;2025:259;;;;;;:::o;2290:344::-;;2393:65;2408:49;2450:6;2408:49;:::i;:::-;2393:65;:::i;:::-;2384:74;;2481:6;2474:5;2467:21;2519:4;2512:5;2508:16;2557:3;2548:6;2543:3;2539:16;2536:25;2533:2;;;2574:1;2571;2564:12;2533:2;2587:41;2621:6;2616:3;2611;2587:41;:::i;:::-;2374:260;;;;;;:::o;2640:139::-;;2724:6;2711:20;2702:29;;2740:33;2767:5;2740:33;:::i;:::-;2692:87;;;;:::o;2802:303::-;;2922:3;2915:4;2907:6;2903:17;2899:27;2889:2;;2940:1;2937;2930:12;2889:2;2980:6;2967:20;3005:94;3095:3;3087:6;3080:4;3072:6;3068:17;3005:94;:::i;:::-;2996:103;;2879:226;;;;;:::o;3128:303::-;;3248:3;3241:4;3233:6;3229:17;3225:27;3215:2;;3266:1;3263;3256:12;3215:2;3306:6;3293:20;3331:94;3421:3;3413:6;3406:4;3398:6;3394:17;3331:94;:::i;:::-;3322:103;;3205:226;;;;;:::o;3454:303::-;;3574:3;3567:4;3559:6;3555:17;3551:27;3541:2;;3592:1;3589;3582:12;3541:2;3632:6;3619:20;3657:94;3747:3;3739:6;3732:4;3724:6;3720:17;3657:94;:::i;:::-;3648:103;;3531:226;;;;;:::o;3763:133::-;;3844:6;3831:20;3822:29;;3860:30;3884:5;3860:30;:::i;:::-;3812:84;;;;:::o;3902:139::-;;3986:6;3973:20;3964:29;;4002:33;4029:5;4002:33;:::i;:::-;3954:87;;;;:::o;4047:137::-;;4130:6;4117:20;4108:29;;4146:32;4172:5;4146:32;:::i;:::-;4098:86;;;;:::o;4190:141::-;;4277:6;4271:13;4262:22;;4293:32;4319:5;4293:32;:::i;:::-;4252:79;;;;:::o;4350:271::-;;4454:3;4447:4;4439:6;4435:17;4431:27;4421:2;;4472:1;4469;4462:12;4421:2;4512:6;4499:20;4537:78;4611:3;4603:6;4596:4;4588:6;4584:17;4537:78;:::i;:::-;4528:87;;4411:210;;;;;:::o;4641:273::-;;4746:3;4739:4;4731:6;4727:17;4723:27;4713:2;;4764:1;4761;4754:12;4713:2;4804:6;4791:20;4829:79;4904:3;4896:6;4889:4;4881:6;4877:17;4829:79;:::i;:::-;4820:88;;4703:211;;;;;:::o;4920:139::-;;5004:6;4991:20;4982:29;;5020:33;5047:5;5020:33;:::i;:::-;4972:87;;;;:::o;5065:262::-;;5173:2;5161:9;5152:7;5148:23;5144:32;5141:2;;;5189:1;5186;5179:12;5141:2;5232:1;5257:53;5302:7;5293:6;5282:9;5278:22;5257:53;:::i;:::-;5247:63;;5203:117;5131:196;;;;:::o;5333:407::-;;;5458:2;5446:9;5437:7;5433:23;5429:32;5426:2;;;5474:1;5471;5464:12;5426:2;5517:1;5542:53;5587:7;5578:6;5567:9;5563:22;5542:53;:::i;:::-;5532:63;;5488:117;5644:2;5670:53;5715:7;5706:6;5695:9;5691:22;5670:53;:::i;:::-;5660:63;;5615:118;5416:324;;;;;:::o;5746:1241::-;;;;;;5981:3;5969:9;5960:7;5956:23;5952:33;5949:2;;;5998:1;5995;5988:12;5949:2;6041:1;6066:53;6111:7;6102:6;6091:9;6087:22;6066:53;:::i;:::-;6056:63;;6012:117;6168:2;6194:53;6239:7;6230:6;6219:9;6215:22;6194:53;:::i;:::-;6184:63;;6139:118;6324:2;6313:9;6309:18;6296:32;6355:18;6347:6;6344:30;6341:2;;;6387:1;6384;6377:12;6341:2;6415:78;6485:7;6476:6;6465:9;6461:22;6415:78;:::i;:::-;6405:88;;6267:236;6570:2;6559:9;6555:18;6542:32;6601:18;6593:6;6590:30;6587:2;;;6633:1;6630;6623:12;6587:2;6661:78;6731:7;6722:6;6711:9;6707:22;6661:78;:::i;:::-;6651:88;;6513:236;6816:3;6805:9;6801:19;6788:33;6848:18;6840:6;6837:30;6834:2;;;6880:1;6877;6870:12;6834:2;6908:62;6962:7;6953:6;6942:9;6938:22;6908:62;:::i;:::-;6898:72;;6759:221;5939:1048;;;;;;;;:::o;6993:955::-;;;;;;7178:3;7166:9;7157:7;7153:23;7149:33;7146:2;;;7195:1;7192;7185:12;7146:2;7238:1;7263:53;7308:7;7299:6;7288:9;7284:22;7263:53;:::i;:::-;7253:63;;7209:117;7365:2;7391:53;7436:7;7427:6;7416:9;7412:22;7391:53;:::i;:::-;7381:63;;7336:118;7493:2;7519:53;7564:7;7555:6;7544:9;7540:22;7519:53;:::i;:::-;7509:63;;7464:118;7621:2;7647:53;7692:7;7683:6;7672:9;7668:22;7647:53;:::i;:::-;7637:63;;7592:118;7777:3;7766:9;7762:19;7749:33;7809:18;7801:6;7798:30;7795:2;;;7841:1;7838;7831:12;7795:2;7869:62;7923:7;7914:6;7903:9;7899:22;7869:62;:::i;:::-;7859:72;;7720:221;7136:812;;;;;;;;:::o;7954:401::-;;;8076:2;8064:9;8055:7;8051:23;8047:32;8044:2;;;8092:1;8089;8082:12;8044:2;8135:1;8160:53;8205:7;8196:6;8185:9;8181:22;8160:53;:::i;:::-;8150:63;;8106:117;8262:2;8288:50;8330:7;8321:6;8310:9;8306:22;8288:50;:::i;:::-;8278:60;;8233:115;8034:321;;;;;:::o;8361:407::-;;;8486:2;8474:9;8465:7;8461:23;8457:32;8454:2;;;8502:1;8499;8492:12;8454:2;8545:1;8570:53;8615:7;8606:6;8595:9;8591:22;8570:53;:::i;:::-;8560:63;;8516:117;8672:2;8698:53;8743:7;8734:6;8723:9;8719:22;8698:53;:::i;:::-;8688:63;;8643:118;8444:324;;;;;:::o;8774:693::-;;;8949:2;8937:9;8928:7;8924:23;8920:32;8917:2;;;8965:1;8962;8955:12;8917:2;9036:1;9025:9;9021:17;9008:31;9066:18;9058:6;9055:30;9052:2;;;9098:1;9095;9088:12;9052:2;9126:78;9196:7;9187:6;9176:9;9172:22;9126:78;:::i;:::-;9116:88;;8979:235;9281:2;9270:9;9266:18;9253:32;9312:18;9304:6;9301:30;9298:2;;;9344:1;9341;9334:12;9298:2;9372:78;9442:7;9433:6;9422:9;9418:22;9372:78;:::i;:::-;9362:88;;9224:236;8907:560;;;;;:::o;9473:405::-;;9606:2;9594:9;9585:7;9581:23;9577:32;9574:2;;;9622:1;9619;9612:12;9574:2;9693:1;9682:9;9678:17;9665:31;9723:18;9715:6;9712:30;9709:2;;;9755:1;9752;9745:12;9709:2;9783:78;9853:7;9844:6;9833:9;9829:22;9783:78;:::i;:::-;9773:88;;9636:235;9564:314;;;;:::o;9884:407::-;;;10009:2;9997:9;9988:7;9984:23;9980:32;9977:2;;;10025:1;10022;10015:12;9977:2;10068:1;10093:53;10138:7;10129:6;10118:9;10114:22;10093:53;:::i;:::-;10083:63;;10039:117;10195:2;10221:53;10266:7;10257:6;10246:9;10242:22;10221:53;:::i;:::-;10211:63;;10166:118;9967:324;;;;;:::o;10297:260::-;;10404:2;10392:9;10383:7;10379:23;10375:32;10372:2;;;10420:1;10417;10410:12;10372:2;10463:1;10488:52;10532:7;10523:6;10512:9;10508:22;10488:52;:::i;:::-;10478:62;;10434:116;10362:195;;;;:::o;10563:282::-;;10681:2;10669:9;10660:7;10656:23;10652:32;10649:2;;;10697:1;10694;10687:12;10649:2;10740:1;10765:63;10820:7;10811:6;10800:9;10796:22;10765:63;:::i;:::-;10755:73;;10711:127;10639:206;;;;:::o;10851:375::-;;10969:2;10957:9;10948:7;10944:23;10940:32;10937:2;;;10985:1;10982;10975:12;10937:2;11056:1;11045:9;11041:17;11028:31;11086:18;11078:6;11075:30;11072:2;;;11118:1;11115;11108:12;11072:2;11146:63;11201:7;11192:6;11181:9;11177:22;11146:63;:::i;:::-;11136:73;;10999:220;10927:299;;;;:::o;11232:262::-;;11340:2;11328:9;11319:7;11315:23;11311:32;11308:2;;;11356:1;11353;11346:12;11308:2;11399:1;11424:53;11469:7;11460:6;11449:9;11445:22;11424:53;:::i;:::-;11414:63;;11370:117;11298:196;;;;:::o;11500:407::-;;;11625:2;11613:9;11604:7;11600:23;11596:32;11593:2;;;11641:1;11638;11631:12;11593:2;11684:1;11709:53;11754:7;11745:6;11734:9;11730:22;11709:53;:::i;:::-;11699:63;;11655:117;11811:2;11837:53;11882:7;11873:6;11862:9;11858:22;11837:53;:::i;:::-;11827:63;;11782:118;11583:324;;;;;:::o;11913:550::-;;;12063:2;12051:9;12042:7;12038:23;12034:32;12031:2;;;12079:1;12076;12069:12;12031:2;12122:1;12147:53;12192:7;12183:6;12172:9;12168:22;12147:53;:::i;:::-;12137:63;;12093:117;12277:2;12266:9;12262:18;12249:32;12308:18;12300:6;12297:30;12294:2;;;12340:1;12337;12330:12;12294:2;12368:78;12438:7;12429:6;12418:9;12414:22;12368:78;:::i;:::-;12358:88;;12220:236;12021:442;;;;;:::o;12469:179::-;;12559:46;12601:3;12593:6;12559:46;:::i;:::-;12637:4;12632:3;12628:14;12614:28;;12549:99;;;;:::o;12654:118::-;12741:24;12759:5;12741:24;:::i;:::-;12736:3;12729:37;12719:53;;:::o;12778:157::-;12883:45;12903:24;12921:5;12903:24;:::i;:::-;12883:45;:::i;:::-;12878:3;12871:58;12861:74;;:::o;12971:732::-;;13119:54;13167:5;13119:54;:::i;:::-;13189:86;13268:6;13263:3;13189:86;:::i;:::-;13182:93;;13299:56;13349:5;13299:56;:::i;:::-;13378:7;13409:1;13394:284;13419:6;13416:1;13413:13;13394:284;;;13495:6;13489:13;13522:63;13581:3;13566:13;13522:63;:::i;:::-;13515:70;;13608:60;13661:6;13608:60;:::i;:::-;13598:70;;13454:224;13441:1;13438;13434:9;13429:14;;13394:284;;;13398:14;13694:3;13687:10;;13095:608;;;;;;;:::o;13709:109::-;13790:21;13805:5;13790:21;:::i;:::-;13785:3;13778:34;13768:50;;:::o;13824:157::-;13929:45;13949:24;13967:5;13949:24;:::i;:::-;13929:45;:::i;:::-;13924:3;13917:58;13907:74;;:::o;13987:360::-;;14101:38;14133:5;14101:38;:::i;:::-;14155:70;14218:6;14213:3;14155:70;:::i;:::-;14148:77;;14234:52;14279:6;14274:3;14267:4;14260:5;14256:16;14234:52;:::i;:::-;14311:29;14333:6;14311:29;:::i;:::-;14306:3;14302:39;14295:46;;14077:270;;;;;:::o;14353:157::-;14453:50;14497:5;14453:50;:::i;:::-;14448:3;14441:63;14431:79;;:::o;14516:364::-;;14632:39;14665:5;14632:39;:::i;:::-;14687:71;14751:6;14746:3;14687:71;:::i;:::-;14680:78;;14767:52;14812:6;14807:3;14800:4;14793:5;14789:16;14767:52;:::i;:::-;14844:29;14866:6;14844:29;:::i;:::-;14839:3;14835:39;14828:46;;14608:272;;;;;:::o;14886:384::-;;15049:67;15113:2;15108:3;15049:67;:::i;:::-;15042:74;;15146:34;15142:1;15137:3;15133:11;15126:55;15212:22;15207:2;15202:3;15198:12;15191:44;15261:2;15256:3;15252:12;15245:19;;15032:238;;;:::o;15276:372::-;;15439:67;15503:2;15498:3;15439:67;:::i;:::-;15432:74;;15536:34;15532:1;15527:3;15523:11;15516:55;15602:10;15597:2;15592:3;15588:12;15581:32;15639:2;15634:3;15630:12;15623:19;;15422:226;;;:::o;15654:369::-;;15817:67;15881:2;15876:3;15817:67;:::i;:::-;15810:74;;15914:34;15910:1;15905:3;15901:11;15894:55;15980:7;15975:2;15970:3;15966:12;15959:29;16014:2;16009:3;16005:12;15998:19;;15800:223;;;:::o;16029:375::-;;16192:67;16256:2;16251:3;16192:67;:::i;:::-;16185:74;;16289:34;16285:1;16280:3;16276:11;16269:55;16355:13;16350:2;16345:3;16341:12;16334:35;16395:2;16390:3;16386:12;16379:19;;16175:229;;;:::o;16410:370::-;;16573:67;16637:2;16632:3;16573:67;:::i;:::-;16566:74;;16670:34;16666:1;16661:3;16657:11;16650:55;16736:8;16731:2;16726:3;16722:12;16715:30;16771:2;16766:3;16762:12;16755:19;;16556:224;;;:::o;16786:317::-;;16949:67;17013:2;17008:3;16949:67;:::i;:::-;16942:74;;17046:21;17042:1;17037:3;17033:11;17026:42;17094:2;17089:3;17085:12;17078:19;;16932:171;;;:::o;17109:378::-;;17272:67;17336:2;17331:3;17272:67;:::i;:::-;17265:74;;17369:34;17365:1;17360:3;17356:11;17349:55;17435:16;17430:2;17425:3;17421:12;17414:38;17478:2;17473:3;17469:12;17462:19;;17255:232;;;:::o;17493:321::-;;17656:67;17720:2;17715:3;17656:67;:::i;:::-;17649:74;;17753:25;17749:1;17744:3;17740:11;17733:46;17805:2;17800:3;17796:12;17789:19;;17639:175;;;:::o;17820:373::-;;17983:67;18047:2;18042:3;17983:67;:::i;:::-;17976:74;;18080:34;18076:1;18071:3;18067:11;18060:55;18146:11;18141:2;18136:3;18132:12;18125:33;18184:2;18179:3;18175:12;18168:19;;17966:227;;;:::o;18199:330::-;;18362:67;18426:2;18421:3;18362:67;:::i;:::-;18355:74;;18459:34;18455:1;18450:3;18446:11;18439:55;18520:2;18515:3;18511:12;18504:19;;18345:184;;;:::o;18535:369::-;;18698:67;18762:2;18757:3;18698:67;:::i;:::-;18691:74;;18795:34;18791:1;18786:3;18782:11;18775:55;18861:7;18856:2;18851:3;18847:12;18840:29;18895:2;18890:3;18886:12;18879:19;;18681:223;;;:::o;18910:382::-;;19073:67;19137:2;19132:3;19073:67;:::i;:::-;19066:74;;19170:34;19166:1;19161:3;19157:11;19150:55;19236:20;19231:2;19226:3;19222:12;19215:42;19283:2;19278:3;19274:12;19267:19;;19056:236;;;:::o;19298:374::-;;19461:67;19525:2;19520:3;19461:67;:::i;:::-;19454:74;;19558:34;19554:1;19549:3;19545:11;19538:55;19624:12;19619:2;19614:3;19610:12;19603:34;19663:2;19658:3;19654:12;19647:19;;19444:228;;;:::o;19678:330::-;;19841:67;19905:2;19900:3;19841:67;:::i;:::-;19834:74;;19938:34;19934:1;19929:3;19925:11;19918:55;19999:2;19994:3;19990:12;19983:19;;19824:184;;;:::o;20014:373::-;;20177:67;20241:2;20236:3;20177:67;:::i;:::-;20170:74;;20274:34;20270:1;20265:3;20261:11;20254:55;20340:11;20335:2;20330:3;20326:12;20319:33;20378:2;20373:3;20369:12;20362:19;;20160:227;;;:::o;20393:373::-;;20556:67;20620:2;20615:3;20556:67;:::i;:::-;20549:74;;20653:34;20649:1;20644:3;20640:11;20633:55;20719:11;20714:2;20709:3;20705:12;20698:33;20757:2;20752:3;20748:12;20741:19;;20539:227;;;:::o;20772:366::-;;20935:67;20999:2;20994:3;20935:67;:::i;:::-;20928:74;;21032:34;21028:1;21023:3;21019:11;21012:55;21098:4;21093:2;21088:3;21084:12;21077:26;21129:2;21124:3;21120:12;21113:19;;20918:220;;;:::o;21144:372::-;;21307:67;21371:2;21366:3;21307:67;:::i;:::-;21300:74;;21404:34;21400:1;21395:3;21391:11;21384:55;21470:10;21465:2;21460:3;21456:12;21449:32;21507:2;21502:3;21498:12;21491:19;;21290:226;;;:::o;21522:365::-;;21685:67;21749:2;21744:3;21685:67;:::i;:::-;21678:74;;21782:34;21778:1;21773:3;21769:11;21762:55;21848:3;21843:2;21838:3;21834:12;21827:25;21878:2;21873:3;21869:12;21862:19;;21668:219;;;:::o;21893:108::-;21970:24;21988:5;21970:24;:::i;:::-;21965:3;21958:37;21948:53;;:::o;22007:118::-;22094:24;22112:5;22094:24;:::i;:::-;22089:3;22082:37;22072:53;;:::o;22131:256::-;;22258:75;22329:3;22320:6;22258:75;:::i;:::-;22358:2;22353:3;22349:12;22342:19;;22378:3;22371:10;;22247:140;;;;:::o;22393:397::-;;22548:75;22619:3;22610:6;22548:75;:::i;:::-;22648:2;22643:3;22639:12;22632:19;;22661:75;22732:3;22723:6;22661:75;:::i;:::-;22761:2;22756:3;22752:12;22745:19;;22781:3;22774:10;;22537:253;;;;;:::o;22796:222::-;;22927:2;22916:9;22912:18;22904:26;;22940:71;23008:1;22997:9;22993:17;22984:6;22940:71;:::i;:::-;22894:124;;;;:::o;23024:1053::-;;23385:3;23374:9;23370:19;23362:27;;23399:71;23467:1;23456:9;23452:17;23443:6;23399:71;:::i;:::-;23480:72;23548:2;23537:9;23533:18;23524:6;23480:72;:::i;:::-;23599:9;23593:4;23589:20;23584:2;23573:9;23569:18;23562:48;23627:108;23730:4;23721:6;23627:108;:::i;:::-;23619:116;;23782:9;23776:4;23772:20;23767:2;23756:9;23752:18;23745:48;23810:108;23913:4;23904:6;23810:108;:::i;:::-;23802:116;;23966:9;23960:4;23956:20;23950:3;23939:9;23935:19;23928:49;23994:76;24065:4;24056:6;23994:76;:::i;:::-;23986:84;;23352:725;;;;;;;;:::o;24083:751::-;;24344:3;24333:9;24329:19;24321:27;;24358:71;24426:1;24415:9;24411:17;24402:6;24358:71;:::i;:::-;24439:72;24507:2;24496:9;24492:18;24483:6;24439:72;:::i;:::-;24521;24589:2;24578:9;24574:18;24565:6;24521:72;:::i;:::-;24603;24671:2;24660:9;24656:18;24647:6;24603:72;:::i;:::-;24723:9;24717:4;24713:20;24707:3;24696:9;24692:19;24685:49;24751:76;24822:4;24813:6;24751:76;:::i;:::-;24743:84;;24311:523;;;;;;;;:::o;24840:373::-;;25021:2;25010:9;25006:18;24998:26;;25070:9;25064:4;25060:20;25056:1;25045:9;25041:17;25034:47;25098:108;25201:4;25192:6;25098:108;:::i;:::-;25090:116;;24988:225;;;;:::o;25219:634::-;;25478:2;25467:9;25463:18;25455:26;;25527:9;25521:4;25517:20;25513:1;25502:9;25498:17;25491:47;25555:108;25658:4;25649:6;25555:108;:::i;:::-;25547:116;;25710:9;25704:4;25700:20;25695:2;25684:9;25680:18;25673:48;25738:108;25841:4;25832:6;25738:108;:::i;:::-;25730:116;;25445:408;;;;;:::o;25859:210::-;;25984:2;25973:9;25969:18;25961:26;;25997:65;26059:1;26048:9;26044:17;26035:6;25997:65;:::i;:::-;25951:118;;;;:::o;26075:248::-;;26219:2;26208:9;26204:18;26196:26;;26232:84;26313:1;26302:9;26298:17;26289:6;26232:84;:::i;:::-;26186:137;;;;:::o;26329:313::-;;26480:2;26469:9;26465:18;26457:26;;26529:9;26523:4;26519:20;26515:1;26504:9;26500:17;26493:47;26557:78;26630:4;26621:6;26557:78;:::i;:::-;26549:86;;26447:195;;;;:::o;26648:419::-;;26852:2;26841:9;26837:18;26829:26;;26901:9;26895:4;26891:20;26887:1;26876:9;26872:17;26865:47;26929:131;27055:4;26929:131;:::i;:::-;26921:139;;26819:248;;;:::o;27073:419::-;;27277:2;27266:9;27262:18;27254:26;;27326:9;27320:4;27316:20;27312:1;27301:9;27297:17;27290:47;27354:131;27480:4;27354:131;:::i;:::-;27346:139;;27244:248;;;:::o;27498:419::-;;27702:2;27691:9;27687:18;27679:26;;27751:9;27745:4;27741:20;27737:1;27726:9;27722:17;27715:47;27779:131;27905:4;27779:131;:::i;:::-;27771:139;;27669:248;;;:::o;27923:419::-;;28127:2;28116:9;28112:18;28104:26;;28176:9;28170:4;28166:20;28162:1;28151:9;28147:17;28140:47;28204:131;28330:4;28204:131;:::i;:::-;28196:139;;28094:248;;;:::o;28348:419::-;;28552:2;28541:9;28537:18;28529:26;;28601:9;28595:4;28591:20;28587:1;28576:9;28572:17;28565:47;28629:131;28755:4;28629:131;:::i;:::-;28621:139;;28519:248;;;:::o;28773:419::-;;28977:2;28966:9;28962:18;28954:26;;29026:9;29020:4;29016:20;29012:1;29001:9;28997:17;28990:47;29054:131;29180:4;29054:131;:::i;:::-;29046:139;;28944:248;;;:::o;29198:419::-;;29402:2;29391:9;29387:18;29379:26;;29451:9;29445:4;29441:20;29437:1;29426:9;29422:17;29415:47;29479:131;29605:4;29479:131;:::i;:::-;29471:139;;29369:248;;;:::o;29623:419::-;;29827:2;29816:9;29812:18;29804:26;;29876:9;29870:4;29866:20;29862:1;29851:9;29847:17;29840:47;29904:131;30030:4;29904:131;:::i;:::-;29896:139;;29794:248;;;:::o;30048:419::-;;30252:2;30241:9;30237:18;30229:26;;30301:9;30295:4;30291:20;30287:1;30276:9;30272:17;30265:47;30329:131;30455:4;30329:131;:::i;:::-;30321:139;;30219:248;;;:::o;30473:419::-;;30677:2;30666:9;30662:18;30654:26;;30726:9;30720:4;30716:20;30712:1;30701:9;30697:17;30690:47;30754:131;30880:4;30754:131;:::i;:::-;30746:139;;30644:248;;;:::o;30898:419::-;;31102:2;31091:9;31087:18;31079:26;;31151:9;31145:4;31141:20;31137:1;31126:9;31122:17;31115:47;31179:131;31305:4;31179:131;:::i;:::-;31171:139;;31069:248;;;:::o;31323:419::-;;31527:2;31516:9;31512:18;31504:26;;31576:9;31570:4;31566:20;31562:1;31551:9;31547:17;31540:47;31604:131;31730:4;31604:131;:::i;:::-;31596:139;;31494:248;;;:::o;31748:419::-;;31952:2;31941:9;31937:18;31929:26;;32001:9;31995:4;31991:20;31987:1;31976:9;31972:17;31965:47;32029:131;32155:4;32029:131;:::i;:::-;32021:139;;31919:248;;;:::o;32173:419::-;;32377:2;32366:9;32362:18;32354:26;;32426:9;32420:4;32416:20;32412:1;32401:9;32397:17;32390:47;32454:131;32580:4;32454:131;:::i;:::-;32446:139;;32344:248;;;:::o;32598:419::-;;32802:2;32791:9;32787:18;32779:26;;32851:9;32845:4;32841:20;32837:1;32826:9;32822:17;32815:47;32879:131;33005:4;32879:131;:::i;:::-;32871:139;;32769:248;;;:::o;33023:419::-;;33227:2;33216:9;33212:18;33204:26;;33276:9;33270:4;33266:20;33262:1;33251:9;33247:17;33240:47;33304:131;33430:4;33304:131;:::i;:::-;33296:139;;33194:248;;;:::o;33448:419::-;;33652:2;33641:9;33637:18;33629:26;;33701:9;33695:4;33691:20;33687:1;33676:9;33672:17;33665:47;33729:131;33855:4;33729:131;:::i;:::-;33721:139;;33619:248;;;:::o;33873:419::-;;34077:2;34066:9;34062:18;34054:26;;34126:9;34120:4;34116:20;34112:1;34101:9;34097:17;34090:47;34154:131;34280:4;34154:131;:::i;:::-;34146:139;;34044:248;;;:::o;34298:419::-;;34502:2;34491:9;34487:18;34479:26;;34551:9;34545:4;34541:20;34537:1;34526:9;34522:17;34515:47;34579:131;34705:4;34579:131;:::i;:::-;34571:139;;34469:248;;;:::o;34723:222::-;;34854:2;34843:9;34839:18;34831:26;;34867:71;34935:1;34924:9;34920:17;34911:6;34867:71;:::i;:::-;34821:124;;;;:::o;34951:332::-;;35110:2;35099:9;35095:18;35087:26;;35123:71;35191:1;35180:9;35176:17;35167:6;35123:71;:::i;:::-;35204:72;35272:2;35261:9;35257:18;35248:6;35204:72;:::i;:::-;35077:206;;;;;:::o;35289:283::-;;35355:2;35349:9;35339:19;;35397:4;35389:6;35385:17;35504:6;35492:10;35489:22;35468:18;35456:10;35453:34;35450:62;35447:2;;;35515:18;;:::i;:::-;35447:2;35555:10;35551:2;35544:22;35329:243;;;;:::o;35578:311::-;;35745:18;35737:6;35734:30;35731:2;;;35767:18;;:::i;:::-;35731:2;35817:4;35809:6;35805:17;35797:25;;35877:4;35871;35867:15;35859:23;;35660:229;;;:::o;35895:311::-;;36062:18;36054:6;36051:30;36048:2;;;36084:18;;:::i;:::-;36048:2;36134:4;36126:6;36122:17;36114:25;;36194:4;36188;36184:15;36176:23;;35977:229;;;:::o;36212:311::-;;36379:18;36371:6;36368:30;36365:2;;;36401:18;;:::i;:::-;36365:2;36451:4;36443:6;36439:17;36431:25;;36511:4;36505;36501:15;36493:23;;36294:229;;;:::o;36529:331::-;;36680:18;36672:6;36669:30;36666:2;;;36702:18;;:::i;:::-;36666:2;36787:4;36783:9;36776:4;36768:6;36764:17;36760:33;36752:41;;36848:4;36842;36838:15;36830:23;;36595:265;;;:::o;36866:332::-;;37018:18;37010:6;37007:30;37004:2;;;37040:18;;:::i;:::-;37004:2;37125:4;37121:9;37114:4;37106:6;37102:17;37098:33;37090:41;;37186:4;37180;37176:15;37168:23;;36933:265;;;:::o;37204:132::-;;37294:3;37286:11;;37324:4;37319:3;37315:14;37307:22;;37276:60;;;:::o;37342:114::-;;37443:5;37437:12;37427:22;;37416:40;;;:::o;37462:98::-;;37547:5;37541:12;37531:22;;37520:40;;;:::o;37566:99::-;;37652:5;37646:12;37636:22;;37625:40;;;:::o;37671:113::-;;37773:4;37768:3;37764:14;37756:22;;37746:38;;;:::o;37790:184::-;;37923:6;37918:3;37911:19;37963:4;37958:3;37954:14;37939:29;;37901:73;;;;:::o;37980:168::-;;38097:6;38092:3;38085:19;38137:4;38132:3;38128:14;38113:29;;38075:73;;;;:::o;38154:169::-;;38272:6;38267:3;38260:19;38312:4;38307:3;38303:14;38288:29;;38250:73;;;;:::o;38329:305::-;;38388:20;38406:1;38388:20;:::i;:::-;38383:25;;38422:20;38440:1;38422:20;:::i;:::-;38417:25;;38576:1;38508:66;38504:74;38501:1;38498:81;38495:2;;;38582:18;;:::i;:::-;38495:2;38626:1;38623;38619:9;38612:16;;38373:261;;;;:::o;38640:348::-;;38703:20;38721:1;38703:20;:::i;:::-;38698:25;;38737:20;38755:1;38737:20;:::i;:::-;38732:25;;38925:1;38857:66;38853:74;38850:1;38847:81;38842:1;38835:9;38828:17;38824:105;38821:2;;;38932:18;;:::i;:::-;38821:2;38980:1;38977;38973:9;38962:20;;38688:300;;;;:::o;38994:191::-;;39054:20;39072:1;39054:20;:::i;:::-;39049:25;;39088:20;39106:1;39088:20;:::i;:::-;39083:25;;39127:1;39124;39121:8;39118:2;;;39132:18;;:::i;:::-;39118:2;39177:1;39174;39170:9;39162:17;;39039:146;;;;:::o;39191:96::-;;39257:24;39275:5;39257:24;:::i;:::-;39246:35;;39236:51;;;:::o;39293:90::-;;39370:5;39363:13;39356:21;39345:32;;39335:48;;;:::o;39389:77::-;;39455:5;39444:16;;39434:32;;;:::o;39472:149::-;;39548:66;39541:5;39537:78;39526:89;;39516:105;;;:::o;39627:141::-;;39708:5;39697:16;;39714:48;39756:5;39714:48;:::i;:::-;39687:81;;;:::o;39774:126::-;;39851:42;39844:5;39840:54;39829:65;;39819:81;;;:::o;39906:77::-;;39972:5;39961:16;;39951:32;;;:::o;39989:141::-;;40085:39;40118:5;40085:39;:::i;:::-;40072:52;;40062:68;;;:::o;40136:154::-;40220:6;40215:3;40210;40197:30;40282:1;40273:6;40268:3;40264:16;40257:27;40187:103;;;:::o;40296:307::-;40364:1;40374:113;40388:6;40385:1;40382:13;40374:113;;;40473:1;40468:3;40464:11;40458:18;40454:1;40449:3;40445:11;40438:39;40410:2;40407:1;40403:10;40398:15;;40374:113;;;40505:6;40502:1;40499:13;40496:2;;;40585:1;40576:6;40571:3;40567:16;40560:27;40496:2;40345:258;;;;:::o;40609:320::-;;40690:1;40684:4;40680:12;40670:22;;40737:1;40731:4;40727:12;40758:18;40748:2;;40814:4;40806:6;40802:17;40792:27;;40748:2;40876;40868:6;40865:14;40845:18;40842:38;40839:2;;;40895:18;;:::i;:::-;40839:2;40660:269;;;;:::o;40935:233::-;;40997:24;41015:5;40997:24;:::i;:::-;40988:33;;41043:66;41036:5;41033:77;41030:2;;;41113:18;;:::i;:::-;41030:2;41160:1;41153:5;41149:13;41142:20;;40978:190;;;:::o;41174:100::-;;41242:26;41262:5;41242:26;:::i;:::-;41231:37;;41221:53;;;:::o;41280:79::-;;41348:5;41337:16;;41327:32;;;:::o;41365:94::-;;41433:20;41447:5;41433:20;:::i;:::-;41422:31;;41412:47;;;:::o;41465:180::-;41513:77;41510:1;41503:88;41610:4;41607:1;41600:15;41634:4;41631:1;41624:15;41651:180;41699:77;41696:1;41689:88;41796:4;41793:1;41786:15;41820:4;41817:1;41810:15;41837:180;41885:77;41882:1;41875:88;41982:4;41979:1;41972:15;42006:4;42003:1;41996:15;42023:180;42071:77;42068:1;42061:88;42168:4;42165:1;42158:15;42192:4;42189:1;42182:15;42209:102;;42301:2;42297:7;42292:2;42285:5;42281:14;42277:28;42267:38;;42257:54;;;:::o;42317:94::-;;42398:5;42394:2;42390:14;42369:35;;42359:52;;;:::o;42417:106::-;;42510:5;42505:3;42501:15;42480:36;;42470:53;;;:::o;42529:833::-;;42606:4;42588:16;42585:26;42582:2;;;42614:5;;42582:2;42652:1;42649;42646;42631:23;42674:34;42705:1;42699:8;42674:34;:::i;:::-;42735:10;42730:3;42727:19;42717:2;;42750:5;;;42717:2;42785;42779:9;42843:1;42825:16;42821:24;42818:1;42812:4;42797:49;42876:4;42870:11;42975:16;42968:4;42960:6;42956:17;42953:39;42920:18;42912:6;42909:30;42893:113;42890:2;;;43021:5;;;;;42890:2;43067:6;43061:4;43057:17;43103:3;43097:10;43130:18;43122:6;43119:30;43116:2;;;43152:5;;;;;;;43116:2;43200:6;43193:4;43188:3;43184:14;43180:27;43237:16;43231:4;43227:27;43222:3;43219:36;43216:2;;;43258:5;;;;;;;;43216:2;43306:29;43328:6;43306:29;:::i;:::-;43299:4;43294:3;43290:14;43286:50;43282:2;43275:62;43353:3;43346:10;;42572:790;;;;;;;;:::o;43368:120::-;43456:1;43449:5;43446:12;43436:2;;43462:18;;:::i;:::-;43436:2;43426:62;:::o;43494:122::-;43567:24;43585:5;43567:24;:::i;:::-;43560:5;43557:35;43547:2;;43606:1;43603;43596:12;43547:2;43537:79;:::o;43622:116::-;43692:21;43707:5;43692:21;:::i;:::-;43685:5;43682:32;43672:2;;43728:1;43725;43718:12;43672:2;43662:76;:::o;43744:122::-;43817:24;43835:5;43817:24;:::i;:::-;43810:5;43807:35;43797:2;;43856:1;43853;43846:12;43797:2;43787:79;:::o;43872:120::-;43944:23;43961:5;43944:23;:::i;:::-;43937:5;43934:34;43924:2;;43982:1;43979;43972:12;43924:2;43914:78;:::o;43998:122::-;44071:24;44089:5;44071:24;:::i;:::-;44064:5;44061:35;44051:2;;44110:1;44107;44100:12;44051:2;44041:79;:::o

Swarm Source

ipfs://3f9403cb2c402fec27da222f80cf43fc11e5970ffafdab2f770ec117c41112be
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.