ETH Price: $2,098.18 (+0.93%)

Token

Signature (Signature)
 

Overview

Max Total Supply

365 Signature

Holders

18

Transfers

-
0

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

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:
Signature

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 13: Signature.sol
// SPDX-License-Identifier: MIT
// TOKEN 365

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./Base64.sol";

contract Signature is ERC721, Ownable {
    address private _artist;
    mapping (address => bool) private _creators;
    string private _externalLib;
    mapping (uint => uint) private _idToSeed;
    string private _imageExtension;
    string private _imageBaseUrl;
    uint private _tokensCreated = 0;
    bool private _paused = true;
    uint private _platformFee;
    uint private _tokenPrice = 3650000000000000;
    
    uint private constant TOKEN_LIMIT = 365;
    string private constant SCRIPT = "let slice = []; for (let i = 2; i < 66; i+=4) { slice.push(hashString.slice(i, i+4)); } let decRows = slice.map(x => parseInt(x, 16)); const border = 32; const max = 256 + border * 2; let canvas, scaling, lineLength, lineY; let r, g, b; let colors = true; function setup() { scaling = Math.min(window.innerWidth/max, window.innerHeight/max); canvas = max * scaling; createCanvas(canvas, canvas); r = shifted(0, 1); g = shifted(2, 5); b = shifted(4, 3); lineY = (230 + border) * scaling; } function draw() { background(255); if (colors) { background(r, g, b, 120); strokeWeight(1); fill(0); stroke(0); drawingContext.setLineDash([scaling * 6, scaling * 3]); line(border * scaling, lineY, (max - border) * scaling, lineY); drawingContext.setLineDash([]); noStroke(); let fontSize = 12 * scaling; textFont('Times New Roman', fontSize); text('Signature', (border + 10) * scaling, lineY + fontSize / 2 + 10 * scaling); bgAlpha = shifted(6, 7) / 2; stroke(r, g, b, bgAlpha < 80 ? bgAlpha : 0); let points = floor(shifted(3, 2) / 3) + 1; let pointsWidth = (256 * scaling) / points; strokeWeight(pointsWidth); for (var v = 0; v < points; v++) { for (var h = 0; h < points; h++) { point(pointsWidth * h + (border * scaling) + pointsWidth / 2, pointsWidth * v + (border * scaling) + pointsWidth / 2); } } } signature(); noLoop(); } function signature() { noFill(); let sw; for(var i = colors ? 0 : 3; i <= 3; i++) { if (i == 3) { if (colors) { stroke(255 - r , 255 - g , 255 - b, 215); } else { stroke(0); } } else { stroke(i * 40); } let weight = shifted(8, 4) / 160; sw = (i * (0.3 + weight) + 0.5) * scaling; strokeWeight(sw); beginShape(); curveVertex(border * scaling, lineY); curveVertex((border + 20) * scaling + sw, (lineY + sw) - 20 * scaling); for (var row = 0; row < decRows.length; row++) { curveVertex(pos(row, 0) + sw, pos(row, 8) + sw); } endShape(); } } function pos(row, i) { return (shifted(row, i) + border) * scaling; } function shifted(row, i) {  return ((decRows[row] >> i) & 0xFF); } function keyTyped() { if (key === 's') { saveCanvas('signature', 'png'); } if (key === 'c') { colors = !colors; redraw(); } }";

    constructor(address artist, uint fee) ERC721("Signature", "Signature") {
        _artist = artist;
        _platformFee = fee;
        _imageBaseUrl = 'https://signature.token365.art/';
        _imageExtension = '.svg';
        _externalLib = 'https://ipfs.io/ipfs/Qmej2aMjKpsH2gGmR1bDnGT7FYWPuuqedgrb3i9NKDjDVw/p5-150.min.js';
    }
    
    function animationPage(uint tokenId) public view returns (string memory) {
        string memory _script = script(tokenId);
        if (bytes(_script).length > 0) {
            return string(abi.encodePacked("data:text/html;base64,", Base64.encode(abi.encodePacked('<html><head><title>Signature by Ruud Ghielen</title><script src="', _externalLib, '"></script><script>', _script, '</script></head><body style="margin:0;"><main></main></body></html>'))));
        }
        return "";
    }

    function canCreate() public view returns (bool) {
        return _tokensCreated < totalSupply() && !_paused;
    }
    
    function create() external payable returns (uint) {
        require(this.canCreate());
        require(msg.value >= this.price());
        uint _id = _create(msg.sender);
        if (msg.value > 0) {
            uint value = (msg.value / 100) * _platformFee;
            if (value > 0) {
                payable(owner()).transfer(value);
            }
            payable(_artist).transfer(msg.value - value);
        }
        return _id;
    }

    function createForAddress(address receiver) public onlyOwner returns (uint) {
        require(_tokensCreated < totalSupply());
        uint _id = _create(receiver);
        return _id;
    }

    function _create(address _creator) internal returns (uint) {
        require(_creator != address(0));
        require(!_creators[_creator]);
        _creators[_creator] = true;
        _tokensCreated = _tokensCreated + 1;
        uint _id = _tokensCreated;
        uint _seed = hash(_creator);
        _idToSeed[_id] = _seed;
        _safeMint(_creator, _id);
        return _id;
    }

    function getHash(uint tokenId) public view returns (string memory) {
        return Strings.toHexString(_idToSeed[tokenId]);
    }

    function hash(address creator) private pure returns (uint) {
        return uint(keccak256(abi.encodePacked(creator)));
    }

    function price() public view returns (uint) {
        return _tokenPrice;
    }

    function script(uint tokenId) public view returns (string memory) {
        uint _seed = _idToSeed[tokenId];
        if (_seed > 0) {
            return string(abi.encodePacked("let hashString = '", Strings.toHexString(_seed), "'; ", SCRIPT));
        }
        return "";
    }

    function setPaused(bool paused) public onlyOwner {
        _paused = paused;
    }

    function setTokenPrice(uint tokenPrice) public onlyOwner {
        _tokenPrice = tokenPrice;
    }

    function setImageUrl(string memory imageBaseUrl, string memory imageExtension) public onlyOwner {
        _imageBaseUrl = imageBaseUrl;
        _imageExtension = imageExtension;
    }

    function setExternalLib(string memory url) public onlyOwner {
        _externalLib = url;
    }

    function tokensCreated() public view returns (uint) {
        return _tokensCreated;
    }

    function totalSupply() public pure returns (uint) {
        return TOKEN_LIMIT;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (tokenId > 0 && tokenId <= _tokensCreated) {
            return string(abi.encodePacked('data:application/json,{"name":"Signature ', Strings.toString(tokenId), '","description":"The Signature is a visual representation of the wallet address that created this token. No worries, the script and hash are both stored immutably inside this blockchain contract to generate the image.","image":"', _imageBaseUrl, Strings.toString(tokenId), _imageExtension, '","external_url":"https://www.token365.art/","animation_url":"', animationPage(tokenId), '","interaction":"Press C to switch between colored and outline Signature, Press S to save the image"}'));
        } else {
            return "";
        }
    }
    
    function withdraw() public onlyOwner {
        require(address(this).balance > 0);
        payable(owner()).transfer(address(this).balance);
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 13: Base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

File 3 of 13: 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 4 of 13: 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 5 of 13: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

    /**
     * @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, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

File 6 of 13: 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 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 8 of 13: 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 9 of 13: 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 13: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"animationPage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canCreate","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHash","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"setExternalLib","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"imageBaseUrl","type":"string"},{"internalType":"string","name":"imageExtension","type":"string"}],"name":"setImageUrl","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":"tokensCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d556001600e60006101000a81548160ff021916908315150217905550660cf7a7d96e20006010553480156200003c57600080fd5b506040516200555e3803806200555e833981810160405281019062000062919062000390565b6040518060400160405280600981526020017f5369676e617475726500000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f5369676e617475726500000000000000000000000000000000000000000000008152508160009081620000df919062000647565b508060019081620000f1919062000647565b50505062000114620001086200021d60201b60201c565b6200022560201b60201c565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055506040518060400160405280601f81526020017f68747470733a2f2f7369676e61747572652e746f6b656e3336352e6172742f00815250600c9081620001a2919062000647565b506040518060400160405280600481526020017f2e73766700000000000000000000000000000000000000000000000000000000815250600b9081620001e9919062000647565b506040518060800160405280605181526020016200550d605191396009908162000214919062000647565b5050506200072e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031d82620002f0565b9050919050565b6200032f8162000310565b81146200033b57600080fd5b50565b6000815190506200034f8162000324565b92915050565b6000819050919050565b6200036a8162000355565b81146200037657600080fd5b50565b6000815190506200038a816200035f565b92915050565b60008060408385031215620003aa57620003a9620002eb565b5b6000620003ba858286016200033e565b9250506020620003cd8582860162000379565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045957607f821691505b6020821081036200046f576200046e62000411565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200049a565b620004e586836200049a565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000528620005226200051c8462000355565b620004fd565b62000355565b9050919050565b6000819050919050565b620005448362000507565b6200055c62000553826200052f565b848454620004a7565b825550505050565b600090565b6200057362000564565b6200058081848462000539565b505050565b5b81811015620005a8576200059c60008262000569565b60018101905062000586565b5050565b601f821115620005f757620005c18162000475565b620005cc846200048a565b81016020851015620005dc578190505b620005f4620005eb856200048a565b83018262000585565b50505b505050565b600082821c905092915050565b60006200061c60001984600802620005fc565b1980831691505092915050565b600062000637838362000609565b9150826002028217905092915050565b6200065282620003d7565b67ffffffffffffffff8111156200066e576200066d620003e2565b5b6200067a825462000440565b62000687828285620005ac565b600060209050601f831160018114620006bf5760008415620006aa578287015190505b620006b6858262000629565b86555062000726565b601f198416620006cf8662000475565b60005b82811015620006f957848901518255600182019150602085019450602081019050620006d2565b8683101562000719578489015162000715601f89168262000609565b8355505b6001600288020188555050505b505050505050565b614dcf806200073e6000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461069a578063efc81a8c146106d7578063f2fde38b146106f5578063f76ab4aa1461071e576101cd565b8063b88d4fde146105ba578063c569bd95146105e3578063c87b56dd14610620578063d7da77c81461065d576101cd565b80638da5cb5b116100d15780638da5cb5b1461051057806395d89b411461053b578063a035b1fe14610566578063a22cb46514610591576101cd565b806370a0823114610491578063715018a6146104ce578063757ccd3b146104e5576101cd565b806323b872dd1161016f5780634f05ba891161013e5780634f05ba89146103b15780636352211e146103ee5780636a61e5fc1461042b5780636b2fafa914610454576101cd565b806323b872dd1461031d5780633ccfd60b14610346578063427500201461035d57806342842e0e14610388576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806316c38b3c146102c957806318160ddd146102f2576101cd565b806301ffc9a7146101d25780630615a8171461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061299a565b610747565b60405161020691906129e2565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612b43565b610829565b005b34801561024457600080fd5b5061024d610855565b60405161025a9190612c3a565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612c92565b6108e7565b6040516102979190612d00565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612d47565b61092d565b005b3480156102d557600080fd5b506102f060048036038101906102eb9190612db3565b610a44565b005b3480156102fe57600080fd5b50610307610a69565b6040516103149190612def565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612e0a565b610a73565b005b34801561035257600080fd5b5061035b610ad3565b005b34801561036957600080fd5b50610372610b38565b60405161037f9190612def565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612e0a565b610b42565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612c92565b610b62565b6040516103e59190612c3a565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190612c92565b610be6565b6040516104229190612d00565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612c92565b610c6c565b005b34801561046057600080fd5b5061047b60048036038101906104769190612c92565b610c7e565b6040516104889190612c3a565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190612e5d565b610ca3565b6040516104c59190612def565b60405180910390f35b3480156104da57600080fd5b506104e3610d5a565b005b3480156104f157600080fd5b506104fa610d6e565b60405161050791906129e2565b60405180910390f35b34801561051c57600080fd5b50610525610d9a565b6040516105329190612d00565b60405180910390f35b34801561054757600080fd5b50610550610dc4565b60405161055d9190612c3a565b60405180910390f35b34801561057257600080fd5b5061057b610e56565b6040516105889190612def565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190612e8a565b610e60565b005b3480156105c657600080fd5b506105e160048036038101906105dc9190612f6b565b610e76565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190612c92565b610ed8565b6040516106179190612c3a565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190612c92565b610f61565b6040516106549190612c3a565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f9190612e5d565b610fdb565b6040516106919190612def565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190612fee565b611010565b6040516106ce91906129e2565b60405180910390f35b6106df6110a4565b6040516106ec9190612def565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190612e5d565b6112a2565b005b34801561072a57600080fd5b506107456004803603810190610740919061302e565b611325565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610822575061082182611340565b5b9050919050565b6108316113aa565b81600c90816108409190613283565b5080600b90816108509190613283565b505050565b606060008054610864906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610890906130a6565b80156108dd5780601f106108b2576101008083540402835291602001916108dd565b820191906000526020600020905b8154815290600101906020018083116108c057829003601f168201915b5050505050905090565b60006108f282611428565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093882610be6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f906133c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c7611473565b73ffffffffffffffffffffffffffffffffffffffff1614806109f657506109f5816109f0611473565b611010565b5b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613459565b60405180910390fd5b610a3f838361147b565b505050565b610a4c6113aa565b80600e60006101000a81548160ff02191690831515021790555050565b600061016d905090565b610a84610a7e611473565b82611534565b610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba906134eb565b60405180910390fd5b610ace8383836115c9565b505050565b610adb6113aa565b60004711610ae857600080fd5b610af0610d9a565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b35573d6000803e3d6000fd5b50565b6000600d54905090565b610b5d83838360405180602001604052806000815250610e76565b505050565b60606000610b6f83610ed8565b9050600081511115610bcd57610ba6600982604051602001610b92929190613746565b6040516020818303038152906040526118c2565b604051602001610bb691906137d7565b604051602081830303815290604052915050610be1565b604051806020016040528060008152509150505b919050565b600080610bf283611a3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613845565b60405180910390fd5b80915050919050565b610c746113aa565b8060108190555050565b6060610c9c600a600084815260200190815260200160002054611a77565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a906138d7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d626113aa565b610d6c6000611a95565b565b6000610d78610a69565b600d54108015610d955750600e60009054906101000a900460ff16155b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610dd3906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610dff906130a6565b8015610e4c5780601f10610e2157610100808354040283529160200191610e4c565b820191906000526020600020905b815481529060010190602001808311610e2f57829003601f168201915b5050505050905090565b6000601054905090565b610e72610e6b611473565b8383611b5b565b5050565b610e87610e81611473565b83611534565b610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd906134eb565b60405180910390fd5b610ed284848484611cc7565b50505050565b60606000600a60008481526020019081526020016000205490506000811115610f4857610f0481611a77565b60405180610880016040528061084a815260200161451061084a9139604051602001610f3192919061398f565b604051602081830303815290604052915050610f5c565b604051806020016040528060008152509150505b919050565b6060600082118015610f755750600d548211155b15610fc357610f8382611d23565b600c610f8e84611d23565b600b610f9986610b62565b604051602001610fad959493929190613cc1565b6040516020818303038152906040529050610fd6565b6040518060200160405280600081525090505b919050565b6000610fe56113aa565b610fed610a69565b600d5410610ffa57600080fd5b600061100583611df1565b905080915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1663757ccd3b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111159190613d4d565b61111e57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190613d8f565b34101561119957600080fd5b60006111a433611df1565b9050600034111561129b576000600f546064346111c19190613e1a565b6111cb9190613e4b565b90506000811115611225576111de610d9a565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611223573d6000803e3d6000fd5b505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc823461126d9190613ea5565b9081150290604051600060405180830381858888f19350505050158015611298573d6000803e3d6000fd5b50505b8091505090565b6112aa6113aa565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090613f4b565b60405180910390fd5b61132281611a95565b50565b61132d6113aa565b806009908161133c9190613283565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113b2611473565b73ffffffffffffffffffffffffffffffffffffffff166113d0610d9a565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90613fb7565b60405180910390fd5b565b61143181611f2f565b611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613845565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114ee83610be6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061154083610be6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061158257506115818185611010565b5b806115c057508373ffffffffffffffffffffffffffffffffffffffff166115a8846108e7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115e982610be6565b73ffffffffffffffffffffffffffffffffffffffff161461163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690614049565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a5906140db565b60405180910390fd5b6116bb8383836001611f70565b8273ffffffffffffffffffffffffffffffffffffffff166116db82610be6565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890614049565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118bd8383836001612096565b505050565b606060008251036118e457604051806020016040528060008152509050611a35565b6000604051806060016040528060408152602001614d5a604091399050600060036002855161191391906140fb565b61191d9190613e1a565b60046119299190613e4b565b9050600060208261193a91906140fb565b67ffffffffffffffff81111561195357611952612a18565b5b6040519080825280601f01601f1916602001820160405280156119855781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156119f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050611999565b600389510660018114611a0e5760028114611a1e57611a29565b613d3d60f01b6002830352611a29565b603d60f81b60018303525b50505050508093505050505b919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6060611a8e826001611a888561209c565b0161212c565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09061417b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cba91906129e2565b60405180910390a3505050565b611cd28484846115c9565b611cde84848484612368565b611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d149061420d565b60405180910390fd5b50505050565b606060006001611d32846124ef565b01905060008167ffffffffffffffff811115611d5157611d50612a18565b5b6040519080825280601f01601f191660200182016040528015611d835781602001600182028036833780820191505090505b509050600082602001820190505b600115611de6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611dda57611dd9613dbc565b5b04945060008503611d91575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e2b57600080fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e8257600080fd5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d54611ee991906140fb565b600d819055506000600d5490506000611f0184612642565b905080600a600084815260200190815260200160002081905550611f258483612675565b8192505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611f5183611a3a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561209057600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146120045780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffc9190613ea5565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461208f5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208791906140fb565b925050819055505b5b50505050565b50505050565b600080600090506000608084901c11156120be57608083901c92506010810190505b6000604084901c11156120d957604083901c92506008810190505b6000602084901c11156120f457602083901c92506004810190505b6000601084901c111561210f57601083901c92506002810190505b6000600884901c1115612123576001810190505b80915050919050565b60606000600283600261213f9190613e4b565b61214991906140fb565b67ffffffffffffffff81111561216257612161612a18565b5b6040519080825280601f01601f1916602001820160405280156121945781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106121cc576121cb61422d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122305761222f61422d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122709190613e4b565b61227a91906140fb565b90505b600181111561231a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106122bc576122bb61422d565b5b1a60f81b8282815181106122d3576122d261422d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806123139061425c565b905061227d565b506000841461235e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612355906142d1565b60405180910390fd5b8091505092915050565b60006123898473ffffffffffffffffffffffffffffffffffffffff16612693565b156124e2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123b2611473565b8786866040518563ffffffff1660e01b81526004016123d49493929190614346565b6020604051808303816000875af192505050801561241057506040513d601f19601f8201168201806040525081019061240d91906143a7565b60015b612492573d8060008114612440576040519150601f19603f3d011682016040523d82523d6000602084013e612445565b606091505b50600081510361248a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124819061420d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e7565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061254d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161254357612542613dbc565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061258a576d04ee2d6d415b85acef810000000083816125805761257f613dbc565b5b0492506020810190505b662386f26fc1000083106125b957662386f26fc1000083816125af576125ae613dbc565b5b0492506010810190505b6305f5e10083106125e2576305f5e10083816125d8576125d7613dbc565b5b0492506008810190505b61271083106126075761271083816125fd576125fc613dbc565b5b0492506004810190505b6064831061262a57606483816126205761261f613dbc565b5b0492506002810190505b600a8310612639576001810190505b80915050919050565b600081604051602001612655919061441c565b6040516020818303038152906040528051906020012060001c9050919050565b61268f8282604051806020016040528060008152506126b6565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6126c08383612711565b6126cd6000848484612368565b61270c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127039061420d565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277790614483565b60405180910390fd5b61278981611f2f565b156127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c0906144ef565b60405180910390fd5b6127d7600083836001611f70565b6127e081611f2f565b15612820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612817906144ef565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461292a600083836001612096565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61297781612942565b811461298257600080fd5b50565b6000813590506129948161296e565b92915050565b6000602082840312156129b0576129af612938565b5b60006129be84828501612985565b91505092915050565b60008115159050919050565b6129dc816129c7565b82525050565b60006020820190506129f760008301846129d3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a5082612a07565b810181811067ffffffffffffffff82111715612a6f57612a6e612a18565b5b80604052505050565b6000612a8261292e565b9050612a8e8282612a47565b919050565b600067ffffffffffffffff821115612aae57612aad612a18565b5b612ab782612a07565b9050602081019050919050565b82818337600083830152505050565b6000612ae6612ae184612a93565b612a78565b905082815260208101848484011115612b0257612b01612a02565b5b612b0d848285612ac4565b509392505050565b600082601f830112612b2a57612b296129fd565b5b8135612b3a848260208601612ad3565b91505092915050565b60008060408385031215612b5a57612b59612938565b5b600083013567ffffffffffffffff811115612b7857612b7761293d565b5b612b8485828601612b15565b925050602083013567ffffffffffffffff811115612ba557612ba461293d565b5b612bb185828601612b15565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bf5578082015181840152602081019050612bda565b60008484015250505050565b6000612c0c82612bbb565b612c168185612bc6565b9350612c26818560208601612bd7565b612c2f81612a07565b840191505092915050565b60006020820190508181036000830152612c548184612c01565b905092915050565b6000819050919050565b612c6f81612c5c565b8114612c7a57600080fd5b50565b600081359050612c8c81612c66565b92915050565b600060208284031215612ca857612ca7612938565b5b6000612cb684828501612c7d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cea82612cbf565b9050919050565b612cfa81612cdf565b82525050565b6000602082019050612d156000830184612cf1565b92915050565b612d2481612cdf565b8114612d2f57600080fd5b50565b600081359050612d4181612d1b565b92915050565b60008060408385031215612d5e57612d5d612938565b5b6000612d6c85828601612d32565b9250506020612d7d85828601612c7d565b9150509250929050565b612d90816129c7565b8114612d9b57600080fd5b50565b600081359050612dad81612d87565b92915050565b600060208284031215612dc957612dc8612938565b5b6000612dd784828501612d9e565b91505092915050565b612de981612c5c565b82525050565b6000602082019050612e046000830184612de0565b92915050565b600080600060608486031215612e2357612e22612938565b5b6000612e3186828701612d32565b9350506020612e4286828701612d32565b9250506040612e5386828701612c7d565b9150509250925092565b600060208284031215612e7357612e72612938565b5b6000612e8184828501612d32565b91505092915050565b60008060408385031215612ea157612ea0612938565b5b6000612eaf85828601612d32565b9250506020612ec085828601612d9e565b9150509250929050565b600067ffffffffffffffff821115612ee557612ee4612a18565b5b612eee82612a07565b9050602081019050919050565b6000612f0e612f0984612eca565b612a78565b905082815260208101848484011115612f2a57612f29612a02565b5b612f35848285612ac4565b509392505050565b600082601f830112612f5257612f516129fd565b5b8135612f62848260208601612efb565b91505092915050565b60008060008060808587031215612f8557612f84612938565b5b6000612f9387828801612d32565b9450506020612fa487828801612d32565b9350506040612fb587828801612c7d565b925050606085013567ffffffffffffffff811115612fd657612fd561293d565b5b612fe287828801612f3d565b91505092959194509250565b6000806040838503121561300557613004612938565b5b600061301385828601612d32565b925050602061302485828601612d32565b9150509250929050565b60006020828403121561304457613043612938565b5b600082013567ffffffffffffffff8111156130625761306161293d565b5b61306e84828501612b15565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130be57607f821691505b6020821081036130d1576130d0613077565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026131397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826130fc565b61314386836130fc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061318061317b61317684612c5c565b61315b565b612c5c565b9050919050565b6000819050919050565b61319a83613165565b6131ae6131a682613187565b848454613109565b825550505050565b600090565b6131c36131b6565b6131ce818484613191565b505050565b5b818110156131f2576131e76000826131bb565b6001810190506131d4565b5050565b601f82111561323757613208816130d7565b613211846130ec565b81016020851015613220578190505b61323461322c856130ec565b8301826131d3565b50505b505050565b600082821c905092915050565b600061325a6000198460080261323c565b1980831691505092915050565b60006132738383613249565b9150826002028217905092915050565b61328c82612bbb565b67ffffffffffffffff8111156132a5576132a4612a18565b5b6132af82546130a6565b6132ba8282856131f6565b600060209050601f8311600181146132ed57600084156132db578287015190505b6132e58582613267565b86555061334d565b601f1984166132fb866130d7565b60005b82811015613323578489015182556001820191506020850194506020810190506132fe565b86831015613340578489015161333c601f891682613249565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006133b1602183612bc6565b91506133bc82613355565b604082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613443603d83612bc6565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006134d5602d83612bc6565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b600081905092915050565b7f3c68746d6c3e3c686561643e3c7469746c653e5369676e61747572652062792060008201527f5275756420476869656c656e3c2f7469746c653e3c736372697074207372633d60208201527f2200000000000000000000000000000000000000000000000000000000000000604082015250565b600061359860418361350b565b91506135a382613516565b604182019050919050565b600081546135bb816130a6565b6135c5818661350b565b945060018216600081146135e057600181146135f557613628565b60ff1983168652811515820286019350613628565b6135fe856130d7565b60005b8381101561362057815481890152600182019150602081019050613601565b838801955050505b50505092915050565b7f223e3c2f7363726970743e3c7363726970743e00000000000000000000000000600082015250565b600061366760138361350b565b915061367282613631565b601382019050919050565b600061368882612bbb565b613692818561350b565b93506136a2818560208601612bd7565b80840191505092915050565b7f3c2f7363726970743e3c2f686561643e3c626f6479207374796c653d226d617260008201527f67696e3a303b223e3c6d61696e3e3c2f6d61696e3e3c2f626f64793e3c2f687460208201527f6d6c3e0000000000000000000000000000000000000000000000000000000000604082015250565b600061373060438361350b565b915061373b826136ae565b604382019050919050565b60006137518261358b565b915061375d82856135ae565b91506137688261365a565b9150613774828461367d565b915061377f82613723565b91508190509392505050565b7f646174613a746578742f68746d6c3b6261736536342c00000000000000000000600082015250565b60006137c160168361350b565b91506137cc8261378b565b601682019050919050565b60006137e2826137b4565b91506137ee828461367d565b915081905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061382f601883612bc6565b915061383a826137f9565b602082019050919050565b6000602082019050818103600083015261385e81613822565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006138c1602983612bc6565b91506138cc82613865565b604082019050919050565b600060208201905081810360008301526138f0816138b4565b9050919050565b7f6c65742068617368537472696e67203d20270000000000000000000000000000600082015250565b600061392d60128361350b565b9150613938826138f7565b601282019050919050565b7f273b200000000000000000000000000000000000000000000000000000000000600082015250565b600061397960038361350b565b915061398482613943565b600382019050919050565b600061399a82613920565b91506139a6828561367d565b91506139b18261396c565b91506139bd828461367d565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a225360008201527f69676e6174757265200000000000000000000000000000000000000000000000602082015250565b6000613a2560298361350b565b9150613a30826139c9565b602982019050919050565b7f222c226465736372697074696f6e223a22546865205369676e6174757265206960008201527f7320612076697375616c20726570726573656e746174696f6e206f662074686560208201527f2077616c6c65742061646472657373207468617420637265617465642074686960408201527f7320746f6b656e2e204e6f20776f72726965732c20746865207363726970742060608201527f616e6420686173682061726520626f74682073746f72656420696d6d7574616260808201527f6c7920696e73696465207468697320626c6f636b636861696e20636f6e74726160a08201527f637420746f2067656e65726174652074686520696d6167652e222c22696d616760c08201527f65223a220000000000000000000000000000000000000000000000000000000060e082015250565b6000613b7b60e48361350b565b9150613b8682613a3b565b60e482019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f7777772e746f60008201527f6b656e3336352e6172742f222c22616e696d6174696f6e5f75726c223a220000602082015250565b6000613bed603e8361350b565b9150613bf882613b91565b603e82019050919050565b7f222c22696e746572616374696f6e223a225072657373204320746f207377697460008201527f6368206265747765656e20636f6c6f72656420616e64206f75746c696e65205360208201527f69676e61747572652c205072657373205320746f20736176652074686520696d60408201527f616765227d000000000000000000000000000000000000000000000000000000606082015250565b6000613cab60658361350b565b9150613cb682613c03565b606582019050919050565b6000613ccc82613a18565b9150613cd8828861367d565b9150613ce382613b6e565b9150613cef82876135ae565b9150613cfb828661367d565b9150613d0782856135ae565b9150613d1282613be0565b9150613d1e828461367d565b9150613d2982613c9e565b91508190509695505050505050565b600081519050613d4781612d87565b92915050565b600060208284031215613d6357613d62612938565b5b6000613d7184828501613d38565b91505092915050565b600081519050613d8981612c66565b92915050565b600060208284031215613da557613da4612938565b5b6000613db384828501613d7a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e2582612c5c565b9150613e3083612c5c565b925082613e4057613e3f613dbc565b5b828204905092915050565b6000613e5682612c5c565b9150613e6183612c5c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9a57613e99613deb565b5b828202905092915050565b6000613eb082612c5c565b9150613ebb83612c5c565b9250828203905081811115613ed357613ed2613deb565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f35602683612bc6565b9150613f4082613ed9565b604082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fa1602083612bc6565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614033602583612bc6565b915061403e82613fd7565b604082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140c5602483612bc6565b91506140d082614069565b604082019050919050565b600060208201905081810360008301526140f4816140b8565b9050919050565b600061410682612c5c565b915061411183612c5c565b925082820190508082111561412957614128613deb565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614165601983612bc6565b91506141708261412f565b602082019050919050565b6000602082019050818103600083015261419481614158565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006141f7603283612bc6565b91506142028261419b565b604082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061426782612c5c565b91506000820361427a57614279613deb565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006142bb602083612bc6565b91506142c682614285565b602082019050919050565b600060208201905081810360008301526142ea816142ae565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614318826142f1565b61432281856142fc565b9350614332818560208601612bd7565b61433b81612a07565b840191505092915050565b600060808201905061435b6000830187612cf1565b6143686020830186612cf1565b6143756040830185612de0565b8181036060830152614387818461430d565b905095945050505050565b6000815190506143a18161296e565b92915050565b6000602082840312156143bd576143bc612938565b5b60006143cb84828501614392565b91505092915050565b60008160601b9050919050565b60006143ec826143d4565b9050919050565b60006143fe826143e1565b9050919050565b61441661441182612cdf565b6143f3565b82525050565b60006144288284614405565b60148201915081905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061446d602083612bc6565b915061447882614437565b602082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006144d9601c83612bc6565b91506144e4826144a3565b602082019050919050565b60006020820190508181036000830152614508816144cc565b905091905056fe6c657420736c696365203d205b5d3b20666f7220286c65742069203d20323b2069203c2036363b20692b3d3429207b20736c6963652e707573682868617368537472696e672e736c69636528692c20692b3429293b207d206c657420646563526f7773203d20736c6963652e6d61702878203d3e207061727365496e7428782c20313629293b20636f6e737420626f72646572203d2033323b20636f6e7374206d6178203d20323536202b20626f72646572202a20323b206c65742063616e7661732c207363616c696e672c206c696e654c656e6774682c206c696e65593b206c657420722c20672c20623b206c657420636f6c6f7273203d20747275653b2066756e6374696f6e2073657475702829207b207363616c696e67203d204d6174682e6d696e2877696e646f772e696e6e657257696474682f6d61782c2077696e646f772e696e6e65724865696768742f6d6178293b2063616e766173203d206d6178202a207363616c696e673b2063726561746543616e7661732863616e7661732c2063616e766173293b2072203d207368696674656428302c2031293b2067203d207368696674656428322c2035293b2062203d207368696674656428342c2033293b206c696e6559203d2028323330202b20626f7264657229202a207363616c696e673b207d2066756e6374696f6e20647261772829207b206261636b67726f756e6428323535293b2069662028636f6c6f727329207b206261636b67726f756e6428722c20672c20622c20313230293b207374726f6b655765696768742831293b2066696c6c2830293b207374726f6b652830293b2064726177696e67436f6e746578742e7365744c696e6544617368285b7363616c696e67202a20362c207363616c696e67202a20335d293b206c696e6528626f72646572202a207363616c696e672c206c696e65592c20286d6178202d20626f7264657229202a207363616c696e672c206c696e6559293b2064726177696e67436f6e746578742e7365744c696e6544617368285b5d293b206e6f5374726f6b6528293b206c657420666f6e7453697a65203d203132202a207363616c696e673b2074657874466f6e74282754696d6573204e657720526f6d616e272c20666f6e7453697a65293b207465787428275369676e6174757265272c2028626f72646572202b20313029202a207363616c696e672c206c696e6559202b20666f6e7453697a65202f2032202b203130202a207363616c696e67293b206267416c706861203d207368696674656428362c203729202f20323b207374726f6b6528722c20672c20622c206267416c706861203c203830203f206267416c706861203a2030293b206c657420706f696e7473203d20666c6f6f72287368696674656428332c203229202f203329202b20313b206c657420706f696e74735769647468203d2028323536202a207363616c696e6729202f20706f696e74733b207374726f6b6557656967687428706f696e74735769647468293b20666f7220287661722076203d20303b2076203c20706f696e74733b20762b2b29207b20666f7220287661722068203d20303b2068203c20706f696e74733b20682b2b29207b20706f696e7428706f696e74735769647468202a2068202b2028626f72646572202a207363616c696e6729202b20706f696e74735769647468202f20322c20706f696e74735769647468202a2076202b2028626f72646572202a207363616c696e6729202b20706f696e74735769647468202f2032293b207d207d207d207369676e617475726528293b206e6f4c6f6f7028293b207d2066756e6374696f6e207369676e61747572652829207b206e6f46696c6c28293b206c65742073773b20666f72287661722069203d20636f6c6f7273203f2030203a20333b2069203c3d20333b20692b2b29207b206966202869203d3d203329207b2069662028636f6c6f727329207b207374726f6b6528323535202d2072202c20323535202d2067202c20323535202d20622c20323135293b207d20656c7365207b207374726f6b652830293b207d207d20656c7365207b207374726f6b652869202a203430293b207d206c657420776569676874203d207368696674656428382c203429202f203136303b207377203d202869202a2028302e33202b2077656967687429202b20302e3529202a207363616c696e673b207374726f6b65576569676874287377293b20626567696e536861706528293b20637572766556657274657828626f72646572202a207363616c696e672c206c696e6559293b2063757276655665727465782828626f72646572202b20323029202a207363616c696e67202b2073772c20286c696e6559202b20737729202d203230202a207363616c696e67293b20666f72202876617220726f77203d20303b20726f77203c20646563526f77732e6c656e6774683b20726f772b2b29207b20637572766556657274657828706f7328726f772c203029202b2073772c20706f7328726f772c203829202b207377293b207d20656e64536861706528293b207d207d2066756e6374696f6e20706f7328726f772c206929207b2072657475726e20287368696674656428726f772c206929202b20626f7264657229202a207363616c696e673b207d2066756e6374696f6e207368696674656428726f772c206929207b202072657475726e202828646563526f77735b726f775d203e3e20692920262030784646293b207d2066756e6374696f6e206b657954797065642829207b20696620286b6579203d3d3d2027732729207b207361766543616e76617328277369676e6174757265272c2027706e6727293b207d20696620286b6579203d3d3d2027632729207b20636f6c6f7273203d2021636f6c6f72733b2072656472617728293b207d207d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220752154a860d28b0577385e3bd8b18d0cc7a83b377ffd975a0059c69c650e55e364736f6c6343000810003368747470733a2f2f697066732e696f2f697066732f516d656a32614d6a4b7073483267476d523162446e4754374659575075757165646772623369394e4b446a4456772f70352d3135302e6d696e2e6a730000000000000000000000003b07930de34b8a5f5033841bdada87baf86ad68e0000000000000000000000000000000000000000000000000000000000000014

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461069a578063efc81a8c146106d7578063f2fde38b146106f5578063f76ab4aa1461071e576101cd565b8063b88d4fde146105ba578063c569bd95146105e3578063c87b56dd14610620578063d7da77c81461065d576101cd565b80638da5cb5b116100d15780638da5cb5b1461051057806395d89b411461053b578063a035b1fe14610566578063a22cb46514610591576101cd565b806370a0823114610491578063715018a6146104ce578063757ccd3b146104e5576101cd565b806323b872dd1161016f5780634f05ba891161013e5780634f05ba89146103b15780636352211e146103ee5780636a61e5fc1461042b5780636b2fafa914610454576101cd565b806323b872dd1461031d5780633ccfd60b14610346578063427500201461035d57806342842e0e14610388576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806316c38b3c146102c957806318160ddd146102f2576101cd565b806301ffc9a7146101d25780630615a8171461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061299a565b610747565b60405161020691906129e2565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612b43565b610829565b005b34801561024457600080fd5b5061024d610855565b60405161025a9190612c3a565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612c92565b6108e7565b6040516102979190612d00565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612d47565b61092d565b005b3480156102d557600080fd5b506102f060048036038101906102eb9190612db3565b610a44565b005b3480156102fe57600080fd5b50610307610a69565b6040516103149190612def565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612e0a565b610a73565b005b34801561035257600080fd5b5061035b610ad3565b005b34801561036957600080fd5b50610372610b38565b60405161037f9190612def565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612e0a565b610b42565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190612c92565b610b62565b6040516103e59190612c3a565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190612c92565b610be6565b6040516104229190612d00565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612c92565b610c6c565b005b34801561046057600080fd5b5061047b60048036038101906104769190612c92565b610c7e565b6040516104889190612c3a565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190612e5d565b610ca3565b6040516104c59190612def565b60405180910390f35b3480156104da57600080fd5b506104e3610d5a565b005b3480156104f157600080fd5b506104fa610d6e565b60405161050791906129e2565b60405180910390f35b34801561051c57600080fd5b50610525610d9a565b6040516105329190612d00565b60405180910390f35b34801561054757600080fd5b50610550610dc4565b60405161055d9190612c3a565b60405180910390f35b34801561057257600080fd5b5061057b610e56565b6040516105889190612def565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190612e8a565b610e60565b005b3480156105c657600080fd5b506105e160048036038101906105dc9190612f6b565b610e76565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190612c92565b610ed8565b6040516106179190612c3a565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190612c92565b610f61565b6040516106549190612c3a565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f9190612e5d565b610fdb565b6040516106919190612def565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190612fee565b611010565b6040516106ce91906129e2565b60405180910390f35b6106df6110a4565b6040516106ec9190612def565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190612e5d565b6112a2565b005b34801561072a57600080fd5b506107456004803603810190610740919061302e565b611325565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610822575061082182611340565b5b9050919050565b6108316113aa565b81600c90816108409190613283565b5080600b90816108509190613283565b505050565b606060008054610864906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610890906130a6565b80156108dd5780601f106108b2576101008083540402835291602001916108dd565b820191906000526020600020905b8154815290600101906020018083116108c057829003601f168201915b5050505050905090565b60006108f282611428565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093882610be6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f906133c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c7611473565b73ffffffffffffffffffffffffffffffffffffffff1614806109f657506109f5816109f0611473565b611010565b5b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613459565b60405180910390fd5b610a3f838361147b565b505050565b610a4c6113aa565b80600e60006101000a81548160ff02191690831515021790555050565b600061016d905090565b610a84610a7e611473565b82611534565b610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba906134eb565b60405180910390fd5b610ace8383836115c9565b505050565b610adb6113aa565b60004711610ae857600080fd5b610af0610d9a565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b35573d6000803e3d6000fd5b50565b6000600d54905090565b610b5d83838360405180602001604052806000815250610e76565b505050565b60606000610b6f83610ed8565b9050600081511115610bcd57610ba6600982604051602001610b92929190613746565b6040516020818303038152906040526118c2565b604051602001610bb691906137d7565b604051602081830303815290604052915050610be1565b604051806020016040528060008152509150505b919050565b600080610bf283611a3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613845565b60405180910390fd5b80915050919050565b610c746113aa565b8060108190555050565b6060610c9c600a600084815260200190815260200160002054611a77565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a906138d7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d626113aa565b610d6c6000611a95565b565b6000610d78610a69565b600d54108015610d955750600e60009054906101000a900460ff16155b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610dd3906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610dff906130a6565b8015610e4c5780601f10610e2157610100808354040283529160200191610e4c565b820191906000526020600020905b815481529060010190602001808311610e2f57829003601f168201915b5050505050905090565b6000601054905090565b610e72610e6b611473565b8383611b5b565b5050565b610e87610e81611473565b83611534565b610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd906134eb565b60405180910390fd5b610ed284848484611cc7565b50505050565b60606000600a60008481526020019081526020016000205490506000811115610f4857610f0481611a77565b60405180610880016040528061084a815260200161451061084a9139604051602001610f3192919061398f565b604051602081830303815290604052915050610f5c565b604051806020016040528060008152509150505b919050565b6060600082118015610f755750600d548211155b15610fc357610f8382611d23565b600c610f8e84611d23565b600b610f9986610b62565b604051602001610fad959493929190613cc1565b6040516020818303038152906040529050610fd6565b6040518060200160405280600081525090505b919050565b6000610fe56113aa565b610fed610a69565b600d5410610ffa57600080fd5b600061100583611df1565b905080915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1663757ccd3b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111159190613d4d565b61111e57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190613d8f565b34101561119957600080fd5b60006111a433611df1565b9050600034111561129b576000600f546064346111c19190613e1a565b6111cb9190613e4b565b90506000811115611225576111de610d9a565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611223573d6000803e3d6000fd5b505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc823461126d9190613ea5565b9081150290604051600060405180830381858888f19350505050158015611298573d6000803e3d6000fd5b50505b8091505090565b6112aa6113aa565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090613f4b565b60405180910390fd5b61132281611a95565b50565b61132d6113aa565b806009908161133c9190613283565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113b2611473565b73ffffffffffffffffffffffffffffffffffffffff166113d0610d9a565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90613fb7565b60405180910390fd5b565b61143181611f2f565b611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613845565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114ee83610be6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061154083610be6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061158257506115818185611010565b5b806115c057508373ffffffffffffffffffffffffffffffffffffffff166115a8846108e7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115e982610be6565b73ffffffffffffffffffffffffffffffffffffffff161461163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690614049565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a5906140db565b60405180910390fd5b6116bb8383836001611f70565b8273ffffffffffffffffffffffffffffffffffffffff166116db82610be6565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890614049565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118bd8383836001612096565b505050565b606060008251036118e457604051806020016040528060008152509050611a35565b6000604051806060016040528060408152602001614d5a604091399050600060036002855161191391906140fb565b61191d9190613e1a565b60046119299190613e4b565b9050600060208261193a91906140fb565b67ffffffffffffffff81111561195357611952612a18565b5b6040519080825280601f01601f1916602001820160405280156119855781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156119f4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050611999565b600389510660018114611a0e5760028114611a1e57611a29565b613d3d60f01b6002830352611a29565b603d60f81b60018303525b50505050508093505050505b919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6060611a8e826001611a888561209c565b0161212c565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09061417b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cba91906129e2565b60405180910390a3505050565b611cd28484846115c9565b611cde84848484612368565b611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d149061420d565b60405180910390fd5b50505050565b606060006001611d32846124ef565b01905060008167ffffffffffffffff811115611d5157611d50612a18565b5b6040519080825280601f01601f191660200182016040528015611d835781602001600182028036833780820191505090505b509050600082602001820190505b600115611de6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611dda57611dd9613dbc565b5b04945060008503611d91575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e2b57600080fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e8257600080fd5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d54611ee991906140fb565b600d819055506000600d5490506000611f0184612642565b905080600a600084815260200190815260200160002081905550611f258483612675565b8192505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611f5183611a3a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600181111561209057600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146120045780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffc9190613ea5565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461208f5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208791906140fb565b925050819055505b5b50505050565b50505050565b600080600090506000608084901c11156120be57608083901c92506010810190505b6000604084901c11156120d957604083901c92506008810190505b6000602084901c11156120f457602083901c92506004810190505b6000601084901c111561210f57601083901c92506002810190505b6000600884901c1115612123576001810190505b80915050919050565b60606000600283600261213f9190613e4b565b61214991906140fb565b67ffffffffffffffff81111561216257612161612a18565b5b6040519080825280601f01601f1916602001820160405280156121945781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106121cc576121cb61422d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122305761222f61422d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122709190613e4b565b61227a91906140fb565b90505b600181111561231a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106122bc576122bb61422d565b5b1a60f81b8282815181106122d3576122d261422d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806123139061425c565b905061227d565b506000841461235e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612355906142d1565b60405180910390fd5b8091505092915050565b60006123898473ffffffffffffffffffffffffffffffffffffffff16612693565b156124e2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123b2611473565b8786866040518563ffffffff1660e01b81526004016123d49493929190614346565b6020604051808303816000875af192505050801561241057506040513d601f19601f8201168201806040525081019061240d91906143a7565b60015b612492573d8060008114612440576040519150601f19603f3d011682016040523d82523d6000602084013e612445565b606091505b50600081510361248a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124819061420d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e7565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061254d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161254357612542613dbc565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061258a576d04ee2d6d415b85acef810000000083816125805761257f613dbc565b5b0492506020810190505b662386f26fc1000083106125b957662386f26fc1000083816125af576125ae613dbc565b5b0492506010810190505b6305f5e10083106125e2576305f5e10083816125d8576125d7613dbc565b5b0492506008810190505b61271083106126075761271083816125fd576125fc613dbc565b5b0492506004810190505b6064831061262a57606483816126205761261f613dbc565b5b0492506002810190505b600a8310612639576001810190505b80915050919050565b600081604051602001612655919061441c565b6040516020818303038152906040528051906020012060001c9050919050565b61268f8282604051806020016040528060008152506126b6565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6126c08383612711565b6126cd6000848484612368565b61270c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127039061420d565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277790614483565b60405180910390fd5b61278981611f2f565b156127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c0906144ef565b60405180910390fd5b6127d7600083836001611f70565b6127e081611f2f565b15612820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612817906144ef565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461292a600083836001612096565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61297781612942565b811461298257600080fd5b50565b6000813590506129948161296e565b92915050565b6000602082840312156129b0576129af612938565b5b60006129be84828501612985565b91505092915050565b60008115159050919050565b6129dc816129c7565b82525050565b60006020820190506129f760008301846129d3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a5082612a07565b810181811067ffffffffffffffff82111715612a6f57612a6e612a18565b5b80604052505050565b6000612a8261292e565b9050612a8e8282612a47565b919050565b600067ffffffffffffffff821115612aae57612aad612a18565b5b612ab782612a07565b9050602081019050919050565b82818337600083830152505050565b6000612ae6612ae184612a93565b612a78565b905082815260208101848484011115612b0257612b01612a02565b5b612b0d848285612ac4565b509392505050565b600082601f830112612b2a57612b296129fd565b5b8135612b3a848260208601612ad3565b91505092915050565b60008060408385031215612b5a57612b59612938565b5b600083013567ffffffffffffffff811115612b7857612b7761293d565b5b612b8485828601612b15565b925050602083013567ffffffffffffffff811115612ba557612ba461293d565b5b612bb185828601612b15565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bf5578082015181840152602081019050612bda565b60008484015250505050565b6000612c0c82612bbb565b612c168185612bc6565b9350612c26818560208601612bd7565b612c2f81612a07565b840191505092915050565b60006020820190508181036000830152612c548184612c01565b905092915050565b6000819050919050565b612c6f81612c5c565b8114612c7a57600080fd5b50565b600081359050612c8c81612c66565b92915050565b600060208284031215612ca857612ca7612938565b5b6000612cb684828501612c7d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cea82612cbf565b9050919050565b612cfa81612cdf565b82525050565b6000602082019050612d156000830184612cf1565b92915050565b612d2481612cdf565b8114612d2f57600080fd5b50565b600081359050612d4181612d1b565b92915050565b60008060408385031215612d5e57612d5d612938565b5b6000612d6c85828601612d32565b9250506020612d7d85828601612c7d565b9150509250929050565b612d90816129c7565b8114612d9b57600080fd5b50565b600081359050612dad81612d87565b92915050565b600060208284031215612dc957612dc8612938565b5b6000612dd784828501612d9e565b91505092915050565b612de981612c5c565b82525050565b6000602082019050612e046000830184612de0565b92915050565b600080600060608486031215612e2357612e22612938565b5b6000612e3186828701612d32565b9350506020612e4286828701612d32565b9250506040612e5386828701612c7d565b9150509250925092565b600060208284031215612e7357612e72612938565b5b6000612e8184828501612d32565b91505092915050565b60008060408385031215612ea157612ea0612938565b5b6000612eaf85828601612d32565b9250506020612ec085828601612d9e565b9150509250929050565b600067ffffffffffffffff821115612ee557612ee4612a18565b5b612eee82612a07565b9050602081019050919050565b6000612f0e612f0984612eca565b612a78565b905082815260208101848484011115612f2a57612f29612a02565b5b612f35848285612ac4565b509392505050565b600082601f830112612f5257612f516129fd565b5b8135612f62848260208601612efb565b91505092915050565b60008060008060808587031215612f8557612f84612938565b5b6000612f9387828801612d32565b9450506020612fa487828801612d32565b9350506040612fb587828801612c7d565b925050606085013567ffffffffffffffff811115612fd657612fd561293d565b5b612fe287828801612f3d565b91505092959194509250565b6000806040838503121561300557613004612938565b5b600061301385828601612d32565b925050602061302485828601612d32565b9150509250929050565b60006020828403121561304457613043612938565b5b600082013567ffffffffffffffff8111156130625761306161293d565b5b61306e84828501612b15565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130be57607f821691505b6020821081036130d1576130d0613077565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026131397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826130fc565b61314386836130fc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061318061317b61317684612c5c565b61315b565b612c5c565b9050919050565b6000819050919050565b61319a83613165565b6131ae6131a682613187565b848454613109565b825550505050565b600090565b6131c36131b6565b6131ce818484613191565b505050565b5b818110156131f2576131e76000826131bb565b6001810190506131d4565b5050565b601f82111561323757613208816130d7565b613211846130ec565b81016020851015613220578190505b61323461322c856130ec565b8301826131d3565b50505b505050565b600082821c905092915050565b600061325a6000198460080261323c565b1980831691505092915050565b60006132738383613249565b9150826002028217905092915050565b61328c82612bbb565b67ffffffffffffffff8111156132a5576132a4612a18565b5b6132af82546130a6565b6132ba8282856131f6565b600060209050601f8311600181146132ed57600084156132db578287015190505b6132e58582613267565b86555061334d565b601f1984166132fb866130d7565b60005b82811015613323578489015182556001820191506020850194506020810190506132fe565b86831015613340578489015161333c601f891682613249565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006133b1602183612bc6565b91506133bc82613355565b604082019050919050565b600060208201905081810360008301526133e0816133a4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613443603d83612bc6565b915061344e826133e7565b604082019050919050565b6000602082019050818103600083015261347281613436565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006134d5602d83612bc6565b91506134e082613479565b604082019050919050565b60006020820190508181036000830152613504816134c8565b9050919050565b600081905092915050565b7f3c68746d6c3e3c686561643e3c7469746c653e5369676e61747572652062792060008201527f5275756420476869656c656e3c2f7469746c653e3c736372697074207372633d60208201527f2200000000000000000000000000000000000000000000000000000000000000604082015250565b600061359860418361350b565b91506135a382613516565b604182019050919050565b600081546135bb816130a6565b6135c5818661350b565b945060018216600081146135e057600181146135f557613628565b60ff1983168652811515820286019350613628565b6135fe856130d7565b60005b8381101561362057815481890152600182019150602081019050613601565b838801955050505b50505092915050565b7f223e3c2f7363726970743e3c7363726970743e00000000000000000000000000600082015250565b600061366760138361350b565b915061367282613631565b601382019050919050565b600061368882612bbb565b613692818561350b565b93506136a2818560208601612bd7565b80840191505092915050565b7f3c2f7363726970743e3c2f686561643e3c626f6479207374796c653d226d617260008201527f67696e3a303b223e3c6d61696e3e3c2f6d61696e3e3c2f626f64793e3c2f687460208201527f6d6c3e0000000000000000000000000000000000000000000000000000000000604082015250565b600061373060438361350b565b915061373b826136ae565b604382019050919050565b60006137518261358b565b915061375d82856135ae565b91506137688261365a565b9150613774828461367d565b915061377f82613723565b91508190509392505050565b7f646174613a746578742f68746d6c3b6261736536342c00000000000000000000600082015250565b60006137c160168361350b565b91506137cc8261378b565b601682019050919050565b60006137e2826137b4565b91506137ee828461367d565b915081905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061382f601883612bc6565b915061383a826137f9565b602082019050919050565b6000602082019050818103600083015261385e81613822565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006138c1602983612bc6565b91506138cc82613865565b604082019050919050565b600060208201905081810360008301526138f0816138b4565b9050919050565b7f6c65742068617368537472696e67203d20270000000000000000000000000000600082015250565b600061392d60128361350b565b9150613938826138f7565b601282019050919050565b7f273b200000000000000000000000000000000000000000000000000000000000600082015250565b600061397960038361350b565b915061398482613943565b600382019050919050565b600061399a82613920565b91506139a6828561367d565b91506139b18261396c565b91506139bd828461367d565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a225360008201527f69676e6174757265200000000000000000000000000000000000000000000000602082015250565b6000613a2560298361350b565b9150613a30826139c9565b602982019050919050565b7f222c226465736372697074696f6e223a22546865205369676e6174757265206960008201527f7320612076697375616c20726570726573656e746174696f6e206f662074686560208201527f2077616c6c65742061646472657373207468617420637265617465642074686960408201527f7320746f6b656e2e204e6f20776f72726965732c20746865207363726970742060608201527f616e6420686173682061726520626f74682073746f72656420696d6d7574616260808201527f6c7920696e73696465207468697320626c6f636b636861696e20636f6e74726160a08201527f637420746f2067656e65726174652074686520696d6167652e222c22696d616760c08201527f65223a220000000000000000000000000000000000000000000000000000000060e082015250565b6000613b7b60e48361350b565b9150613b8682613a3b565b60e482019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f7777772e746f60008201527f6b656e3336352e6172742f222c22616e696d6174696f6e5f75726c223a220000602082015250565b6000613bed603e8361350b565b9150613bf882613b91565b603e82019050919050565b7f222c22696e746572616374696f6e223a225072657373204320746f207377697460008201527f6368206265747765656e20636f6c6f72656420616e64206f75746c696e65205360208201527f69676e61747572652c205072657373205320746f20736176652074686520696d60408201527f616765227d000000000000000000000000000000000000000000000000000000606082015250565b6000613cab60658361350b565b9150613cb682613c03565b606582019050919050565b6000613ccc82613a18565b9150613cd8828861367d565b9150613ce382613b6e565b9150613cef82876135ae565b9150613cfb828661367d565b9150613d0782856135ae565b9150613d1282613be0565b9150613d1e828461367d565b9150613d2982613c9e565b91508190509695505050505050565b600081519050613d4781612d87565b92915050565b600060208284031215613d6357613d62612938565b5b6000613d7184828501613d38565b91505092915050565b600081519050613d8981612c66565b92915050565b600060208284031215613da557613da4612938565b5b6000613db384828501613d7a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e2582612c5c565b9150613e3083612c5c565b925082613e4057613e3f613dbc565b5b828204905092915050565b6000613e5682612c5c565b9150613e6183612c5c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9a57613e99613deb565b5b828202905092915050565b6000613eb082612c5c565b9150613ebb83612c5c565b9250828203905081811115613ed357613ed2613deb565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f35602683612bc6565b9150613f4082613ed9565b604082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fa1602083612bc6565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614033602583612bc6565b915061403e82613fd7565b604082019050919050565b6000602082019050818103600083015261406281614026565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140c5602483612bc6565b91506140d082614069565b604082019050919050565b600060208201905081810360008301526140f4816140b8565b9050919050565b600061410682612c5c565b915061411183612c5c565b925082820190508082111561412957614128613deb565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614165601983612bc6565b91506141708261412f565b602082019050919050565b6000602082019050818103600083015261419481614158565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006141f7603283612bc6565b91506142028261419b565b604082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061426782612c5c565b91506000820361427a57614279613deb565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006142bb602083612bc6565b91506142c682614285565b602082019050919050565b600060208201905081810360008301526142ea816142ae565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614318826142f1565b61432281856142fc565b9350614332818560208601612bd7565b61433b81612a07565b840191505092915050565b600060808201905061435b6000830187612cf1565b6143686020830186612cf1565b6143756040830185612de0565b8181036060830152614387818461430d565b905095945050505050565b6000815190506143a18161296e565b92915050565b6000602082840312156143bd576143bc612938565b5b60006143cb84828501614392565b91505092915050565b60008160601b9050919050565b60006143ec826143d4565b9050919050565b60006143fe826143e1565b9050919050565b61441661441182612cdf565b6143f3565b82525050565b60006144288284614405565b60148201915081905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061446d602083612bc6565b915061447882614437565b602082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006144d9601c83612bc6565b91506144e4826144a3565b602082019050919050565b60006020820190508181036000830152614508816144cc565b905091905056fe6c657420736c696365203d205b5d3b20666f7220286c65742069203d20323b2069203c2036363b20692b3d3429207b20736c6963652e707573682868617368537472696e672e736c69636528692c20692b3429293b207d206c657420646563526f7773203d20736c6963652e6d61702878203d3e207061727365496e7428782c20313629293b20636f6e737420626f72646572203d2033323b20636f6e7374206d6178203d20323536202b20626f72646572202a20323b206c65742063616e7661732c207363616c696e672c206c696e654c656e6774682c206c696e65593b206c657420722c20672c20623b206c657420636f6c6f7273203d20747275653b2066756e6374696f6e2073657475702829207b207363616c696e67203d204d6174682e6d696e2877696e646f772e696e6e657257696474682f6d61782c2077696e646f772e696e6e65724865696768742f6d6178293b2063616e766173203d206d6178202a207363616c696e673b2063726561746543616e7661732863616e7661732c2063616e766173293b2072203d207368696674656428302c2031293b2067203d207368696674656428322c2035293b2062203d207368696674656428342c2033293b206c696e6559203d2028323330202b20626f7264657229202a207363616c696e673b207d2066756e6374696f6e20647261772829207b206261636b67726f756e6428323535293b2069662028636f6c6f727329207b206261636b67726f756e6428722c20672c20622c20313230293b207374726f6b655765696768742831293b2066696c6c2830293b207374726f6b652830293b2064726177696e67436f6e746578742e7365744c696e6544617368285b7363616c696e67202a20362c207363616c696e67202a20335d293b206c696e6528626f72646572202a207363616c696e672c206c696e65592c20286d6178202d20626f7264657229202a207363616c696e672c206c696e6559293b2064726177696e67436f6e746578742e7365744c696e6544617368285b5d293b206e6f5374726f6b6528293b206c657420666f6e7453697a65203d203132202a207363616c696e673b2074657874466f6e74282754696d6573204e657720526f6d616e272c20666f6e7453697a65293b207465787428275369676e6174757265272c2028626f72646572202b20313029202a207363616c696e672c206c696e6559202b20666f6e7453697a65202f2032202b203130202a207363616c696e67293b206267416c706861203d207368696674656428362c203729202f20323b207374726f6b6528722c20672c20622c206267416c706861203c203830203f206267416c706861203a2030293b206c657420706f696e7473203d20666c6f6f72287368696674656428332c203229202f203329202b20313b206c657420706f696e74735769647468203d2028323536202a207363616c696e6729202f20706f696e74733b207374726f6b6557656967687428706f696e74735769647468293b20666f7220287661722076203d20303b2076203c20706f696e74733b20762b2b29207b20666f7220287661722068203d20303b2068203c20706f696e74733b20682b2b29207b20706f696e7428706f696e74735769647468202a2068202b2028626f72646572202a207363616c696e6729202b20706f696e74735769647468202f20322c20706f696e74735769647468202a2076202b2028626f72646572202a207363616c696e6729202b20706f696e74735769647468202f2032293b207d207d207d207369676e617475726528293b206e6f4c6f6f7028293b207d2066756e6374696f6e207369676e61747572652829207b206e6f46696c6c28293b206c65742073773b20666f72287661722069203d20636f6c6f7273203f2030203a20333b2069203c3d20333b20692b2b29207b206966202869203d3d203329207b2069662028636f6c6f727329207b207374726f6b6528323535202d2072202c20323535202d2067202c20323535202d20622c20323135293b207d20656c7365207b207374726f6b652830293b207d207d20656c7365207b207374726f6b652869202a203430293b207d206c657420776569676874203d207368696674656428382c203429202f203136303b207377203d202869202a2028302e33202b2077656967687429202b20302e3529202a207363616c696e673b207374726f6b65576569676874287377293b20626567696e536861706528293b20637572766556657274657828626f72646572202a207363616c696e672c206c696e6559293b2063757276655665727465782828626f72646572202b20323029202a207363616c696e67202b2073772c20286c696e6559202b20737729202d203230202a207363616c696e67293b20666f72202876617220726f77203d20303b20726f77203c20646563526f77732e6c656e6774683b20726f772b2b29207b20637572766556657274657828706f7328726f772c203029202b2073772c20706f7328726f772c203829202b207377293b207d20656e64536861706528293b207d207d2066756e6374696f6e20706f7328726f772c206929207b2072657475726e20287368696674656428726f772c206929202b20626f7264657229202a207363616c696e673b207d2066756e6374696f6e207368696674656428726f772c206929207b202072657475726e202828646563526f77735b726f775d203e3e20692920262030784646293b207d2066756e6374696f6e206b657954797065642829207b20696620286b6579203d3d3d2027732729207b207361766543616e76617328277369676e6174757265272c2027706e6727293b207d20696620286b6579203d3d3d2027632729207b20636f6c6f7273203d2021636f6c6f72733b2072656472617728293b207d207d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220752154a860d28b0577385e3bd8b18d0cc7a83b377ffd975a0059c69c650e55e364736f6c63430008100033

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

0000000000000000000000003b07930de34b8a5f5033841bdada87baf86ad68e0000000000000000000000000000000000000000000000000000000000000014

-----Decoded View---------------
Arg [0] : artist (address): 0x3b07930De34b8A5f5033841BDada87BAF86aD68e
Arg [1] : fee (uint256): 20

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003b07930de34b8a5f5033841bdada87baf86ad68e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000014


Deployed Bytecode Sourcemap

142:6902:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1505:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5605:183:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2406:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3870:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3403:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5413:82:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5991:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4547:326:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6896:146:11;;;;;;;;;;;;;:::i;:::-;;5895:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4939:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3120:489:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2125:219:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5501:98:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4777:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:204:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:10;;;;;;;;;;;;;:::i;:::-;;3615:114:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2568:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5044:79:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4104:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5184:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5129:278:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6082:804;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4190:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4323:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3739:445:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5794:95:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1505:300:4;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;5605:183:11:-;1087:13:10;:11;:13::i;:::-;5727:12:11::1;5711:13;:28;;;;;;:::i;:::-;;5767:14;5749:15;:32;;;;;;:::i;:::-;;5605:183:::0;;:::o;2406:98:4:-;2460:13;2492:5;2485:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2406:98;:::o;3870:167::-;3946:7;3965:23;3980:7;3965:14;:23::i;:::-;4006:15;:24;4022:7;4006:24;;;;;;;;;;;;;;;;;;;;;3999:31;;3870:167;;;:::o;3403:406::-;3483:13;3499:23;3514:7;3499:14;:23::i;:::-;3483:39;;3546:5;3540:11;;:2;:11;;;3532:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3637:5;3621:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3646:37;3663:5;3670:12;:10;:12::i;:::-;3646:16;:37::i;:::-;3621:62;3600:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3781:21;3790:2;3794:7;3781:8;:21::i;:::-;3473:336;3403:406;;:::o;5413:82:11:-;1087:13:10;:11;:13::i;:::-;5482:6:11::1;5472:7;;:16;;;;;;;;;;;;;;;;;;5413:82:::0;:::o;5991:85::-;6035:4;604:3;6051:18;;5991:85;:::o;4547:326:4:-;4736:41;4755:12;:10;:12::i;:::-;4769:7;4736:18;:41::i;:::-;4728:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;4838:28;4848:4;4854:2;4858:7;4838:9;:28::i;:::-;4547:326;;;:::o;6896:146:11:-;1087:13:10;:11;:13::i;:::-;6975:1:11::1;6951:21;:25;6943:34;;;::::0;::::1;;6995:7;:5;:7::i;:::-;6987:25;;:48;7013:21;6987:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6896:146::o:0;5895:90::-;5941:4;5964:14;;5957:21;;5895:90;:::o;4939:179:4:-;5072:39;5089:4;5095:2;5099:7;5072:39;;;;;;;;;;;;:16;:39::i;:::-;4939:179;;;:::o;3120:489:11:-;3178:13;3203:21;3227:15;3234:7;3227:6;:15::i;:::-;3203:39;;3280:1;3262:7;3256:21;:25;3252:332;;;3354:217;3454:12;3491:7;3368:202;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3354:13;:217::i;:::-;3311:261;;;;;;;;:::i;:::-;;;;;;;;;;;;;3297:276;;;;;3252:332;3593:9;;;;;;;;;;;;;;;3120:489;;;;:::o;2125:219:4:-;2197:7;2216:13;2232:17;2241:7;2232:8;:17::i;:::-;2216:33;;2284:1;2267:19;;:5;:19;;;2259:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2332:5;2325:12;;;2125:219;;;:::o;5501:98:11:-;1087:13:10;:11;:13::i;:::-;5582:10:11::1;5568:11;:24;;;;5501:98:::0;:::o;4777:130::-;4829:13;4861:39;4881:9;:18;4891:7;4881:18;;;;;;;;;;;;4861:19;:39::i;:::-;4854:46;;4777:130;;;:::o;1864:204:4:-;1936:7;1980:1;1963:19;;:5;:19;;;1955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2045:9;:16;2055:5;2045:16;;;;;;;;;;;;;;;;2038:23;;1864:204;;;:::o;1824:101:10:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;3615:114:11:-;3657:4;3697:13;:11;:13::i;:::-;3680:14;;:30;:42;;;;;3715:7;;;;;;;;;;;3714:8;3680:42;3673:49;;3615:114;:::o;1194:85:10:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2568:102:4:-;2624:13;2656:7;2649:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2568:102;:::o;5044:79:11:-;5082:4;5105:11;;5098:18;;5044:79;:::o;4104:153:4:-;4198:52;4217:12;:10;:12::i;:::-;4231:8;4241;4198:18;:52::i;:::-;4104:153;;:::o;5184:314::-;5352:41;5371:12;:10;:12::i;:::-;5385:7;5352:18;:41::i;:::-;5344:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;5453:38;5467:4;5473:2;5477:7;5486:4;5453:13;:38::i;:::-;5184:314;;;;:::o;5129:278:11:-;5180:13;5205:10;5218:9;:18;5228:7;5218:18;;;;;;;;;;;;5205:31;;5258:1;5250:5;:9;5246:136;;;5328:26;5348:5;5328:19;:26::i;:::-;5363:6;;;;;;;;;;;;;;;;;5289:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5275:96;;;;;5246:136;5391:9;;;;;;;;;;;;;;;5129:278;;;;:::o;6082:804::-;6155:13;6194:1;6184:7;:11;:40;;;;;6210:14;;6199:7;:25;;6184:40;6180:700;;;6316:25;6333:7;6316:16;:25::i;:::-;6575:13;6590:25;6607:7;6590:16;:25::i;:::-;6617:15;6700:22;6714:7;6700:13;:22::i;:::-;6254:574;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6240:589;;;;6180:700;6860:9;;;;;;;;;;;;;;6082:804;;;;:::o;4190:190::-;4260:4;1087:13:10;:11;:13::i;:::-;4301::11::1;:11;:13::i;:::-;4284:14;;:30;4276:39;;;::::0;::::1;;4325:8;4336:17;4344:8;4336:7;:17::i;:::-;4325:28;;4370:3;4363:10;;;4190:190:::0;;;:::o;4323:162:4:-;4420:4;4443:18;:25;4462:5;4443:25;;;;;;;;;;;;;;;:35;4469:8;4443:35;;;;;;;;;;;;;;;;;;;;;;;;;4436:42;;4323:162;;;;:::o;3739:445:11:-;3783:4;3807;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3799:25;;;;;;3855:4;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3842:9;:25;;3834:34;;;;;;3878:8;3889:19;3897:10;3889:7;:19::i;:::-;3878:30;;3934:1;3922:9;:13;3918:240;;;3951:10;3984:12;;3977:3;3965:9;:15;;;;:::i;:::-;3964:32;;;;:::i;:::-;3951:45;;4022:1;4014:5;:9;4010:80;;;4051:7;:5;:7::i;:::-;4043:25;;:32;4069:5;4043:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4010:80;4111:7;;;;;;;;;;;4103:25;;:44;4141:5;4129:9;:17;;;;:::i;:::-;4103:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3937:221;3918:240;4174:3;4167:10;;;3739:445;:::o;2074:198:10:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;5794:95:11:-;1087:13:10;:11;:13::i;:::-;5879:3:11::1;5864:12;:18;;;;;;:::i;:::-;;5794:95:::0;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;1352:130:10:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;13401:133:4:-;13482:16;13490:7;13482;:16::i;:::-;13474:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13401:133;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;12703:171:4:-;12804:2;12777:15;:24;12793:7;12777:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12859:7;12855:2;12821:46;;12830:23;12845:7;12830:14;:23::i;:::-;12821:46;;;;;;;;;;;;12703:171;;:::o;7475:261::-;7568:4;7584:13;7600:23;7615:7;7600:14;:23::i;:::-;7584:39;;7652:5;7641:16;;:7;:16;;;:52;;;;7661:32;7678:5;7685:7;7661:16;:32::i;:::-;7641:52;:87;;;;7721:7;7697:31;;:20;7709:7;7697:11;:20::i;:::-;:31;;;7641:87;7633:96;;;7475:261;;;;:::o;11358:1233::-;11512:4;11485:31;;:23;11500:7;11485:14;:23::i;:::-;:31;;;11477:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11590:1;11576:16;;:2;:16;;;11568:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11644:42;11665:4;11671:2;11675:7;11684:1;11644:20;:42::i;:::-;11813:4;11786:31;;:23;11801:7;11786:14;:23::i;:::-;:31;;;11778:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11928:15;:24;11944:7;11928:24;;;;;;;;;;;;11921:31;;;;;;;;;;;12415:1;12396:9;:15;12406:4;12396:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12447:1;12430:9;:13;12440:2;12430:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12487:2;12468:7;:16;12476:7;12468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12524:7;12520:2;12505:27;;12514:4;12505:27;;;;;;;;;;;;12543:41;12563:4;12569:2;12573:7;12582:1;12543:19;:41::i;:::-;11358:1233;;;:::o;777:1861:1:-;835:13;879:1;864:4;:11;:16;860:31;;882:9;;;;;;;;;;;;;;;;860:31;940:19;962:12;;;;;;;;;;;;;;;;;940:34;;1023:18;1069:1;1064;1050:4;:11;:15;;;;:::i;:::-;1049:21;;;;:::i;:::-;1044:1;:27;;;;:::i;:::-;1023:48;;1151:20;1198:2;1185:10;:15;;;;:::i;:::-;1174:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1151:50;;1294:10;1286:6;1279:26;1386:1;1379:5;1375:13;1442:4;1492;1486:11;1477:7;1473:25;1585:2;1577:6;1573:15;1655:739;1674:6;1665:7;1662:19;1655:739;;;1771:1;1762:7;1758:15;1747:26;;1809:7;1803:14;1932:4;1924:5;1920:2;1916:14;1912:25;1902:8;1898:40;1892:47;1881:9;1873:67;1985:1;1974:9;1970:17;1957:30;;2063:4;2055:5;2051:2;2047:14;2043:25;2033:8;2029:40;2023:47;2012:9;2004:67;2116:1;2105:9;2101:17;2088:30;;2194:4;2186:5;2183:1;2178:14;2174:25;2164:8;2160:40;2154:47;2143:9;2135:67;2247:1;2236:9;2232:17;2219:30;;2325:4;2317:5;2305:25;2295:8;2291:40;2285:47;2274:9;2266:67;2378:1;2367:9;2363:17;2350:30;;1697:697;1655:739;;;2464:1;2457:4;2451:11;2447:19;2484:1;2479:54;;;;2551:1;2546:52;;;;2440:158;;2479:54;2523:6;2518:3;2514:16;2510:1;2499:9;2495:17;2488:43;2479:54;;2546:52;2590:4;2585:3;2581:14;2577:1;2566:9;2562:17;2555:41;2440:158;;1221:1387;;;;2625:6;2618:13;;;;;777:1861;;;;:::o;6773:115:4:-;6839:7;6865;:16;6873:7;6865:16;;;;;;;;;;;;;;;;;;;;;6858:23;;6773:115;;;:::o;1211:174:12:-;1270:13;1326:42;1338:5;1366:1;1345:18;1357:5;1345:11;:18::i;:::-;:22;1326:11;:42::i;:::-;1319:49;;1211:174;;;:::o;2426:187:10:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;13010:307:4:-;13160:8;13151:17;;:5;:17;;;13143:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;13246:8;13208:18;:25;13227:5;13208:25;;;;;;;;;;;;;;;:35;13234:8;13208:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13291:8;13269:41;;13284:5;13269:41;;;13301:8;13269:41;;;;;;:::i;:::-;;;;;;;;13010:307;;;:::o;6359:305::-;6509:28;6519:4;6525:2;6529:7;6509:9;:28::i;:::-;6555:47;6578:4;6584:2;6588:7;6597:4;6555:22;:47::i;:::-;6547:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6359:305;;;;:::o;410:696:12:-;466:13;515:14;552:1;532:17;543:5;532:10;:17::i;:::-;:21;515:38;;567:20;601:6;590:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:41;;622:11;748:6;744:2;740:15;732:6;728:28;721:35;;783:280;790:4;783:280;;;814:5;;;;;;;;953:8;948:2;941:5;937:14;932:30;927:3;919:44;1007:2;998:11;;;;;;:::i;:::-;;;;;1040:1;1031:5;:10;783:280;1027:21;783:280;1083:6;1076:13;;;;;410:696;;;:::o;4386:385:11:-;4439:4;4483:1;4463:22;;:8;:22;;;4455:31;;;;;;4505:9;:19;4515:8;4505:19;;;;;;;;;;;;;;;;;;;;;;;;;4504:20;4496:29;;;;;;4557:4;4535:9;:19;4545:8;4535:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;4605:1;4588:14;;:18;;;;:::i;:::-;4571:14;:35;;;;4616:8;4627:14;;4616:25;;4651:10;4664:14;4669:8;4664:4;:14::i;:::-;4651:27;;4705:5;4688:9;:14;4698:3;4688:14;;;;;;;;;;;:22;;;;4720:24;4730:8;4740:3;4720:9;:24::i;:::-;4761:3;4754:10;;;;4386:385;;;:::o;7191:126:4:-;7256:4;7308:1;7279:31;;:17;7288:7;7279:8;:17::i;:::-;:31;;;;7272:38;;7191:126;;;:::o;15633:396::-;15817:1;15805:9;:13;15801:222;;;15854:1;15838:18;;:4;:18;;;15834:85;;15895:9;15876;:15;15886:4;15876:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15834:85;15950:1;15936:16;;:2;:16;;;15932:81;;15989:9;15972;:13;15982:2;15972:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;15932:81;15801:222;15633:396;;;;:::o;16735:153::-;;;;;:::o;11430:663:9:-;11484:7;11503:14;11520:1;11503:18;;11574:1;11568:3;11559:5;:12;;:16;11555:98;;;11605:3;11595:13;;;;;11636:2;11626:12;;;;11555:98;11684:1;11679:2;11670:5;:11;;:15;11666:95;;;11715:2;11705:12;;;;;11745:1;11735:11;;;;11666:95;11792:1;11787:2;11778:5;:11;;:15;11774:95;;;11823:2;11813:12;;;;;11853:1;11843:11;;;;11774:95;11900:1;11895:2;11886:5;:11;;:15;11882:95;;;11931:2;11921:12;;;;;11961:1;11951:11;;;;11882:95;12007:1;12003;11994:5;:10;;:14;11990:64;;;12038:1;12028:11;;;;11990:64;12080:6;12073:13;;;11430:663;;;:::o;1508:437:12:-;1583:13;1608:19;1653:1;1644:6;1640:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1630:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1608:47;;1665:15;:6;1672:1;1665:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1690;:6;1697:1;1690:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1720:9;1745:1;1736:6;1732:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1720:26;;1715:128;1752:1;1748;:5;1715:128;;;1786:8;1803:3;1795:5;:11;1786:21;;;;;;;:::i;:::-;;;;;1774:6;1781:1;1774:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;1831:1;1821:11;;;;;1755:3;;;;:::i;:::-;;;1715:128;;;;1869:1;1860:5;:10;1852:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:6;1917:21;;;1508:437;;;;:::o;14086:831:4:-;14235:4;14255:15;:2;:13;;;:15::i;:::-;14251:660;;;14306:2;14290:36;;;14327:12;:10;:12::i;:::-;14341:4;14347:7;14356:4;14290:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14286:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14545:1;14528:6;:13;:18;14524:321;;14570:60;;;;;;;;;;:::i;:::-;;;;;;;;14524:321;14797:6;14791:13;14782:6;14778:2;14774:15;14767:38;14286:573;14421:41;;;14411:51;;;:6;:51;;;;14404:58;;;;;14251:660;14896:4;14889:11;;14086:831;;;;;;;:::o;9889:890:9:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;4913:125:11:-;4966:4;5021:7;5004:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;4994:36;;;;;;4989:42;;4982:49;;4913:125;;;:::o;8066:108:4:-;8141:26;8151:2;8155:7;8141:26;;;;;;;;;;;;:9;:26::i;:::-;8066:108;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;8395:309:4:-;8519:18;8525:2;8529:7;8519:5;:18::i;:::-;8568:53;8599:1;8603:2;8607:7;8616:4;8568:22;:53::i;:::-;8547:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8395:309;;;:::o;9026:920::-;9119:1;9105:16;;:2;:16;;;9097:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9177:16;9185:7;9177;:16::i;:::-;9176:17;9168:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9237:48;9266:1;9270:2;9274:7;9283:1;9237:20;:48::i;:::-;9381:16;9389:7;9381;:16::i;:::-;9380:17;9372:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9789:1;9772:9;:13;9782:2;9772:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9830:2;9811:7;:16;9819:7;9811:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9873:7;9869:2;9848:33;;9865:1;9848:33;;;;;;;;;;;;9892:47;9920:1;9924:2;9928:7;9937:1;9892:19;:47::i;:::-;9026:920;;:::o;7:75:13:-;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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:834::-;3825:6;3833;3882:2;3870:9;3861:7;3857:23;3853:32;3850:119;;;3888:79;;:::i;:::-;3850:119;4036:1;4025:9;4021:17;4008:31;4066:18;4058:6;4055:30;4052:117;;;4088:79;;:::i;:::-;4052:117;4193:63;4248:7;4239:6;4228:9;4224:22;4193:63;:::i;:::-;4183:73;;3979:287;4333:2;4322:9;4318:18;4305:32;4364:18;4356:6;4353:30;4350:117;;;4386:79;;:::i;:::-;4350:117;4491:63;4546:7;4537:6;4526:9;4522:22;4491:63;:::i;:::-;4481:73;;4276:288;3737:834;;;;;:::o;4577:99::-;4629:6;4663:5;4657:12;4647:22;;4577:99;;;:::o;4682:169::-;4766:11;4800:6;4795:3;4788:19;4840:4;4835:3;4831:14;4816:29;;4682:169;;;;:::o;4857:246::-;4938:1;4948:113;4962:6;4959:1;4956:13;4948:113;;;5047:1;5042:3;5038:11;5032:18;5028:1;5023:3;5019:11;5012:39;4984:2;4981:1;4977:10;4972:15;;4948:113;;;5095:1;5086:6;5081:3;5077:16;5070:27;4919:184;4857:246;;;:::o;5109:377::-;5197:3;5225:39;5258:5;5225:39;:::i;:::-;5280:71;5344:6;5339:3;5280:71;:::i;:::-;5273:78;;5360:65;5418:6;5413:3;5406:4;5399:5;5395:16;5360:65;:::i;:::-;5450:29;5472:6;5450:29;:::i;:::-;5445:3;5441:39;5434:46;;5201:285;5109:377;;;;:::o;5492:313::-;5605:4;5643:2;5632:9;5628:18;5620:26;;5692:9;5686:4;5682:20;5678:1;5667:9;5663:17;5656:47;5720:78;5793:4;5784:6;5720:78;:::i;:::-;5712:86;;5492:313;;;;:::o;5811:77::-;5848:7;5877:5;5866:16;;5811:77;;;:::o;5894:122::-;5967:24;5985:5;5967:24;:::i;:::-;5960:5;5957:35;5947:63;;6006:1;6003;5996:12;5947:63;5894:122;:::o;6022:139::-;6068:5;6106:6;6093:20;6084:29;;6122:33;6149:5;6122:33;:::i;:::-;6022:139;;;;:::o;6167:329::-;6226:6;6275:2;6263:9;6254:7;6250:23;6246:32;6243:119;;;6281:79;;:::i;:::-;6243:119;6401:1;6426:53;6471:7;6462:6;6451:9;6447:22;6426:53;:::i;:::-;6416:63;;6372:117;6167:329;;;;:::o;6502:126::-;6539:7;6579:42;6572:5;6568:54;6557:65;;6502:126;;;:::o;6634:96::-;6671:7;6700:24;6718:5;6700:24;:::i;:::-;6689:35;;6634:96;;;:::o;6736:118::-;6823:24;6841:5;6823:24;:::i;:::-;6818:3;6811:37;6736:118;;:::o;6860:222::-;6953:4;6991:2;6980:9;6976:18;6968:26;;7004:71;7072:1;7061:9;7057:17;7048:6;7004:71;:::i;:::-;6860:222;;;;:::o;7088:122::-;7161:24;7179:5;7161:24;:::i;:::-;7154:5;7151:35;7141:63;;7200:1;7197;7190:12;7141:63;7088:122;:::o;7216:139::-;7262:5;7300:6;7287:20;7278:29;;7316:33;7343:5;7316:33;:::i;:::-;7216:139;;;;:::o;7361:474::-;7429:6;7437;7486:2;7474:9;7465:7;7461:23;7457:32;7454:119;;;7492:79;;:::i;:::-;7454:119;7612:1;7637:53;7682:7;7673:6;7662:9;7658:22;7637:53;:::i;:::-;7627:63;;7583:117;7739:2;7765:53;7810:7;7801:6;7790:9;7786:22;7765:53;:::i;:::-;7755:63;;7710:118;7361:474;;;;;:::o;7841:116::-;7911:21;7926:5;7911:21;:::i;:::-;7904:5;7901:32;7891:60;;7947:1;7944;7937:12;7891:60;7841:116;:::o;7963:133::-;8006:5;8044:6;8031:20;8022:29;;8060:30;8084:5;8060:30;:::i;:::-;7963:133;;;;:::o;8102:323::-;8158:6;8207:2;8195:9;8186:7;8182:23;8178:32;8175:119;;;8213:79;;:::i;:::-;8175:119;8333:1;8358:50;8400:7;8391:6;8380:9;8376:22;8358:50;:::i;:::-;8348:60;;8304:114;8102:323;;;;:::o;8431:118::-;8518:24;8536:5;8518:24;:::i;:::-;8513:3;8506:37;8431:118;;:::o;8555:222::-;8648:4;8686:2;8675:9;8671:18;8663:26;;8699:71;8767:1;8756:9;8752:17;8743:6;8699:71;:::i;:::-;8555:222;;;;:::o;8783:619::-;8860:6;8868;8876;8925:2;8913:9;8904:7;8900:23;8896:32;8893:119;;;8931:79;;:::i;:::-;8893:119;9051:1;9076:53;9121:7;9112:6;9101:9;9097:22;9076:53;:::i;:::-;9066:63;;9022:117;9178:2;9204:53;9249:7;9240:6;9229:9;9225:22;9204:53;:::i;:::-;9194:63;;9149:118;9306:2;9332:53;9377:7;9368:6;9357:9;9353:22;9332:53;:::i;:::-;9322:63;;9277:118;8783:619;;;;;:::o;9408:329::-;9467:6;9516:2;9504:9;9495:7;9491:23;9487:32;9484:119;;;9522:79;;:::i;:::-;9484:119;9642:1;9667:53;9712:7;9703:6;9692:9;9688:22;9667:53;:::i;:::-;9657:63;;9613:117;9408:329;;;;:::o;9743:468::-;9808:6;9816;9865:2;9853:9;9844:7;9840:23;9836:32;9833:119;;;9871:79;;:::i;:::-;9833:119;9991:1;10016:53;10061:7;10052:6;10041:9;10037:22;10016:53;:::i;:::-;10006:63;;9962:117;10118:2;10144:50;10186:7;10177:6;10166:9;10162:22;10144:50;:::i;:::-;10134:60;;10089:115;9743:468;;;;;:::o;10217:307::-;10278:4;10368:18;10360:6;10357:30;10354:56;;;10390:18;;:::i;:::-;10354:56;10428:29;10450:6;10428:29;:::i;:::-;10420:37;;10512:4;10506;10502:15;10494:23;;10217:307;;;:::o;10530:423::-;10607:5;10632:65;10648:48;10689:6;10648:48;:::i;:::-;10632:65;:::i;:::-;10623:74;;10720:6;10713:5;10706:21;10758:4;10751:5;10747:16;10796:3;10787:6;10782:3;10778:16;10775:25;10772:112;;;10803:79;;:::i;:::-;10772:112;10893:54;10940:6;10935:3;10930;10893:54;:::i;:::-;10613:340;10530:423;;;;;:::o;10972:338::-;11027:5;11076:3;11069:4;11061:6;11057:17;11053:27;11043:122;;11084:79;;:::i;:::-;11043:122;11201:6;11188:20;11226:78;11300:3;11292:6;11285:4;11277:6;11273:17;11226:78;:::i;:::-;11217:87;;11033:277;10972:338;;;;:::o;11316:943::-;11411:6;11419;11427;11435;11484:3;11472:9;11463:7;11459:23;11455:33;11452:120;;;11491:79;;:::i;:::-;11452:120;11611:1;11636:53;11681:7;11672:6;11661:9;11657:22;11636:53;:::i;:::-;11626:63;;11582:117;11738:2;11764:53;11809:7;11800:6;11789:9;11785:22;11764:53;:::i;:::-;11754:63;;11709:118;11866:2;11892:53;11937:7;11928:6;11917:9;11913:22;11892:53;:::i;:::-;11882:63;;11837:118;12022:2;12011:9;12007:18;11994:32;12053:18;12045:6;12042:30;12039:117;;;12075:79;;:::i;:::-;12039:117;12180:62;12234:7;12225:6;12214:9;12210:22;12180:62;:::i;:::-;12170:72;;11965:287;11316:943;;;;;;;:::o;12265:474::-;12333:6;12341;12390:2;12378:9;12369:7;12365:23;12361:32;12358:119;;;12396:79;;:::i;:::-;12358:119;12516:1;12541:53;12586:7;12577:6;12566:9;12562:22;12541:53;:::i;:::-;12531:63;;12487:117;12643:2;12669:53;12714:7;12705:6;12694:9;12690:22;12669:53;:::i;:::-;12659:63;;12614:118;12265:474;;;;;:::o;12745:509::-;12814:6;12863:2;12851:9;12842:7;12838:23;12834:32;12831:119;;;12869:79;;:::i;:::-;12831:119;13017:1;13006:9;13002:17;12989:31;13047:18;13039:6;13036:30;13033:117;;;13069:79;;:::i;:::-;13033:117;13174:63;13229:7;13220:6;13209:9;13205:22;13174:63;:::i;:::-;13164:73;;12960:287;12745:509;;;;:::o;13260:180::-;13308:77;13305:1;13298:88;13405:4;13402:1;13395:15;13429:4;13426:1;13419:15;13446:320;13490:6;13527:1;13521:4;13517:12;13507:22;;13574:1;13568:4;13564:12;13595:18;13585:81;;13651:4;13643:6;13639:17;13629:27;;13585:81;13713:2;13705:6;13702:14;13682:18;13679:38;13676:84;;13732:18;;:::i;:::-;13676:84;13497:269;13446:320;;;:::o;13772:141::-;13821:4;13844:3;13836:11;;13867:3;13864:1;13857:14;13901:4;13898:1;13888:18;13880:26;;13772:141;;;:::o;13919:93::-;13956:6;14003:2;13998;13991:5;13987:14;13983:23;13973:33;;13919:93;;;:::o;14018:107::-;14062:8;14112:5;14106:4;14102:16;14081:37;;14018:107;;;;:::o;14131:393::-;14200:6;14250:1;14238:10;14234:18;14273:97;14303:66;14292:9;14273:97;:::i;:::-;14391:39;14421:8;14410:9;14391:39;:::i;:::-;14379:51;;14463:4;14459:9;14452:5;14448:21;14439:30;;14512:4;14502:8;14498:19;14491:5;14488:30;14478:40;;14207:317;;14131:393;;;;;:::o;14530:60::-;14558:3;14579:5;14572:12;;14530:60;;;:::o;14596:142::-;14646:9;14679:53;14697:34;14706:24;14724:5;14706:24;:::i;:::-;14697:34;:::i;:::-;14679:53;:::i;:::-;14666:66;;14596:142;;;:::o;14744:75::-;14787:3;14808:5;14801:12;;14744:75;;;:::o;14825:269::-;14935:39;14966:7;14935:39;:::i;:::-;14996:91;15045:41;15069:16;15045:41;:::i;:::-;15037:6;15030:4;15024:11;14996:91;:::i;:::-;14990:4;14983:105;14901:193;14825:269;;;:::o;15100:73::-;15145:3;15100:73;:::o;15179:189::-;15256:32;;:::i;:::-;15297:65;15355:6;15347;15341:4;15297:65;:::i;:::-;15232:136;15179:189;;:::o;15374:186::-;15434:120;15451:3;15444:5;15441:14;15434:120;;;15505:39;15542:1;15535:5;15505:39;:::i;:::-;15478:1;15471:5;15467:13;15458:22;;15434:120;;;15374:186;;:::o;15566:543::-;15667:2;15662:3;15659:11;15656:446;;;15701:38;15733:5;15701:38;:::i;:::-;15785:29;15803:10;15785:29;:::i;:::-;15775:8;15771:44;15968:2;15956:10;15953:18;15950:49;;;15989:8;15974:23;;15950:49;16012:80;16068:22;16086:3;16068:22;:::i;:::-;16058:8;16054:37;16041:11;16012:80;:::i;:::-;15671:431;;15656:446;15566:543;;;:::o;16115:117::-;16169:8;16219:5;16213:4;16209:16;16188:37;;16115:117;;;;:::o;16238:169::-;16282:6;16315:51;16363:1;16359:6;16351:5;16348:1;16344:13;16315:51;:::i;:::-;16311:56;16396:4;16390;16386:15;16376:25;;16289:118;16238:169;;;;:::o;16412:295::-;16488:4;16634:29;16659:3;16653:4;16634:29;:::i;:::-;16626:37;;16696:3;16693:1;16689:11;16683:4;16680:21;16672:29;;16412:295;;;;:::o;16712:1395::-;16829:37;16862:3;16829:37;:::i;:::-;16931:18;16923:6;16920:30;16917:56;;;16953:18;;:::i;:::-;16917:56;16997:38;17029:4;17023:11;16997:38;:::i;:::-;17082:67;17142:6;17134;17128:4;17082:67;:::i;:::-;17176:1;17200:4;17187:17;;17232:2;17224:6;17221:14;17249:1;17244:618;;;;17906:1;17923:6;17920:77;;;17972:9;17967:3;17963:19;17957:26;17948:35;;17920:77;18023:67;18083:6;18076:5;18023:67;:::i;:::-;18017:4;18010:81;17879:222;17214:887;;17244:618;17296:4;17292:9;17284:6;17280:22;17330:37;17362:4;17330:37;:::i;:::-;17389:1;17403:208;17417:7;17414:1;17411:14;17403:208;;;17496:9;17491:3;17487:19;17481:26;17473:6;17466:42;17547:1;17539:6;17535:14;17525:24;;17594:2;17583:9;17579:18;17566:31;;17440:4;17437:1;17433:12;17428:17;;17403:208;;;17639:6;17630:7;17627:19;17624:179;;;17697:9;17692:3;17688:19;17682:26;17740:48;17782:4;17774:6;17770:17;17759:9;17740:48;:::i;:::-;17732:6;17725:64;17647:156;17624:179;17849:1;17845;17837:6;17833:14;17829:22;17823:4;17816:36;17251:611;;;17214:887;;16804:1303;;;16712:1395;;:::o;18113:220::-;18253:34;18249:1;18241:6;18237:14;18230:58;18322:3;18317:2;18309:6;18305:15;18298:28;18113:220;:::o;18339:366::-;18481:3;18502:67;18566:2;18561:3;18502:67;:::i;:::-;18495:74;;18578:93;18667:3;18578:93;:::i;:::-;18696:2;18691:3;18687:12;18680:19;;18339:366;;;:::o;18711:419::-;18877:4;18915:2;18904:9;18900:18;18892:26;;18964:9;18958:4;18954:20;18950:1;18939:9;18935:17;18928:47;18992:131;19118:4;18992:131;:::i;:::-;18984:139;;18711:419;;;:::o;19136:248::-;19276:34;19272:1;19264:6;19260:14;19253:58;19345:31;19340:2;19332:6;19328:15;19321:56;19136:248;:::o;19390:366::-;19532:3;19553:67;19617:2;19612:3;19553:67;:::i;:::-;19546:74;;19629:93;19718:3;19629:93;:::i;:::-;19747:2;19742:3;19738:12;19731:19;;19390:366;;;:::o;19762:419::-;19928:4;19966:2;19955:9;19951:18;19943:26;;20015:9;20009:4;20005:20;20001:1;19990:9;19986:17;19979:47;20043:131;20169:4;20043:131;:::i;:::-;20035:139;;19762:419;;;:::o;20187:232::-;20327:34;20323:1;20315:6;20311:14;20304:58;20396:15;20391:2;20383:6;20379:15;20372:40;20187:232;:::o;20425:366::-;20567:3;20588:67;20652:2;20647:3;20588:67;:::i;:::-;20581:74;;20664:93;20753:3;20664:93;:::i;:::-;20782:2;20777:3;20773:12;20766:19;;20425:366;;;:::o;20797:419::-;20963:4;21001:2;20990:9;20986:18;20978:26;;21050:9;21044:4;21040:20;21036:1;21025:9;21021:17;21014:47;21078:131;21204:4;21078:131;:::i;:::-;21070:139;;20797:419;;;:::o;21222:148::-;21324:11;21361:3;21346:18;;21222:148;;;;:::o;21376:352::-;21516:34;21512:1;21504:6;21500:14;21493:58;21585:34;21580:2;21572:6;21568:15;21561:59;21654:66;21649:2;21641:6;21637:15;21630:91;21376:352;:::o;21734:402::-;21894:3;21915:85;21997:2;21992:3;21915:85;:::i;:::-;21908:92;;22009:93;22098:3;22009:93;:::i;:::-;22127:2;22122:3;22118:12;22111:19;;21734:402;;;:::o;22166:874::-;22269:3;22306:5;22300:12;22335:36;22361:9;22335:36;:::i;:::-;22387:89;22469:6;22464:3;22387:89;:::i;:::-;22380:96;;22507:1;22496:9;22492:17;22523:1;22518:166;;;;22698:1;22693:341;;;;22485:549;;22518:166;22602:4;22598:9;22587;22583:25;22578:3;22571:38;22664:6;22657:14;22650:22;22642:6;22638:35;22633:3;22629:45;22622:52;;22518:166;;22693:341;22760:38;22792:5;22760:38;:::i;:::-;22820:1;22834:154;22848:6;22845:1;22842:13;22834:154;;;22922:7;22916:14;22912:1;22907:3;22903:11;22896:35;22972:1;22963:7;22959:15;22948:26;;22870:4;22867:1;22863:12;22858:17;;22834:154;;;23017:6;23012:3;23008:16;23001:23;;22700:334;;22485:549;;22273:767;;22166:874;;;;:::o;23046:214::-;23186:66;23182:1;23174:6;23170:14;23163:90;23046:214;:::o;23266:402::-;23426:3;23447:85;23529:2;23524:3;23447:85;:::i;:::-;23440:92;;23541:93;23630:3;23541:93;:::i;:::-;23659:2;23654:3;23650:12;23643:19;;23266:402;;;:::o;23674:390::-;23780:3;23808:39;23841:5;23808:39;:::i;:::-;23863:89;23945:6;23940:3;23863:89;:::i;:::-;23856:96;;23961:65;24019:6;24014:3;24007:4;24000:5;23996:16;23961:65;:::i;:::-;24051:6;24046:3;24042:16;24035:23;;23784:280;23674:390;;;;:::o;24070:355::-;24210:66;24206:1;24198:6;24194:14;24187:90;24311:66;24306:2;24298:6;24294:15;24287:91;24412:5;24407:2;24399:6;24395:15;24388:30;24070:355;:::o;24431:402::-;24591:3;24612:85;24694:2;24689:3;24612:85;:::i;:::-;24605:92;;24706:93;24795:3;24706:93;:::i;:::-;24824:2;24819:3;24815:12;24808:19;;24431:402;;;:::o;24839:1227::-;25319:3;25341:148;25485:3;25341:148;:::i;:::-;25334:155;;25506:92;25594:3;25585:6;25506:92;:::i;:::-;25499:99;;25615:148;25759:3;25615:148;:::i;:::-;25608:155;;25780:95;25871:3;25862:6;25780:95;:::i;:::-;25773:102;;25892:148;26036:3;25892:148;:::i;:::-;25885:155;;26057:3;26050:10;;24839:1227;;;;;:::o;26072:172::-;26212:24;26208:1;26200:6;26196:14;26189:48;26072:172;:::o;26250:402::-;26410:3;26431:85;26513:2;26508:3;26431:85;:::i;:::-;26424:92;;26525:93;26614:3;26525:93;:::i;:::-;26643:2;26638:3;26634:12;26627:19;;26250:402;;;:::o;26658:541::-;26891:3;26913:148;27057:3;26913:148;:::i;:::-;26906:155;;27078:95;27169:3;27160:6;27078:95;:::i;:::-;27071:102;;27190:3;27183:10;;26658:541;;;;:::o;27205:174::-;27345:26;27341:1;27333:6;27329:14;27322:50;27205:174;:::o;27385:366::-;27527:3;27548:67;27612:2;27607:3;27548:67;:::i;:::-;27541:74;;27624:93;27713:3;27624:93;:::i;:::-;27742:2;27737:3;27733:12;27726:19;;27385:366;;;:::o;27757:419::-;27923:4;27961:2;27950:9;27946:18;27938:26;;28010:9;28004:4;28000:20;27996:1;27985:9;27981:17;27974:47;28038:131;28164:4;28038:131;:::i;:::-;28030:139;;27757:419;;;:::o;28182:228::-;28322:34;28318:1;28310:6;28306:14;28299:58;28391:11;28386:2;28378:6;28374:15;28367:36;28182:228;:::o;28416:366::-;28558:3;28579:67;28643:2;28638:3;28579:67;:::i;:::-;28572:74;;28655:93;28744:3;28655:93;:::i;:::-;28773:2;28768:3;28764:12;28757:19;;28416:366;;;:::o;28788:419::-;28954:4;28992:2;28981:9;28977:18;28969:26;;29041:9;29035:4;29031:20;29027:1;29016:9;29012:17;29005:47;29069:131;29195:4;29069:131;:::i;:::-;29061:139;;28788:419;;;:::o;29213:168::-;29353:20;29349:1;29341:6;29337:14;29330:44;29213:168;:::o;29387:402::-;29547:3;29568:85;29650:2;29645:3;29568:85;:::i;:::-;29561:92;;29662:93;29751:3;29662:93;:::i;:::-;29780:2;29775:3;29771:12;29764:19;;29387:402;;;:::o;29795:153::-;29935:5;29931:1;29923:6;29919:14;29912:29;29795:153;:::o;29954:400::-;30114:3;30135:84;30217:1;30212:3;30135:84;:::i;:::-;30128:91;;30228:93;30317:3;30228:93;:::i;:::-;30346:1;30341:3;30337:11;30330:18;;29954:400;;;:::o;30360:967::-;30742:3;30764:148;30908:3;30764:148;:::i;:::-;30757:155;;30929:95;31020:3;31011:6;30929:95;:::i;:::-;30922:102;;31041:148;31185:3;31041:148;:::i;:::-;31034:155;;31206:95;31297:3;31288:6;31206:95;:::i;:::-;31199:102;;31318:3;31311:10;;30360:967;;;;;:::o;31333:260::-;31473:66;31469:1;31461:6;31457:14;31450:90;31574:11;31569:2;31561:6;31557:15;31550:36;31333:260;:::o;31599:402::-;31759:3;31780:85;31862:2;31857:3;31780:85;:::i;:::-;31773:92;;31874:93;31963:3;31874:93;:::i;:::-;31992:2;31987:3;31983:12;31976:19;;31599:402;;;:::o;32007:765::-;32147:66;32143:1;32135:6;32131:14;32124:90;32248:34;32243:2;32235:6;32231:15;32224:59;32317:34;32312:2;32304:6;32300:15;32293:59;32386:34;32381:2;32373:6;32369:15;32362:59;32456:34;32450:3;32442:6;32438:16;32431:60;32526:34;32520:3;32512:6;32508:16;32501:60;32596:66;32590:3;32582:6;32578:16;32571:92;32698:66;32692:3;32684:6;32680:16;32673:92;32007:765;:::o;32778:404::-;32938:3;32959:86;33041:3;33036;32959:86;:::i;:::-;32952:93;;33054;33143:3;33054:93;:::i;:::-;33172:3;33167;33163:13;33156:20;;32778:404;;;:::o;33188:315::-;33328:66;33324:1;33316:6;33312:14;33305:90;33429:66;33424:2;33416:6;33412:15;33405:91;33188:315;:::o;33509:402::-;33669:3;33690:85;33772:2;33767:3;33690:85;:::i;:::-;33683:92;;33784:93;33873:3;33784:93;:::i;:::-;33902:2;33897:3;33893:12;33886:19;;33509:402;;;:::o;33917:453::-;34057:66;34053:1;34045:6;34041:14;34034:90;34158:34;34153:2;34145:6;34141:15;34134:59;34227:34;34222:2;34214:6;34210:15;34203:59;34296:66;34291:2;34283:6;34279:15;34272:91;33917:453;:::o;34376:404::-;34536:3;34557:86;34639:3;34634;34557:86;:::i;:::-;34550:93;;34652;34741:3;34652:93;:::i;:::-;34770:3;34765;34761:13;34754:20;;34376:404;;;:::o;34786:1967::-;35508:3;35530:148;35674:3;35530:148;:::i;:::-;35523:155;;35695:95;35786:3;35777:6;35695:95;:::i;:::-;35688:102;;35807:148;35951:3;35807:148;:::i;:::-;35800:155;;35972:92;36060:3;36051:6;35972:92;:::i;:::-;35965:99;;36081:95;36172:3;36163:6;36081:95;:::i;:::-;36074:102;;36193:92;36281:3;36272:6;36193:92;:::i;:::-;36186:99;;36302:148;36446:3;36302:148;:::i;:::-;36295:155;;36467:95;36558:3;36549:6;36467:95;:::i;:::-;36460:102;;36579:148;36723:3;36579:148;:::i;:::-;36572:155;;36744:3;36737:10;;34786:1967;;;;;;;;:::o;36759:137::-;36813:5;36844:6;36838:13;36829:22;;36860:30;36884:5;36860:30;:::i;:::-;36759:137;;;;:::o;36902:345::-;36969:6;37018:2;37006:9;36997:7;36993:23;36989:32;36986:119;;;37024:79;;:::i;:::-;36986:119;37144:1;37169:61;37222:7;37213:6;37202:9;37198:22;37169:61;:::i;:::-;37159:71;;37115:125;36902:345;;;;:::o;37253:143::-;37310:5;37341:6;37335:13;37326:22;;37357:33;37384:5;37357:33;:::i;:::-;37253:143;;;;:::o;37402:351::-;37472:6;37521:2;37509:9;37500:7;37496:23;37492:32;37489:119;;;37527:79;;:::i;:::-;37489:119;37647:1;37672:64;37728:7;37719:6;37708:9;37704:22;37672:64;:::i;:::-;37662:74;;37618:128;37402:351;;;;:::o;37759:180::-;37807:77;37804:1;37797:88;37904:4;37901:1;37894:15;37928:4;37925:1;37918:15;37945:180;37993:77;37990:1;37983:88;38090:4;38087:1;38080:15;38114:4;38111:1;38104:15;38131:185;38171:1;38188:20;38206:1;38188:20;:::i;:::-;38183:25;;38222:20;38240:1;38222:20;:::i;:::-;38217:25;;38261:1;38251:35;;38266:18;;:::i;:::-;38251:35;38308:1;38305;38301:9;38296:14;;38131:185;;;;:::o;38322:348::-;38362:7;38385:20;38403:1;38385:20;:::i;:::-;38380:25;;38419:20;38437:1;38419:20;:::i;:::-;38414:25;;38607:1;38539:66;38535:74;38532:1;38529:81;38524:1;38517:9;38510:17;38506:105;38503:131;;;38614:18;;:::i;:::-;38503:131;38662:1;38659;38655:9;38644:20;;38322:348;;;;:::o;38676:194::-;38716:4;38736:20;38754:1;38736:20;:::i;:::-;38731:25;;38770:20;38788:1;38770:20;:::i;:::-;38765:25;;38814:1;38811;38807:9;38799:17;;38838:1;38832:4;38829:11;38826:37;;;38843:18;;:::i;:::-;38826:37;38676:194;;;;:::o;38876:225::-;39016:34;39012:1;39004:6;39000:14;38993:58;39085:8;39080:2;39072:6;39068:15;39061:33;38876:225;:::o;39107:366::-;39249:3;39270:67;39334:2;39329:3;39270:67;:::i;:::-;39263:74;;39346:93;39435:3;39346:93;:::i;:::-;39464:2;39459:3;39455:12;39448:19;;39107:366;;;:::o;39479:419::-;39645:4;39683:2;39672:9;39668:18;39660:26;;39732:9;39726:4;39722:20;39718:1;39707:9;39703:17;39696:47;39760:131;39886:4;39760:131;:::i;:::-;39752:139;;39479:419;;;:::o;39904:182::-;40044:34;40040:1;40032:6;40028:14;40021:58;39904:182;:::o;40092:366::-;40234:3;40255:67;40319:2;40314:3;40255:67;:::i;:::-;40248:74;;40331:93;40420:3;40331:93;:::i;:::-;40449:2;40444:3;40440:12;40433:19;;40092:366;;;:::o;40464:419::-;40630:4;40668:2;40657:9;40653:18;40645:26;;40717:9;40711:4;40707:20;40703:1;40692:9;40688:17;40681:47;40745:131;40871:4;40745:131;:::i;:::-;40737:139;;40464:419;;;:::o;40889:224::-;41029:34;41025:1;41017:6;41013:14;41006:58;41098:7;41093:2;41085:6;41081:15;41074:32;40889:224;:::o;41119:366::-;41261:3;41282:67;41346:2;41341:3;41282:67;:::i;:::-;41275:74;;41358:93;41447:3;41358:93;:::i;:::-;41476:2;41471:3;41467:12;41460:19;;41119:366;;;:::o;41491:419::-;41657:4;41695:2;41684:9;41680:18;41672:26;;41744:9;41738:4;41734:20;41730:1;41719:9;41715:17;41708:47;41772:131;41898:4;41772:131;:::i;:::-;41764:139;;41491:419;;;:::o;41916:223::-;42056:34;42052:1;42044:6;42040:14;42033:58;42125:6;42120:2;42112:6;42108:15;42101:31;41916:223;:::o;42145:366::-;42287:3;42308:67;42372:2;42367:3;42308:67;:::i;:::-;42301:74;;42384:93;42473:3;42384:93;:::i;:::-;42502:2;42497:3;42493:12;42486:19;;42145:366;;;:::o;42517:419::-;42683:4;42721:2;42710:9;42706:18;42698:26;;42770:9;42764:4;42760:20;42756:1;42745:9;42741:17;42734:47;42798:131;42924:4;42798:131;:::i;:::-;42790:139;;42517:419;;;:::o;42942:191::-;42982:3;43001:20;43019:1;43001:20;:::i;:::-;42996:25;;43035:20;43053:1;43035:20;:::i;:::-;43030:25;;43078:1;43075;43071:9;43064:16;;43099:3;43096:1;43093:10;43090:36;;;43106:18;;:::i;:::-;43090:36;42942:191;;;;:::o;43139:175::-;43279:27;43275:1;43267:6;43263:14;43256:51;43139:175;:::o;43320:366::-;43462:3;43483:67;43547:2;43542:3;43483:67;:::i;:::-;43476:74;;43559:93;43648:3;43559:93;:::i;:::-;43677:2;43672:3;43668:12;43661:19;;43320:366;;;:::o;43692:419::-;43858:4;43896:2;43885:9;43881:18;43873:26;;43945:9;43939:4;43935:20;43931:1;43920:9;43916:17;43909:47;43973:131;44099:4;43973:131;:::i;:::-;43965:139;;43692:419;;;:::o;44117:237::-;44257:34;44253:1;44245:6;44241:14;44234:58;44326:20;44321:2;44313:6;44309:15;44302:45;44117:237;:::o;44360:366::-;44502:3;44523:67;44587:2;44582:3;44523:67;:::i;:::-;44516:74;;44599:93;44688:3;44599:93;:::i;:::-;44717:2;44712:3;44708:12;44701:19;;44360:366;;;:::o;44732:419::-;44898:4;44936:2;44925:9;44921:18;44913:26;;44985:9;44979:4;44975:20;44971:1;44960:9;44956:17;44949:47;45013:131;45139:4;45013:131;:::i;:::-;45005:139;;44732:419;;;:::o;45157:180::-;45205:77;45202:1;45195:88;45302:4;45299:1;45292:15;45326:4;45323:1;45316:15;45343:171;45382:3;45405:24;45423:5;45405:24;:::i;:::-;45396:33;;45451:4;45444:5;45441:15;45438:41;;45459:18;;:::i;:::-;45438:41;45506:1;45499:5;45495:13;45488:20;;45343:171;;;:::o;45520:182::-;45660:34;45656:1;45648:6;45644:14;45637:58;45520:182;:::o;45708:366::-;45850:3;45871:67;45935:2;45930:3;45871:67;:::i;:::-;45864:74;;45947:93;46036:3;45947:93;:::i;:::-;46065:2;46060:3;46056:12;46049:19;;45708:366;;;:::o;46080:419::-;46246:4;46284:2;46273:9;46269:18;46261:26;;46333:9;46327:4;46323:20;46319:1;46308:9;46304:17;46297:47;46361:131;46487:4;46361:131;:::i;:::-;46353:139;;46080:419;;;:::o;46505:98::-;46556:6;46590:5;46584:12;46574:22;;46505:98;;;:::o;46609:168::-;46692:11;46726:6;46721:3;46714:19;46766:4;46761:3;46757:14;46742:29;;46609:168;;;;:::o;46783:373::-;46869:3;46897:38;46929:5;46897:38;:::i;:::-;46951:70;47014:6;47009:3;46951:70;:::i;:::-;46944:77;;47030:65;47088:6;47083:3;47076:4;47069:5;47065:16;47030:65;:::i;:::-;47120:29;47142:6;47120:29;:::i;:::-;47115:3;47111:39;47104:46;;46873:283;46783:373;;;;:::o;47162:640::-;47357:4;47395:3;47384:9;47380:19;47372:27;;47409:71;47477:1;47466:9;47462:17;47453:6;47409:71;:::i;:::-;47490:72;47558:2;47547:9;47543:18;47534:6;47490:72;:::i;:::-;47572;47640:2;47629:9;47625:18;47616:6;47572:72;:::i;:::-;47691:9;47685:4;47681:20;47676:2;47665:9;47661:18;47654:48;47719:76;47790:4;47781:6;47719:76;:::i;:::-;47711:84;;47162:640;;;;;;;:::o;47808:141::-;47864:5;47895:6;47889:13;47880:22;;47911:32;47937:5;47911:32;:::i;:::-;47808:141;;;;:::o;47955:349::-;48024:6;48073:2;48061:9;48052:7;48048:23;48044:32;48041:119;;;48079:79;;:::i;:::-;48041:119;48199:1;48224:63;48279:7;48270:6;48259:9;48255:22;48224:63;:::i;:::-;48214:73;;48170:127;47955:349;;;;:::o;48310:94::-;48343:8;48391:5;48387:2;48383:14;48362:35;;48310:94;;;:::o;48410:::-;48449:7;48478:20;48492:5;48478:20;:::i;:::-;48467:31;;48410:94;;;:::o;48510:100::-;48549:7;48578:26;48598:5;48578:26;:::i;:::-;48567:37;;48510:100;;;:::o;48616:157::-;48721:45;48741:24;48759:5;48741:24;:::i;:::-;48721:45;:::i;:::-;48716:3;48709:58;48616:157;;:::o;48779:256::-;48891:3;48906:75;48977:3;48968:6;48906:75;:::i;:::-;49006:2;49001:3;48997:12;48990:19;;49026:3;49019:10;;48779:256;;;;:::o;49041:182::-;49181:34;49177:1;49169:6;49165:14;49158:58;49041:182;:::o;49229:366::-;49371:3;49392:67;49456:2;49451:3;49392:67;:::i;:::-;49385:74;;49468:93;49557:3;49468:93;:::i;:::-;49586:2;49581:3;49577:12;49570:19;;49229:366;;;:::o;49601:419::-;49767:4;49805:2;49794:9;49790:18;49782:26;;49854:9;49848:4;49844:20;49840:1;49829:9;49825:17;49818:47;49882:131;50008:4;49882:131;:::i;:::-;49874:139;;49601:419;;;:::o;50026:178::-;50166:30;50162:1;50154:6;50150:14;50143:54;50026:178;:::o;50210:366::-;50352:3;50373:67;50437:2;50432:3;50373:67;:::i;:::-;50366:74;;50449:93;50538:3;50449:93;:::i;:::-;50567:2;50562:3;50558:12;50551:19;;50210:366;;;:::o;50582:419::-;50748:4;50786:2;50775:9;50771:18;50763:26;;50835:9;50829:4;50825:20;50821:1;50810:9;50806:17;50799:47;50863:131;50989:4;50863:131;:::i;:::-;50855:139;;50582:419;;;:::o

Swarm Source

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