ETH Price: $2,713.24 (+1.67%)

Token

OCEAN (OCEAN)
 

Overview

Max Total Supply

101 OCEAN

Holders

87

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
leegte.eth
Balance
1 OCEAN
0xe8e01e71d18f838b13e8f6fa250ee0e4bed6b877
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:
Ocean

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

import "./ERC721.sol";

contract Ocean is ERC721 { 
    uint private constant TOKEN_LIMIT = 101;
    string private constant SCRIPT = "let hor = []; for (let i = 2; i < 34; i+=4) { hor.push(hashString.slice(i, i+4)); } let ver = []; for (let i = 34; i < 66; i+=4) { ver.push(hashString.slice(i, i+4)); } let horLines = hor.map(x => parseInt(x, 16)); let verLines = ver.map(x => parseInt(x, 16)); let mask = 0xFF; let backgroundIndex; let backgroundArray = [255,200,100,50,0]; let outPadding = 40; let inPadding = 15; let size = 25; let scale; let dim; function setup() { dim = (72 * (size + inPadding)); let screen = Math.min(window.innerWidth, window.innerHeight) - 16; scale = screen/(dim + (outPadding * 2)); createCanvas(screen, screen); colorMode(RGB, 256,1,1,255); backgroundIndex = (horLines[0] & mask) < 26 ? 4 : 0; } function drawLines(line, i, extPadding, pos, horizontal) { let verVal = (line >> i) & mask; if (verVal < size) { verVal += size; } else if (verVal > (72*2)) { drawLine(extPadding, pos, verVal / 2.85, horizontal); drawLine(extPadding, pos, verVal / 2.05, horizontal); drawLine(extPadding, pos, verVal / 1.70, horizontal); verVal /= 1.25; } else if (verVal > 72) { drawLine(extPadding, pos, verVal / 2.25, horizontal); verVal /= 1.5; } drawLine(extPadding, pos, verVal, horizontal); } function drawLine(extPadding, start, value, horizontal) { let item = outPadding + extPadding + (((dim - (extPadding * 2)) - 256) / 72) * (value % 72); if (horizontal) { line(item * scale, start * scale, (item + value) * scale, start * scale); } else { line(start * scale, item * scale, start * scale, (item + value) * scale); } } function keyPressed() { if (keyCode === 32) { if (backgroundIndex < backgroundArray.length - 1) { backgroundIndex++; } else { backgroundIndex = 0; } } } function draw() { background(backgroundArray[backgroundIndex]); strokeWeight(size * scale); strokeCap(SQUARE); stroke(255-backgroundArray[backgroundIndex], 255-backgroundArray[backgroundIndex], 255-backgroundArray[backgroundIndex]); let item = 0; for (let o = 0; o < 8; o++) { for (var i = 0; i < 9; i++) { let extPadding = item < 18 ? (dim / 54) * (18 - item) : item >= 54 ? (dim / 54) * ( item - 54) : 0; let pos = (item * (size + inPadding)) + outPadding; drawLines(verLines[o], i, extPadding, pos, false); drawLines(horLines[o], i, extPadding, pos, true); item++; } } }";
    uint private _tokenPrice = 44000000000000000;
    address private _platform;
    uint private _numSamples;
    uint private _numTokens = 0;
    mapping (uint => uint) private _idToSeed;
    string private _imageBaseUrl;
    string private _imageBaseExtension;
    string private _generatedBaseUrl;
    bool private _paused = true;
    
    constructor() ERC721("OCEAN", "OCEAN") {
        _platform = msg.sender;
        _imageBaseUrl = 'http://ocean.myartcontract.com/';
        _imageBaseExtension = '.svg';
        _generatedBaseUrl = 'http://project.myartcontract.com/image.html?contract=';
        _numSamples = 3;
    }
    
    function totalSupply() public pure returns (uint) {
        return TOKEN_LIMIT;
    }
    
    function price() public view returns (uint) {
        return _tokenPrice;
    }
    
    function created() public view returns (uint) {
        return _numTokens;
    }
    
    function createSamples(uint amount) external payable returns (uint) {
        require(msg.sender == _platform);
        require((_numTokens + amount) <= _numSamples);
        for (uint i = 0; i < amount; i++) {
            _create(msg.sender);
        }
        return amount;
    }

    function createForAddress(address receiver) external payable returns (uint) {
        require(msg.sender == _platform);
        require(_numTokens < totalSupply());
        uint _id = _create(receiver);
        return _id;
    }
    
    function create() external payable returns (uint) {
        require(this.canCreateArt());
        require(msg.value >= price());
        uint _id = _create(msg.sender);
        payable(_platform).transfer(msg.value);
        return _id;
    }

    function _create(address _creator) internal returns (uint) {
        require(_creator != address(0));
        _numTokens = _numTokens + 1;
        uint _id = _numTokens;
        uint _seed = hash(_id, _creator);
        _idToSeed[_id] = _seed;
        _safeMint(_creator, _id);
        return _id;
    }
    
    function canCreateArt() external view returns (bool) {
        return _numTokens >= _numSamples && _numTokens < totalSupply() && !_paused;
    }
    
    function hash(uint tokenId, address creator) private view returns (uint) {
        return uint(keccak256(abi.encodePacked(this.name(), tokenId, creator)));
    }
    
    function setPaused(bool paused) public {
        require(msg.sender == _platform);
        _paused = paused;
    }

    function setTokenPrice(uint tokenPrice) public {
        require(msg.sender == _platform);
        _tokenPrice = tokenPrice;
    }

    function setImageBase(string memory imageUrl, string memory imageExtension) public {
        require(msg.sender == _platform);
        _imageBaseUrl = imageUrl;
        _imageBaseExtension = imageExtension;
    }

    function setGeneratedBaseUrl(string memory url) public {
        require(msg.sender == _platform);
        _generatedBaseUrl = url;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (tokenId > 0 && tokenId <= _numTokens) {
            string memory _imageUrl = StrUtil.strConcat(_imageBaseUrl, Strings.toString(tokenId), _imageBaseExtension);
            string memory _generatedUrl = StrUtil.strConcat(_generatedBaseUrl, Strings.toHexString(uint256(uint160(address(this)))), '&id=', Strings.toString(tokenId));
            string memory _urls = StrUtil.strConcat('"image":"', _imageUrl, '","external_url":"https://www.myartcontract.com/","animation_url":"', _generatedUrl, '",');
            return StrUtil.strConcat('data:application/json,{"name":"OCEAN %23', Strings.toString(tokenId), '","description":"The My Art Contract Genesis collection inpired by the work of Piet Mondriaan that captures the pier and the ocean.",', _urls, '"interaction":"Space bar changes the canvas color"}');
        } else {
            return "";
        }
    }
    
    function script(uint tokenId) external view returns (string memory) {
        uint _seed = _idToSeed[tokenId];
        if (_seed > 0) {
            return StrUtil.strConcat("let hashString = '", Strings.toHexString(_seed), "'; ", SCRIPT);
        }
        return "";
    }
}

library StrUtil {
    // https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol

    function strConcat(string memory _a, string memory _b) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, "", "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        uint i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }
}

File 1 of 10: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 10: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 10: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 10: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 10: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 6 of 10: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 10: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 8 of 10: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canCreateArt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"createForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createSamples","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"created","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"script","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"url","type":"string"}],"name":"setGeneratedBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"imageUrl","type":"string"},{"internalType":"string","name":"imageExtension","type":"string"}],"name":"setImageBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052669c51c4521e000060065560006009556001600e60006101000a81548160ff0219169083151502179055503480156200003c57600080fd5b506040518060400160405280600581526020017f4f4345414e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f4345414e0000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c1929190620001fa565b508060019080519060200190620000da929190620001fa565b50505033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601f81526020017f687474703a2f2f6f6365616e2e6d79617274636f6e74726163742e636f6d2f00815250600b90805190602001906200016b929190620001fa565b506040518060400160405280600481526020017f2e73766700000000000000000000000000000000000000000000000000000000815250600c9080519060200190620001b9929190620001fa565b5060405180606001604052806035815260200162004b0660359139600d9080519060200190620001eb929190620001fa565b5060036008819055506200030f565b8280546200020890620002d9565b90600052602060002090601f0160209004810192826200022c576000855562000278565b82601f106200024757805160ff191683800117855562000278565b8280016001018555821562000278579182015b82811115620002775782518255916020019190600101906200025a565b5b5090506200028791906200028b565b5090565b5b80821115620002a65760008160009055506001016200028c565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f257607f821691505b60208210811415620003095762000308620002aa565b5b50919050565b6147e7806200031f6000396000f3fe6080604052600436106101665760003560e01c806370a08231116100d1578063c569bd951161008a578063d7da77c811610064578063d7da77c814610553578063e985e9c514610583578063efc81a8c146105c0578063fa96954c146105de57610166565b8063c569bd95146104b0578063c87b56dd146104ed578063c9834e7e1461052a57610166565b806370a08231146103a057806395d89b41146103dd578063a035b1fe14610408578063a22cb46514610433578063b88d4fde1461045c578063bcbf07001461048557610166565b806323b872dd1161012357806323b872dd1461028d578063325a19f1146102b657806342842e0e146102e15780635c0333191461030a5780636352211e1461033a5780636a61e5fc1461037757610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806316c38b3c1461023957806318160ddd14610262575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612a2b565b610607565b60405161019f9190612a73565b60405180910390f35b3480156101b457600080fd5b506101bd6106e9565b6040516101ca9190612b27565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612b7f565b61077b565b6040516102079190612bed565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612c34565b610800565b005b34801561024557600080fd5b50610260600480360381019061025b9190612ca0565b610918565b005b34801561026e57600080fd5b5061027761098f565b6040516102849190612cdc565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612cf7565b610998565b005b3480156102c257600080fd5b506102cb6109f8565b6040516102d89190612cdc565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190612cf7565b610a02565b005b610324600480360381019061031f9190612b7f565b610a22565b6040516103319190612cdc565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190612b7f565b610acb565b60405161036e9190612bed565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190612b7f565b610b7d565b005b3480156103ac57600080fd5b506103c760048036038101906103c29190612d4a565b610be1565b6040516103d49190612cdc565b60405180910390f35b3480156103e957600080fd5b506103f2610c99565b6040516103ff9190612b27565b60405180910390f35b34801561041457600080fd5b5061041d610d2b565b60405161042a9190612cdc565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190612d77565b610d35565b005b34801561046857600080fd5b50610483600480360381019061047e9190612eec565b610d4b565b005b34801561049157600080fd5b5061049a610dad565b6040516104a79190612a73565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190612b7f565b610de9565b6040516104e49190612b27565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190612b7f565b610ec6565b6040516105219190612b27565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613010565b611211565b005b61056d60048036038101906105689190612d4a565b61129d565b60405161057a9190612cdc565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613088565b611324565b6040516105b79190612a73565b60405180910390f35b6105c86113b8565b6040516105d59190612cdc565b60405180910390f35b3480156105ea57600080fd5b50610605600480360381019061060091906130c8565b6114c3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e257506106e182611537565b5b9050919050565b6060600080546106f890613140565b80601f016020809104026020016040519081016040528092919081815260200182805461072490613140565b80156107715780601f1061074657610100808354040283529160200191610771565b820191906000526020600020905b81548152906001019060200180831161075457829003601f168201915b5050505050905090565b6000610786826115a1565b6107c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bc906131e4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080b82610acb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390613276565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089b61160d565b73ffffffffffffffffffffffffffffffffffffffff1614806108ca57506108c9816108c461160d565b611324565b5b610909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090090613308565b60405180910390fd5b6109138383611615565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097257600080fd5b80600e60006101000a81548160ff02191690831515021790555050565b60006065905090565b6109a96109a361160d565b826116ce565b6109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df9061339a565b60405180910390fd5b6109f38383836117ac565b505050565b6000600954905090565b610a1d83838360405180602001604052806000815250610d4b565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7e57600080fd5b60085482600954610a8f91906133e9565b1115610a9a57600080fd5b60005b82811015610ac257610aae33611a13565b508080610aba9061343f565b915050610a9d565b50819050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b906134fa565b60405180910390fd5b80915050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd757600080fd5b8060068190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c499061358c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610ca890613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd490613140565b8015610d215780601f10610cf657610100808354040283529160200191610d21565b820191906000526020600020905b815481529060010190602001808311610d0457829003601f168201915b5050505050905090565b6000600654905090565b610d47610d4061160d565b8383611aa4565b5050565b610d5c610d5661160d565b836116ce565b610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d929061339a565b60405180910390fd5b610da784848484611c11565b50505050565b600060085460095410158015610dcb5750610dc661098f565b600954105b8015610de45750600e60009054906101000a900460ff16155b905090565b60606000600a60008481526020019081526020016000205490506000811115610ead57610ea56040518060400160405280601281526020017f6c65742068617368537472696e67203d20270000000000000000000000000000815250610e4e83611c6d565b6040518060400160405280600381526020017f273b200000000000000000000000000000000000000000000000000000000000815250604051806108e001604052806108b68152602001613ed46108b69139611cf3565b915050610ec1565b604051806020016040528060008152509150505b919050565b6060600082118015610eda57506009548211155b156111f9576000611008600b8054610ef190613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1d90613140565b8015610f6a5780601f10610f3f57610100808354040283529160200191610f6a565b820191906000526020600020905b815481529060010190602001808311610f4d57829003601f168201915b5050505050610f7885611d1b565b600c8054610f8590613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb190613140565b8015610ffe5780601f10610fd357610100808354040283529160200191610ffe565b820191906000526020600020905b815481529060010190602001808311610fe157829003601f168201915b5050505050611e7c565b905060006110fd600d805461101c90613140565b80601f016020809104026020016040519081016040528092919081815260200182805461104890613140565b80156110955780601f1061106a57610100808354040283529160200191611095565b820191906000526020600020905b81548152906001019060200180831161107857829003601f168201915b50505050506110b93073ffffffffffffffffffffffffffffffffffffffff16611c6d565b6040518060400160405280600481526020017f2669643d000000000000000000000000000000000000000000000000000000008152506110f888611d1b565b611cf3565b905060006111906040518060400160405280600981526020017f22696d616765223a22000000000000000000000000000000000000000000000081525084604051806080016040528060438152602001613dd960439139856040518060400160405280600281526020017f222c000000000000000000000000000000000000000000000000000000000000815250611eb2565b90506111ef60405180606001604052806028815260200161478a602891396111b787611d1b565b6040518060c0016040528060858152602001613e1c6085913984604051806060016040528060338152602001613ea160339139611eb2565b935050505061120c565b6040518060200160405280600081525090505b919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461126b57600080fd5b81600b908051906020019061128192919061291c565b5080600c908051906020019061129892919061291c565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112f957600080fd5b61130161098f565b6009541061130e57600080fd5b600061131983611a13565b905080915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1663bcbf07006040518163ffffffff1660e01b8152600401602060405180830381865afa158015611405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142991906135c1565b61143257600080fd5b61143a610d2b565b34101561144657600080fd5b600061145133611a13565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156114bb573d6000803e3d6000fd5b508091505090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151d57600080fd5b80600d908051906020019061153392919061291c565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661168883610acb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116d9826115a1565b611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90613660565b60405180910390fd5b600061172383610acb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061176557506117648185611324565b5b806117a357508373ffffffffffffffffffffffffffffffffffffffff1661178b8461077b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117cc82610acb565b73ffffffffffffffffffffffffffffffffffffffff1614611822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611819906136f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990613784565b60405180910390fd5b61189d83838361222d565b6118a8600082611615565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118f891906137a4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461194f91906133e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a0e838383612232565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a4e57600080fd5b6001600954611a5d91906133e9565b600981905550600060095490506000611a768285612237565b905080600a600084815260200190815260200160002081905550611a9a84836122e2565b8192505050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90613824565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c049190612a73565b60405180910390a3505050565b611c1c8484846117ac565b611c2884848484612300565b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e906138b6565b60405180910390fd5b50505050565b60606000821415611cb5576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050611cee565b600082905060005b60008214611cdf578080611cd09061343f565b915050600882901c9150611cbd565b611ce98482612488565b925050505b919050565b6060611d118585858560405180602001604052806000815250611eb2565b9050949350505050565b60606000821415611d63576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e77565b600082905060005b60008214611d95578080611d7e9061343f565b915050600a82611d8e9190613905565b9150611d6b565b60008167ffffffffffffffff811115611db157611db0612dc1565b5b6040519080825280601f01601f191660200182016040528015611de35781602001600182028036833780820191505090505b5090505b60008514611e7057600182611dfc91906137a4565b9150600a85611e0b9190613936565b6030611e1791906133e9565b60f81b818381518110611e2d57611e2c613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e699190613905565b9450611de7565b8093505050505b919050565b6060611ea98484846040518060200160405280600081525060405180602001604052806000815250611eb2565b90509392505050565b606060008690506000869050600086905060008690506000869050600081518351855187518951611ee391906133e9565b611eed91906133e9565b611ef791906133e9565b611f0191906133e9565b67ffffffffffffffff811115611f1a57611f19612dc1565b5b6040519080825280601f01601f191660200182016040528015611f4c5781602001600182028036833780820191505090505b5090506000819050600080600090505b8851811015611fe457888181518110611f7857611f77613967565b5b602001015160f81c60f81b838380611f8f9061343f565b945081518110611fa257611fa1613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611fdc9061343f565b915050611f5c565b600090505b87518110156120715787818151811061200557612004613967565b5b602001015160f81c60f81b83838061201c9061343f565b94508151811061202f5761202e613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806120699061343f565b915050611fe9565b600090505b86518110156120fe5786818151811061209257612091613967565b5b602001015160f81c60f81b8383806120a99061343f565b9450815181106120bc576120bb613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806120f69061343f565b915050612076565b600090505b855181101561218b5785818151811061211f5761211e613967565b5b602001015160f81c60f81b8383806121369061343f565b94508151811061214957612148613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121839061343f565b915050612103565b600090505b8451811015612218578481815181106121ac576121ab613967565b5b602001015160f81c60f81b8383806121c39061343f565b9450815181106121d6576121d5613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122109061343f565b915050612190565b82995050505050505050505095945050505050565b505050565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015612284573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122ad9190613a06565b83836040516020016122c193929190613af4565b6040516020818303038152906040528051906020012060001c905092915050565b6122fc8282604051806020016040528060008152506126c4565b5050565b60006123218473ffffffffffffffffffffffffffffffffffffffff1661271f565b1561247b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261234a61160d565b8786866040518563ffffffff1660e01b815260040161236c9493929190613b82565b6020604051808303816000875af19250505080156123a857506040513d601f19601f820116820180604052508101906123a59190613be3565b60015b61242b573d80600081146123d8576040519150601f19603f3d011682016040523d82523d6000602084013e6123dd565b606091505b50600081511415612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a906138b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612480565b600190505b949350505050565b60606000600283600261249b9190613c10565b6124a591906133e9565b67ffffffffffffffff8111156124be576124bd612dc1565b5b6040519080825280601f01601f1916602001820160405280156124f05781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061252857612527613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061258c5761258b613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026125cc9190613c10565b6125d691906133e9565b90505b6001811115612676577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061261857612617613967565b5b1a60f81b82828151811061262f5761262e613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061266f90613c6a565b90506125d9565b50600084146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b190613ce0565b60405180910390fd5b8091505092915050565b6126ce8383612742565b6126db6000848484612300565b61271a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612711906138b6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a990613d4c565b60405180910390fd5b6127bb816115a1565b156127fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f290613db8565b60405180910390fd5b6128076000838361222d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461285791906133e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461291860008383612232565b5050565b82805461292890613140565b90600052602060002090601f01602090048101928261294a5760008555612991565b82601f1061296357805160ff1916838001178555612991565b82800160010185558215612991579182015b82811115612990578251825591602001919060010190612975565b5b50905061299e91906129a2565b5090565b5b808211156129bb5760008160009055506001016129a3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a08816129d3565b8114612a1357600080fd5b50565b600081359050612a25816129ff565b92915050565b600060208284031215612a4157612a406129c9565b5b6000612a4f84828501612a16565b91505092915050565b60008115159050919050565b612a6d81612a58565b82525050565b6000602082019050612a886000830184612a64565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ac8578082015181840152602081019050612aad565b83811115612ad7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612af982612a8e565b612b038185612a99565b9350612b13818560208601612aaa565b612b1c81612add565b840191505092915050565b60006020820190508181036000830152612b418184612aee565b905092915050565b6000819050919050565b612b5c81612b49565b8114612b6757600080fd5b50565b600081359050612b7981612b53565b92915050565b600060208284031215612b9557612b946129c9565b5b6000612ba384828501612b6a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd782612bac565b9050919050565b612be781612bcc565b82525050565b6000602082019050612c026000830184612bde565b92915050565b612c1181612bcc565b8114612c1c57600080fd5b50565b600081359050612c2e81612c08565b92915050565b60008060408385031215612c4b57612c4a6129c9565b5b6000612c5985828601612c1f565b9250506020612c6a85828601612b6a565b9150509250929050565b612c7d81612a58565b8114612c8857600080fd5b50565b600081359050612c9a81612c74565b92915050565b600060208284031215612cb657612cb56129c9565b5b6000612cc484828501612c8b565b91505092915050565b612cd681612b49565b82525050565b6000602082019050612cf16000830184612ccd565b92915050565b600080600060608486031215612d1057612d0f6129c9565b5b6000612d1e86828701612c1f565b9350506020612d2f86828701612c1f565b9250506040612d4086828701612b6a565b9150509250925092565b600060208284031215612d6057612d5f6129c9565b5b6000612d6e84828501612c1f565b91505092915050565b60008060408385031215612d8e57612d8d6129c9565b5b6000612d9c85828601612c1f565b9250506020612dad85828601612c8b565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612df982612add565b810181811067ffffffffffffffff82111715612e1857612e17612dc1565b5b80604052505050565b6000612e2b6129bf565b9050612e378282612df0565b919050565b600067ffffffffffffffff821115612e5757612e56612dc1565b5b612e6082612add565b9050602081019050919050565b82818337600083830152505050565b6000612e8f612e8a84612e3c565b612e21565b905082815260208101848484011115612eab57612eaa612dbc565b5b612eb6848285612e6d565b509392505050565b600082601f830112612ed357612ed2612db7565b5b8135612ee3848260208601612e7c565b91505092915050565b60008060008060808587031215612f0657612f056129c9565b5b6000612f1487828801612c1f565b9450506020612f2587828801612c1f565b9350506040612f3687828801612b6a565b925050606085013567ffffffffffffffff811115612f5757612f566129ce565b5b612f6387828801612ebe565b91505092959194509250565b600067ffffffffffffffff821115612f8a57612f89612dc1565b5b612f9382612add565b9050602081019050919050565b6000612fb3612fae84612f6f565b612e21565b905082815260208101848484011115612fcf57612fce612dbc565b5b612fda848285612e6d565b509392505050565b600082601f830112612ff757612ff6612db7565b5b8135613007848260208601612fa0565b91505092915050565b60008060408385031215613027576130266129c9565b5b600083013567ffffffffffffffff811115613045576130446129ce565b5b61305185828601612fe2565b925050602083013567ffffffffffffffff811115613072576130716129ce565b5b61307e85828601612fe2565b9150509250929050565b6000806040838503121561309f5761309e6129c9565b5b60006130ad85828601612c1f565b92505060206130be85828601612c1f565b9150509250929050565b6000602082840312156130de576130dd6129c9565b5b600082013567ffffffffffffffff8111156130fc576130fb6129ce565b5b61310884828501612fe2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061315857607f821691505b6020821081141561316c5761316b613111565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006131ce602c83612a99565b91506131d982613172565b604082019050919050565b600060208201905081810360008301526131fd816131c1565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613260602183612a99565b915061326b82613204565b604082019050919050565b6000602082019050818103600083015261328f81613253565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006132f2603883612a99565b91506132fd82613296565b604082019050919050565b60006020820190508181036000830152613321816132e5565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613384603183612a99565b915061338f82613328565b604082019050919050565b600060208201905081810360008301526133b381613377565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133f482612b49565b91506133ff83612b49565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613434576134336133ba565b5b828201905092915050565b600061344a82612b49565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561347d5761347c6133ba565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006134e4602983612a99565b91506134ef82613488565b604082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613576602a83612a99565b91506135818261351a565b604082019050919050565b600060208201905081810360008301526135a581613569565b9050919050565b6000815190506135bb81612c74565b92915050565b6000602082840312156135d7576135d66129c9565b5b60006135e5848285016135ac565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061364a602c83612a99565b9150613655826135ee565b604082019050919050565b600060208201905081810360008301526136798161363d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006136dc602583612a99565b91506136e782613680565b604082019050919050565b6000602082019050818103600083015261370b816136cf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061376e602483612a99565b915061377982613712565b604082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b60006137af82612b49565b91506137ba83612b49565b9250828210156137cd576137cc6133ba565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061380e601983612a99565b9150613819826137d8565b602082019050919050565b6000602082019050818103600083015261383d81613801565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138a0603283612a99565b91506138ab82613844565b604082019050919050565b600060208201905081810360008301526138cf81613893565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061391082612b49565b915061391b83612b49565b92508261392b5761392a6138d6565b5b828204905092915050565b600061394182612b49565b915061394c83612b49565b92508261395c5761395b6138d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006139a96139a484612f6f565b612e21565b9050828152602081018484840111156139c5576139c4612dbc565b5b6139d0848285612aaa565b509392505050565b600082601f8301126139ed576139ec612db7565b5b81516139fd848260208601613996565b91505092915050565b600060208284031215613a1c57613a1b6129c9565b5b600082015167ffffffffffffffff811115613a3a57613a396129ce565b5b613a46848285016139d8565b91505092915050565b600081905092915050565b6000613a6582612a8e565b613a6f8185613a4f565b9350613a7f818560208601612aaa565b80840191505092915050565b6000819050919050565b613aa6613aa182612b49565b613a8b565b82525050565b60008160601b9050919050565b6000613ac482613aac565b9050919050565b6000613ad682613ab9565b9050919050565b613aee613ae982612bcc565b613acb565b82525050565b6000613b008286613a5a565b9150613b0c8285613a95565b602082019150613b1c8284613add565b601482019150819050949350505050565b600081519050919050565b600082825260208201905092915050565b6000613b5482613b2d565b613b5e8185613b38565b9350613b6e818560208601612aaa565b613b7781612add565b840191505092915050565b6000608082019050613b976000830187612bde565b613ba46020830186612bde565b613bb16040830185612ccd565b8181036060830152613bc38184613b49565b905095945050505050565b600081519050613bdd816129ff565b92915050565b600060208284031215613bf957613bf86129c9565b5b6000613c0784828501613bce565b91505092915050565b6000613c1b82612b49565b9150613c2683612b49565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c5f57613c5e6133ba565b5b828202905092915050565b6000613c7582612b49565b91506000821415613c8957613c886133ba565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613cca602083612a99565b9150613cd582613c94565b602082019050919050565b60006020820190508181036000830152613cf981613cbd565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613d36602083612a99565b9150613d4182613d00565b602082019050919050565b60006020820190508181036000830152613d6581613d29565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613da2601c83612a99565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b905091905056fe222c2265787465726e616c5f75726c223a2268747470733a2f2f7777772e6d79617274636f6e74726163742e636f6d2f222c22616e696d6174696f6e5f75726c223a22222c226465736372697074696f6e223a22546865204d792041727420436f6e74726163742047656e6573697320636f6c6c656374696f6e20696e70697265642062792074686520776f726b206f662050696574204d6f6e64726961616e207468617420636170747572657320746865207069657220616e6420746865206f6365616e2e222c22696e746572616374696f6e223a22537061636520626172206368616e676573207468652063616e76617320636f6c6f72227d6c657420686f72203d205b5d3b20666f7220286c65742069203d20323b2069203c2033343b20692b3d3429207b20686f722e707573682868617368537472696e672e736c69636528692c20692b3429293b207d206c657420766572203d205b5d3b20666f7220286c65742069203d2033343b2069203c2036363b20692b3d3429207b207665722e707573682868617368537472696e672e736c69636528692c20692b3429293b207d206c657420686f724c696e6573203d20686f722e6d61702878203d3e207061727365496e7428782c20313629293b206c6574207665724c696e6573203d207665722e6d61702878203d3e207061727365496e7428782c20313629293b206c6574206d61736b203d20307846463b206c6574206261636b67726f756e64496e6465783b206c6574206261636b67726f756e644172726179203d205b3235352c3230302c3130302c35302c305d3b206c6574206f757450616464696e67203d2034303b206c657420696e50616464696e67203d2031353b206c65742073697a65203d2032353b206c6574207363616c653b206c65742064696d3b2066756e6374696f6e2073657475702829207b2064696d203d20283732202a202873697a65202b20696e50616464696e6729293b206c65742073637265656e203d204d6174682e6d696e2877696e646f772e696e6e657257696474682c2077696e646f772e696e6e657248656967687429202d2031363b207363616c65203d2073637265656e2f2864696d202b20286f757450616464696e67202a203229293b2063726561746543616e7661732873637265656e2c2073637265656e293b20636f6c6f724d6f6465285247422c203235362c312c312c323535293b206261636b67726f756e64496e646578203d2028686f724c696e65735b305d2026206d61736b29203c203236203f2034203a20303b207d2066756e6374696f6e20647261774c696e6573286c696e652c20692c2065787450616464696e672c20706f732c20686f72697a6f6e74616c29207b206c65742076657256616c203d20286c696e65203e3e2069292026206d61736b3b206966202876657256616c203c2073697a6529207b2076657256616c202b3d2073697a653b207d20656c7365206966202876657256616c203e202837322a322929207b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20322e38352c20686f72697a6f6e74616c293b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20322e30352c20686f72697a6f6e74616c293b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20312e37302c20686f72697a6f6e74616c293b2076657256616c202f3d20312e32353b207d20656c7365206966202876657256616c203e20373229207b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20322e32352c20686f72697a6f6e74616c293b2076657256616c202f3d20312e353b207d20647261774c696e652865787450616464696e672c20706f732c2076657256616c2c20686f72697a6f6e74616c293b207d2066756e6374696f6e20647261774c696e652865787450616464696e672c2073746172742c2076616c75652c20686f72697a6f6e74616c29207b206c6574206974656d203d206f757450616464696e67202b2065787450616464696e67202b2028282864696d202d202865787450616464696e67202a20322929202d2032353629202f20373229202a202876616c75652025203732293b2069662028686f72697a6f6e74616c29207b206c696e65286974656d202a207363616c652c207374617274202a207363616c652c20286974656d202b2076616c756529202a207363616c652c207374617274202a207363616c65293b207d20656c7365207b206c696e65287374617274202a207363616c652c206974656d202a207363616c652c207374617274202a207363616c652c20286974656d202b2076616c756529202a207363616c65293b207d207d2066756e6374696f6e206b6579507265737365642829207b20696620286b6579436f6465203d3d3d20333229207b20696620286261636b67726f756e64496e646578203c206261636b67726f756e6441727261792e6c656e677468202d203129207b206261636b67726f756e64496e6465782b2b3b207d20656c7365207b206261636b67726f756e64496e646578203d20303b207d207d207d2066756e6374696f6e20647261772829207b206261636b67726f756e64286261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d293b207374726f6b655765696768742873697a65202a207363616c65293b207374726f6b6543617028535155415245293b207374726f6b65283235352d6261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d2c203235352d6261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d2c203235352d6261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d293b206c6574206974656d203d20303b20666f7220286c6574206f203d20303b206f203c20383b206f2b2b29207b20666f7220287661722069203d20303b2069203c20393b20692b2b29207b206c65742065787450616464696e67203d206974656d203c203138203f202864696d202f20353429202a20283138202d206974656d29203a206974656d203e3d203534203f202864696d202f20353429202a2028206974656d202d20353429203a20303b206c657420706f73203d20286974656d202a202873697a65202b20696e50616464696e672929202b206f757450616464696e673b20647261774c696e6573287665724c696e65735b6f5d2c20692c2065787450616464696e672c20706f732c2066616c7365293b20647261774c696e657328686f724c696e65735b6f5d2c20692c2065787450616464696e672c20706f732c2074727565293b206974656d2b2b3b207d207d207d646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a224f4345414e20253233a2646970667358221220f53cf41c7ee09067c0a3ff96e699428b9017421c9a438984626f85702785b39164736f6c634300080c0033687474703a2f2f70726f6a6563742e6d79617274636f6e74726163742e636f6d2f696d6167652e68746d6c3f636f6e74726163743d

Deployed Bytecode

0x6080604052600436106101665760003560e01c806370a08231116100d1578063c569bd951161008a578063d7da77c811610064578063d7da77c814610553578063e985e9c514610583578063efc81a8c146105c0578063fa96954c146105de57610166565b8063c569bd95146104b0578063c87b56dd146104ed578063c9834e7e1461052a57610166565b806370a08231146103a057806395d89b41146103dd578063a035b1fe14610408578063a22cb46514610433578063b88d4fde1461045c578063bcbf07001461048557610166565b806323b872dd1161012357806323b872dd1461028d578063325a19f1146102b657806342842e0e146102e15780635c0333191461030a5780636352211e1461033a5780636a61e5fc1461037757610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806316c38b3c1461023957806318160ddd14610262575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612a2b565b610607565b60405161019f9190612a73565b60405180910390f35b3480156101b457600080fd5b506101bd6106e9565b6040516101ca9190612b27565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612b7f565b61077b565b6040516102079190612bed565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612c34565b610800565b005b34801561024557600080fd5b50610260600480360381019061025b9190612ca0565b610918565b005b34801561026e57600080fd5b5061027761098f565b6040516102849190612cdc565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612cf7565b610998565b005b3480156102c257600080fd5b506102cb6109f8565b6040516102d89190612cdc565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190612cf7565b610a02565b005b610324600480360381019061031f9190612b7f565b610a22565b6040516103319190612cdc565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190612b7f565b610acb565b60405161036e9190612bed565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190612b7f565b610b7d565b005b3480156103ac57600080fd5b506103c760048036038101906103c29190612d4a565b610be1565b6040516103d49190612cdc565b60405180910390f35b3480156103e957600080fd5b506103f2610c99565b6040516103ff9190612b27565b60405180910390f35b34801561041457600080fd5b5061041d610d2b565b60405161042a9190612cdc565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190612d77565b610d35565b005b34801561046857600080fd5b50610483600480360381019061047e9190612eec565b610d4b565b005b34801561049157600080fd5b5061049a610dad565b6040516104a79190612a73565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190612b7f565b610de9565b6040516104e49190612b27565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190612b7f565b610ec6565b6040516105219190612b27565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613010565b611211565b005b61056d60048036038101906105689190612d4a565b61129d565b60405161057a9190612cdc565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613088565b611324565b6040516105b79190612a73565b60405180910390f35b6105c86113b8565b6040516105d59190612cdc565b60405180910390f35b3480156105ea57600080fd5b50610605600480360381019061060091906130c8565b6114c3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e257506106e182611537565b5b9050919050565b6060600080546106f890613140565b80601f016020809104026020016040519081016040528092919081815260200182805461072490613140565b80156107715780601f1061074657610100808354040283529160200191610771565b820191906000526020600020905b81548152906001019060200180831161075457829003601f168201915b5050505050905090565b6000610786826115a1565b6107c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bc906131e4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080b82610acb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390613276565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089b61160d565b73ffffffffffffffffffffffffffffffffffffffff1614806108ca57506108c9816108c461160d565b611324565b5b610909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090090613308565b60405180910390fd5b6109138383611615565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097257600080fd5b80600e60006101000a81548160ff02191690831515021790555050565b60006065905090565b6109a96109a361160d565b826116ce565b6109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df9061339a565b60405180910390fd5b6109f38383836117ac565b505050565b6000600954905090565b610a1d83838360405180602001604052806000815250610d4b565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7e57600080fd5b60085482600954610a8f91906133e9565b1115610a9a57600080fd5b60005b82811015610ac257610aae33611a13565b508080610aba9061343f565b915050610a9d565b50819050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b906134fa565b60405180910390fd5b80915050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd757600080fd5b8060068190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c499061358c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610ca890613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd490613140565b8015610d215780601f10610cf657610100808354040283529160200191610d21565b820191906000526020600020905b815481529060010190602001808311610d0457829003601f168201915b5050505050905090565b6000600654905090565b610d47610d4061160d565b8383611aa4565b5050565b610d5c610d5661160d565b836116ce565b610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d929061339a565b60405180910390fd5b610da784848484611c11565b50505050565b600060085460095410158015610dcb5750610dc661098f565b600954105b8015610de45750600e60009054906101000a900460ff16155b905090565b60606000600a60008481526020019081526020016000205490506000811115610ead57610ea56040518060400160405280601281526020017f6c65742068617368537472696e67203d20270000000000000000000000000000815250610e4e83611c6d565b6040518060400160405280600381526020017f273b200000000000000000000000000000000000000000000000000000000000815250604051806108e001604052806108b68152602001613ed46108b69139611cf3565b915050610ec1565b604051806020016040528060008152509150505b919050565b6060600082118015610eda57506009548211155b156111f9576000611008600b8054610ef190613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1d90613140565b8015610f6a5780601f10610f3f57610100808354040283529160200191610f6a565b820191906000526020600020905b815481529060010190602001808311610f4d57829003601f168201915b5050505050610f7885611d1b565b600c8054610f8590613140565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb190613140565b8015610ffe5780601f10610fd357610100808354040283529160200191610ffe565b820191906000526020600020905b815481529060010190602001808311610fe157829003601f168201915b5050505050611e7c565b905060006110fd600d805461101c90613140565b80601f016020809104026020016040519081016040528092919081815260200182805461104890613140565b80156110955780601f1061106a57610100808354040283529160200191611095565b820191906000526020600020905b81548152906001019060200180831161107857829003601f168201915b50505050506110b93073ffffffffffffffffffffffffffffffffffffffff16611c6d565b6040518060400160405280600481526020017f2669643d000000000000000000000000000000000000000000000000000000008152506110f888611d1b565b611cf3565b905060006111906040518060400160405280600981526020017f22696d616765223a22000000000000000000000000000000000000000000000081525084604051806080016040528060438152602001613dd960439139856040518060400160405280600281526020017f222c000000000000000000000000000000000000000000000000000000000000815250611eb2565b90506111ef60405180606001604052806028815260200161478a602891396111b787611d1b565b6040518060c0016040528060858152602001613e1c6085913984604051806060016040528060338152602001613ea160339139611eb2565b935050505061120c565b6040518060200160405280600081525090505b919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461126b57600080fd5b81600b908051906020019061128192919061291c565b5080600c908051906020019061129892919061291c565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112f957600080fd5b61130161098f565b6009541061130e57600080fd5b600061131983611a13565b905080915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1663bcbf07006040518163ffffffff1660e01b8152600401602060405180830381865afa158015611405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142991906135c1565b61143257600080fd5b61143a610d2b565b34101561144657600080fd5b600061145133611a13565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156114bb573d6000803e3d6000fd5b508091505090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151d57600080fd5b80600d908051906020019061153392919061291c565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661168883610acb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116d9826115a1565b611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90613660565b60405180910390fd5b600061172383610acb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061176557506117648185611324565b5b806117a357508373ffffffffffffffffffffffffffffffffffffffff1661178b8461077b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117cc82610acb565b73ffffffffffffffffffffffffffffffffffffffff1614611822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611819906136f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990613784565b60405180910390fd5b61189d83838361222d565b6118a8600082611615565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118f891906137a4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461194f91906133e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a0e838383612232565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a4e57600080fd5b6001600954611a5d91906133e9565b600981905550600060095490506000611a768285612237565b905080600a600084815260200190815260200160002081905550611a9a84836122e2565b8192505050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90613824565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c049190612a73565b60405180910390a3505050565b611c1c8484846117ac565b611c2884848484612300565b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e906138b6565b60405180910390fd5b50505050565b60606000821415611cb5576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050611cee565b600082905060005b60008214611cdf578080611cd09061343f565b915050600882901c9150611cbd565b611ce98482612488565b925050505b919050565b6060611d118585858560405180602001604052806000815250611eb2565b9050949350505050565b60606000821415611d63576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e77565b600082905060005b60008214611d95578080611d7e9061343f565b915050600a82611d8e9190613905565b9150611d6b565b60008167ffffffffffffffff811115611db157611db0612dc1565b5b6040519080825280601f01601f191660200182016040528015611de35781602001600182028036833780820191505090505b5090505b60008514611e7057600182611dfc91906137a4565b9150600a85611e0b9190613936565b6030611e1791906133e9565b60f81b818381518110611e2d57611e2c613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e699190613905565b9450611de7565b8093505050505b919050565b6060611ea98484846040518060200160405280600081525060405180602001604052806000815250611eb2565b90509392505050565b606060008690506000869050600086905060008690506000869050600081518351855187518951611ee391906133e9565b611eed91906133e9565b611ef791906133e9565b611f0191906133e9565b67ffffffffffffffff811115611f1a57611f19612dc1565b5b6040519080825280601f01601f191660200182016040528015611f4c5781602001600182028036833780820191505090505b5090506000819050600080600090505b8851811015611fe457888181518110611f7857611f77613967565b5b602001015160f81c60f81b838380611f8f9061343f565b945081518110611fa257611fa1613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611fdc9061343f565b915050611f5c565b600090505b87518110156120715787818151811061200557612004613967565b5b602001015160f81c60f81b83838061201c9061343f565b94508151811061202f5761202e613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806120699061343f565b915050611fe9565b600090505b86518110156120fe5786818151811061209257612091613967565b5b602001015160f81c60f81b8383806120a99061343f565b9450815181106120bc576120bb613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806120f69061343f565b915050612076565b600090505b855181101561218b5785818151811061211f5761211e613967565b5b602001015160f81c60f81b8383806121369061343f565b94508151811061214957612148613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121839061343f565b915050612103565b600090505b8451811015612218578481815181106121ac576121ab613967565b5b602001015160f81c60f81b8383806121c39061343f565b9450815181106121d6576121d5613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122109061343f565b915050612190565b82995050505050505050505095945050505050565b505050565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015612284573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906122ad9190613a06565b83836040516020016122c193929190613af4565b6040516020818303038152906040528051906020012060001c905092915050565b6122fc8282604051806020016040528060008152506126c4565b5050565b60006123218473ffffffffffffffffffffffffffffffffffffffff1661271f565b1561247b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261234a61160d565b8786866040518563ffffffff1660e01b815260040161236c9493929190613b82565b6020604051808303816000875af19250505080156123a857506040513d601f19601f820116820180604052508101906123a59190613be3565b60015b61242b573d80600081146123d8576040519150601f19603f3d011682016040523d82523d6000602084013e6123dd565b606091505b50600081511415612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a906138b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612480565b600190505b949350505050565b60606000600283600261249b9190613c10565b6124a591906133e9565b67ffffffffffffffff8111156124be576124bd612dc1565b5b6040519080825280601f01601f1916602001820160405280156124f05781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061252857612527613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061258c5761258b613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026125cc9190613c10565b6125d691906133e9565b90505b6001811115612676577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061261857612617613967565b5b1a60f81b82828151811061262f5761262e613967565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061266f90613c6a565b90506125d9565b50600084146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b190613ce0565b60405180910390fd5b8091505092915050565b6126ce8383612742565b6126db6000848484612300565b61271a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612711906138b6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a990613d4c565b60405180910390fd5b6127bb816115a1565b156127fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f290613db8565b60405180910390fd5b6128076000838361222d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461285791906133e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461291860008383612232565b5050565b82805461292890613140565b90600052602060002090601f01602090048101928261294a5760008555612991565b82601f1061296357805160ff1916838001178555612991565b82800160010185558215612991579182015b82811115612990578251825591602001919060010190612975565b5b50905061299e91906129a2565b5090565b5b808211156129bb5760008160009055506001016129a3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a08816129d3565b8114612a1357600080fd5b50565b600081359050612a25816129ff565b92915050565b600060208284031215612a4157612a406129c9565b5b6000612a4f84828501612a16565b91505092915050565b60008115159050919050565b612a6d81612a58565b82525050565b6000602082019050612a886000830184612a64565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ac8578082015181840152602081019050612aad565b83811115612ad7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612af982612a8e565b612b038185612a99565b9350612b13818560208601612aaa565b612b1c81612add565b840191505092915050565b60006020820190508181036000830152612b418184612aee565b905092915050565b6000819050919050565b612b5c81612b49565b8114612b6757600080fd5b50565b600081359050612b7981612b53565b92915050565b600060208284031215612b9557612b946129c9565b5b6000612ba384828501612b6a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd782612bac565b9050919050565b612be781612bcc565b82525050565b6000602082019050612c026000830184612bde565b92915050565b612c1181612bcc565b8114612c1c57600080fd5b50565b600081359050612c2e81612c08565b92915050565b60008060408385031215612c4b57612c4a6129c9565b5b6000612c5985828601612c1f565b9250506020612c6a85828601612b6a565b9150509250929050565b612c7d81612a58565b8114612c8857600080fd5b50565b600081359050612c9a81612c74565b92915050565b600060208284031215612cb657612cb56129c9565b5b6000612cc484828501612c8b565b91505092915050565b612cd681612b49565b82525050565b6000602082019050612cf16000830184612ccd565b92915050565b600080600060608486031215612d1057612d0f6129c9565b5b6000612d1e86828701612c1f565b9350506020612d2f86828701612c1f565b9250506040612d4086828701612b6a565b9150509250925092565b600060208284031215612d6057612d5f6129c9565b5b6000612d6e84828501612c1f565b91505092915050565b60008060408385031215612d8e57612d8d6129c9565b5b6000612d9c85828601612c1f565b9250506020612dad85828601612c8b565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612df982612add565b810181811067ffffffffffffffff82111715612e1857612e17612dc1565b5b80604052505050565b6000612e2b6129bf565b9050612e378282612df0565b919050565b600067ffffffffffffffff821115612e5757612e56612dc1565b5b612e6082612add565b9050602081019050919050565b82818337600083830152505050565b6000612e8f612e8a84612e3c565b612e21565b905082815260208101848484011115612eab57612eaa612dbc565b5b612eb6848285612e6d565b509392505050565b600082601f830112612ed357612ed2612db7565b5b8135612ee3848260208601612e7c565b91505092915050565b60008060008060808587031215612f0657612f056129c9565b5b6000612f1487828801612c1f565b9450506020612f2587828801612c1f565b9350506040612f3687828801612b6a565b925050606085013567ffffffffffffffff811115612f5757612f566129ce565b5b612f6387828801612ebe565b91505092959194509250565b600067ffffffffffffffff821115612f8a57612f89612dc1565b5b612f9382612add565b9050602081019050919050565b6000612fb3612fae84612f6f565b612e21565b905082815260208101848484011115612fcf57612fce612dbc565b5b612fda848285612e6d565b509392505050565b600082601f830112612ff757612ff6612db7565b5b8135613007848260208601612fa0565b91505092915050565b60008060408385031215613027576130266129c9565b5b600083013567ffffffffffffffff811115613045576130446129ce565b5b61305185828601612fe2565b925050602083013567ffffffffffffffff811115613072576130716129ce565b5b61307e85828601612fe2565b9150509250929050565b6000806040838503121561309f5761309e6129c9565b5b60006130ad85828601612c1f565b92505060206130be85828601612c1f565b9150509250929050565b6000602082840312156130de576130dd6129c9565b5b600082013567ffffffffffffffff8111156130fc576130fb6129ce565b5b61310884828501612fe2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061315857607f821691505b6020821081141561316c5761316b613111565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006131ce602c83612a99565b91506131d982613172565b604082019050919050565b600060208201905081810360008301526131fd816131c1565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613260602183612a99565b915061326b82613204565b604082019050919050565b6000602082019050818103600083015261328f81613253565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006132f2603883612a99565b91506132fd82613296565b604082019050919050565b60006020820190508181036000830152613321816132e5565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613384603183612a99565b915061338f82613328565b604082019050919050565b600060208201905081810360008301526133b381613377565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133f482612b49565b91506133ff83612b49565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613434576134336133ba565b5b828201905092915050565b600061344a82612b49565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561347d5761347c6133ba565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006134e4602983612a99565b91506134ef82613488565b604082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613576602a83612a99565b91506135818261351a565b604082019050919050565b600060208201905081810360008301526135a581613569565b9050919050565b6000815190506135bb81612c74565b92915050565b6000602082840312156135d7576135d66129c9565b5b60006135e5848285016135ac565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061364a602c83612a99565b9150613655826135ee565b604082019050919050565b600060208201905081810360008301526136798161363d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006136dc602583612a99565b91506136e782613680565b604082019050919050565b6000602082019050818103600083015261370b816136cf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061376e602483612a99565b915061377982613712565b604082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b60006137af82612b49565b91506137ba83612b49565b9250828210156137cd576137cc6133ba565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061380e601983612a99565b9150613819826137d8565b602082019050919050565b6000602082019050818103600083015261383d81613801565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138a0603283612a99565b91506138ab82613844565b604082019050919050565b600060208201905081810360008301526138cf81613893565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061391082612b49565b915061391b83612b49565b92508261392b5761392a6138d6565b5b828204905092915050565b600061394182612b49565b915061394c83612b49565b92508261395c5761395b6138d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006139a96139a484612f6f565b612e21565b9050828152602081018484840111156139c5576139c4612dbc565b5b6139d0848285612aaa565b509392505050565b600082601f8301126139ed576139ec612db7565b5b81516139fd848260208601613996565b91505092915050565b600060208284031215613a1c57613a1b6129c9565b5b600082015167ffffffffffffffff811115613a3a57613a396129ce565b5b613a46848285016139d8565b91505092915050565b600081905092915050565b6000613a6582612a8e565b613a6f8185613a4f565b9350613a7f818560208601612aaa565b80840191505092915050565b6000819050919050565b613aa6613aa182612b49565b613a8b565b82525050565b60008160601b9050919050565b6000613ac482613aac565b9050919050565b6000613ad682613ab9565b9050919050565b613aee613ae982612bcc565b613acb565b82525050565b6000613b008286613a5a565b9150613b0c8285613a95565b602082019150613b1c8284613add565b601482019150819050949350505050565b600081519050919050565b600082825260208201905092915050565b6000613b5482613b2d565b613b5e8185613b38565b9350613b6e818560208601612aaa565b613b7781612add565b840191505092915050565b6000608082019050613b976000830187612bde565b613ba46020830186612bde565b613bb16040830185612ccd565b8181036060830152613bc38184613b49565b905095945050505050565b600081519050613bdd816129ff565b92915050565b600060208284031215613bf957613bf86129c9565b5b6000613c0784828501613bce565b91505092915050565b6000613c1b82612b49565b9150613c2683612b49565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c5f57613c5e6133ba565b5b828202905092915050565b6000613c7582612b49565b91506000821415613c8957613c886133ba565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613cca602083612a99565b9150613cd582613c94565b602082019050919050565b60006020820190508181036000830152613cf981613cbd565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613d36602083612a99565b9150613d4182613d00565b602082019050919050565b60006020820190508181036000830152613d6581613d29565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613da2601c83612a99565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b905091905056fe222c2265787465726e616c5f75726c223a2268747470733a2f2f7777772e6d79617274636f6e74726163742e636f6d2f222c22616e696d6174696f6e5f75726c223a22222c226465736372697074696f6e223a22546865204d792041727420436f6e74726163742047656e6573697320636f6c6c656374696f6e20696e70697265642062792074686520776f726b206f662050696574204d6f6e64726961616e207468617420636170747572657320746865207069657220616e6420746865206f6365616e2e222c22696e746572616374696f6e223a22537061636520626172206368616e676573207468652063616e76617320636f6c6f72227d6c657420686f72203d205b5d3b20666f7220286c65742069203d20323b2069203c2033343b20692b3d3429207b20686f722e707573682868617368537472696e672e736c69636528692c20692b3429293b207d206c657420766572203d205b5d3b20666f7220286c65742069203d2033343b2069203c2036363b20692b3d3429207b207665722e707573682868617368537472696e672e736c69636528692c20692b3429293b207d206c657420686f724c696e6573203d20686f722e6d61702878203d3e207061727365496e7428782c20313629293b206c6574207665724c696e6573203d207665722e6d61702878203d3e207061727365496e7428782c20313629293b206c6574206d61736b203d20307846463b206c6574206261636b67726f756e64496e6465783b206c6574206261636b67726f756e644172726179203d205b3235352c3230302c3130302c35302c305d3b206c6574206f757450616464696e67203d2034303b206c657420696e50616464696e67203d2031353b206c65742073697a65203d2032353b206c6574207363616c653b206c65742064696d3b2066756e6374696f6e2073657475702829207b2064696d203d20283732202a202873697a65202b20696e50616464696e6729293b206c65742073637265656e203d204d6174682e6d696e2877696e646f772e696e6e657257696474682c2077696e646f772e696e6e657248656967687429202d2031363b207363616c65203d2073637265656e2f2864696d202b20286f757450616464696e67202a203229293b2063726561746543616e7661732873637265656e2c2073637265656e293b20636f6c6f724d6f6465285247422c203235362c312c312c323535293b206261636b67726f756e64496e646578203d2028686f724c696e65735b305d2026206d61736b29203c203236203f2034203a20303b207d2066756e6374696f6e20647261774c696e6573286c696e652c20692c2065787450616464696e672c20706f732c20686f72697a6f6e74616c29207b206c65742076657256616c203d20286c696e65203e3e2069292026206d61736b3b206966202876657256616c203c2073697a6529207b2076657256616c202b3d2073697a653b207d20656c7365206966202876657256616c203e202837322a322929207b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20322e38352c20686f72697a6f6e74616c293b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20322e30352c20686f72697a6f6e74616c293b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20312e37302c20686f72697a6f6e74616c293b2076657256616c202f3d20312e32353b207d20656c7365206966202876657256616c203e20373229207b20647261774c696e652865787450616464696e672c20706f732c2076657256616c202f20322e32352c20686f72697a6f6e74616c293b2076657256616c202f3d20312e353b207d20647261774c696e652865787450616464696e672c20706f732c2076657256616c2c20686f72697a6f6e74616c293b207d2066756e6374696f6e20647261774c696e652865787450616464696e672c2073746172742c2076616c75652c20686f72697a6f6e74616c29207b206c6574206974656d203d206f757450616464696e67202b2065787450616464696e67202b2028282864696d202d202865787450616464696e67202a20322929202d2032353629202f20373229202a202876616c75652025203732293b2069662028686f72697a6f6e74616c29207b206c696e65286974656d202a207363616c652c207374617274202a207363616c652c20286974656d202b2076616c756529202a207363616c652c207374617274202a207363616c65293b207d20656c7365207b206c696e65287374617274202a207363616c652c206974656d202a207363616c652c207374617274202a207363616c652c20286974656d202b2076616c756529202a207363616c65293b207d207d2066756e6374696f6e206b6579507265737365642829207b20696620286b6579436f6465203d3d3d20333229207b20696620286261636b67726f756e64496e646578203c206261636b67726f756e6441727261792e6c656e677468202d203129207b206261636b67726f756e64496e6465782b2b3b207d20656c7365207b206261636b67726f756e64496e646578203d20303b207d207d207d2066756e6374696f6e20647261772829207b206261636b67726f756e64286261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d293b207374726f6b655765696768742873697a65202a207363616c65293b207374726f6b6543617028535155415245293b207374726f6b65283235352d6261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d2c203235352d6261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d2c203235352d6261636b67726f756e6441727261795b6261636b67726f756e64496e6465785d293b206c6574206974656d203d20303b20666f7220286c6574206f203d20303b206f203c20383b206f2b2b29207b20666f7220287661722069203d20303b2069203c20393b20692b2b29207b206c65742065787450616464696e67203d206974656d203c203138203f202864696d202f20353429202a20283138202d206974656d29203a206974656d203e3d203534203f202864696d202f20353429202a2028206974656d202d20353429203a20303b206c657420706f73203d20286974656d202a202873697a65202b20696e50616464696e672929202b206f757450616464696e673b20647261774c696e6573287665724c696e65735b6f5d2c20692c2065787450616464696e672c20706f732c2066616c7365293b20647261774c696e657328686f724c696e65735b6f5d2c20692c2065787450616464696e672c20706f732c2074727565293b206974656d2b2b3b207d207d207d646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a224f4345414e20253233a2646970667358221220f53cf41c7ee09067c0a3ff96e699428b9017421c9a438984626f85702785b39164736f6c634300080c0033

Deployed Bytecode Sourcemap

81:6538:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1505:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2423:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3473:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4750:114:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3064:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4662:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3248:80:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5058:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3338:282:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2126:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4870:130:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1864:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2585:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3159:79:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4219:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5303:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4425:144:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6344:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5371:963;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5006:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3626:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4438:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3864:242:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5224:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1505:300:3;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;2423:98::-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3935:217::-;4011:7;4038:16;4046:7;4038;:16::i;:::-;4030:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4121:15;:24;4137:7;4121:24;;;;;;;;;;;;;;;;;;;;;4114:31;;3935:217;;;:::o;3473:401::-;3553:13;3569:23;3584:7;3569:14;:23::i;:::-;3553:39;;3616:5;3610:11;;:2;:11;;;;3602:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3707:5;3691:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3716:37;3733:5;3740:12;:10;:12::i;:::-;3716:16;:37::i;:::-;3691:62;3670:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3543:331;3473:401;;:::o;4750:114:8:-;4821:9;;;;;;;;;;;4807:23;;:10;:23;;;4799:32;;;;;;4851:6;4841:7;;:16;;;;;;;;;;;;;;;;;;4750:114;:::o;3064:85::-;3108:4;149:3;3124:18;;3064:85;:::o;4662:330:3:-;4851:41;4870:12;:10;:12::i;:::-;4884:7;4851:18;:41::i;:::-;4843:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4957:28;4967:4;4973:2;4977:7;4957:9;:28::i;:::-;4662:330;;;:::o;3248:80:8:-;3288:4;3311:10;;3304:17;;3248:80;:::o;5058:179:3:-;5191:39;5208:4;5214:2;5218:7;5191:39;;;;;;;;;;;;:16;:39::i;:::-;5058:179;;;:::o;3338:282:8:-;3400:4;3438:9;;;;;;;;;;;3424:23;;:10;:23;;;3416:32;;;;;;3491:11;;3480:6;3467:10;;:19;;;;:::i;:::-;3466:36;;3458:45;;;;;;3518:6;3513:78;3534:6;3530:1;:10;3513:78;;;3561:19;3569:10;3561:7;:19::i;:::-;;3542:3;;;;;:::i;:::-;;;;3513:78;;;;3607:6;3600:13;;3338:282;;;:::o;2126:235:3:-;2198:7;2217:13;2233:7;:16;2241:7;2233:16;;;;;;;;;;;;;;;;;;;;;2217:32;;2284:1;2267:19;;:5;:19;;;;2259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2349:5;2342:12;;;2126:235;;;:::o;4870:130:8:-;4949:9;;;;;;;;;;;4935:23;;:10;:23;;;4927:32;;;;;;4983:10;4969:11;:24;;;;4870:130;:::o;1864:205:3:-;1936:7;1980:1;1963:19;;:5;:19;;;;1955:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2046:9;:16;2056:5;2046:16;;;;;;;;;;;;;;;;2039:23;;1864:205;;;:::o;2585:102::-;2641:13;2673:7;2666:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2585:102;:::o;3159:79:8:-;3197:4;3220:11;;3213:18;;3159:79;:::o;4219:153:3:-;4313:52;4332:12;:10;:12::i;:::-;4346:8;4356;4313:18;:52::i;:::-;4219:153;;:::o;5303:320::-;5472:41;5491:12;:10;:12::i;:::-;5505:7;5472:18;:41::i;:::-;5464:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5577:39;5591:4;5597:2;5601:7;5610:5;5577:13;:39::i;:::-;5303:320;;;;:::o;4425:144:8:-;4472:4;4509:11;;4495:10;;:25;;:55;;;;;4537:13;:11;:13::i;:::-;4524:10;;:26;4495:55;:67;;;;;4555:7;;;;;;;;;;;4554:8;4495:67;4488:74;;4425:144;:::o;6344:273::-;6397:13;6422:10;6435:9;:18;6445:7;6435:18;;;;;;;;;;;;6422:31;;6475:1;6467:5;:9;6463:129;;;6499:82;;;;;;;;;;;;;;;;;;6539:26;6559:5;6539:19;:26::i;:::-;6499:82;;;;;;;;;;;;;;;;;6574:6;;;;;;;;;;;;;;;;;6499:17;:82::i;:::-;6492:89;;;;;6463:129;6601:9;;;;;;;;;;;;;;;6344:273;;;;:::o;5371:963::-;5444:13;5483:1;5473:7;:11;:36;;;;;5499:10;;5488:7;:21;;5473:36;5469:859;;;5525:23;5551:80;5569:13;5551:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5584:25;5601:7;5584:16;:25::i;:::-;5611:19;5551:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:80::i;:::-;5525:106;;5645:27;5675:125;5693:17;5675:125;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5712:52;5756:4;5732:31;;5712:19;:52::i;:::-;5675:125;;;;;;;;;;;;;;;;;5774:25;5791:7;5774:16;:25::i;:::-;5675:17;:125::i;:::-;5645:155;;5814:19;5836:133;;;;;;;;;;;;;;;;;;5867:9;5836:133;;;;;;;;;;;;;;;;;5949:13;5836:133;;;;;;;;;;;;;;;;;:17;:133::i;:::-;5814:155;;5990:287;;;;;;;;;;;;;;;;;;6052:25;6069:7;6052:16;:25::i;:::-;5990:287;;;;;;;;;;;;;;;;;6216:5;5990:287;;;;;;;;;;;;;;;;;:17;:287::i;:::-;5983:294;;;;;;;5469:859;6308:9;;;;;;;;;;;;;;5371:963;;;;:::o;5006:212::-;5121:9;;;;;;;;;;;5107:23;;:10;:23;;;5099:32;;;;;;5157:8;5141:13;:24;;;;;;;;;;;;:::i;:::-;;5197:14;5175:19;:36;;;;;;;;;;;;:::i;:::-;;5006:212;;:::o;3626:228::-;3696:4;3734:9;;;;;;;;;;;3720:23;;:10;:23;;;3712:32;;;;;;3775:13;:11;:13::i;:::-;3762:10;;:26;3754:35;;;;;;3799:8;3810:17;3818:8;3810:7;:17::i;:::-;3799:28;;3844:3;3837:10;;;3626:228;;;:::o;4438:162:3:-;4535:4;4558:18;:25;4577:5;4558:25;;;;;;;;;;;;;;;:35;4584:8;4558:35;;;;;;;;;;;;;;;;;;;;;;;;;4551:42;;4438:162;;;;:::o;3864:242:8:-;3908:4;3932;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3924:28;;;;;;3983:7;:5;:7::i;:::-;3970:9;:20;;3962:29;;;;;;4001:8;4012:19;4020:10;4012:7;:19::i;:::-;4001:30;;4049:9;;;;;;;;;;;4041:27;;:38;4069:9;4041:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4096:3;4089:10;;;3864:242;:::o;5224:137::-;5311:9;;;;;;;;;;;5297:23;;:10;:23;;;5289:32;;;;;;5351:3;5331:17;:23;;;;;;;;;;;;:::i;:::-;;5224:137;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7095:125:3:-;7160:4;7211:1;7183:30;;:7;:16;7191:7;7183:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7176:37;;7095:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11104:171:3:-;11205:2;11178:15;:24;11194:7;11178:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11260:7;11256:2;11222:46;;11231:23;11246:7;11231:14;:23::i;:::-;11222:46;;;;;;;;;;;;11104:171;;:::o;7378:344::-;7471:4;7495:16;7503:7;7495;:16::i;:::-;7487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7570:13;7586:23;7601:7;7586:14;:23::i;:::-;7570:39;;7638:5;7627:16;;:7;:16;;;:52;;;;7647:32;7664:5;7671:7;7647:16;:32::i;:::-;7627:52;:87;;;;7707:7;7683:31;;:20;7695:7;7683:11;:20::i;:::-;:31;;;7627:87;7619:96;;;7378:344;;;;:::o;10388:605::-;10542:4;10515:31;;:23;10530:7;10515:14;:23::i;:::-;:31;;;10507:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10620:1;10606:16;;:2;:16;;;;10598:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10674:39;10695:4;10701:2;10705:7;10674:20;:39::i;:::-;10775:29;10792:1;10796:7;10775:8;:29::i;:::-;10834:1;10815:9;:15;10825:4;10815:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10862:1;10845:9;:13;10855:2;10845:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10892:2;10873:7;:16;10881:7;10873:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10929:7;10925:2;10910:27;;10919:4;10910:27;;;;;;;;;;;;10948:38;10968:4;10974:2;10978:7;10948:19;:38::i;:::-;10388:605;;;:::o;4112:303:8:-;4165:4;4209:1;4189:22;;:8;:22;;;;4181:31;;;;;;4248:1;4235:10;;:14;;;;:::i;:::-;4222:10;:27;;;;4259:8;4270:10;;4259:21;;4290:10;4303:19;4308:3;4313:8;4303:4;:19::i;:::-;4290:32;;4349:5;4332:9;:14;4342:3;4332:14;;;;;;;;;;;:22;;;;4364:24;4374:8;4384:3;4364:9;:24::i;:::-;4405:3;4398:10;;;;4112:303;;;:::o;11410:307:3:-;11560:8;11551:17;;:5;:17;;;;11543:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11646:8;11608:18;:25;11627:5;11608:25;;;;;;;;;;;;;;;:35;11634:8;11608:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11691:8;11669:41;;11684:5;11669:41;;;11701:8;11669:41;;;;;;:::i;:::-;;;;;;;;11410:307;;;:::o;6485:::-;6636:28;6646:4;6652:2;6656:7;6636:9;:28::i;:::-;6682:48;6705:4;6711:2;6715:7;6724:5;6682:22;:48::i;:::-;6674:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6485:307;;;;:::o;1136:329:9:-;1195:13;1233:1;1224:5;:10;1220:54;;;1250:13;;;;;;;;;;;;;;;;;;;;;1220:54;1283:12;1298:5;1283:20;;1313:14;1341:75;1356:1;1348:4;:9;1341:75;;1373:8;;;;;:::i;:::-;;;;1404:1;1395:10;;;;;1341:75;;;1432:26;1444:5;1451:6;1432:11;:26::i;:::-;1425:33;;;;1136:329;;;;:::o;7086:202:8:-;7200:33;7252:29;7262:2;7266;7270;7274;7252:29;;;;;;;;;;;;:9;:29::i;:::-;7245:36;;7086:202;;;;;;:::o;328:703:9:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;6896:184:8:-;6992:33;7044:29;7054:2;7058;7062;7044:29;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;7037:36;;6896:184;;;;;:::o;7294:1020::-;7426:33;7471:16;7496:2;7471:28;;7509:16;7534:2;7509:28;;7547:16;7572:2;7547:28;;7585:16;7610:2;7585:28;;7623:16;7648:2;7623:28;;7661:19;7746:3;:10;7733:3;:10;7720:3;:10;7707:3;:10;7694:3;:10;:23;;;;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;:62;;;;:::i;:::-;7683:74;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7661:96;;7767:19;7795:5;7767:34;;7811:6;7831;7860:1;7856:5;;7851:78;7867:3;:10;7863:1;:14;7851:78;;;7912:3;7916:1;7912:6;;;;;;;;:::i;:::-;;;;;;;;;;7898;7905:3;;;;;:::i;:::-;;;7898:11;;;;;;;;:::i;:::-;;;;;:20;;;;;;;;;;;7879:3;;;;;:::i;:::-;;;;7851:78;;;7947:1;7943:5;;7938:78;7954:3;:10;7950:1;:14;7938:78;;;7999:3;8003:1;7999:6;;;;;;;;:::i;:::-;;;;;;;;;;7985;7992:3;;;;;:::i;:::-;;;7985:11;;;;;;;;:::i;:::-;;;;;:20;;;;;;;;;;;7966:3;;;;;:::i;:::-;;;;7938:78;;;8034:1;8030:5;;8025:78;8041:3;:10;8037:1;:14;8025:78;;;8086:3;8090:1;8086:6;;;;;;;;:::i;:::-;;;;;;;;;;8072;8079:3;;;;;:::i;:::-;;;8072:11;;;;;;;;:::i;:::-;;;;;:20;;;;;;;;;;;8053:3;;;;;:::i;:::-;;;;8025:78;;;8121:1;8117:5;;8112:78;8128:3;:10;8124:1;:14;8112:78;;;8173:3;8177:1;8173:6;;;;;;;;:::i;:::-;;;;;;;;;;8159;8166:3;;;;;:::i;:::-;;;8159:11;;;;;;;;:::i;:::-;;;;;:20;;;;;;;;;;;8140:3;;;;;:::i;:::-;;;;8112:78;;;8208:1;8204:5;;8199:78;8215:3;:10;8211:1;:14;8199:78;;;8260:3;8264:1;8260:6;;;;;;;;:::i;:::-;;;;;;;;;;8246;8253:3;;;;;:::i;:::-;;;8246:11;;;;;;;;:::i;:::-;;;;;:20;;;;;;;;;;;8227:3;;;;;:::i;:::-;;;;8199:78;;;8300:6;8286:21;;;;;;;;;;;7294:1020;;;;;;;:::o;13604:122:3:-;;;;:::o;14098:121::-;;;;:::o;4579:161:8:-;4646:4;4701;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4714:7;4723;4684:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4674:58;;;;;;4669:64;;4662:71;;4579:161;;;;:::o;8052:108:3:-;8127:26;8137:2;8141:7;8127:26;;;;;;;;;;;;:9;:26::i;:::-;8052:108;;:::o;12270:778::-;12420:4;12440:15;:2;:13;;;:15::i;:::-;12436:606;;;12491:2;12475:36;;;12512:12;:10;:12::i;:::-;12526:4;12532:7;12541:5;12475:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12471:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12731:1;12714:6;:13;:18;12710:266;;;12756:60;;;;;;;;;;:::i;:::-;;;;;;;;12710:266;12928:6;12922:13;12913:6;12909:2;12905:15;12898:38;12471:519;12607:41;;;12597:51;;;:6;:51;;;;12590:58;;;;;12436:606;13027:4;13020:11;;12270:778;;;;;;;:::o;1588:441:9:-;1663:13;1688:19;1733:1;1724:6;1720:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1710:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1688:47;;1745:15;:6;1752:1;1745:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1800:9;1825:1;1816:6;1812:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;1866:12;1887:3;1879:5;:11;1866:25;;;;;;;:::i;:::-;;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1915:1;1905:11;;;;;1835:3;;;;:::i;:::-;;;1795:132;;;;1953:1;1944:5;:10;1936:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2015:6;2001:21;;;1588:441;;;;:::o;8381:311:3:-;8506:18;8512:2;8516:7;8506:5;:18::i;:::-;8555:54;8586:1;8590:2;8594:7;8603:5;8555:22;:54::i;:::-;8534:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8381:311;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;9014:427:3:-;9107:1;9093:16;;:2;:16;;;;9085:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9165:16;9173:7;9165;:16::i;:::-;9164:17;9156:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9225:45;9254:1;9258:2;9262:7;9225:20;:45::i;:::-;9298:1;9281:9;:13;9291:2;9281:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9328:2;9309:7;:16;9317:7;9309:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9371:7;9367:2;9346:33;;9363:1;9346:33;;;;;;;;;;;;9390:44;9418:1;9422:2;9426:7;9390:19;:44::i;:::-;9014:427;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:116::-;5008:21;5023:5;5008:21;:::i;:::-;5001:5;4998:32;4988:60;;5044:1;5041;5034:12;4988:60;4938:116;:::o;5060:133::-;5103:5;5141:6;5128:20;5119:29;;5157:30;5181:5;5157:30;:::i;:::-;5060:133;;;;:::o;5199:323::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:50;5497:7;5488:6;5477:9;5473:22;5455:50;:::i;:::-;5445:60;;5401:114;5199:323;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:468::-;6905:6;6913;6962:2;6950:9;6941:7;6937:23;6933:32;6930:119;;;6968:79;;:::i;:::-;6930:119;7088:1;7113:53;7158:7;7149:6;7138:9;7134:22;7113:53;:::i;:::-;7103:63;;7059:117;7215:2;7241:50;7283:7;7274:6;7263:9;7259:22;7241:50;:::i;:::-;7231:60;;7186:115;6840:468;;;;;:::o;7314:117::-;7423:1;7420;7413:12;7437:117;7546:1;7543;7536:12;7560:180;7608:77;7605:1;7598:88;7705:4;7702:1;7695:15;7729:4;7726:1;7719:15;7746:281;7829:27;7851:4;7829:27;:::i;:::-;7821:6;7817:40;7959:6;7947:10;7944:22;7923:18;7911:10;7908:34;7905:62;7902:88;;;7970:18;;:::i;:::-;7902:88;8010:10;8006:2;7999:22;7789:238;7746:281;;:::o;8033:129::-;8067:6;8094:20;;:::i;:::-;8084:30;;8123:33;8151:4;8143:6;8123:33;:::i;:::-;8033:129;;;:::o;8168:307::-;8229:4;8319:18;8311:6;8308:30;8305:56;;;8341:18;;:::i;:::-;8305:56;8379:29;8401:6;8379:29;:::i;:::-;8371:37;;8463:4;8457;8453:15;8445:23;;8168:307;;;:::o;8481:154::-;8565:6;8560:3;8555;8542:30;8627:1;8618:6;8613:3;8609:16;8602:27;8481:154;;;:::o;8641:410::-;8718:5;8743:65;8759:48;8800:6;8759:48;:::i;:::-;8743:65;:::i;:::-;8734:74;;8831:6;8824:5;8817:21;8869:4;8862:5;8858:16;8907:3;8898:6;8893:3;8889:16;8886:25;8883:112;;;8914:79;;:::i;:::-;8883:112;9004:41;9038:6;9033:3;9028;9004:41;:::i;:::-;8724:327;8641:410;;;;;:::o;9070:338::-;9125:5;9174:3;9167:4;9159:6;9155:17;9151:27;9141:122;;9182:79;;:::i;:::-;9141:122;9299:6;9286:20;9324:78;9398:3;9390:6;9383:4;9375:6;9371:17;9324:78;:::i;:::-;9315:87;;9131:277;9070:338;;;;:::o;9414:943::-;9509:6;9517;9525;9533;9582:3;9570:9;9561:7;9557:23;9553:33;9550:120;;;9589:79;;:::i;:::-;9550:120;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:53;9907:7;9898:6;9887:9;9883:22;9862:53;:::i;:::-;9852:63;;9807:118;9964:2;9990:53;10035:7;10026:6;10015:9;10011:22;9990:53;:::i;:::-;9980:63;;9935:118;10120:2;10109:9;10105:18;10092:32;10151:18;10143:6;10140:30;10137:117;;;10173:79;;:::i;:::-;10137:117;10278:62;10332:7;10323:6;10312:9;10308:22;10278:62;:::i;:::-;10268:72;;10063:287;9414:943;;;;;;;:::o;10363:308::-;10425:4;10515:18;10507:6;10504:30;10501:56;;;10537:18;;:::i;:::-;10501:56;10575:29;10597:6;10575:29;:::i;:::-;10567:37;;10659:4;10653;10649:15;10641:23;;10363:308;;;:::o;10677:412::-;10755:5;10780:66;10796:49;10838:6;10796:49;:::i;:::-;10780:66;:::i;:::-;10771:75;;10869:6;10862:5;10855:21;10907:4;10900:5;10896:16;10945:3;10936:6;10931:3;10927:16;10924:25;10921:112;;;10952:79;;:::i;:::-;10921:112;11042:41;11076:6;11071:3;11066;11042:41;:::i;:::-;10761:328;10677:412;;;;;:::o;11109:340::-;11165:5;11214:3;11207:4;11199:6;11195:17;11191:27;11181:122;;11222:79;;:::i;:::-;11181:122;11339:6;11326:20;11364:79;11439:3;11431:6;11424:4;11416:6;11412:17;11364:79;:::i;:::-;11355:88;;11171:278;11109:340;;;;:::o;11455:834::-;11543:6;11551;11600:2;11588:9;11579:7;11575:23;11571:32;11568:119;;;11606:79;;:::i;:::-;11568:119;11754:1;11743:9;11739:17;11726:31;11784:18;11776:6;11773:30;11770:117;;;11806:79;;:::i;:::-;11770:117;11911:63;11966:7;11957:6;11946:9;11942:22;11911:63;:::i;:::-;11901:73;;11697:287;12051:2;12040:9;12036:18;12023:32;12082:18;12074:6;12071:30;12068:117;;;12104:79;;:::i;:::-;12068:117;12209:63;12264:7;12255:6;12244:9;12240:22;12209:63;:::i;:::-;12199:73;;11994:288;11455:834;;;;;:::o;12295:474::-;12363:6;12371;12420:2;12408:9;12399:7;12395:23;12391:32;12388:119;;;12426:79;;:::i;:::-;12388:119;12546:1;12571:53;12616:7;12607:6;12596:9;12592:22;12571:53;:::i;:::-;12561:63;;12517:117;12673:2;12699:53;12744:7;12735:6;12724:9;12720:22;12699:53;:::i;:::-;12689:63;;12644:118;12295:474;;;;;:::o;12775:509::-;12844:6;12893:2;12881:9;12872:7;12868:23;12864:32;12861:119;;;12899:79;;:::i;:::-;12861:119;13047:1;13036:9;13032:17;13019:31;13077:18;13069:6;13066:30;13063:117;;;13099:79;;:::i;:::-;13063:117;13204:63;13259:7;13250:6;13239:9;13235:22;13204:63;:::i;:::-;13194:73;;12990:287;12775:509;;;;:::o;13290:180::-;13338:77;13335:1;13328:88;13435:4;13432:1;13425:15;13459:4;13456:1;13449:15;13476:320;13520:6;13557:1;13551:4;13547:12;13537:22;;13604:1;13598:4;13594:12;13625:18;13615:81;;13681:4;13673:6;13669:17;13659:27;;13615:81;13743:2;13735:6;13732:14;13712:18;13709:38;13706:84;;;13762:18;;:::i;:::-;13706:84;13527:269;13476:320;;;:::o;13802:231::-;13942:34;13938:1;13930:6;13926:14;13919:58;14011:14;14006:2;13998:6;13994:15;13987:39;13802:231;:::o;14039:366::-;14181:3;14202:67;14266:2;14261:3;14202:67;:::i;:::-;14195:74;;14278:93;14367:3;14278:93;:::i;:::-;14396:2;14391:3;14387:12;14380:19;;14039:366;;;:::o;14411:419::-;14577:4;14615:2;14604:9;14600:18;14592:26;;14664:9;14658:4;14654:20;14650:1;14639:9;14635:17;14628:47;14692:131;14818:4;14692:131;:::i;:::-;14684:139;;14411:419;;;:::o;14836:220::-;14976:34;14972:1;14964:6;14960:14;14953:58;15045:3;15040:2;15032:6;15028:15;15021:28;14836:220;:::o;15062:366::-;15204:3;15225:67;15289:2;15284:3;15225:67;:::i;:::-;15218:74;;15301:93;15390:3;15301:93;:::i;:::-;15419:2;15414:3;15410:12;15403:19;;15062:366;;;:::o;15434:419::-;15600:4;15638:2;15627:9;15623:18;15615:26;;15687:9;15681:4;15677:20;15673:1;15662:9;15658:17;15651:47;15715:131;15841:4;15715:131;:::i;:::-;15707:139;;15434:419;;;:::o;15859:243::-;15999:34;15995:1;15987:6;15983:14;15976:58;16068:26;16063:2;16055:6;16051:15;16044:51;15859:243;:::o;16108:366::-;16250:3;16271:67;16335:2;16330:3;16271:67;:::i;:::-;16264:74;;16347:93;16436:3;16347:93;:::i;:::-;16465:2;16460:3;16456:12;16449:19;;16108:366;;;:::o;16480:419::-;16646:4;16684:2;16673:9;16669:18;16661:26;;16733:9;16727:4;16723:20;16719:1;16708:9;16704:17;16697:47;16761:131;16887:4;16761:131;:::i;:::-;16753:139;;16480:419;;;:::o;16905:236::-;17045:34;17041:1;17033:6;17029:14;17022:58;17114:19;17109:2;17101:6;17097:15;17090:44;16905:236;:::o;17147:366::-;17289:3;17310:67;17374:2;17369:3;17310:67;:::i;:::-;17303:74;;17386:93;17475:3;17386:93;:::i;:::-;17504:2;17499:3;17495:12;17488:19;;17147:366;;;:::o;17519:419::-;17685:4;17723:2;17712:9;17708:18;17700:26;;17772:9;17766:4;17762:20;17758:1;17747:9;17743:17;17736:47;17800:131;17926:4;17800:131;:::i;:::-;17792:139;;17519:419;;;:::o;17944:180::-;17992:77;17989:1;17982:88;18089:4;18086:1;18079:15;18113:4;18110:1;18103:15;18130:305;18170:3;18189:20;18207:1;18189:20;:::i;:::-;18184:25;;18223:20;18241:1;18223:20;:::i;:::-;18218:25;;18377:1;18309:66;18305:74;18302:1;18299:81;18296:107;;;18383:18;;:::i;:::-;18296:107;18427:1;18424;18420:9;18413:16;;18130:305;;;;:::o;18441:233::-;18480:3;18503:24;18521:5;18503:24;:::i;:::-;18494:33;;18549:66;18542:5;18539:77;18536:103;;;18619:18;;:::i;:::-;18536:103;18666:1;18659:5;18655:13;18648:20;;18441:233;;;:::o;18680:228::-;18820:34;18816:1;18808:6;18804:14;18797:58;18889:11;18884:2;18876:6;18872:15;18865:36;18680:228;:::o;18914:366::-;19056:3;19077:67;19141:2;19136:3;19077:67;:::i;:::-;19070:74;;19153:93;19242:3;19153:93;:::i;:::-;19271:2;19266:3;19262:12;19255:19;;18914:366;;;:::o;19286:419::-;19452:4;19490:2;19479:9;19475:18;19467:26;;19539:9;19533:4;19529:20;19525:1;19514:9;19510:17;19503:47;19567:131;19693:4;19567:131;:::i;:::-;19559:139;;19286:419;;;:::o;19711:229::-;19851:34;19847:1;19839:6;19835:14;19828:58;19920:12;19915:2;19907:6;19903:15;19896:37;19711:229;:::o;19946:366::-;20088:3;20109:67;20173:2;20168:3;20109:67;:::i;:::-;20102:74;;20185:93;20274:3;20185:93;:::i;:::-;20303:2;20298:3;20294:12;20287:19;;19946:366;;;:::o;20318:419::-;20484:4;20522:2;20511:9;20507:18;20499:26;;20571:9;20565:4;20561:20;20557:1;20546:9;20542:17;20535:47;20599:131;20725:4;20599:131;:::i;:::-;20591:139;;20318:419;;;:::o;20743:137::-;20797:5;20828:6;20822:13;20813:22;;20844:30;20868:5;20844:30;:::i;:::-;20743:137;;;;:::o;20886:345::-;20953:6;21002:2;20990:9;20981:7;20977:23;20973:32;20970:119;;;21008:79;;:::i;:::-;20970:119;21128:1;21153:61;21206:7;21197:6;21186:9;21182:22;21153:61;:::i;:::-;21143:71;;21099:125;20886:345;;;;:::o;21237:231::-;21377:34;21373:1;21365:6;21361:14;21354:58;21446:14;21441:2;21433:6;21429:15;21422:39;21237:231;:::o;21474:366::-;21616:3;21637:67;21701:2;21696:3;21637:67;:::i;:::-;21630:74;;21713:93;21802:3;21713:93;:::i;:::-;21831:2;21826:3;21822:12;21815:19;;21474:366;;;:::o;21846:419::-;22012:4;22050:2;22039:9;22035:18;22027:26;;22099:9;22093:4;22089:20;22085:1;22074:9;22070:17;22063:47;22127:131;22253:4;22127:131;:::i;:::-;22119:139;;21846:419;;;:::o;22271:224::-;22411:34;22407:1;22399:6;22395:14;22388:58;22480:7;22475:2;22467:6;22463:15;22456:32;22271:224;:::o;22501:366::-;22643:3;22664:67;22728:2;22723:3;22664:67;:::i;:::-;22657:74;;22740:93;22829:3;22740:93;:::i;:::-;22858:2;22853:3;22849:12;22842:19;;22501:366;;;:::o;22873:419::-;23039:4;23077:2;23066:9;23062:18;23054:26;;23126:9;23120:4;23116:20;23112:1;23101:9;23097:17;23090:47;23154:131;23280:4;23154:131;:::i;:::-;23146:139;;22873:419;;;:::o;23298:223::-;23438:34;23434:1;23426:6;23422:14;23415:58;23507:6;23502:2;23494:6;23490:15;23483:31;23298:223;:::o;23527:366::-;23669:3;23690:67;23754:2;23749:3;23690:67;:::i;:::-;23683:74;;23766:93;23855:3;23766:93;:::i;:::-;23884:2;23879:3;23875:12;23868:19;;23527:366;;;:::o;23899:419::-;24065:4;24103:2;24092:9;24088:18;24080:26;;24152:9;24146:4;24142:20;24138:1;24127:9;24123:17;24116:47;24180:131;24306:4;24180:131;:::i;:::-;24172:139;;23899:419;;;:::o;24324:191::-;24364:4;24384:20;24402:1;24384:20;:::i;:::-;24379:25;;24418:20;24436:1;24418:20;:::i;:::-;24413:25;;24457:1;24454;24451:8;24448:34;;;24462:18;;:::i;:::-;24448:34;24507:1;24504;24500:9;24492:17;;24324:191;;;;:::o;24521:175::-;24661:27;24657:1;24649:6;24645:14;24638:51;24521:175;:::o;24702:366::-;24844:3;24865:67;24929:2;24924:3;24865:67;:::i;:::-;24858:74;;24941:93;25030:3;24941:93;:::i;:::-;25059:2;25054:3;25050:12;25043:19;;24702:366;;;:::o;25074:419::-;25240:4;25278:2;25267:9;25263:18;25255:26;;25327:9;25321:4;25317:20;25313:1;25302:9;25298:17;25291:47;25355:131;25481:4;25355:131;:::i;:::-;25347:139;;25074:419;;;:::o;25499:237::-;25639:34;25635:1;25627:6;25623:14;25616:58;25708:20;25703:2;25695:6;25691:15;25684:45;25499:237;:::o;25742:366::-;25884:3;25905:67;25969:2;25964:3;25905:67;:::i;:::-;25898:74;;25981:93;26070:3;25981:93;:::i;:::-;26099:2;26094:3;26090:12;26083:19;;25742:366;;;:::o;26114:419::-;26280:4;26318:2;26307:9;26303:18;26295:26;;26367:9;26361:4;26357:20;26353:1;26342:9;26338:17;26331:47;26395:131;26521:4;26395:131;:::i;:::-;26387:139;;26114:419;;;:::o;26539:180::-;26587:77;26584:1;26577:88;26684:4;26681:1;26674:15;26708:4;26705:1;26698:15;26725:185;26765:1;26782:20;26800:1;26782:20;:::i;:::-;26777:25;;26816:20;26834:1;26816:20;:::i;:::-;26811:25;;26855:1;26845:35;;26860:18;;:::i;:::-;26845:35;26902:1;26899;26895:9;26890:14;;26725:185;;;;:::o;26916:176::-;26948:1;26965:20;26983:1;26965:20;:::i;:::-;26960:25;;26999:20;27017:1;26999:20;:::i;:::-;26994:25;;27038:1;27028:35;;27043:18;;:::i;:::-;27028:35;27084:1;27081;27077:9;27072:14;;26916:176;;;;:::o;27098:180::-;27146:77;27143:1;27136:88;27243:4;27240:1;27233:15;27267:4;27264:1;27257:15;27284:421;27373:5;27398:66;27414:49;27456:6;27414:49;:::i;:::-;27398:66;:::i;:::-;27389:75;;27487:6;27480:5;27473:21;27525:4;27518:5;27514:16;27563:3;27554:6;27549:3;27545:16;27542:25;27539:112;;;27570:79;;:::i;:::-;27539:112;27660:39;27692:6;27687:3;27682;27660:39;:::i;:::-;27379:326;27284:421;;;;;:::o;27725:355::-;27792:5;27841:3;27834:4;27826:6;27822:17;27818:27;27808:122;;27849:79;;:::i;:::-;27808:122;27959:6;27953:13;27984:90;28070:3;28062:6;28055:4;28047:6;28043:17;27984:90;:::i;:::-;27975:99;;27798:282;27725:355;;;;:::o;28086:524::-;28166:6;28215:2;28203:9;28194:7;28190:23;28186:32;28183:119;;;28221:79;;:::i;:::-;28183:119;28362:1;28351:9;28347:17;28341:24;28392:18;28384:6;28381:30;28378:117;;;28414:79;;:::i;:::-;28378:117;28519:74;28585:7;28576:6;28565:9;28561:22;28519:74;:::i;:::-;28509:84;;28312:291;28086:524;;;;:::o;28616:148::-;28718:11;28755:3;28740:18;;28616:148;;;;:::o;28770:377::-;28876:3;28904:39;28937:5;28904:39;:::i;:::-;28959:89;29041:6;29036:3;28959:89;:::i;:::-;28952:96;;29057:52;29102:6;29097:3;29090:4;29083:5;29079:16;29057:52;:::i;:::-;29134:6;29129:3;29125:16;29118:23;;28880:267;28770:377;;;;:::o;29153:79::-;29192:7;29221:5;29210:16;;29153:79;;;:::o;29238:157::-;29343:45;29363:24;29381:5;29363:24;:::i;:::-;29343:45;:::i;:::-;29338:3;29331:58;29238:157;;:::o;29401:94::-;29434:8;29482:5;29478:2;29474:14;29453:35;;29401:94;;;:::o;29501:::-;29540:7;29569:20;29583:5;29569:20;:::i;:::-;29558:31;;29501:94;;;:::o;29601:100::-;29640:7;29669:26;29689:5;29669:26;:::i;:::-;29658:37;;29601:100;;;:::o;29707:157::-;29812:45;29832:24;29850:5;29832:24;:::i;:::-;29812:45;:::i;:::-;29807:3;29800:58;29707:157;;:::o;29870:557::-;30058:3;30080:95;30171:3;30162:6;30080:95;:::i;:::-;30073:102;;30185:75;30256:3;30247:6;30185:75;:::i;:::-;30285:2;30280:3;30276:12;30269:19;;30298:75;30369:3;30360:6;30298:75;:::i;:::-;30398:2;30393:3;30389:12;30382:19;;30418:3;30411:10;;29870:557;;;;;;:::o;30433:98::-;30484:6;30518:5;30512:12;30502:22;;30433:98;;;:::o;30537:168::-;30620:11;30654:6;30649:3;30642:19;30694:4;30689:3;30685:14;30670:29;;30537:168;;;;:::o;30711:360::-;30797:3;30825:38;30857:5;30825:38;:::i;:::-;30879:70;30942:6;30937:3;30879:70;:::i;:::-;30872:77;;30958:52;31003:6;30998:3;30991:4;30984:5;30980:16;30958:52;:::i;:::-;31035:29;31057:6;31035:29;:::i;:::-;31030:3;31026:39;31019:46;;30801:270;30711:360;;;;:::o;31077:640::-;31272:4;31310:3;31299:9;31295:19;31287:27;;31324:71;31392:1;31381:9;31377:17;31368:6;31324:71;:::i;:::-;31405:72;31473:2;31462:9;31458:18;31449:6;31405:72;:::i;:::-;31487;31555:2;31544:9;31540:18;31531:6;31487:72;:::i;:::-;31606:9;31600:4;31596:20;31591:2;31580:9;31576:18;31569:48;31634:76;31705:4;31696:6;31634:76;:::i;:::-;31626:84;;31077:640;;;;;;;:::o;31723:141::-;31779:5;31810:6;31804:13;31795:22;;31826:32;31852:5;31826:32;:::i;:::-;31723:141;;;;:::o;31870:349::-;31939:6;31988:2;31976:9;31967:7;31963:23;31959:32;31956:119;;;31994:79;;:::i;:::-;31956:119;32114:1;32139:63;32194:7;32185:6;32174:9;32170:22;32139:63;:::i;:::-;32129:73;;32085:127;31870:349;;;;:::o;32225:348::-;32265:7;32288:20;32306:1;32288:20;:::i;:::-;32283:25;;32322:20;32340:1;32322:20;:::i;:::-;32317:25;;32510:1;32442:66;32438:74;32435:1;32432:81;32427:1;32420:9;32413:17;32409:105;32406:131;;;32517:18;;:::i;:::-;32406:131;32565:1;32562;32558:9;32547:20;;32225:348;;;;:::o;32579:171::-;32618:3;32641:24;32659:5;32641:24;:::i;:::-;32632:33;;32687:4;32680:5;32677:15;32674:41;;;32695:18;;:::i;:::-;32674:41;32742:1;32735:5;32731:13;32724:20;;32579:171;;;:::o;32756:182::-;32896:34;32892:1;32884:6;32880:14;32873:58;32756:182;:::o;32944:366::-;33086:3;33107:67;33171:2;33166:3;33107:67;:::i;:::-;33100:74;;33183:93;33272:3;33183:93;:::i;:::-;33301:2;33296:3;33292:12;33285:19;;32944:366;;;:::o;33316:419::-;33482:4;33520:2;33509:9;33505:18;33497:26;;33569:9;33563:4;33559:20;33555:1;33544:9;33540:17;33533:47;33597:131;33723:4;33597:131;:::i;:::-;33589:139;;33316:419;;;:::o;33741:182::-;33881:34;33877:1;33869:6;33865:14;33858:58;33741:182;:::o;33929:366::-;34071:3;34092:67;34156:2;34151:3;34092:67;:::i;:::-;34085:74;;34168:93;34257:3;34168:93;:::i;:::-;34286:2;34281:3;34277:12;34270:19;;33929:366;;;:::o;34301:419::-;34467:4;34505:2;34494:9;34490:18;34482:26;;34554:9;34548:4;34544:20;34540:1;34529:9;34525:17;34518:47;34582:131;34708:4;34582:131;:::i;:::-;34574:139;;34301:419;;;:::o;34726:178::-;34866:30;34862:1;34854:6;34850:14;34843:54;34726:178;:::o;34910:366::-;35052:3;35073:67;35137:2;35132:3;35073:67;:::i;:::-;35066:74;;35149:93;35238:3;35149:93;:::i;:::-;35267:2;35262:3;35258:12;35251:19;;34910:366;;;:::o;35282:419::-;35448:4;35486:2;35475:9;35471:18;35463:26;;35535:9;35529:4;35525:20;35521:1;35510:9;35506:17;35499:47;35563:131;35689:4;35563:131;:::i;:::-;35555:139;;35282:419;;;:::o

Swarm Source

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