ETH Price: $3,502.70 (-0.19%)
Gas: 2 Gwei

Token

booncuk (booncuk)
 

Overview

Max Total Supply

0 booncuk

Holders

51

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 booncuk
0x7dbfc0f6bbfd2e13bdd0a1a4a1d5caf7c9633bbf
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:
booncuk

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-26
*/

// SPDX-License-Identifier: MIT

// File: Base64.sol



/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
pragma solidity ^0.8.2;

library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // 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) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, 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;
    }
}
// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: @openzeppelin/contracts/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: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @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;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: booncuk.sol



/*
    
    booncuk
    
*/

pragma solidity ^0.8.2;







contract booncuk is
    ERC721,
    ReentrancyGuard,
    Ownable
{
    using SafeMath for uint256;
    using Strings for uint256;
    using Strings for uint160;
    using Strings for uint8;
    using Base64 for bytes;
    uint256 public booncuk_count;
    string public _description;
    string public _external_url;
    uint MAX_SUPPLY = 128;
    // testnet
    // IERC721 internal BONCUK_CONTRACT = IERC721(0x3EB595bD0C169e61BB18307aeF3717863b9C523c);
    // mainnet
    IERC721 internal BONCUK_CONTRACT = IERC721(0xfa12Fae65134A8F2041a68b88A253D23E7914804);


    mapping(uint256 => uint256) private _dnaBank;
    mapping(uint => bool) private _redeems;

    function redeemBoncuk(uint _b) private {
        _redeems[_b] = true;
    }
    function setDescription(string memory _d) public onlyOwner {
        require(msg.sender == tx.origin);
        _description = _d;
    }
    function setExternalUrl(string memory _u) public onlyOwner {
        require(msg.sender == tx.origin);
        _external_url = _u;
    }

    function random() private view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(msg.sender, _dnaBank[booncuk_count-1])));
    }

    function _mint(address _to) private {
        booncuk_count = booncuk_count.add(1);
        _dnaBank[booncuk_count] = random();
        _safeMint(_to, booncuk_count);
    }

    function mint(uint boncuk_id) public nonReentrant {
        require(msg.sender == tx.origin);
        require(_redeems[boncuk_id] == false, 'this boncuk seems to have minted a booncuk before');
        require(BONCUK_CONTRACT.ownerOf(boncuk_id) == msg.sender, "this boncuk seems not to be yours");
        require(booncuk_count.add(2) <= MAX_SUPPLY, string(abi.encodePacked("only ", MAX_SUPPLY.toString(), " of them will ever exist")));
        redeemBoncuk(boncuk_id);
        _mint(msg.sender);
        // angels' share
        if (booncuk_count % 8 == 7) {
            _mint(address(owner()));
        }
    }
    
    // dna structs
    
    struct s_c {
        string _r;
        string _g;
        string _b;
    }
    
    struct s_e {
        uint r_y;
        uint r_x;
        uint c_y;
        uint c_x;
    }
    
    struct s_r {
        uint r_0;
        uint r_1;
        string r_s;
    }
    
    struct s_boncuk {
        uint e_1_r_x;
        s_c e_1_c;
        s_e e_2;
        s_e e_3;
        s_c e_3_c;
        string e_3_c_a;
        s_e e_4;
        s_r r_;
    }
    
    // TODO: struct _boo mirroring the DNA_Decoded and a new DNA_Decoded with 2 _boo and one e_0_c
    struct DNA_Decoded {
        uint s_;
        string e_0_g;
        uint e_0_r;
        uint e_0_r_x;
        s_boncuk b_1;
        s_boncuk b_2;
    }
    
    // dna helpers
    
    function _g_c(uint _i, uint _p) private pure returns (string memory) {
        return ((_i / (255 ** _p)) % 255).toString();
    }
    
    function g_c(uint _i, uint _o) private pure returns (s_c memory) {
        return s_c(_g_c(_i, (0 + _o)), _g_c(_i, (1 + _o)), _g_c(_i, (2 + _o)));
    }
    
    function g_r_x(uint _i, uint _r, uint _s) private pure returns (uint) {
        return _r - (_r / 20) + ((_i / 64) % (_r / (10 * _s)));
    }
    
    function g_n_r(uint _i, uint _p_r, uint _f) private pure returns (uint) {
        return (_p_r / 2) + ((_i / 128) % (_p_r / _f));
    }
    
    function g_n_c(uint _i, uint _p_r, uint _n_r, uint _p_c, uint _s) private pure returns (uint) {
        uint _d = ((_p_r - _n_r) * 35) / 100;
        return _p_c - _d + ((_i / (255 * _s)) % (_d * 2));
    }

    function g_s_e(uint _i, uint _p_r, uint _p_c_y, uint _p_c_x) private pure returns (s_e memory) {
        uint _n_r = g_n_r(_i, _p_r, 3);
        return s_e(
            _n_r,
            g_r_x(_i, _n_r, 1),
            g_n_c(_i, _p_r, _n_r, _p_c_y, 1),
            g_n_c(_i, _p_r, _n_r, _p_c_x, 2));
    }
    
    function g_s_r(uint _i) private pure returns (s_r memory) {
        uint _r = 360 * ((_i / 1025) % 2);
        return s_r(_r, (360 - _r), (8 + ((_i / 2048) % 25)).toString());
    }
    
    function g_c_a(uint _i, uint _p, uint _d) private pure returns (string memory) {
        return (_d + (_i / 10 ** _p) % 5).toString();
    }
    
    function g_s(uint _i) private pure returns (uint) {
        return 20 + (_i / 1024) % 11;
    }
    
    function g_boo(uint _i) private pure returns (s_boncuk memory) {
        uint e_1_r_x = g_r_x(_i, 512, 2);
        s_c memory e_1_c = g_c(_i, 3);
        s_e memory e_2 = g_s_e(_i, 512, 512, 512);
        s_e memory e_3 = g_s_e(_i, e_2.r_y, e_2.c_y, e_2.c_x);
        s_c memory e_3_c = g_c(_i, 5);
        string memory e_3_c_a = g_c_a(_i, 6, 1);
        s_e memory e_4 = g_s_e(_i, e_3.r_y, e_3.c_y, e_3.c_x);
        s_r memory r_ = g_s_r(_i);
        s_boncuk memory _b = s_boncuk(e_1_r_x, e_1_c, e_2, e_3, e_3_c, e_3_c_a, e_4, r_);
        return _b;
    }    
    // dna decoder
    function decode_dna(uint _i) private view returns (DNA_Decoded memory) {
        uint s_ = g_s(_i);
        uint _i_1 = _dnaBank[_i];
        uint _i_2 = _i_1.div(2);
        s_boncuk memory b_1 = g_boo(_i_1);
        s_boncuk memory b_2 = g_boo(_i_2);
        s_c memory e_0_c = g_c(_i_1, 4);
        uint e_0_r = g_n_r(_i_1, 500, 2);
        uint e_0_r_x = g_r_x(_i_1, e_0_r, 1);
        DNA_Decoded memory d = DNA_Decoded(s_, e_0_c._g, e_0_r, e_0_r_x, b_1, b_2);
        return d;
    }
    
    // render helpers
    
    function s_t(address _o) private pure returns (string memory) {
        string memory _s;
        string memory _t;
        string memory _a = uint160(_o).toHexString();
        {
            _s = '<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg"><g>';
            _t = string(abi.encodePacked('<title>', _a, '</title>'));
        }
        return string(abi.encodePacked(_s, _t));
    }
    
    // TODO: e_0
    
    function e_0(DNA_Decoded memory _d) private pure returns (string memory) {
        string memory _a;
        string memory _d_0;
        string memory _r_g_0;
        string memory _s_o_0;
        string memory _s_o_1;
        string memory _s_o_2;
        string memory _r_g_1;
        string memory _d_1;
        string memory _e_0;
        {
            _a = string(
                abi.encodePacked(
                    '<g><animateTransform attributeName="transform" begin="0s" dur="', _d.s_.toString(), 's" type="translate" values="0,0; 12,0; 0,0; -12,0; 0,0" repeatCount="indefinite"/>'));
        }
        {
            _d_0 = '<defs>';
            _r_g_0 = '<radialGradient id="e_0_g">';
        }
        {
            _s_o_0 = '<stop offset="0%" stop-color="#FFF"/>';
            _s_o_1 = string(abi.encodePacked('<stop offset="99%" stop-color="rgb(', _d.e_0_g, ',', _d.e_0_g, ',', _d.e_0_g, ')"/>'));
            _s_o_2 = '<stop offset="100%" stop-color="#7d7d7d"/>';
        }
        {
            _r_g_1 = '</radialGradient>';
            _d_1 = '</defs>';
        }
        {
            _e_0 = string(abi.encodePacked('<ellipse ry="', _d.e_0_r.toString(), '" rx="', _d.e_0_r_x.toString(), '" cy="512" cx="512" fill="url(#e_0_g)"/></g>'));
        }

        return string(abi.encodePacked(_a, _d_0, _r_g_0, _s_o_0, _s_o_1, _s_o_2, _r_g_1, _d_1, _e_0));
    }

    function e_1_2_3_4(s_boncuk memory _b, uint b_i) private pure returns (string memory) {
        string memory _g;
        string memory _a;
        string memory _e_1;
        string memory _e_2;
        string memory _e_3;
        string memory _e_3_f;
        string memory _e_4;
        {
            _g = string(abi.encodePacked('<g transform="scale(0.5), translate(', ((b_i - 1) * 1024).toString(), ',512)">'));
        }
        {
            _a = string(
                abi.encodePacked(
                    '<animateTransform additive="sum" attributeName="transform" begin="0s" dur="', _b.r_.r_s, 's" type="translate" values="0,0; 0,', (b_i == 1 ? '': '-'), '50; 0,0; 0,', (b_i == 2 ? '': '-'), '50; 0,0" repeatCount="indefinite"/><g>'));
        }
        {
            _e_1 = string(abi.encodePacked('<ellipse ry="512" rx="', _b.e_1_r_x.toString(), '" cy="512" cx="512" fill="url(#e_1_g', b_i.toString(), ')"/>'));
        }
        {
            _e_2 = string(
                abi.encodePacked(
                    '<ellipse ry="',_b.e_2.r_y.toString(),
                    '" rx="', _b.e_2.r_x.toString(),
                    '" cy="', _b.e_2.c_y.toString(),
                    '" cx="', _b.e_2.c_x.toString(),
                    '" fill="#FFF"/>'));
        }
        {
            _e_3_f = string(abi.encodePacked('rgba(', _b.e_3_c._r, ',', _b.e_3_c._g, ',', _b.e_3_c._b, ',0.', _b.e_3_c_a,')'));
        }
        {
            _e_3 = string(
                abi.encodePacked(
                    '<ellipse ry="', _b.e_3.r_y.toString(),
                    '" rx="', _b.e_3.r_x.toString(),
                    '" cy="', _b.e_3.c_y.toString(),
                    '" cx="', _b.e_3.c_x.toString(),
                    '" fill="', _e_3_f, '"/>'));
        }
        {
            _e_4 = string(
                abi.encodePacked(
                    '<ellipse ry="', _b.e_4.r_y.toString(),
                    '" rx="', _b.e_4.r_x.toString(),
                    '" cy="', _b.e_4.c_y.toString(),
                    '" cx="', _b.e_4.c_x.toString(),
                    '" fill="rgba(22, 24, 150, 0.8)"/>'));
        }
        return string(abi.encodePacked(_g, _a, _e_1, _e_2, _e_3, _e_4));
    }

    function a_d_r_g(s_boncuk memory _b, uint b_i) private pure returns (string memory) {
        string memory _a;
        string memory _de;
        string memory _r_g;
        {
            _a = string(
                abi.encodePacked(
                    '<animateTransform attributeName="transform" begin="0s" dur="', _b.r_.r_s, 's" type="rotate" from="',
                    _b.r_.r_0.toString(), ' 512 512" to="', _b.r_.r_1.toString(), ' 512 512" repeatCount="indefinite"/>'));
            _de = '<defs>';
           _r_g = string(abi.encodePacked('<radialGradient id="e_1_g', b_i.toString(), '">'));
        }
        return string(abi.encodePacked(_a, _de, _r_g));
    }

    // TODO: takes s_boo instead of DNA_Decoded
    function s_o(s_boncuk memory _b) private pure returns (string memory) {
        string memory _s_o_0;
        string memory _s_o_1;
        string memory _s_o_2;
        string memory _r_g;
        string memory _d;
        string memory _g;
        {
            _s_o_0 = '<stop offset="30%" stop-color="#000"/>';
            _s_o_1 = string(abi.encodePacked('<stop offset="99%" stop-color="rgb(', _b.e_1_c._r, ',', _b.e_1_c._g, ',', _b.e_1_c._b, ')"/>'));
            _s_o_2 = '<stop offset="100%" stop-color="rgba(125,125,125,1)"/>';
        }
        {
            _r_g = '</radialGradient>';
            _d = '</defs>';
            _g = '</g></g>';
        }

        return string(abi.encodePacked(_s_o_0, _s_o_1, _s_o_2, _r_g, _d, _g));
    }

    function g_s() private pure returns (string memory) {
        string memory _s;
        {
            _s = '</g></svg>';
        }
        return string(abi.encodePacked(_s));
    }
    
    function r_bo(s_boncuk memory _b, uint _b_i) private pure returns (string memory) {
        return string(abi.encodePacked(
            e_1_2_3_4(_b, _b_i),
            a_d_r_g(_b, _b_i),
            s_o(_b)
        ));
    }

    // render function

    function render(uint _i) private view returns (string memory) {
        DNA_Decoded memory _d = decode_dna(_i);
        return string(abi.encodePacked(
            s_t(ownerOf(_i)),
            e_0(_d),
            r_bo(_d.b_1, 1),
            r_bo(_d.b_2, 2),
            g_s()
        ));
    }

    // encoded render function

    function render_encoded(uint _i) private view returns (string memory) {
        return string(bytes(abi.encodePacked(render(_i))).encode());
    }
    
    // metadata attributes helpers
    
    function o_w(s_boncuk memory _b) private pure returns (string memory) {
        return ((1000 * (512 - _b.e_1_r_x)) / 512).toString();
    }

    function i_w(s_e memory _s_e) private pure returns (string memory) {
        uint _r_x = _s_e.r_x;
        uint _r_y = _s_e.r_y;
        if (_r_x > _r_y) {
            return ((
                1000 * (_r_x - _r_y)
            ) / _r_x).toString();
        }
        return ((
            1000 * (_r_y - _r_x)
        ) / _r_y).toString();
    }

    function w_a(s_boncuk memory _b, string memory _i) private pure returns (string memory) {
        string memory _s_w;
        string memory _e_w;
        string memory _i_w;
        string memory _p_w;
        {
            _s_w = string(abi.encodePacked('{"trait_type": "', _i, 'eye socket warp", "value": "', o_w(_b)));
        }
        {
            _e_w = string(abi.encodePacked(' promil"}, {"trait_type": "', _i, 'eye warp", "value": "', i_w(_b.e_2)));
        }
        {
            _i_w = string(abi.encodePacked(' promil"}, {"trait_type": "', _i, 'eye iris warp", "value": "', i_w(_b.e_3)));
        }
        {
            _p_w = string(abi.encodePacked(' promil"}, {"trait_type": "', _i, 'eye pupil warp", "value": "', i_w(_b.e_4)));
        }
        return string(
            abi.encodePacked(
                _s_w,
                _e_w,
                _i_w,
                _p_w,
                ' promil"}, '
            )
        );
    }

    function s_a(s_boncuk memory _b, string memory _i) private pure returns (string memory) {
        return string(
            abi.encodePacked(
                '{"trait_type": "', _i, 'eye size", "value": "',
                _b.e_2.r_x.toString(),
                'px"}, {"trait_type": "', _i, 'eye iris size", "value": "',
                _b.e_3.r_x.toString(),
                'px"},  {"trait_type": "', _i, 'eye pupil size", "value": "',
                _b.e_4.r_x.toString(),
                'px"},'
            )
        );
    }

    function c_a(s_boncuk memory _b, string memory _i) private pure returns (string memory) {
        string memory l_c;
        string memory i_c;
        string memory b_c;
        {
            l_c = string(abi.encodePacked('{"trait_type": "', _i, 'eye lid color", "value": "rgb(', _b.e_1_c._r, ', ', _b.e_1_c._g, ', ', _b.e_1_c._b, ')"},'));
        }
        {
            i_c = string(abi.encodePacked('{"trait_type": "', _i, 'eye pupil color", "value": "rgb(', _b.e_3_c._r, ', ', _b.e_3_c._g, ', ', _b.e_3_c._b, ')"},'));
        }
        return string(
            abi.encodePacked(
                l_c,
                i_c,
                b_c
            )
        );
    }

    function r_a(s_boncuk memory _b, string memory _i) private pure returns (string memory) {
        return string(
            abi.encodePacked(
                '{"trait_type": "', _i, 'eye full rotation time", "value": "',
                _b.r_.r_s,
                's"}, {"trait_type": "', _i, 'eye rotation direction", "value": "',
                _b.r_.r_0 == 0 ? 'clockwise' : 'counter-clockwise',
                '"}'
            )
        );
    }
    
    function f_a(DNA_Decoded memory _d) private pure returns (string memory) {
        return string(
            abi.encodePacked(
                '{"trait_type": "face size", "value": "',
                _d.e_0_r.toString(),
                'px"}, {"trait_type": "face color", "value": "rgb(',
                _d.e_0_g, ',', _d.e_0_g, ',', _d.e_0_g,
                ')"},  {"trait_type": "face swing time", "value": "',
                _d.s_.toString(),
                's"},'
            )
        );
    }

    // metadata attribute generation
    
    function getBoncukAttributes(s_boncuk memory _b, string memory _i) private pure returns (string memory) {
        return string(abi.encodePacked(w_a(_b, _i), s_a(_b, _i), c_a(_b, _i), r_a(_b, _i)));
    }

    function getAttributes(uint _i)
        private
        view
        returns (string memory)
    {
        DNA_Decoded memory _d = decode_dna(_i);
        s_boncuk memory b_1 = _d.b_1;
        s_boncuk memory b_2 = _d.b_2;
        return string(abi.encodePacked('[', f_a(_d), getBoncukAttributes(b_1, 'left '), ",", getBoncukAttributes(b_2, 'right '), ']'));
    }
    
    // tokenURI for ERC721

    function tokenURI(uint256 _i)
        public
        view
        override(ERC721)
        returns (string memory)
    {
        super.tokenURI(_i);
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    bytes(
                        abi.encodePacked(
                            '{"attributes": ', getAttributes(_i),
                            ', "name": "booncuk #', _i.toString(),
                            '", "description": "', _description,
                            '", "external_url": "', _external_url,
                            '", "image": "data:image/svg+xml;base64,',
                            render_encoded(_i),
                            '"}'
                        )
                    ).encode(),
                    "#"
                )
            );
    }
    
    // contractURI for OpenSea
  
    function contractURI() public view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    bytes(
                        abi.encodePacked(
                            '{"name": "booncuk", "description": "', _description,
                            '", "external_link": "', _external_url,
                            '"}'
                        )
                    ).encode()
                )
            );
    }
    
    // Derived 721 contract must override function “supportsInterface”

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
     
    // constructor populating description, externalUrl, and the genesis NFT for the contractURI

    constructor()
        ERC721("booncuk", "booncuk")
        onlyOwner
    {
        setDescription(string(abi.encodePacked(MAX_SUPPLY.toString(), " on-mint generated, on-chain stored and displayed evil eye pairs")));
        setExternalUrl("https://booncuk.wtf");
        mint(1);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_external_url","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":"booncuk_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boncuk_id","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_d","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_u","type":"string"}],"name":"setExternalUrl","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":"_i","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040819052600b55600c80546001600160a01b03191673fa12fae65134a8f2041a68b88a253d23e79148041790553480156200003c57600080fd5b50604080518082018252600780825266626f6f6e63756b60c81b6020808401828152855180870190965292855284015281519192916200007f9160009162000aa8565b5080516200009590600190602084019062000aa8565b5050600160065550620000a8336200018c565b6007546001600160a01b03163314620000f75760405162461bcd60e51b81526020600482018190526024820152600080516020620058c383398151915260448201526064015b60405180910390fd5b6200013b62000113600b54620001de60201b62000d0b1760201c565b60405160200162000125919062000bd3565b60408051601f19818403018152919052620002fb565b60408051808201909152601381527f68747470733a2f2f626f6f6e63756b2e7774660000000000000000000000000060208201526200017a906200036c565b620001866001620003d9565b62000e2f565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606081620002035750506040805180820190915260018152600360fc1b602082015290565b8160005b81156200023357806200021a8162000da2565b91506200022b9050600a8362000d01565b915062000207565b6000816001600160401b0381111562000250576200025062000e19565b6040519080825280601f01601f1916602001820160405280156200027b576020820181803683370190505b5090505b8415620002f3576200029360018362000d18565b9150620002a2600a8662000dc0565b620002af90603062000ce6565b60f81b818381518110620002c757620002c762000e03565b60200101906001600160f81b031916908160001a905350620002eb600a8662000d01565b94506200027f565b949350505050565b6007546001600160a01b03163314620003465760405162461bcd60e51b81526020600482018190526024820152600080516020620058c38339815191526044820152606401620000ee565b3332146200035357600080fd5b80516200036890600990602084019062000aa8565b5050565b6007546001600160a01b03163314620003b75760405162461bcd60e51b81526020600482018190526024820152600080516020620058c38339815191526044820152606401620000ee565b333214620003c457600080fd5b80516200036890600a90602084019062000aa8565b600260065414156200042e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620000ee565b60026006553332146200044057600080fd5b6000818152600e602052604090205460ff1615620004bb5760405162461bcd60e51b815260206004820152603160248201527f7468697320626f6e63756b207365656d7320746f2068617665206d696e746564604482015270206120626f6f6e63756b206265666f726560781b6064820152608401620000ee565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b1580156200050057600080fd5b505afa15801562000515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200053b919062000b4e565b6001600160a01b0316146200059d5760405162461bcd60e51b815260206004820152602160248201527f7468697320626f6e63756b207365656d73206e6f7420746f20626520796f75726044820152607360f81b6064820152608401620000ee565b600b54620005bd60026008546200068360201b62000e111790919060201c565b1115620005d7600b54620001de60201b62000d0b1760201c565b604051602001620005e9919062000c3c565b60405160208183030381529060405290620006195760405162461bcd60e51b8152600401620000ee919062000cd1565b506200063a816000908152600e60205260409020805460ff19166001179055565b620006453362000698565b6008805462000655919062000dc0565b600714156200067b576200067b620006756007546001600160a01b031690565b62000698565b506001600655565b600062000691828462000ce6565b9392505050565b620006b560016008546200068360201b62000e111790919060201c565b600855620006c2620006e9565b600880546000908152600d602052604090209190915554620006e690829062000758565b50565b600033600d6000600160085462000701919062000d18565b8152602001908152602001600020546040516020016200073a92919060609290921b6001600160601b0319168252601482015260340190565b6040516020818303038152906040528051906020012060001c905090565b620003688282604051806020016040528060008152506200077a60201b60201c565b620007868383620007f2565b6200079560008484846200093a565b620007ed5760405162461bcd60e51b81526020600482015260326024820152600080516020620058a383398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620000ee565b505050565b6001600160a01b0382166200084a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620000ee565b6000818152600260205260409020546001600160a01b031615620008b15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620000ee565b6001600160a01b0382166000908152600360205260408120805460019290620008dc90849062000ce6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200095b846001600160a01b031662000aa260201b62000e241760201c565b1562000a9757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200099590339089908890889060040162000c92565b602060405180830381600087803b158015620009b057600080fd5b505af1925050508015620009e3575060408051601f3d908101601f19168201909252620009e09181019062000b79565b60015b62000a7c573d80801562000a14576040519150601f19603f3d011682016040523d82523d6000602084013e62000a19565b606091505b50805162000a745760405162461bcd60e51b81526020600482015260326024820152600080516020620058a383398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620000ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620002f3565b506001949350505050565b3b151590565b82805462000ab69062000d65565b90600052602060002090601f01602090048101928262000ada576000855562000b25565b82601f1062000af557805160ff191683800117855562000b25565b8280016001018555821562000b25579182015b8281111562000b2557825182559160200191906001019062000b08565b5062000b3392915062000b37565b5090565b5b8082111562000b33576000815560010162000b38565b60006020828403121562000b6157600080fd5b81516001600160a01b03811681146200069157600080fd5b60006020828403121562000b8c57600080fd5b81516001600160e01b0319811681146200069157600080fd5b6000815180845262000bbf81602086016020860162000d32565b601f01601f19169290920160200192915050565b6000825162000be781846020870162000d32565b7f206f6e2d6d696e742067656e6572617465642c206f6e2d636861696e2073746f9201918252507f72656420616e6420646973706c61796564206576696c206579652070616972736020820152604001919050565b64037b7363c960dd1b81526000825162000c5e81600585016020870162000d32565b7f206f66207468656d2077696c6c206576657220657869737400000000000000006005939091019283015250601d01919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009062000cc79083018462000ba5565b9695505050505050565b60208152600062000691602083018462000ba5565b6000821982111562000cfc5762000cfc62000dd7565b500190565b60008262000d135762000d1362000ded565b500490565b60008282101562000d2d5762000d2d62000dd7565b500390565b60005b8381101562000d4f57818101518382015260200162000d35565b8381111562000d5f576000848401525b50505050565b600181811c9082168062000d7a57607f821691505b6020821081141562000d9c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000db95762000db962000dd7565b5060010190565b60008262000dd25762000dd262000ded565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b614a648062000e3f6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063baedebee1161007c578063baedebee146102b1578063c87b56dd146102ba578063cfa84dfe146102cd578063e8a3d485146102d5578063e985e9c5146102dd578063f2fde38b146102f057600080fd5b80638da5cb5b1461024c57806390c3f38f1461025d57806395d89b4114610270578063a0712d6814610278578063a22cb4651461028b578063b88d4fde1461029e57600080fd5b806326d58ad31161011557806326d58ad3146101e257806342842e0e146101f55780634c2aa727146102085780636352211e1461021057806370a0823114610223578063715018a61461024457600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba57806323b872dd146101cf575b600080fd5b610165610160366004612daa565b610303565b60405190151581526020015b60405180910390f35b610182610314565b6040516101719190614595565b6101a261019d366004612e2d565b6103a6565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004612d7e565b610440565b005b6101cd6101dd366004612c8a565b610556565b6101cd6101f0366004612de4565b610587565b6101cd610203366004612c8a565b6105d4565b6101826105ef565b6101a261021e366004612e2d565b61067d565b610236610231366004612c17565b6106f4565b604051908152602001610171565b6101cd61077b565b6007546001600160a01b03166101a2565b6101cd61026b366004612de4565b6107b1565b6101826107fa565b6101cd610286366004612e2d565b610809565b6101cd610299366004612d4b565b610a7e565b6101cd6102ac366004612ccb565b610b43565b61023660085481565b6101826102c8366004612e2d565b610b7b565b610182610bf7565b610182610c04565b6101656102eb366004612c51565b610c42565b6101cd6102fe366004612c17565b610c70565b600061030e82610e2a565b92915050565b60606000805461032390614810565b80601f016020809104026020016040519081016040528092919081815260200182805461034f90614810565b801561039c5780601f106103715761010080835404028352916020019161039c565b820191906000526020600020905b81548152906001019060200180831161037f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166104245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061044b8261067d565b9050806001600160a01b0316836001600160a01b031614156104b95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161041b565b336001600160a01b03821614806104d557506104d58133610c42565b6105475760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161041b565b6105518383610e7a565b505050565b6105603382610ee8565b61057c5760405162461bcd60e51b815260040161041b9061462f565b610551838383610fb7565b6007546001600160a01b031633146105b15760405162461bcd60e51b815260040161041b906145fa565b3332146105bd57600080fd5b80516105d090600a9060208401906129a7565b5050565b61055183838360405180602001604052806000815250610b43565b600a80546105fc90614810565b80601f016020809104026020016040519081016040528092919081815260200182805461062890614810565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b03168061030e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161041b565b60006001600160a01b03821661075f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161041b565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146107a55760405162461bcd60e51b815260040161041b906145fa565b6107af6000611157565b565b6007546001600160a01b031633146107db5760405162461bcd60e51b815260040161041b906145fa565b3332146107e757600080fd5b80516105d09060099060208401906129a7565b60606001805461032390614810565b6002600654141561085c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161041b565b600260065533321461086d57600080fd5b6000818152600e602052604090205460ff16156108e65760405162461bcd60e51b815260206004820152603160248201527f7468697320626f6e63756b207365656d7320746f2068617665206d696e746564604482015270206120626f6f6e63756b206265666f726560781b606482015260840161041b565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561092a57600080fd5b505afa15801561093e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109629190612c34565b6001600160a01b0316146109c25760405162461bcd60e51b815260206004820152602160248201527f7468697320626f6e63756b207365656d73206e6f7420746f20626520796f75726044820152607360f81b606482015260840161041b565b600b546008546109d3906002610e11565b11156109e0600b54610d0b565b6040516020016109f091906142cf565b60405160208183030381529060405290610a1d5760405162461bcd60e51b815260040161041b9190614595565b50610a3d816000908152600e60205260409020805460ff19166001179055565b610a46336111a9565b60088054610a549190614866565b60071415610a7657610a76610a716007546001600160a01b031690565b6111a9565b506001600655565b6001600160a01b038216331415610ad75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161041b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b4d3383610ee8565b610b695760405162461bcd60e51b815260040161041b9061462f565b610b75848484846111e4565b50505050565b6060610b8682611217565b50610bd1610b93836112fe565b610b9c84610d0b565b6009600a610ba98761139c565b604051602001610bbd959493929190614323565b6040516020818303038152906040526113ba565b604051602001610be1919061427f565b6040516020818303038152906040529050919050565b600980546105fc90614810565b6060610c1e6009600a604051602001610bbd92919061443f565b604051602001610c2e919061423a565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6007546001600160a01b03163314610c9a5760405162461bcd60e51b815260040161041b906145fa565b6001600160a01b038116610cff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161041b565b610d0881611157565b50565b606081610d2f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610d595780610d438161484b565b9150610d529050600a83614698565b9150610d33565b60008167ffffffffffffffff811115610d7457610d746148bc565b6040519080825280601f01601f191660200182016040528015610d9e576020820181803683370190505b5090505b8415610e0957610db36001836147b6565b9150610dc0600a86614866565b610dcb906030614680565b60f81b818381518110610de057610de06148a6565b60200101906001600160f81b031916908160001a905350610e02600a86614698565b9450610da2565b949350505050565b6000610e1d8284614680565b9392505050565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480610e5b57506001600160e01b03198216635b5e139f60e01b145b8061030e57506301ffc9a760e01b6001600160e01b031983161461030e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610eaf8261067d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610f615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161041b565b6000610f6c8361067d565b9050806001600160a01b0316846001600160a01b03161480610fa75750836001600160a01b0316610f9c846103a6565b6001600160a01b0316145b80610e095750610e098185610c42565b826001600160a01b0316610fca8261067d565b6001600160a01b0316146110325760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161041b565b6001600160a01b0382166110945760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161041b565b61109f600082610e7a565b6001600160a01b03831660009081526003602052604081208054600192906110c89084906147b6565b90915550506001600160a01b03821660009081526003602052604081208054600192906110f6908490614680565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546111b7906001610e11565b6008556111c2611522565b600880546000908152600d602052604090209190915554610d08908290611593565b6111ef848484610fb7565b6111fb848484846115ad565b610b755760405162461bcd60e51b815260040161041b906145a8565b6000818152600260205260409020546060906001600160a01b03166112965760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161041b565b60006112ad60408051602081019091526000815290565b905060008151116112cd5760405180602001604052806000815250610e1d565b806112d784610d0b565b6040516020016112e8929190612f44565b6040516020818303038152906040529392505050565b6060600061130b836116ba565b608081015160a08201519192509061132283611772565b611349836040518060400160405280600581526020016403632b33a160dd1b8152506117a9565b611371836040518060400160405280600681526020016503934b3b43a160d51b8152506117a9565b60405160200161138393929190613f83565b6040516020818303038152906040529350505050919050565b606061030e6113aa836117fd565b604051602001610bbd9190612f28565b60608151600014156113da57505060408051602081019091526000815290565b600060405180606001604052806040815260200161497360409139905060006003845160026114099190614680565b6114139190614698565b61141e906004614797565b9050600061142d826020614680565b67ffffffffffffffff811115611445576114456148bc565b6040519080825280601f01601f19166020018201604052801561146f576020820181803683370190505b509050818152600183018586518101602084015b818310156114dd5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611483565b6003895106600181146114f7576002811461150857611514565b613d3d60f01b600119830152611514565b603d60f81b6000198301525b509398975050505050505050565b600033600d6000600160085461153891906147b6565b81526020019081526020016000205460405160200161157592919060609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6040516020818303038152906040528051906020012060001c905090565b6105d0828260405180602001604052806000815250611860565b60006001600160a01b0384163b156116af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906115f1903390899088908890600401614558565b602060405180830381600087803b15801561160b57600080fd5b505af192505050801561163b575060408051601f3d908101601f1916820190925261163891810190612dc7565b60015b611695573d808015611669576040519150601f19603f3d011682016040523d82523d6000602084013e61166e565b606091505b50805161168d5760405162461bcd60e51b815260040161041b906145a8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e09565b506001949350505050565b6116c2612a2b565b60006116cd83611893565b6000848152600d60205260408120549192506116ea8260026118b8565b905060006116f7836118c4565b90506000611704836118c4565b905060006117138560046119a7565b90506000611725866101f46002611a1d565b9050600061173587836001611a53565b6040805160c081018252998a52602094850151948a019490945292880191909152506060860152608085019190915260a084015250909392505050565b60606117818260400151610d0b565b602083015183518190819061179590610d0b565b604051602001610be1959493929190613867565b60606117b58383611a94565b6117bf8484611b8a565b6117c98585611bd7565b6117d38686611c78565b6040516020016117e69493929190612fb6565b604051602081830303815290604052905092915050565b6060600061180a836116ba565b905061181d6118188461067d565b611cf5565b61182682611d60565b61183583608001516001611f1b565b6118448460a001516002611f1b565b61184c611f4c565b6040516020016112e895949392919061300d565b61186a8383611f9a565b61187760008484846115ad565b6105515760405162461bcd60e51b815260040161041b906145a8565b6000600b6118a361040084614698565b6118ad9190614866565b61030e906014614680565b6000610e1d8284614698565b6118cc612a6c565b60006118dc836102006002611a53565b905060006118eb8460036119a7565b905060006118ff85610200806102006120dc565b9050600061191b868360000151846040015185606001516120dc565b9050600061192a8760056119a7565b9050600061193b8860066001612166565b90506000611957898560000151866040015187606001516120dc565b905060006119648a61219b565b6040805161010081018252998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c08401525060e082015292915050565b6119cb60405180606001604052806060815260200160608152602001606081525090565b60405180606001604052806119ec858560006119e79190614680565b612231565b8152602001611a00856119e7866001614680565b8152602001611a14856119e7866002614680565b90529392505050565b6000611a298284614698565b611a34608086614698565b611a3e9190614866565b611a49600285614698565b610e099190614680565b6000611a6082600a614797565b611a6a9084614698565b611a75604086614698565b611a7f9190614866565b611a8a601485614698565b611a4990856147b6565b606080606080606085611aa688612256565b604051602001611ab7929190613276565b604051602081830303815290604052935085611ad68860400151612286565b604051602001611ae7929190613ab6565b604051602081830303815290604052925085611b068860600151612286565b604051602001611b17929190613a35565b604051602081830303815290604052915085611b368860c00151612286565b604051602001611b479291906139b4565b604051602081830303815290604052905083838383604051602001611b6f94939291906131b8565b60405160208183030381529060405294505050505092915050565b606081611b9e846040015160200151610d0b565b83611bb0866060015160200151610d0b565b85611bc28860c0015160200151610d0b565b6040516020016117e6969594939291906132eb565b6020808301518051818301516040928301519251606094859485948594611c04948a949293919201613524565b60408051601f19818403018152828252608089015180516020828101519290940151929750611c38948a949193910161345c565b6040516020818303038152906040529150828282604051602001611c5e93929190612f73565b604051602081830303815290604052935050505092915050565b60e0820151604081015190516060918391829015611cbf5760405180604001604052806011815260200170636f756e7465722d636c6f636b7769736560781b815250611ce2565b60405180604001604052806009815260200168636c6f636b7769736560b81b8152505b6040516020016117e694939291906135ec565b60608060606000611d0e856001600160a01b03166122b5565b90506040518060800160405280604681526020016149b360469139925080604051602001611d3c9190613826565b60405160208183030381529060405291508282604051602001611383929190612f44565b606080606080606080606080606080611d7c8b60000151610d0b565b604051602001611d8c9190613e4d565b6040516020818303038152906040529850604051806040016040528060068152602001651e3232b3399f60d11b81525097506040518060400160405280601b81526020017f3c72616469616c4772616469656e742069643d22655f305f67223e00000000008152509650604051806060016040528060258152602001614928602591396020808d0151604051929850611e2b929091829182910161419a565b60408051601f1981840301815260608301909152602a8083529096506148fe60208301399350604051806040016040528060118152602001701e17b930b234b0b623b930b234b2b73a1f60791b8152509250604051806040016040528060078152602001661e17b232b3399f60c91b8152509150611eac8b60400151610d0b565b611eb98c60600151610d0b565b604051602001611eca929190613db3565b6040516020818303038152906040529050888888888888888888604051602001611efc999897969594939291906130f7565b6040516020818303038152906040529950505050505050505050919050565b6060611f278383612309565b611f3184846125d8565b611f3a85612684565b6040516020016117e693929190612f73565b6060806040518060400160405280600a8152602001691e17b39f1e17b9bb339f60b11b815250905080604051602001611f859190612f28565b60405160208183030381529060405291505090565b6001600160a01b038216611ff05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161041b565b6000818152600260205260409020546001600160a01b0316156120555760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161041b565b6001600160a01b038216600090815260036020526040812080546001929061207e908490614680565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6121076040518060800160405280600081526020016000815260200160008152602001600081525090565b600061211586866003611a1d565b9050604051806080016040528082815260200161213488846001611a53565b815260200161214788888589600161279c565b815260200161215a88888588600261279c565b90529695505050505050565b6060610e09600561217885600a6146ef565b6121829087614698565b61218c9190614866565b6121969084614680565b610d0b565b6121bf60405180606001604052806000815260200160008152602001606081525090565b600060026121cf61040185614698565b6121d99190614866565b6121e590610168614797565b905060405180606001604052808281526020018261016861220691906147b6565b8152602001611a14601961221c61080088614698565b6122269190614866565b612196906008614680565b6060610e1d60ff61224284826146ef565b61224c9086614698565b6121969190614866565b606061030e610200836000015161020061227091906147b6565b61227c906103e8614797565b6121969190614698565b6020810151815160609190808211156122a757610e098261227083826147b6565b610e098161227084826147b6565b6060816122dc5750506040805180820190915260048152630307830360e41b602082015290565b8160005b81156122ff57806122f08161484b565b915050600882901c91506122e0565b610e09848261280b565b60608080808080808061232c61232060018b6147b6565b61219690610400614797565b60405160200161233c9190613f20565b60405160208183030381529060405296508960e00151604001518960011461237d57604051806040016040528060018152602001602d60f81b81525061238e565b604051806020016040528060008152505b8a6002146123b557604051806040016040528060018152602001602d60f81b8152506123c6565b604051806020016040528060008152505b6040516020016123d8939291906136f9565b60405160208183030381529060405295506123f68a60000151610d0b565b6123ff8a610d0b565b604051602001612410929190614101565b60405160208183030381529060405294506124328a6040015160000151610d0b565b6124438b6040015160200151610d0b565b6124548c6040015160400151610d0b565b6124658d6040015160600151610d0b565b6040516020016124789493929190613b2f565b60405160208183030381529060405293508960800151600001518a60800151602001518b60800151604001518c60a001516040516020016124bc94939291906144ba565b60405160208183030381529060405291506124de8a6060015160000151610d0b565b6124ef8b6060015160200151610d0b565b6125008c6060015160400151610d0b565b6125118d6060015160600151610d0b565b85604051602001612526959493929190613cd5565b60405160208183030381529060405292506125488a60c0015160000151610d0b565b6125598b60c0015160200151610d0b565b61256a8c60c0015160400151610d0b565b61257b8d60c0015160600151610d0b565b60405160200161258e9493929190613bf6565b60405160208183030381529060405290508686868686856040516020016125ba96959493929190613078565b60405160208183030381529060405297505050505050505092915050565b6060806060808560e00151604001516125f88760e0015160000151610d0b565b6126098860e0015160200151610d0b565b60405160200161261b93929190613ff3565b60408051601f1981840301815282820190915260068252651e3232b3399f60d11b60208301529350915061264e85610d0b565b60405160200161265e9190613225565b6040516020818303038152906040529050828282604051602001611c5e93929190612f73565b606080606080606080606060405180606001604052806026815260200161494d602691396020808a01518051818301516040928301519251949a506126ce9491939092910161419a565b60408051601f198184030181526060830190915260368083529096506149f960208301399350604051806040016040528060118152602001701e17b930b234b0b623b930b234b2b73a1f60791b8152509250604051806040016040528060078152602001661e17b232b3399f60c91b8152509150604051806040016040528060088152602001671e17b39f1e17b39f60c11b815250905085858585858560405160200161278096959493929190613078565b6040516020818303038152906040529650505050505050919050565b60008060646127ab86886147b6565b6127b6906023614797565b6127c09190614698565b90506127cd816002614797565b6127d88460ff614797565b6127e29089614698565b6127ec9190614866565b6127f682866147b6565b6128009190614680565b979650505050505050565b6060600061281a836002614797565b612825906002614680565b67ffffffffffffffff81111561283d5761283d6148bc565b6040519080825280601f01601f191660200182016040528015612867576020820181803683370190505b509050600360fc1b81600081518110612882576128826148a6565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106128b1576128b16148a6565b60200101906001600160f81b031916908160001a90535060006128d5846002614797565b6128e0906001614680565b90505b6001811115612958576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612914576129146148a6565b1a60f81b82828151811061292a5761292a6148a6565b60200101906001600160f81b031916908160001a90535060049490941c93612951816147f9565b90506128e3565b508315610e1d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161041b565b8280546129b390614810565b90600052602060002090601f0160209004810192826129d55760008555612a1b565b82601f106129ee57805160ff1916838001178555612a1b565b82800160010185558215612a1b579182015b82811115612a1b578251825591602001919060010190612a00565b50612a27929150612b8c565b5090565b6040518060c0016040528060008152602001606081526020016000815260200160008152602001612a5a612a6c565b8152602001612a67612a6c565b905290565b60405180610100016040528060008152602001612aa360405180606001604052806060815260200160608152602001606081525090565b8152602001612ad36040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001612b036040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001612b2c60405180606001604052806060815260200160608152602001606081525090565b815260200160608152602001612b636040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001612a6760405180606001604052806000815260200160008152602001606081525090565b5b80821115612a275760008155600101612b8d565b600067ffffffffffffffff80841115612bbc57612bbc6148bc565b604051601f8501601f19908116603f01168101908282118183101715612be457612be46148bc565b81604052809350858152868686011115612bfd57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c2957600080fd5b8135610e1d816148d2565b600060208284031215612c4657600080fd5b8151610e1d816148d2565b60008060408385031215612c6457600080fd5b8235612c6f816148d2565b91506020830135612c7f816148d2565b809150509250929050565b600080600060608486031215612c9f57600080fd5b8335612caa816148d2565b92506020840135612cba816148d2565b929592945050506040919091013590565b60008060008060808587031215612ce157600080fd5b8435612cec816148d2565b93506020850135612cfc816148d2565b925060408501359150606085013567ffffffffffffffff811115612d1f57600080fd5b8501601f81018713612d3057600080fd5b612d3f87823560208401612ba1565b91505092959194509250565b60008060408385031215612d5e57600080fd5b8235612d69816148d2565b915060208301358015158114612c7f57600080fd5b60008060408385031215612d9157600080fd5b8235612d9c816148d2565b946020939093013593505050565b600060208284031215612dbc57600080fd5b8135610e1d816148e7565b600060208284031215612dd957600080fd5b8151610e1d816148e7565b600060208284031215612df657600080fd5b813567ffffffffffffffff811115612e0d57600080fd5b8201601f81018413612e1e57600080fd5b610e0984823560208401612ba1565b600060208284031215612e3f57600080fd5b5035919050565b60008151808452612e5e8160208601602086016147cd565b601f01601f19169290920160200192915050565b60008151612e848185602086016147cd565b9290920192915050565b8054600090600181811c9080831680612ea857607f831692505b6020808410821415612eca57634e487b7160e01b600052602260045260246000fd5b818015612ede5760018114612eef57612f1c565b60ff19861689528489019650612f1c565b60008881526020902060005b86811015612f145781548b820152908501908301612efb565b505084890196505b50505050505092915050565b60008251612f3a8184602087016147cd565b9190910192915050565b60008351612f568184602088016147cd565b835190830190612f6a8183602088016147cd565b01949350505050565b60008451612f858184602089016147cd565b845190830190612f998183602089016147cd565b8451910190612fac8183602088016147cd565b0195945050505050565b60008551612fc8818460208a016147cd565b855190830190612fdc818360208a016147cd565b8551910190612fef8183602089016147cd565b84519101906130028183602088016147cd565b019695505050505050565b6000865161301f818460208b016147cd565b865190830190613033818360208b016147cd565b8651910190613046818360208a016147cd565b85519101906130598183602089016147cd565b845191019061306c8183602088016147cd565b01979650505050505050565b60008751602061308b8285838d016147cd565b88519184019161309e8184848d016147cd565b88519201916130b08184848c016147cd565b87519201916130c28184848b016147cd565b86519201916130d48184848a016147cd565b85519201916130e681848489016147cd565b919091019998505050505050505050565b60008a51613109818460208f016147cd565b8a519083019061311d818360208f016147cd565b8a5161312f8183850160208f016147cd565b8a51929091010190613145818360208d016147cd565b88516131578183850160208d016147cd565b885192909101019061316d818360208b016147cd565b8651910190613180818360208a016147cd565b85516131928183850160208a016147cd565b85519290910101906131a88183602088016147cd565b019b9a5050505050505050505050565b600085516131ca818460208a016147cd565b8551908301906131de818360208a016147cd565b85519101906131f18183602089016147cd565b84519101906132048183602088016147cd565b6a010383937b6b4b6113e96160ad1b9101908152600b019695505050505050565b7f3c72616469616c4772616469656e742069643d22655f315f670000000000000081526000825161325d8160198501602087016147cd565b61111f60f11b6019939091019283015250601b01919050565b6f3d913a3930b4ba2fba3cb832911d101160811b815282516000906132a28160108501602088016147cd565b7f65796520736f636b65742077617270222c202276616c7565223a20220000000060109184019182015283516132df81602c8401602088016147cd565b01602c01949350505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528651600090613317816010850160208c016147cd565b7432bcb29039b4bd32911610113b30b63ab2911d101160591b601091840191820152875161334c816025840160208c016147cd565b75383c113e96103d913a3930b4ba2fba3cb832911d101160511b60259290910191820152865161338381603b840160208b016147cd565b7f65796520697269732073697a65222c202276616c7565223a2022000000000000603b929091019182015285516133c1816055840160208a016147cd565b7f7078227d2c20207b2274726169745f74797065223a20220000000000000000006055929091019182015284516133ff81606c8401602089016147cd565b61344e61343d613437606c848601017f65796520707570696c2073697a65222c202276616c7565223a202200000000008152601b0190565b87612e72565b641c1e089f4b60da1b815260050190565b9a9950505050505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528451600090613488816010850160208a016147cd565b7f65796520707570696c20636f6c6f72222c202276616c7565223a20227267622860109184019182015285516134c5816030840160208a016147cd565b80820191505061016160f51b80603083015285516134ea816032850160208a016147cd565b603292019182015283516135058160348401602088016147cd565b630a489f4b60e21b603492909101918201526038019695505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528451600090613550816010850160208a016147cd565b7f657965206c696420636f6c6f72222c202276616c7565223a2022726762280000601091840191820152855161358d81602e840160208a016147cd565b80820191505061016160f51b80602e83015285516135b2816030850160208a016147cd565b603092019182015283516135cd8160328401602088016147cd565b630a489f4b60e21b603292909101918201526036019695505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528451600090613618816010850160208a016147cd565b7f6579652066756c6c20726f746174696f6e2074696d65222c202276616c756522601091840191820152621d101160e91b603082018190528651613663816033850160208b016147cd565b7439913e96103d913a3930b4ba2fba3cb832911d101160591b603393909101928301528551613699816048850160208a016147cd565b7f65796520726f746174696f6e20646972656374696f6e222c202276616c75652260489390910192830152606882015283516136dc81606b8401602088016147cd565b61227d60f01b606b9290910191820152606d019695505050505050565b7f3c616e696d6174655472616e73666f726d2061646469746976653d2273756d2281527f206174747269627574654e616d653d227472616e73666f726d2220626567696e60208201526a1e9118399110323ab91e9160a91b60408201526000845161376b81604b8501602089016147cd565b7f732220747970653d227472616e736c617465222076616c7565733d22302c303b604b9184019182015262080c0b60ea1b606b82015284516137b481606e8401602089016147cd565b6a0d4c0ec80c0b0c0ec80c0b60aa1b606e929091019182015283516137e08160798401602088016147cd565b7f35303b20302c302220726570656174436f756e743d22696e646566696e697465607992909101918201526511179f1e339f60d11b6099820152609f0195945050505050565b661e3a34ba36329f60c91b8152600082516138488160078501602087016147cd565b671e17ba34ba36329f60c11b6007939091019283015250600f01919050565b7f7b2274726169745f74797065223a2022666163652073697a65222c202276616c8152653ab2911d101160d11b6020820152600086516138ae816026850160208b016147cd565b7f7078227d2c207b2274726169745f74797065223a20226661636520636f6c6f7260269184019182015270044584044ecc2d8eaca44744044e4cec45607b1b60468201528651613905816057840160208b016147cd565b808201915050600b60fa1b8060578301528651613929816058850160208b016147cd565b605892019182015284516139448160598401602089016147cd565b6139a76139976134376059848601017f29227d2c20207b2274726169745f74797065223a202266616365207377696e67815271103a34b6b2911610113b30b63ab2911d101160711b602082015260320190565b631cc89f4b60e21b815260040190565b9998505050505050505050565b7f2070726f6d696c227d2c207b2274726169745f74797065223a202200000000008152600083516139ec81601b8501602088016147cd565b7f65796520707570696c2077617270222c202276616c7565223a20220000000000601b918401918201528351613a298160368401602088016147cd565b01603601949350505050565b7f2070726f6d696c227d2c207b2274726169745f74797065223a20220000000000815260008351613a6d81601b8501602088016147cd565b7f65796520697269732077617270222c202276616c7565223a2022000000000000601b918401918201528351613aaa8160358401602088016147cd565b01603501949350505050565b7f2070726f6d696c227d2c207b2274726169745f74797065223a20220000000000815260008351613aee81601b8501602088016147cd565b7432bcb2903bb0b938111610113b30b63ab2911d101160591b601b918401918201528351613b238160308401602088016147cd565b01603001949350505050565b6c1e32b63634b839b290393c9e9160991b81528451600090613b5881600d850160208a016147cd565b651110393c1e9160d11b600d918401918201528551613b7e816013840160208a016147cd565b65111031bc9e9160d11b601392909101918201528451613ba58160198401602089016147cd565b65111031bc1e9160d11b601992909101918201528351613bcc81601f8401602088016147cd565b6e11103334b6361e9111a3232311179f60891b601f9290910191820152602e019695505050505050565b6c1e32b63634b839b290393c9e9160991b81528451600090613c1f81600d850160208a016147cd565b651110393c1e9160d11b600d918401918201528551613c45816013840160208a016147cd565b65111031bc9e9160d11b601392909101918201528451613c6c8160198401602089016147cd565b65111031bc1e9160d11b601992909101918201528351613c9381601f8401602088016147cd565b7f222066696c6c3d22726762612832322c2032342c203135302c20302e3829222f601f9290910191820152601f60f91b603f8201526040019695505050505050565b6c1e32b63634b839b290393c9e9160991b81528551600090613cfe81600d850160208b016147cd565b651110393c1e9160d11b600d918401918201528651613d24816013840160208b016147cd565b65111031bc9e9160d11b601392909101918201528551613d4b816019840160208a016147cd565b65111031bc1e9160d11b601992909101918201528451613d7281601f8401602089016147cd565b6711103334b6361e9160c11b601f92909101918201528351613d9b8160278401602088016147cd565b6139a76027828401016211179f60e91b815260030190565b6c1e32b63634b839b290393c9e9160991b81528251600090613ddc81600d8501602088016147cd565b651110393c1e9160d11b600d918401918201528351613e028160138401602088016147cd565b7f222063793d22353132222063783d22353132222066696c6c3d2275726c282365601392909101918201526b2f982fb39491179f1e17b39f60a11b6033820152603f01949350505050565b7f3c673e3c616e696d6174655472616e73666f726d206174747269627574654e6181527f6d653d227472616e73666f726d2220626567696e3d22307322206475723d2200602082015260008251613eab81603f8501602087016147cd565b7f732220747970653d227472616e736c617465222076616c7565733d22302c303b603f9390910192830152507f2031322c303b20302c303b202d31322c303b20302c302220726570656174436f605f820152713ab73a1e9134b73232b334b734ba3291179f60711b607f820152609101919050565b7f3c67207472616e73666f726d3d227363616c6528302e35292c207472616e736c8152630c2e8ca560e31b602082015260008251613f658160248501602087016147cd565b66161a989914911f60c91b6024939091019283015250602b01919050565b605b60f81b815260008451613f9f8160018501602089016147cd565b845190830190613fb68160018401602089016147cd565b600b60fa1b600192909101918201528351613fd88160028401602088016147cd565b605d60f81b6002929091019182015260030195945050505050565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d81527f227472616e73666f726d2220626567696e3d22307322206475723d220000000060208201526000845161405181603c8501602089016147cd565b7f732220747970653d22726f74617465222066726f6d3d22000000000000000000603c91840191820152845161408e8160538401602089016147cd565b6d101a9899101a989911103a379e9160911b6053929091019182015283516140bd8160618401602088016147cd565b7f20353132203531322220726570656174436f756e743d22696e646566696e697460619290910191820152633291179f60e11b608182015260850195945050505050565b751e32b63634b839b290393c9e911a98991110393c1e9160511b815282516000906141338160168501602088016147cd565b7f222063793d22353132222063783d22353132222066696c6c3d2275726c282365601691840191820152635f315f6760e01b6036820152835161417d81603a8401602088016147cd565b631491179f60e11b603a9290910191820152603e01949350505050565b7f3c73746f70206f66667365743d22393925222073746f702d636f6c6f723d22728152620cec4560eb1b6020820152600084516141de8160238501602089016147cd565b8083019050600b60fa1b8060238301528551614201816024850160208a016147cd565b6024920191820152835161421c8160258401602088016147cd565b631491179f60e11b6025929091019182015260290195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161427281601d8501602087016147cd565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516142b781601d8501602087016147cd565b602360f81b601d939091019283015250601e01919050565b64037b7363c960dd1b8152600082516142ef8160058501602087016147cd565b7f206f66207468656d2077696c6c206576657220657869737400000000000000006005939091019283015250601d01919050565b6e03d9130ba3a3934b13aba32b9911d1608d1b8152855160009061434e81600f850160208b016147cd565b732c20226e616d65223a2022626f6f6e63756b202360601b600f918401918201528651614382816023840160208b016147cd565b72111610113232b9b1b934b83a34b7b7111d101160691b602392909101918201526143b06036820187612e8e565b731116101132bc3a32b93730b62fbab936111d101160611b815290506143d96014820186612e8e565b90507f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015283516144218160278401602088016147cd565b61227d60f01b60279290910191820152602901979650505050505050565b7f7b226e616d65223a2022626f6f6e63756b222c20226465736372697074696f6e815263111d101160e11b6020820152600061447e6024830185612e8e565b741116101132bc3a32b93730b62fb634b735911d101160591b81526144a66015820185612e8e565b61227d60f01b815260020195945050505050565b640e4cec4c2560db1b8152600085516144da816005850160208a016147cd565b8083019050600b60fa1b80600583015286516144fd816006850160208b016147cd565b600692019182015284516145188160078401602089016147cd565b6216181760e91b60079290910191820152835161453c81600a8401602088016147cd565b602960f81b600a9290910191820152600b019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061458b90830184612e46565b9695505050505050565b602081526000610e1d6020830184612e46565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156146935761469361487a565b500190565b6000826146a7576146a7614890565b500490565b600181815b808511156146e75781600019048211156146cd576146cd61487a565b808516156146da57918102915b93841c93908002906146b1565b509250929050565b6000610e1d83836000826147055750600161030e565b816147125750600061030e565b816001811461472857600281146147325761474e565b600191505061030e565b60ff8411156147435761474361487a565b50506001821b61030e565b5060208310610133831016604e8410600b8410161715614771575081810a61030e565b61477b83836146ac565b806000190482111561478f5761478f61487a565b029392505050565b60008160001904831182151516156147b1576147b161487a565b500290565b6000828210156147c8576147c861487a565b500390565b60005b838110156147e85781810151838201526020016147d0565b83811115610b755750506000910152565b6000816148085761480861487a565b506000190190565b600181811c9082168061482457607f821691505b6020821081141561484557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561485f5761485f61487a565b5060010190565b60008261487557614875614890565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d0857600080fd5b6001600160e01b031981168114610d0857600080fdfe3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2223376437643764222f3e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2223464646222f3e3c73746f70206f66667365743d22333025222073746f702d636f6c6f723d2223303030222f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d223130323422206865696768743d22313032342220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c673e3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2272676261283132352c3132352c3132352c3129222f3ea2646970667358221220530e79e37152e6fc4a20f641a87b3b52eccec71027762b122466317dc56b714864736f6c634300080700334552433732313a207472616e7366657220746f206e6f6e2045524337323152654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063baedebee1161007c578063baedebee146102b1578063c87b56dd146102ba578063cfa84dfe146102cd578063e8a3d485146102d5578063e985e9c5146102dd578063f2fde38b146102f057600080fd5b80638da5cb5b1461024c57806390c3f38f1461025d57806395d89b4114610270578063a0712d6814610278578063a22cb4651461028b578063b88d4fde1461029e57600080fd5b806326d58ad31161011557806326d58ad3146101e257806342842e0e146101f55780634c2aa727146102085780636352211e1461021057806370a0823114610223578063715018a61461024457600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba57806323b872dd146101cf575b600080fd5b610165610160366004612daa565b610303565b60405190151581526020015b60405180910390f35b610182610314565b6040516101719190614595565b6101a261019d366004612e2d565b6103a6565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004612d7e565b610440565b005b6101cd6101dd366004612c8a565b610556565b6101cd6101f0366004612de4565b610587565b6101cd610203366004612c8a565b6105d4565b6101826105ef565b6101a261021e366004612e2d565b61067d565b610236610231366004612c17565b6106f4565b604051908152602001610171565b6101cd61077b565b6007546001600160a01b03166101a2565b6101cd61026b366004612de4565b6107b1565b6101826107fa565b6101cd610286366004612e2d565b610809565b6101cd610299366004612d4b565b610a7e565b6101cd6102ac366004612ccb565b610b43565b61023660085481565b6101826102c8366004612e2d565b610b7b565b610182610bf7565b610182610c04565b6101656102eb366004612c51565b610c42565b6101cd6102fe366004612c17565b610c70565b600061030e82610e2a565b92915050565b60606000805461032390614810565b80601f016020809104026020016040519081016040528092919081815260200182805461034f90614810565b801561039c5780601f106103715761010080835404028352916020019161039c565b820191906000526020600020905b81548152906001019060200180831161037f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166104245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061044b8261067d565b9050806001600160a01b0316836001600160a01b031614156104b95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161041b565b336001600160a01b03821614806104d557506104d58133610c42565b6105475760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161041b565b6105518383610e7a565b505050565b6105603382610ee8565b61057c5760405162461bcd60e51b815260040161041b9061462f565b610551838383610fb7565b6007546001600160a01b031633146105b15760405162461bcd60e51b815260040161041b906145fa565b3332146105bd57600080fd5b80516105d090600a9060208401906129a7565b5050565b61055183838360405180602001604052806000815250610b43565b600a80546105fc90614810565b80601f016020809104026020016040519081016040528092919081815260200182805461062890614810565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b03168061030e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161041b565b60006001600160a01b03821661075f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161041b565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146107a55760405162461bcd60e51b815260040161041b906145fa565b6107af6000611157565b565b6007546001600160a01b031633146107db5760405162461bcd60e51b815260040161041b906145fa565b3332146107e757600080fd5b80516105d09060099060208401906129a7565b60606001805461032390614810565b6002600654141561085c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161041b565b600260065533321461086d57600080fd5b6000818152600e602052604090205460ff16156108e65760405162461bcd60e51b815260206004820152603160248201527f7468697320626f6e63756b207365656d7320746f2068617665206d696e746564604482015270206120626f6f6e63756b206265666f726560781b606482015260840161041b565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561092a57600080fd5b505afa15801561093e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109629190612c34565b6001600160a01b0316146109c25760405162461bcd60e51b815260206004820152602160248201527f7468697320626f6e63756b207365656d73206e6f7420746f20626520796f75726044820152607360f81b606482015260840161041b565b600b546008546109d3906002610e11565b11156109e0600b54610d0b565b6040516020016109f091906142cf565b60405160208183030381529060405290610a1d5760405162461bcd60e51b815260040161041b9190614595565b50610a3d816000908152600e60205260409020805460ff19166001179055565b610a46336111a9565b60088054610a549190614866565b60071415610a7657610a76610a716007546001600160a01b031690565b6111a9565b506001600655565b6001600160a01b038216331415610ad75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161041b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b4d3383610ee8565b610b695760405162461bcd60e51b815260040161041b9061462f565b610b75848484846111e4565b50505050565b6060610b8682611217565b50610bd1610b93836112fe565b610b9c84610d0b565b6009600a610ba98761139c565b604051602001610bbd959493929190614323565b6040516020818303038152906040526113ba565b604051602001610be1919061427f565b6040516020818303038152906040529050919050565b600980546105fc90614810565b6060610c1e6009600a604051602001610bbd92919061443f565b604051602001610c2e919061423a565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6007546001600160a01b03163314610c9a5760405162461bcd60e51b815260040161041b906145fa565b6001600160a01b038116610cff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161041b565b610d0881611157565b50565b606081610d2f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610d595780610d438161484b565b9150610d529050600a83614698565b9150610d33565b60008167ffffffffffffffff811115610d7457610d746148bc565b6040519080825280601f01601f191660200182016040528015610d9e576020820181803683370190505b5090505b8415610e0957610db36001836147b6565b9150610dc0600a86614866565b610dcb906030614680565b60f81b818381518110610de057610de06148a6565b60200101906001600160f81b031916908160001a905350610e02600a86614698565b9450610da2565b949350505050565b6000610e1d8284614680565b9392505050565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480610e5b57506001600160e01b03198216635b5e139f60e01b145b8061030e57506301ffc9a760e01b6001600160e01b031983161461030e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610eaf8261067d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610f615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161041b565b6000610f6c8361067d565b9050806001600160a01b0316846001600160a01b03161480610fa75750836001600160a01b0316610f9c846103a6565b6001600160a01b0316145b80610e095750610e098185610c42565b826001600160a01b0316610fca8261067d565b6001600160a01b0316146110325760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161041b565b6001600160a01b0382166110945760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161041b565b61109f600082610e7a565b6001600160a01b03831660009081526003602052604081208054600192906110c89084906147b6565b90915550506001600160a01b03821660009081526003602052604081208054600192906110f6908490614680565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546111b7906001610e11565b6008556111c2611522565b600880546000908152600d602052604090209190915554610d08908290611593565b6111ef848484610fb7565b6111fb848484846115ad565b610b755760405162461bcd60e51b815260040161041b906145a8565b6000818152600260205260409020546060906001600160a01b03166112965760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161041b565b60006112ad60408051602081019091526000815290565b905060008151116112cd5760405180602001604052806000815250610e1d565b806112d784610d0b565b6040516020016112e8929190612f44565b6040516020818303038152906040529392505050565b6060600061130b836116ba565b608081015160a08201519192509061132283611772565b611349836040518060400160405280600581526020016403632b33a160dd1b8152506117a9565b611371836040518060400160405280600681526020016503934b3b43a160d51b8152506117a9565b60405160200161138393929190613f83565b6040516020818303038152906040529350505050919050565b606061030e6113aa836117fd565b604051602001610bbd9190612f28565b60608151600014156113da57505060408051602081019091526000815290565b600060405180606001604052806040815260200161497360409139905060006003845160026114099190614680565b6114139190614698565b61141e906004614797565b9050600061142d826020614680565b67ffffffffffffffff811115611445576114456148bc565b6040519080825280601f01601f19166020018201604052801561146f576020820181803683370190505b509050818152600183018586518101602084015b818310156114dd5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611483565b6003895106600181146114f7576002811461150857611514565b613d3d60f01b600119830152611514565b603d60f81b6000198301525b509398975050505050505050565b600033600d6000600160085461153891906147b6565b81526020019081526020016000205460405160200161157592919060609290921b6bffffffffffffffffffffffff19168252601482015260340190565b6040516020818303038152906040528051906020012060001c905090565b6105d0828260405180602001604052806000815250611860565b60006001600160a01b0384163b156116af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906115f1903390899088908890600401614558565b602060405180830381600087803b15801561160b57600080fd5b505af192505050801561163b575060408051601f3d908101601f1916820190925261163891810190612dc7565b60015b611695573d808015611669576040519150601f19603f3d011682016040523d82523d6000602084013e61166e565b606091505b50805161168d5760405162461bcd60e51b815260040161041b906145a8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e09565b506001949350505050565b6116c2612a2b565b60006116cd83611893565b6000848152600d60205260408120549192506116ea8260026118b8565b905060006116f7836118c4565b90506000611704836118c4565b905060006117138560046119a7565b90506000611725866101f46002611a1d565b9050600061173587836001611a53565b6040805160c081018252998a52602094850151948a019490945292880191909152506060860152608085019190915260a084015250909392505050565b60606117818260400151610d0b565b602083015183518190819061179590610d0b565b604051602001610be1959493929190613867565b60606117b58383611a94565b6117bf8484611b8a565b6117c98585611bd7565b6117d38686611c78565b6040516020016117e69493929190612fb6565b604051602081830303815290604052905092915050565b6060600061180a836116ba565b905061181d6118188461067d565b611cf5565b61182682611d60565b61183583608001516001611f1b565b6118448460a001516002611f1b565b61184c611f4c565b6040516020016112e895949392919061300d565b61186a8383611f9a565b61187760008484846115ad565b6105515760405162461bcd60e51b815260040161041b906145a8565b6000600b6118a361040084614698565b6118ad9190614866565b61030e906014614680565b6000610e1d8284614698565b6118cc612a6c565b60006118dc836102006002611a53565b905060006118eb8460036119a7565b905060006118ff85610200806102006120dc565b9050600061191b868360000151846040015185606001516120dc565b9050600061192a8760056119a7565b9050600061193b8860066001612166565b90506000611957898560000151866040015187606001516120dc565b905060006119648a61219b565b6040805161010081018252998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c08401525060e082015292915050565b6119cb60405180606001604052806060815260200160608152602001606081525090565b60405180606001604052806119ec858560006119e79190614680565b612231565b8152602001611a00856119e7866001614680565b8152602001611a14856119e7866002614680565b90529392505050565b6000611a298284614698565b611a34608086614698565b611a3e9190614866565b611a49600285614698565b610e099190614680565b6000611a6082600a614797565b611a6a9084614698565b611a75604086614698565b611a7f9190614866565b611a8a601485614698565b611a4990856147b6565b606080606080606085611aa688612256565b604051602001611ab7929190613276565b604051602081830303815290604052935085611ad68860400151612286565b604051602001611ae7929190613ab6565b604051602081830303815290604052925085611b068860600151612286565b604051602001611b17929190613a35565b604051602081830303815290604052915085611b368860c00151612286565b604051602001611b479291906139b4565b604051602081830303815290604052905083838383604051602001611b6f94939291906131b8565b60405160208183030381529060405294505050505092915050565b606081611b9e846040015160200151610d0b565b83611bb0866060015160200151610d0b565b85611bc28860c0015160200151610d0b565b6040516020016117e6969594939291906132eb565b6020808301518051818301516040928301519251606094859485948594611c04948a949293919201613524565b60408051601f19818403018152828252608089015180516020828101519290940151929750611c38948a949193910161345c565b6040516020818303038152906040529150828282604051602001611c5e93929190612f73565b604051602081830303815290604052935050505092915050565b60e0820151604081015190516060918391829015611cbf5760405180604001604052806011815260200170636f756e7465722d636c6f636b7769736560781b815250611ce2565b60405180604001604052806009815260200168636c6f636b7769736560b81b8152505b6040516020016117e694939291906135ec565b60608060606000611d0e856001600160a01b03166122b5565b90506040518060800160405280604681526020016149b360469139925080604051602001611d3c9190613826565b60405160208183030381529060405291508282604051602001611383929190612f44565b606080606080606080606080606080611d7c8b60000151610d0b565b604051602001611d8c9190613e4d565b6040516020818303038152906040529850604051806040016040528060068152602001651e3232b3399f60d11b81525097506040518060400160405280601b81526020017f3c72616469616c4772616469656e742069643d22655f305f67223e00000000008152509650604051806060016040528060258152602001614928602591396020808d0151604051929850611e2b929091829182910161419a565b60408051601f1981840301815260608301909152602a8083529096506148fe60208301399350604051806040016040528060118152602001701e17b930b234b0b623b930b234b2b73a1f60791b8152509250604051806040016040528060078152602001661e17b232b3399f60c91b8152509150611eac8b60400151610d0b565b611eb98c60600151610d0b565b604051602001611eca929190613db3565b6040516020818303038152906040529050888888888888888888604051602001611efc999897969594939291906130f7565b6040516020818303038152906040529950505050505050505050919050565b6060611f278383612309565b611f3184846125d8565b611f3a85612684565b6040516020016117e693929190612f73565b6060806040518060400160405280600a8152602001691e17b39f1e17b9bb339f60b11b815250905080604051602001611f859190612f28565b60405160208183030381529060405291505090565b6001600160a01b038216611ff05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161041b565b6000818152600260205260409020546001600160a01b0316156120555760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161041b565b6001600160a01b038216600090815260036020526040812080546001929061207e908490614680565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6121076040518060800160405280600081526020016000815260200160008152602001600081525090565b600061211586866003611a1d565b9050604051806080016040528082815260200161213488846001611a53565b815260200161214788888589600161279c565b815260200161215a88888588600261279c565b90529695505050505050565b6060610e09600561217885600a6146ef565b6121829087614698565b61218c9190614866565b6121969084614680565b610d0b565b6121bf60405180606001604052806000815260200160008152602001606081525090565b600060026121cf61040185614698565b6121d99190614866565b6121e590610168614797565b905060405180606001604052808281526020018261016861220691906147b6565b8152602001611a14601961221c61080088614698565b6122269190614866565b612196906008614680565b6060610e1d60ff61224284826146ef565b61224c9086614698565b6121969190614866565b606061030e610200836000015161020061227091906147b6565b61227c906103e8614797565b6121969190614698565b6020810151815160609190808211156122a757610e098261227083826147b6565b610e098161227084826147b6565b6060816122dc5750506040805180820190915260048152630307830360e41b602082015290565b8160005b81156122ff57806122f08161484b565b915050600882901c91506122e0565b610e09848261280b565b60608080808080808061232c61232060018b6147b6565b61219690610400614797565b60405160200161233c9190613f20565b60405160208183030381529060405296508960e00151604001518960011461237d57604051806040016040528060018152602001602d60f81b81525061238e565b604051806020016040528060008152505b8a6002146123b557604051806040016040528060018152602001602d60f81b8152506123c6565b604051806020016040528060008152505b6040516020016123d8939291906136f9565b60405160208183030381529060405295506123f68a60000151610d0b565b6123ff8a610d0b565b604051602001612410929190614101565b60405160208183030381529060405294506124328a6040015160000151610d0b565b6124438b6040015160200151610d0b565b6124548c6040015160400151610d0b565b6124658d6040015160600151610d0b565b6040516020016124789493929190613b2f565b60405160208183030381529060405293508960800151600001518a60800151602001518b60800151604001518c60a001516040516020016124bc94939291906144ba565b60405160208183030381529060405291506124de8a6060015160000151610d0b565b6124ef8b6060015160200151610d0b565b6125008c6060015160400151610d0b565b6125118d6060015160600151610d0b565b85604051602001612526959493929190613cd5565b60405160208183030381529060405292506125488a60c0015160000151610d0b565b6125598b60c0015160200151610d0b565b61256a8c60c0015160400151610d0b565b61257b8d60c0015160600151610d0b565b60405160200161258e9493929190613bf6565b60405160208183030381529060405290508686868686856040516020016125ba96959493929190613078565b60405160208183030381529060405297505050505050505092915050565b6060806060808560e00151604001516125f88760e0015160000151610d0b565b6126098860e0015160200151610d0b565b60405160200161261b93929190613ff3565b60408051601f1981840301815282820190915260068252651e3232b3399f60d11b60208301529350915061264e85610d0b565b60405160200161265e9190613225565b6040516020818303038152906040529050828282604051602001611c5e93929190612f73565b606080606080606080606060405180606001604052806026815260200161494d602691396020808a01518051818301516040928301519251949a506126ce9491939092910161419a565b60408051601f198184030181526060830190915260368083529096506149f960208301399350604051806040016040528060118152602001701e17b930b234b0b623b930b234b2b73a1f60791b8152509250604051806040016040528060078152602001661e17b232b3399f60c91b8152509150604051806040016040528060088152602001671e17b39f1e17b39f60c11b815250905085858585858560405160200161278096959493929190613078565b6040516020818303038152906040529650505050505050919050565b60008060646127ab86886147b6565b6127b6906023614797565b6127c09190614698565b90506127cd816002614797565b6127d88460ff614797565b6127e29089614698565b6127ec9190614866565b6127f682866147b6565b6128009190614680565b979650505050505050565b6060600061281a836002614797565b612825906002614680565b67ffffffffffffffff81111561283d5761283d6148bc565b6040519080825280601f01601f191660200182016040528015612867576020820181803683370190505b509050600360fc1b81600081518110612882576128826148a6565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106128b1576128b16148a6565b60200101906001600160f81b031916908160001a90535060006128d5846002614797565b6128e0906001614680565b90505b6001811115612958576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612914576129146148a6565b1a60f81b82828151811061292a5761292a6148a6565b60200101906001600160f81b031916908160001a90535060049490941c93612951816147f9565b90506128e3565b508315610e1d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161041b565b8280546129b390614810565b90600052602060002090601f0160209004810192826129d55760008555612a1b565b82601f106129ee57805160ff1916838001178555612a1b565b82800160010185558215612a1b579182015b82811115612a1b578251825591602001919060010190612a00565b50612a27929150612b8c565b5090565b6040518060c0016040528060008152602001606081526020016000815260200160008152602001612a5a612a6c565b8152602001612a67612a6c565b905290565b60405180610100016040528060008152602001612aa360405180606001604052806060815260200160608152602001606081525090565b8152602001612ad36040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001612b036040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001612b2c60405180606001604052806060815260200160608152602001606081525090565b815260200160608152602001612b636040518060800160405280600081526020016000815260200160008152602001600081525090565b8152602001612a6760405180606001604052806000815260200160008152602001606081525090565b5b80821115612a275760008155600101612b8d565b600067ffffffffffffffff80841115612bbc57612bbc6148bc565b604051601f8501601f19908116603f01168101908282118183101715612be457612be46148bc565b81604052809350858152868686011115612bfd57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c2957600080fd5b8135610e1d816148d2565b600060208284031215612c4657600080fd5b8151610e1d816148d2565b60008060408385031215612c6457600080fd5b8235612c6f816148d2565b91506020830135612c7f816148d2565b809150509250929050565b600080600060608486031215612c9f57600080fd5b8335612caa816148d2565b92506020840135612cba816148d2565b929592945050506040919091013590565b60008060008060808587031215612ce157600080fd5b8435612cec816148d2565b93506020850135612cfc816148d2565b925060408501359150606085013567ffffffffffffffff811115612d1f57600080fd5b8501601f81018713612d3057600080fd5b612d3f87823560208401612ba1565b91505092959194509250565b60008060408385031215612d5e57600080fd5b8235612d69816148d2565b915060208301358015158114612c7f57600080fd5b60008060408385031215612d9157600080fd5b8235612d9c816148d2565b946020939093013593505050565b600060208284031215612dbc57600080fd5b8135610e1d816148e7565b600060208284031215612dd957600080fd5b8151610e1d816148e7565b600060208284031215612df657600080fd5b813567ffffffffffffffff811115612e0d57600080fd5b8201601f81018413612e1e57600080fd5b610e0984823560208401612ba1565b600060208284031215612e3f57600080fd5b5035919050565b60008151808452612e5e8160208601602086016147cd565b601f01601f19169290920160200192915050565b60008151612e848185602086016147cd565b9290920192915050565b8054600090600181811c9080831680612ea857607f831692505b6020808410821415612eca57634e487b7160e01b600052602260045260246000fd5b818015612ede5760018114612eef57612f1c565b60ff19861689528489019650612f1c565b60008881526020902060005b86811015612f145781548b820152908501908301612efb565b505084890196505b50505050505092915050565b60008251612f3a8184602087016147cd565b9190910192915050565b60008351612f568184602088016147cd565b835190830190612f6a8183602088016147cd565b01949350505050565b60008451612f858184602089016147cd565b845190830190612f998183602089016147cd565b8451910190612fac8183602088016147cd565b0195945050505050565b60008551612fc8818460208a016147cd565b855190830190612fdc818360208a016147cd565b8551910190612fef8183602089016147cd565b84519101906130028183602088016147cd565b019695505050505050565b6000865161301f818460208b016147cd565b865190830190613033818360208b016147cd565b8651910190613046818360208a016147cd565b85519101906130598183602089016147cd565b845191019061306c8183602088016147cd565b01979650505050505050565b60008751602061308b8285838d016147cd565b88519184019161309e8184848d016147cd565b88519201916130b08184848c016147cd565b87519201916130c28184848b016147cd565b86519201916130d48184848a016147cd565b85519201916130e681848489016147cd565b919091019998505050505050505050565b60008a51613109818460208f016147cd565b8a519083019061311d818360208f016147cd565b8a5161312f8183850160208f016147cd565b8a51929091010190613145818360208d016147cd565b88516131578183850160208d016147cd565b885192909101019061316d818360208b016147cd565b8651910190613180818360208a016147cd565b85516131928183850160208a016147cd565b85519290910101906131a88183602088016147cd565b019b9a5050505050505050505050565b600085516131ca818460208a016147cd565b8551908301906131de818360208a016147cd565b85519101906131f18183602089016147cd565b84519101906132048183602088016147cd565b6a010383937b6b4b6113e96160ad1b9101908152600b019695505050505050565b7f3c72616469616c4772616469656e742069643d22655f315f670000000000000081526000825161325d8160198501602087016147cd565b61111f60f11b6019939091019283015250601b01919050565b6f3d913a3930b4ba2fba3cb832911d101160811b815282516000906132a28160108501602088016147cd565b7f65796520736f636b65742077617270222c202276616c7565223a20220000000060109184019182015283516132df81602c8401602088016147cd565b01602c01949350505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528651600090613317816010850160208c016147cd565b7432bcb29039b4bd32911610113b30b63ab2911d101160591b601091840191820152875161334c816025840160208c016147cd565b75383c113e96103d913a3930b4ba2fba3cb832911d101160511b60259290910191820152865161338381603b840160208b016147cd565b7f65796520697269732073697a65222c202276616c7565223a2022000000000000603b929091019182015285516133c1816055840160208a016147cd565b7f7078227d2c20207b2274726169745f74797065223a20220000000000000000006055929091019182015284516133ff81606c8401602089016147cd565b61344e61343d613437606c848601017f65796520707570696c2073697a65222c202276616c7565223a202200000000008152601b0190565b87612e72565b641c1e089f4b60da1b815260050190565b9a9950505050505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528451600090613488816010850160208a016147cd565b7f65796520707570696c20636f6c6f72222c202276616c7565223a20227267622860109184019182015285516134c5816030840160208a016147cd565b80820191505061016160f51b80603083015285516134ea816032850160208a016147cd565b603292019182015283516135058160348401602088016147cd565b630a489f4b60e21b603492909101918201526038019695505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528451600090613550816010850160208a016147cd565b7f657965206c696420636f6c6f72222c202276616c7565223a2022726762280000601091840191820152855161358d81602e840160208a016147cd565b80820191505061016160f51b80602e83015285516135b2816030850160208a016147cd565b603092019182015283516135cd8160328401602088016147cd565b630a489f4b60e21b603292909101918201526036019695505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528451600090613618816010850160208a016147cd565b7f6579652066756c6c20726f746174696f6e2074696d65222c202276616c756522601091840191820152621d101160e91b603082018190528651613663816033850160208b016147cd565b7439913e96103d913a3930b4ba2fba3cb832911d101160591b603393909101928301528551613699816048850160208a016147cd565b7f65796520726f746174696f6e20646972656374696f6e222c202276616c75652260489390910192830152606882015283516136dc81606b8401602088016147cd565b61227d60f01b606b9290910191820152606d019695505050505050565b7f3c616e696d6174655472616e73666f726d2061646469746976653d2273756d2281527f206174747269627574654e616d653d227472616e73666f726d2220626567696e60208201526a1e9118399110323ab91e9160a91b60408201526000845161376b81604b8501602089016147cd565b7f732220747970653d227472616e736c617465222076616c7565733d22302c303b604b9184019182015262080c0b60ea1b606b82015284516137b481606e8401602089016147cd565b6a0d4c0ec80c0b0c0ec80c0b60aa1b606e929091019182015283516137e08160798401602088016147cd565b7f35303b20302c302220726570656174436f756e743d22696e646566696e697465607992909101918201526511179f1e339f60d11b6099820152609f0195945050505050565b661e3a34ba36329f60c91b8152600082516138488160078501602087016147cd565b671e17ba34ba36329f60c11b6007939091019283015250600f01919050565b7f7b2274726169745f74797065223a2022666163652073697a65222c202276616c8152653ab2911d101160d11b6020820152600086516138ae816026850160208b016147cd565b7f7078227d2c207b2274726169745f74797065223a20226661636520636f6c6f7260269184019182015270044584044ecc2d8eaca44744044e4cec45607b1b60468201528651613905816057840160208b016147cd565b808201915050600b60fa1b8060578301528651613929816058850160208b016147cd565b605892019182015284516139448160598401602089016147cd565b6139a76139976134376059848601017f29227d2c20207b2274726169745f74797065223a202266616365207377696e67815271103a34b6b2911610113b30b63ab2911d101160711b602082015260320190565b631cc89f4b60e21b815260040190565b9998505050505050505050565b7f2070726f6d696c227d2c207b2274726169745f74797065223a202200000000008152600083516139ec81601b8501602088016147cd565b7f65796520707570696c2077617270222c202276616c7565223a20220000000000601b918401918201528351613a298160368401602088016147cd565b01603601949350505050565b7f2070726f6d696c227d2c207b2274726169745f74797065223a20220000000000815260008351613a6d81601b8501602088016147cd565b7f65796520697269732077617270222c202276616c7565223a2022000000000000601b918401918201528351613aaa8160358401602088016147cd565b01603501949350505050565b7f2070726f6d696c227d2c207b2274726169745f74797065223a20220000000000815260008351613aee81601b8501602088016147cd565b7432bcb2903bb0b938111610113b30b63ab2911d101160591b601b918401918201528351613b238160308401602088016147cd565b01603001949350505050565b6c1e32b63634b839b290393c9e9160991b81528451600090613b5881600d850160208a016147cd565b651110393c1e9160d11b600d918401918201528551613b7e816013840160208a016147cd565b65111031bc9e9160d11b601392909101918201528451613ba58160198401602089016147cd565b65111031bc1e9160d11b601992909101918201528351613bcc81601f8401602088016147cd565b6e11103334b6361e9111a3232311179f60891b601f9290910191820152602e019695505050505050565b6c1e32b63634b839b290393c9e9160991b81528451600090613c1f81600d850160208a016147cd565b651110393c1e9160d11b600d918401918201528551613c45816013840160208a016147cd565b65111031bc9e9160d11b601392909101918201528451613c6c8160198401602089016147cd565b65111031bc1e9160d11b601992909101918201528351613c9381601f8401602088016147cd565b7f222066696c6c3d22726762612832322c2032342c203135302c20302e3829222f601f9290910191820152601f60f91b603f8201526040019695505050505050565b6c1e32b63634b839b290393c9e9160991b81528551600090613cfe81600d850160208b016147cd565b651110393c1e9160d11b600d918401918201528651613d24816013840160208b016147cd565b65111031bc9e9160d11b601392909101918201528551613d4b816019840160208a016147cd565b65111031bc1e9160d11b601992909101918201528451613d7281601f8401602089016147cd565b6711103334b6361e9160c11b601f92909101918201528351613d9b8160278401602088016147cd565b6139a76027828401016211179f60e91b815260030190565b6c1e32b63634b839b290393c9e9160991b81528251600090613ddc81600d8501602088016147cd565b651110393c1e9160d11b600d918401918201528351613e028160138401602088016147cd565b7f222063793d22353132222063783d22353132222066696c6c3d2275726c282365601392909101918201526b2f982fb39491179f1e17b39f60a11b6033820152603f01949350505050565b7f3c673e3c616e696d6174655472616e73666f726d206174747269627574654e6181527f6d653d227472616e73666f726d2220626567696e3d22307322206475723d2200602082015260008251613eab81603f8501602087016147cd565b7f732220747970653d227472616e736c617465222076616c7565733d22302c303b603f9390910192830152507f2031322c303b20302c303b202d31322c303b20302c302220726570656174436f605f820152713ab73a1e9134b73232b334b734ba3291179f60711b607f820152609101919050565b7f3c67207472616e73666f726d3d227363616c6528302e35292c207472616e736c8152630c2e8ca560e31b602082015260008251613f658160248501602087016147cd565b66161a989914911f60c91b6024939091019283015250602b01919050565b605b60f81b815260008451613f9f8160018501602089016147cd565b845190830190613fb68160018401602089016147cd565b600b60fa1b600192909101918201528351613fd88160028401602088016147cd565b605d60f81b6002929091019182015260030195945050505050565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d81527f227472616e73666f726d2220626567696e3d22307322206475723d220000000060208201526000845161405181603c8501602089016147cd565b7f732220747970653d22726f74617465222066726f6d3d22000000000000000000603c91840191820152845161408e8160538401602089016147cd565b6d101a9899101a989911103a379e9160911b6053929091019182015283516140bd8160618401602088016147cd565b7f20353132203531322220726570656174436f756e743d22696e646566696e697460619290910191820152633291179f60e11b608182015260850195945050505050565b751e32b63634b839b290393c9e911a98991110393c1e9160511b815282516000906141338160168501602088016147cd565b7f222063793d22353132222063783d22353132222066696c6c3d2275726c282365601691840191820152635f315f6760e01b6036820152835161417d81603a8401602088016147cd565b631491179f60e11b603a9290910191820152603e01949350505050565b7f3c73746f70206f66667365743d22393925222073746f702d636f6c6f723d22728152620cec4560eb1b6020820152600084516141de8160238501602089016147cd565b8083019050600b60fa1b8060238301528551614201816024850160208a016147cd565b6024920191820152835161421c8160258401602088016147cd565b631491179f60e11b6025929091019182015260290195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161427281601d8501602087016147cd565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516142b781601d8501602087016147cd565b602360f81b601d939091019283015250601e01919050565b64037b7363c960dd1b8152600082516142ef8160058501602087016147cd565b7f206f66207468656d2077696c6c206576657220657869737400000000000000006005939091019283015250601d01919050565b6e03d9130ba3a3934b13aba32b9911d1608d1b8152855160009061434e81600f850160208b016147cd565b732c20226e616d65223a2022626f6f6e63756b202360601b600f918401918201528651614382816023840160208b016147cd565b72111610113232b9b1b934b83a34b7b7111d101160691b602392909101918201526143b06036820187612e8e565b731116101132bc3a32b93730b62fbab936111d101160611b815290506143d96014820186612e8e565b90507f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015283516144218160278401602088016147cd565b61227d60f01b60279290910191820152602901979650505050505050565b7f7b226e616d65223a2022626f6f6e63756b222c20226465736372697074696f6e815263111d101160e11b6020820152600061447e6024830185612e8e565b741116101132bc3a32b93730b62fb634b735911d101160591b81526144a66015820185612e8e565b61227d60f01b815260020195945050505050565b640e4cec4c2560db1b8152600085516144da816005850160208a016147cd565b8083019050600b60fa1b80600583015286516144fd816006850160208b016147cd565b600692019182015284516145188160078401602089016147cd565b6216181760e91b60079290910191820152835161453c81600a8401602088016147cd565b602960f81b600a9290910191820152600b019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061458b90830184612e46565b9695505050505050565b602081526000610e1d6020830184612e46565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156146935761469361487a565b500190565b6000826146a7576146a7614890565b500490565b600181815b808511156146e75781600019048211156146cd576146cd61487a565b808516156146da57918102915b93841c93908002906146b1565b509250929050565b6000610e1d83836000826147055750600161030e565b816147125750600061030e565b816001811461472857600281146147325761474e565b600191505061030e565b60ff8411156147435761474361487a565b50506001821b61030e565b5060208310610133831016604e8410600b8410161715614771575081810a61030e565b61477b83836146ac565b806000190482111561478f5761478f61487a565b029392505050565b60008160001904831182151516156147b1576147b161487a565b500290565b6000828210156147c8576147c861487a565b500390565b60005b838110156147e85781810151838201526020016147d0565b83811115610b755750506000910152565b6000816148085761480861487a565b506000190190565b600181811c9082168061482457607f821691505b6020821081141561484557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561485f5761485f61487a565b5060010190565b60008261487557614875614890565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d0857600080fd5b6001600160e01b031981168114610d0857600080fdfe3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2223376437643764222f3e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2223464646222f3e3c73746f70206f66667365743d22333025222073746f702d636f6c6f723d2223303030222f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d223130323422206865696768743d22313032342220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c673e3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2272676261283132352c3132352c3132352c3129222f3ea2646970667358221220530e79e37152e6fc4a20f641a87b3b52eccec71027762b122466317dc56b714864736f6c63430008070033

Deployed Bytecode Sourcemap

47196:18905:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65483:211;;;;;;:::i;:::-;;:::i;:::-;;;51136:14:1;;51129:22;51111:41;;51099:2;51084:18;65483:211:0;;;;;;;;35916:100;;;:::i;:::-;;;;;;;:::i;37475:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;50434:32:1;;;50416:51;;50404:2;50389:18;37475:221:0;50270:203:1;36998:411:0;;;;;;:::i;:::-;;:::i;:::-;;38365:339;;;;;;:::i;:::-;;:::i;48108:139::-;;;;;;:::i;:::-;;:::i;38775:185::-;;;;;;:::i;:::-;;:::i;47496:27::-;;;:::i;35610:239::-;;;;;;:::i;:::-;;:::i;35340:208::-;;;;;;:::i;:::-;;:::i;:::-;;;59456:25:1;;;59444:2;59429:18;35340:208:0;59310:177:1;14534:94:0;;;:::i;13883:87::-;13956:6;;-1:-1:-1;;;;;13956:6:0;13883:87;;47964:138;;;;;;:::i;:::-;;:::i;36085:104::-;;;:::i;48597:623::-;;;;;;:::i;:::-;;:::i;37768:295::-;;;;;;:::i;:::-;;:::i;39031:328::-;;;;;;:::i;:::-;;:::i;47428:28::-;;;;;;63899:902;;;;;;:::i;:::-;;:::i;47463:26::-;;;:::i;64849:544::-;;;:::i;38134:164::-;;;;;;:::i;:::-;;:::i;14783:192::-;;;;;;:::i;:::-;;:::i;65483:211::-;65621:4;65650:36;65674:11;65650:23;:36::i;:::-;65643:43;65483:211;-1:-1:-1;;65483:211:0:o;35916:100::-;35970:13;36003:5;35996:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35916:100;:::o;37475:221::-;37551:7;40958:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40958:16:0;37571:73;;;;-1:-1:-1;;;37571:73:0;;56314:2:1;37571:73:0;;;56296:21:1;56353:2;56333:18;;;56326:30;56392:34;56372:18;;;56365:62;-1:-1:-1;;;56443:18:1;;;56436:42;56495:19;;37571:73:0;;;;;;;;;-1:-1:-1;37664:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37664:24:0;;37475:221::o;36998:411::-;37079:13;37095:23;37110:7;37095:14;:23::i;:::-;37079:39;;37143:5;-1:-1:-1;;;;;37137:11:0;:2;-1:-1:-1;;;;;37137:11:0;;;37129:57;;;;-1:-1:-1;;;37129:57:0;;57914:2:1;37129:57:0;;;57896:21:1;57953:2;57933:18;;;57926:30;57992:34;57972:18;;;57965:62;-1:-1:-1;;;58043:18:1;;;58036:31;58084:19;;37129:57:0;57712:397:1;37129:57:0;12751:10;-1:-1:-1;;;;;37221:21:0;;;;:62;;-1:-1:-1;37246:37:0;37263:5;12751:10;38134:164;:::i;37246:37::-;37199:168;;;;-1:-1:-1;;;37199:168:0;;54305:2:1;37199:168:0;;;54287:21:1;54344:2;54324:18;;;54317:30;54383:34;54363:18;;;54356:62;54454:26;54434:18;;;54427:54;54498:19;;37199:168:0;54103:420:1;37199:168:0;37380:21;37389:2;37393:7;37380:8;:21::i;:::-;37068:341;36998:411;;:::o;38365:339::-;38560:41;12751:10;38593:7;38560:18;:41::i;:::-;38552:103;;;;-1:-1:-1;;;38552:103:0;;;;;;;:::i;:::-;38668:28;38678:4;38684:2;38688:7;38668:9;:28::i;48108:139::-;13956:6;;-1:-1:-1;;;;;13956:6:0;12751:10;14103:23;14095:68;;;;-1:-1:-1;;;14095:68:0;;;;;;;:::i;:::-;48186:10:::1;48200:9;48186:23;48178:32;;;::::0;::::1;;48221:18:::0;;::::1;::::0;:13:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48108:139:::0;:::o;38775:185::-;38913:39;38930:4;38936:2;38940:7;38913:39;;;;;;;;;;;;:16;:39::i;47496:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35610:239::-;35682:7;35718:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35718:16:0;35753:19;35745:73;;;;-1:-1:-1;;;35745:73:0;;55543:2:1;35745:73:0;;;55525:21:1;55582:2;55562:18;;;55555:30;55621:34;55601:18;;;55594:62;-1:-1:-1;;;55672:18:1;;;55665:39;55721:19;;35745:73:0;55341:405:1;35340:208:0;35412:7;-1:-1:-1;;;;;35440:19:0;;35432:74;;;;-1:-1:-1;;;35432:74:0;;55132:2:1;35432:74:0;;;55114:21:1;55171:2;55151:18;;;55144:30;55210:34;55190:18;;;55183:62;-1:-1:-1;;;55261:18:1;;;55254:40;55311:19;;35432:74:0;54930:406:1;35432:74:0;-1:-1:-1;;;;;;35524:16:0;;;;;:9;:16;;;;;;;35340:208::o;14534:94::-;13956:6;;-1:-1:-1;;;;;13956:6:0;12751:10;14103:23;14095:68;;;;-1:-1:-1;;;14095:68:0;;;;;;;:::i;:::-;14599:21:::1;14617:1;14599:9;:21::i;:::-;14534:94::o:0;47964:138::-;13956:6;;-1:-1:-1;;;;;13956:6:0;12751:10;14103:23;14095:68;;;;-1:-1:-1;;;14095:68:0;;;;;;;:::i;:::-;48042:10:::1;48056:9;48042:23;48034:32;;;::::0;::::1;;48077:17:::0;;::::1;::::0;:12:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;36085:104::-:0;36141:13;36174:7;36167:14;;;;;:::i;48597:623::-;11101:1;11697:7;;:19;;11689:63;;;;-1:-1:-1;;;11689:63:0;;59152:2:1;11689:63:0;;;59134:21:1;59191:2;59171:18;;;59164:30;59230:33;59210:18;;;59203:61;59281:18;;11689:63:0;58950:355:1;11689:63:0;11101:1;11830:7;:18;48666:10:::1;48680:9;48666:23;48658:32;;;::::0;::::1;;48709:19;::::0;;;:8:::1;:19;::::0;;;;;::::1;;:28;48701:90;;;::::0;-1:-1:-1;;;48701:90:0;;58734:2:1;48701:90:0::1;::::0;::::1;58716:21:1::0;58773:2;58753:18;;;58746:30;58812:34;58792:18;;;58785:62;-1:-1:-1;;;58863:18:1;;;58856:47;58920:19;;48701:90:0::1;58532:413:1::0;48701:90:0::1;48810:15;::::0;:34:::1;::::0;-1:-1:-1;;;48810:34:0;;::::1;::::0;::::1;59456:25:1::0;;;48848:10:0::1;::::0;-1:-1:-1;;;;;48810:15:0::1;::::0;:23:::1;::::0;59429:18:1;;48810:34:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48810:48:0::1;;48802:94;;;::::0;-1:-1:-1;;;48802:94:0;;54730:2:1;48802:94:0::1;::::0;::::1;54712:21:1::0;54769:2;54749:18;;;54742:30;54808:34;54788:18;;;54781:62;-1:-1:-1;;;54859:18:1;;;54852:31;54900:19;;48802:94:0::1;54528:397:1::0;48802:94:0::1;48939:10;::::0;48915:13:::1;::::0;:20:::1;::::0;48933:1:::1;48915:17;:20::i;:::-;:34;;48984:21;:10;;:19;:21::i;:::-;48958:76;;;;;;;;:::i;:::-;;;;;;;;;;;;;48907:129;;;;;-1:-1:-1::0;;;48907:129:0::1;;;;;;;;:::i;:::-;;49047:23;49060:9;47931:12:::0;;;;:8;:12;;;;;:19;;-1:-1:-1;;47931:19:0;47946:4;47931:19;;;47881:77;49047:23:::1;49081:17;49087:10;49081:5;:17::i;:::-;49155:1;49139:13:::0;::::1;:17;;;;:::i;:::-;49160:1;49139:22;49135:78;;;49178:23;49192:7;13956:6:::0;;-1:-1:-1;;;;;13956:6:0;;13883:87;49192:7:::1;49178:5;:23::i;:::-;-1:-1:-1::0;11057:1:0;12009:7;:22;48597:623::o;37768:295::-;-1:-1:-1;;;;;37871:24:0;;12751:10;37871:24;;37863:62;;;;-1:-1:-1;;;37863:62:0;;53538:2:1;37863:62:0;;;53520:21:1;53577:2;53557:18;;;53550:30;53616:27;53596:18;;;53589:55;53661:18;;37863:62:0;53336:349:1;37863:62:0;12751:10;37938:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37938:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37938:53:0;;;;;;;;;;38007:48;;51111:41:1;;;37938:42:0;;12751:10;38007:48;;51084:18:1;38007:48:0;;;;;;;37768:295;;:::o;39031:328::-;39206:41;12751:10;39239:7;39206:18;:41::i;:::-;39198:103;;;;-1:-1:-1;;;39198:103:0;;;;;;;:::i;:::-;39312:39;39326:4;39332:2;39336:7;39345:5;39312:13;:39::i;:::-;39031:328;;;;:::o;63899:902::-;64003:13;64034:18;64049:2;64034:14;:18::i;:::-;;64201:532;64299:17;64313:2;64299:13;:17::i;:::-;64371:13;:2;:11;:13::i;:::-;64438:12;64505:13;64621:18;64636:2;64621:14;:18::i;:::-;64233:468;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64201:530;:532::i;:::-;64108:670;;;;;;;;:::i;:::-;;;;;;;;;;;;;64063:730;;63899:902;;;:::o;47463:26::-;;;;;;;:::i;64849:544::-;64893:13;65057:294;65176:12;65244:13;65089:230;;;;;;;;;:::i;65057:294::-;64964:406;;;;;;;;:::i;:::-;;;;;;;;;;;;;64919:466;;64849:544;:::o;38134:164::-;-1:-1:-1;;;;;38255:25:0;;;38231:4;38255:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38134:164::o;14783:192::-;13956:6;;-1:-1:-1;;;;;13956:6:0;12751:10;14103:23;14095:68;;;;-1:-1:-1;;;14095:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14872:22:0;::::1;14864:73;;;::::0;-1:-1:-1;;;14864:73:0;;52369:2:1;14864:73:0::1;::::0;::::1;52351:21:1::0;52408:2;52388:18;;;52381:30;52447:34;52427:18;;;52420:62;-1:-1:-1;;;52498:18:1;;;52491:36;52544:19;;14864:73:0::1;52167:402:1::0;14864:73:0::1;14948:19;14958:8;14948:9;:19::i;:::-;14783:192:::0;:::o;17287:723::-;17343:13;17564:10;17560:53;;-1:-1:-1;;17591:10:0;;;;;;;;;;;;-1:-1:-1;;;17591:10:0;;;;;17287:723::o;17560:53::-;17638:5;17623:12;17679:78;17686:9;;17679:78;;17712:8;;;;:::i;:::-;;-1:-1:-1;17735:10:0;;-1:-1:-1;17743:2:0;17735:10;;:::i;:::-;;;17679:78;;;17767:19;17799:6;17789:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17789:17:0;;17767:39;;17817:154;17824:10;;17817:154;;17851:11;17861:1;17851:11;;:::i;:::-;;-1:-1:-1;17920:10:0;17928:2;17920:5;:10;:::i;:::-;17907:24;;:2;:24;:::i;:::-;17894:39;;17877:6;17884;17877:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17877:56:0;;;;;;;;-1:-1:-1;17948:11:0;17957:2;17948:11;;:::i;:::-;;;17817:154;;;17995:6;17287:723;-1:-1:-1;;;;17287:723:0:o;5189:98::-;5247:7;5274:5;5278:1;5274;:5;:::i;:::-;5267:12;5189:98;-1:-1:-1;;;5189:98:0:o;19812:387::-;20135:20;20183:8;;;19812:387::o;34971:305::-;35073:4;-1:-1:-1;;;;;;35110:40:0;;-1:-1:-1;;;35110:40:0;;:105;;-1:-1:-1;;;;;;;35167:48:0;;-1:-1:-1;;;35167:48:0;35110:105;:158;;;-1:-1:-1;;;;;;;;;;16921:40:0;;;35232:36;16812:157;44851:174;44926:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44926:29:0;-1:-1:-1;;;;;44926:29:0;;;;;;;;:24;;44980:23;44926:24;44980:14;:23::i;:::-;-1:-1:-1;;;;;44971:46:0;;;;;;;;;;;44851:174;;:::o;41163:348::-;41256:4;40958:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40958:16:0;41273:73;;;;-1:-1:-1;;;41273:73:0;;53892:2:1;41273:73:0;;;53874:21:1;53931:2;53911:18;;;53904:30;53970:34;53950:18;;;53943:62;-1:-1:-1;;;54021:18:1;;;54014:42;54073:19;;41273:73:0;53690:408:1;41273:73:0;41357:13;41373:23;41388:7;41373:14;:23::i;:::-;41357:39;;41426:5;-1:-1:-1;;;;;41415:16:0;:7;-1:-1:-1;;;;;41415:16:0;;:51;;;;41459:7;-1:-1:-1;;;;;41435:31:0;:20;41447:7;41435:11;:20::i;:::-;-1:-1:-1;;;;;41435:31:0;;41415:51;:87;;;;41470:32;41487:5;41494:7;41470:16;:32::i;44155:578::-;44314:4;-1:-1:-1;;;;;44287:31:0;:23;44302:7;44287:14;:23::i;:::-;-1:-1:-1;;;;;44287:31:0;;44279:85;;;;-1:-1:-1;;;44279:85:0;;57088:2:1;44279:85:0;;;57070:21:1;57127:2;57107:18;;;57100:30;57166:34;57146:18;;;57139:62;-1:-1:-1;;;57217:18:1;;;57210:39;57266:19;;44279:85:0;56886:405:1;44279:85:0;-1:-1:-1;;;;;44383:16:0;;44375:65;;;;-1:-1:-1;;;44375:65:0;;53133:2:1;44375:65:0;;;53115:21:1;53172:2;53152:18;;;53145:30;53211:34;53191:18;;;53184:62;-1:-1:-1;;;53262:18:1;;;53255:34;53306:19;;44375:65:0;52931:400:1;44375:65:0;44557:29;44574:1;44578:7;44557:8;:29::i;:::-;-1:-1:-1;;;;;44599:15:0;;;;;;:9;:15;;;;;:20;;44618:1;;44599:15;:20;;44618:1;;44599:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44630:13:0;;;;;;:9;:13;;;;;:18;;44647:1;;44630:13;:18;;44647:1;;44630:18;:::i;:::-;;;;-1:-1:-1;;44659:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44659:21:0;-1:-1:-1;;;;;44659:21:0;;;;;;;;;44698:27;;44659:16;;44698:27;;;;;;;44155:578;;;:::o;14983:173::-;15058:6;;;-1:-1:-1;;;;;15075:17:0;;;-1:-1:-1;;;;;;15075:17:0;;;;;;;15108:40;;15058:6;;;15075:17;15058:6;;15108:40;;15039:16;;15108:40;15028:128;14983:173;:::o;48413:176::-;48476:13;;:20;;48494:1;48476:17;:20::i;:::-;48460:13;:36;48533:8;:6;:8::i;:::-;48516:13;;;48507:23;;;;:8;:23;;;;;:34;;;;48567:13;48552:29;;48562:3;;48552:9;:29::i;40241:315::-;40398:28;40408:4;40414:2;40418:7;40398:9;:28::i;:::-;40445:48;40468:4;40474:2;40478:7;40487:5;40445:22;:48::i;:::-;40437:111;;;;-1:-1:-1;;;40437:111:0;;;;;;;:::i;36260:334::-;40934:4;40958:16;;;:7;:16;;;;;;36333:13;;-1:-1:-1;;;;;40958:16:0;36359:76;;;;-1:-1:-1;;;36359:76:0;;57498:2:1;36359:76:0;;;57480:21:1;57537:2;57517:18;;;57510:30;57576:34;57556:18;;;57549:62;-1:-1:-1;;;57627:18:1;;;57620:45;57682:19;;36359:76:0;57296:411:1;36359:76:0;36448:21;36472:10;36919:9;;;;;;;;;-1:-1:-1;36919:9:0;;;36842:94;36472:10;36448:34;;36524:1;36506:7;36500:21;:25;:86;;;;;;;;;;;;;;;;;36552:7;36561:18;:7;:16;:18::i;:::-;36535:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36493:93;36260:334;-1:-1:-1;;;36260:334:0:o;63484:373::-;63565:13;63596:21;63620:14;63631:2;63620:10;:14::i;:::-;63667:6;;;;63706;;;;63596:38;;-1:-1:-1;63667:6:0;63759:7;63596:38;63759:3;:7::i;:::-;63768:33;63788:3;63768:33;;;;;;;;;;;;;-1:-1:-1;;;63768:33:0;;;:19;:33::i;:::-;63808:34;63828:3;63808:34;;;;;;;;;;;;;-1:-1:-1;;;63808:34:0;;;:19;:34::i;:::-;63737:111;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63723:126;;;;;63484:373;;;:::o;59261:148::-;59316:13;59356:44;59379:10;59386:2;59379:6;:10::i;:::-;59362:28;;;;;;;;:::i;355:2037::-;413:13;443:4;:11;458:1;443:16;439:31;;;-1:-1:-1;;461:9:0;;;;;;;;;-1:-1:-1;461:9:0;;;355:2037::o;439:31::-;530:19;552:5;;;;;;;;;;;;;;;;;530:27;;609:18;655:1;636:4;:11;650:1;636:15;;;;:::i;:::-;635:21;;;;:::i;:::-;630:27;;:1;:27;:::i;:::-;609:48;-1:-1:-1;740:20:0;774:15;609:48;787:2;774:15;:::i;:::-;763:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;763:27:0;;740:50;;887:10;879:6;872:26;994:1;987:5;983:13;1065:4;1116;1110:11;1101:7;1097:25;1224:2;1216:6;1212:15;1309:810;1328:6;1319:7;1316:19;1309:810;;;1394:1;1381:15;;;1475:14;;1628:4;1616:2;1612:14;;;1608:25;;1594:40;;1588:47;1583:3;1579:57;;;1561:76;;1756:2;1752:14;;;1748:25;;1734:40;;1728:47;1719:57;;1682:1;1667:17;;1701:76;1897:1;1892:14;;;1888:25;;1874:40;;1868:47;1859:57;;1807:17;;;1841:76;2028:25;;2014:40;;2008:47;1999:57;;1947:17;;;1981:76;;;;2087:17;;1309:810;;;2204:1;2197:4;2191:11;2187:19;2225:1;2220:54;;;;2293:1;2288:52;;;;2180:160;;2220:54;-1:-1:-1;;;;;2236:17:0;;2229:43;2220:54;;2288:52;-1:-1:-1;;;;;2304:17:0;;2297:41;2180:160;-1:-1:-1;2378:6:0;;355:2037;-1:-1:-1;;;;;;;;355:2037:0:o;48255:150::-;48295:7;48357:10;48369:8;:25;48392:1;48378:13;;:15;;;;:::i;:::-;48369:25;;;;;;;;;;;;48340:55;;;;;;;;7155:2:1;7151:15;;;;-1:-1:-1;;7147:53:1;7135:66;;7226:2;7217:12;;7210:28;7263:2;7254:12;;6978:294;48340:55:0;;;;;;;;;;;;;48330:66;;;;;;48322:75;;48315:82;;48255:150;:::o;41853:110::-;41929:26;41939:2;41943:7;41929:26;;;;;;;;;;;;:9;:26::i;45590:799::-;45745:4;-1:-1:-1;;;;;45766:13:0;;20135:20;20183:8;45762:620;;45802:72;;-1:-1:-1;;;45802:72:0;;-1:-1:-1;;;;;45802:36:0;;;;;:72;;12751:10;;45853:4;;45859:7;;45868:5;;45802:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45802:72:0;;;;;;;;-1:-1:-1;;45802:72:0;;;;;;;;;;;;:::i;:::-;;;45798:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46044:13:0;;46040:272;;46087:60;;-1:-1:-1;;;46087:60:0;;;;;;;:::i;46040:272::-;46262:6;46256:13;46247:6;46243:2;46239:15;46232:38;45798:529;-1:-1:-1;;;;;;45925:51:0;-1:-1:-1;;;45925:51:0;;-1:-1:-1;45918:58:0;;45762:620;-1:-1:-1;46366:4:0;45590:799;;;;;;:::o;52252:500::-;52303:18;;:::i;:::-;52334:7;52344;52348:2;52344:3;:7::i;:::-;52362:9;52374:12;;;:8;:12;;;;;;52334:17;;-1:-1:-1;52409:11:0;52374:12;52418:1;52409:8;:11::i;:::-;52397:23;;52431:19;52453:11;52459:4;52453:5;:11::i;:::-;52431:33;;52475:19;52497:11;52503:4;52497:5;:11::i;:::-;52475:33;;52519:16;52538:12;52542:4;52548:1;52538:3;:12::i;:::-;52519:31;;52561:10;52574:19;52580:4;52586:3;52591:1;52574:5;:19::i;:::-;52561:32;;52604:12;52619:21;52625:4;52631:5;52638:1;52619:5;:21::i;:::-;52674:51;;;;;;;;;;;;52690:8;;;;52674:51;;;;;;;;;;;;;;-1:-1:-1;52674:51:0;;;;;;;;;;;;;;;-1:-1:-1;52674:51:0;;52252:500;-1:-1:-1;;;52252:500:0:o;62701:517::-;62759:13;62907:19;:2;:8;;;:17;:19::i;:::-;63015:8;;;;63143:5;;63015:8;;;;63143:16;;:14;:16::i;:::-;62813:386;;;;;;;;;;;;:::i;63270:206::-;63359:13;63416:11;63420:2;63424;63416:3;:11::i;:::-;63429;63433:2;63437;63429:3;:11::i;:::-;63442;63446:2;63450;63442:3;:11::i;:::-;63455;63459:2;63463;63455:3;:11::i;:::-;63399:68;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63385:83;;63270:206;;;;:::o;58914:305::-;58961:13;58987:21;59011:14;59022:2;59011:10;:14::i;:::-;58987:38;;59081:16;59085:11;59093:2;59085:7;:11::i;:::-;59081:3;:16::i;:::-;59112:7;59116:2;59112:3;:7::i;:::-;59134:15;59139:2;:6;;;59147:1;59134:4;:15::i;:::-;59164;59169:2;:6;;;59177:1;59164:4;:15::i;:::-;59194:5;:3;:5::i;:::-;59050:160;;;;;;;;;;;;:::i;42190:321::-;42320:18;42326:2;42330:7;42320:5;:18::i;:::-;42371:54;42402:1;42406:2;42410:7;42419:5;42371:22;:54::i;:::-;42349:154;;;;-1:-1:-1;;;42349:154:0;;;;;;;:::i;51542:97::-;51586:4;51629:2;51616:9;51621:4;51616:2;:9;:::i;:::-;51615:16;;;;:::i;:::-;51610:21;;:2;:21;:::i;6326:98::-;6384:7;6411:5;6415:1;6411;:5;:::i;51651:571::-;51697:15;;:::i;:::-;51725:12;51740:17;51746:2;51750:3;51755:1;51740:5;:17::i;:::-;51725:32;;51768:16;51787:10;51791:2;51795:1;51787:3;:10::i;:::-;51768:29;;51808:14;51825:24;51831:2;51835:3;51840;51845;51825:5;:24::i;:::-;51808:41;;51860:14;51877:36;51883:2;51887:3;:7;;;51896:3;:7;;;51905:3;:7;;;51877:5;:36::i;:::-;51860:53;;51924:16;51943:10;51947:2;51951:1;51943:3;:10::i;:::-;51924:29;;51964:21;51988:15;51994:2;51998:1;52001;51988:5;:15::i;:::-;51964:39;;52014:14;52031:36;52037:2;52041:3;:7;;;52050:3;:7;;;52059:3;:7;;;52031:5;:36::i;:::-;52014:53;;52078:13;52094:9;52100:2;52094:5;:9::i;:::-;52135:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52135:59:0;;;;;51651:571;-1:-1:-1;;51651:571:0:o;50181:154::-;50234:10;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;50234:10:0;50264:63;;;;;;;;50268:18;50273:2;50282;50278:1;:6;;;;:::i;:::-;50268:4;:18::i;:::-;50264:63;;;;50288:18;50293:2;50298:6;50302:2;50298:1;:6;:::i;50288:18::-;50264:63;;;;50308:18;50313:2;50318:6;50322:2;50318:1;:6;:::i;50308:18::-;50264:63;;50257:70;50181:154;-1:-1:-1;;;50181:154:0:o;50502:137::-;50568:4;50620:9;50627:2;50620:4;:9;:::i;:::-;50607:8;50612:3;50607:2;:8;:::i;:::-;50606:24;;;;:::i;:::-;50593:8;50600:1;50593:4;:8;:::i;:::-;50592:39;;;;:::i;50347:143::-;50411:4;50472:7;50477:2;50472;:7;:::i;:::-;50466:14;;:2;:14;:::i;:::-;50454:7;50459:2;50454;:7;:::i;:::-;50453:28;;;;:::i;:::-;50441:7;50446:2;50441;:7;:::i;:::-;50435:14;;:2;:14;:::i;59977:984::-;60050:13;60076:18;60105;60134;60163;60258:2;60294:7;60298:2;60294:3;:7::i;:::-;60221:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60207:96;;60402:2;60431:11;60435:2;:6;;;60431:3;:11::i;:::-;60354:89;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60340:104;;60543:2;60577:11;60581:2;:6;;;60577:3;:11::i;:::-;60495:94;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60481:109;;60689:2;60724:11;60728:2;:6;;;60724:3;:11::i;:::-;60641:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60627:110;;60822:4;60845;60868;60891;60787:155;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60759:194;;;;;;59977:984;;;;:::o;60969:545::-;61042:13;61151:2;61197:21;:2;:6;;;:10;;;:19;:21::i;:::-;61263:2;61314:21;:2;:6;;;:10;;;:19;:21::i;:::-;61381:2;61433:21;:2;:6;;;:10;;;:19;:21::i;:::-;61096:399;;;;;;;;;;;;;:::i;61522:697::-;61808:8;;;;;:11;;61827;;;;61846;;;;;61733:133;;61595:13;;;;;;;;61733:133;;61770:2;;61808:11;;61827;;61733:133;;:::i;:::-;;;;-1:-1:-1;;61733:133:0;;;;;;;;;61994:8;;;;:11;;61733:133;62013:11;;;;62032;;;;;61733:133;;-1:-1:-1;61917:135:0;;61954:2;;61994:11;;62032;61917:135;;:::i;:::-;;;;;;;;;;;;;61904:149;;62138:3;62160;62182;62103:97;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62075:136;;;;;61522:697;;;;:::o;62227:462::-;62469:5;;;;:9;;;;62582;;62300:13;;62409:2;;;;62582:14;:50;;;;;;;;;;;;;;;-1:-1:-1;;;62582:50:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62582:50:0;;;;62354:316;;;;;;;;;;;:::i;52793:414::-;52840:13;52866:16;52893;52920;52939:25;52947:2;-1:-1:-1;;;;;52939:23:0;;:25::i;:::-;52920:44;;52990:77;;;;;;;;;;;;;;;;;;;53122:2;53094:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;53082:56;;53191:2;53195;53174:24;;;;;;;;;:::i;53243:1409::-;53301:13;53327:16;53354:18;53383:20;53414;53445;53476;53507;53538:18;53567;53747:16;:2;:5;;;:14;:16::i;:::-;53641:209;;;;;;;;:::i;:::-;;;;;;;;;;;;;53611:240;;53888:15;;;;;;;;;;;;;-1:-1:-1;;;53888:15:0;;;;;53918:38;;;;;;;;;;;;;;;;;;;53993:48;;;;;;;;;;;;;;;;;54128:8;;;;;54072:103;;53993:48;;-1:-1:-1;54072:103:0;;54128:8;;;;;;54072:103;;:::i;:::-;;;;-1:-1:-1;;54072:103:0;;;;;;54191:53;;;;;;;;;;54072:103;;-1:-1:-1;54191:53:0;54072:103;54191:53;;;;;54281:28;;;;;;;;;;;;;-1:-1:-1;;;54281:28:0;;;;;54324:16;;;;;;;;;;;;;-1:-1:-1;;;54324:16:0;;;;;54425:19;:2;:8;;;:17;:19::i;:::-;54456:21;:2;:10;;;:19;:21::i;:::-;54391:135;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54377:150;;54582:2;54586:4;54592:6;54600;54608;54616;54624;54632:4;54638;54565:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54551:93;;;;;;;;;;;53243:1409;;;:::o;58649:231::-;58716:13;58787:19;58797:2;58801:4;58787:9;:19::i;:::-;58821:17;58829:2;58833:4;58821:7;:17::i;:::-;58853:7;58857:2;58853:3;:7::i;:::-;58756:115;;;;;;;;;;:::i;58450:187::-;58487:13;58513:16;58555:17;;;;;;;;;;;;;-1:-1:-1;;;58555:17:0;;;;;58625:2;58608:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;58594:35;;;58450:187;:::o;42847:382::-;-1:-1:-1;;;;;42927:16:0;;42919:61;;;;-1:-1:-1;;;42919:61:0;;55953:2:1;42919:61:0;;;55935:21:1;;;55972:18;;;55965:30;56031:34;56011:18;;;56004:62;56083:18;;42919:61:0;55751:356:1;42919:61:0;40934:4;40958:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40958:16:0;:30;42991:58;;;;-1:-1:-1;;;42991:58:0;;52776:2:1;42991:58:0;;;52758:21:1;52815:2;52795:18;;;52788:30;52854;52834:18;;;52827:58;52902:18;;42991:58:0;52574:352:1;42991:58:0;-1:-1:-1;;;;;43120:13:0;;;;;;:9;:13;;;;;:18;;43137:1;;43120:13;:18;;43137:1;;43120:18;:::i;:::-;;;;-1:-1:-1;;43149:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43149:21:0;-1:-1:-1;;;;;43149:21:0;;;;;;;;43188:33;;43149:16;;;43188:33;;43149:16;;43188:33;42847:382;;:::o;50868:312::-;50951:10;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50951:10:0;50974:9;50986:18;50992:2;50996:4;51002:1;50986:5;:18::i;:::-;50974:30;;51022:150;;;;;;;;51040:4;51022:150;;;;51059:18;51065:2;51069:4;51075:1;51059:5;:18::i;:::-;51022:150;;;;51092:32;51098:2;51102:4;51108;51114:6;51122:1;51092:5;:32::i;:::-;51022:150;;;;51139:32;51145:2;51149:4;51155;51161:6;51169:1;51139:5;:32::i;:::-;51022:150;;51015:157;50868:312;-1:-1:-1;;;;;;50868:312:0:o;51388:142::-;51452:13;51485:37;51509:1;51497:8;51503:2;51497;:8;:::i;:::-;51492:13;;:2;:13;:::i;:::-;51491:19;;;;:::i;:::-;51486:24;;:2;:24;:::i;:::-;51485:35;:37::i;51192:184::-;51238:10;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;51238:10:0;51261:7;51292:1;51279:9;51284:4;51279:2;:9;:::i;:::-;51278:15;;;;:::i;:::-;51271:23;;:3;:23;:::i;:::-;51261:33;;51312:56;;;;;;;;51316:2;51312:56;;;;51327:2;51321:3;:8;;;;:::i;:::-;51312:56;;;;51332:35;51352:2;51339:9;51344:4;51339:2;:9;:::i;:::-;51338:16;;;;:::i;:::-;51333:22;;:1;:22;:::i;50037:132::-;50091:13;50124:37;50146:3;50132:9;50139:2;50146:3;50132:9;:::i;:::-;50126:16;;:2;:16;:::i;:::-;50125:24;;;;:::i;59463:142::-;59518:13;59551:46;59582:3;59567:2;:10;;;59561:3;:16;;;;:::i;:::-;59553:25;;:4;:25;:::i;:::-;59552:33;;;;:::i;59613:356::-;59703:8;;;;59734;;59665:13;;59703:8;59757:11;;;59753:125;;;59792:74;59850:4;59820:11;59827:4;59850;59820:11;:::i;59753:125::-;59895:66;59945:4;59919:11;59926:4;59945;59919:11;:::i;18120:340::-;18179:13;18209:10;18205:56;;-1:-1:-1;;18236:13:0;;;;;;;;;;;;-1:-1:-1;;;18236:13:0;;;;;18120:340::o;18205:56::-;18286:5;18271:12;18331:78;18338:9;;18331:78;;18364:8;;;;:::i;:::-;;;;18396:1;18387:10;;;;;18331:78;;;18426:26;18438:5;18445:6;18426:11;:26::i;54660:2260::-;54731:13;;;;;;;;55042:29;55044:7;55050:1;55044:3;:7;:::i;:::-;55043:16;;55055:4;55043:16;:::i;55042:29::-;54985:98;;;;;;;;:::i;:::-;;;;;;;;;;;;;54973:111;;55269:2;:5;;;:9;;;55320:3;55327:1;55320:8;:18;;;;;;;;;;;;;;;-1:-1:-1;;;55320:18:0;;;;;;;;;;;;;;;;;;;55357:3;55364:1;55357:8;:18;;;;;;;;;;;;;;;-1:-1:-1;;;55357:18:0;;;;;;;;;;;;;;;;;;;55151:268;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55121:299;;55514:21;:2;:10;;;:19;:21::i;:::-;55577:14;:3;:12;:14::i;:::-;55471:129;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55457:144;;55725:21;:2;:6;;;:10;;;:19;:21::i;:::-;55779;:2;:6;;;:10;;;:19;:21::i;:::-;55833;:2;:6;;;:10;;;:19;:21::i;:::-;55887;:2;:6;;;:10;;;:19;:21::i;:::-;55670:279;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55638:312;;56029:2;:8;;;:11;;;56047:2;:8;;;:11;;;56065:2;:8;;;:11;;;56085:2;:10;;;56003:97;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55987:114;;56226:21;:2;:6;;;:10;;;:19;:21::i;:::-;56280;:2;:6;;;:10;;;:19;:21::i;:::-;56334;:2;:6;;;:10;;;:19;:21::i;:::-;56388;:2;:6;;;:10;;;:19;:21::i;:::-;56444:6;56170:288;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56138:321;;56584:21;:2;:6;;;:10;;;:19;:21::i;:::-;56638;:2;:6;;;:10;;;:19;:21::i;:::-;56692;:2;:6;;;:10;;;:19;:21::i;:::-;56746;:2;:6;;;:10;;;:19;:21::i;:::-;56528:298;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56496:331;;56880:2;56884;56888:4;56894;56900;56906;56863:48;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56849:63;;;;;;;;;54660:2260;;;;:::o;56928:689::-;56997:13;57023:16;57050:17;57078:18;57255:2;:5;;;:9;;;57314:20;:2;:5;;;:9;;;:18;:20::i;:::-;57354;:2;:5;;;:9;;;:18;:20::i;:::-;57152:263;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57152:263:0;;;;;;57431:14;;;;;;;;;-1:-1:-1;;;57152:263:0;57431:14;;;57152:263;-1:-1:-1;57152:263:0;-1:-1:-1;57519:14:0;:3;:12;:14::i;:::-;57473:67;;;;;;;;:::i;:::-;;;;;;;;;;;;;57459:82;;57594:2;57598:3;57603:4;57577:31;;;;;;;;;;:::i;57674:768::-;57729:13;57755:20;57786;57817;57848:18;57877:16;57904;57946:49;;;;;;;;;;;;;;;;;58082:8;;;;;:11;;58100;;;;58118;;;;;58026:112;;57946:49;;-1:-1:-1;58026:112:0;;58082:11;;58100;;58118;58026:112;;:::i;:::-;;;;-1:-1:-1;;58026:112:0;;;;;;58154:65;;;;;;;;;;58026:112;;-1:-1:-1;58154:65:0;58026:112;58154:65;;;;;58256:26;;;;;;;;;;;;;-1:-1:-1;;;58256:26:0;;;;;58297:14;;;;;;;;;;;;;-1:-1:-1;;;58297:14:0;;;;;58326:15;;;;;;;;;;;;;-1:-1:-1;;;58326:15:0;;;;;58396:6;58404;58412;58420:4;58426:2;58430;58379:54;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58365:69;;;;;;;;57674:768;;;:::o;50651:209::-;50739:4;;50789:3;50768:11;50775:4;50768;:11;:::i;:::-;50767:18;;50783:2;50767:18;:::i;:::-;50766:26;;;;:::i;:::-;50756:36;-1:-1:-1;50844:6:0;50756:36;50849:1;50844:6;:::i;:::-;50830:8;50836:2;50830:3;:8;:::i;:::-;50824:15;;:2;:15;:::i;:::-;50823:28;;;;:::i;:::-;50810:9;50817:2;50810:4;:9;:::i;:::-;:42;;;;:::i;:::-;50803:49;50651:209;-1:-1:-1;;;;;;;50651:209:0:o;18588:451::-;18663:13;18689:19;18721:10;18725:6;18721:1;:10;:::i;:::-;:14;;18734:1;18721:14;:::i;:::-;18711:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18711:25:0;;18689:47;;-1:-1:-1;;;18747:6:0;18754:1;18747:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;18747:15:0;;;;;;;;;-1:-1:-1;;;18773:6:0;18780:1;18773:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;18773:15:0;;;;;;;;-1:-1:-1;18804:9:0;18816:10;18820:6;18816:1;:10;:::i;:::-;:14;;18829:1;18816:14;:::i;:::-;18804:26;;18799:135;18836:1;18832;:5;18799:135;;;-1:-1:-1;;;18884:5:0;18892:3;18884:11;18871:25;;;;;;;:::i;:::-;;;;18859:6;18866:1;18859:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;18859:37:0;;;;;;;;-1:-1:-1;18921:1:0;18911:11;;;;;18839:3;;;:::i;:::-;;;18799:135;;;-1:-1:-1;18952:10:0;;18944:55;;;;-1:-1:-1;;;18944:55:0;;51589:2:1;18944:55:0;;;51571:21:1;;;51608:18;;;51601:30;51667:34;51647:18;;;51640:62;51719:18;;18944:55:0;51387:356:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:247::-;709:6;762:2;750:9;741:7;737:23;733:32;730:52;;;778:1;775;768:12;730:52;817:9;804:23;836:31;861:5;836:31;:::i;902:251::-;972:6;1025:2;1013:9;1004:7;1000:23;996:32;993:52;;;1041:1;1038;1031:12;993:52;1073:9;1067:16;1092:31;1117:5;1092:31;:::i;1158:388::-;1226:6;1234;1287:2;1275:9;1266:7;1262:23;1258:32;1255:52;;;1303:1;1300;1293:12;1255:52;1342:9;1329:23;1361:31;1386:5;1361:31;:::i;:::-;1411:5;-1:-1:-1;1468:2:1;1453:18;;1440:32;1481:33;1440:32;1481:33;:::i;:::-;1533:7;1523:17;;;1158:388;;;;;:::o;1551:456::-;1628:6;1636;1644;1697:2;1685:9;1676:7;1672:23;1668:32;1665:52;;;1713:1;1710;1703:12;1665:52;1752:9;1739:23;1771:31;1796:5;1771:31;:::i;:::-;1821:5;-1:-1:-1;1878:2:1;1863:18;;1850:32;1891:33;1850:32;1891:33;:::i;:::-;1551:456;;1943:7;;-1:-1:-1;;;1997:2:1;1982:18;;;;1969:32;;1551:456::o;2012:794::-;2107:6;2115;2123;2131;2184:3;2172:9;2163:7;2159:23;2155:33;2152:53;;;2201:1;2198;2191:12;2152:53;2240:9;2227:23;2259:31;2284:5;2259:31;:::i;:::-;2309:5;-1:-1:-1;2366:2:1;2351:18;;2338:32;2379:33;2338:32;2379:33;:::i;:::-;2431:7;-1:-1:-1;2485:2:1;2470:18;;2457:32;;-1:-1:-1;2540:2:1;2525:18;;2512:32;2567:18;2556:30;;2553:50;;;2599:1;2596;2589:12;2553:50;2622:22;;2675:4;2667:13;;2663:27;-1:-1:-1;2653:55:1;;2704:1;2701;2694:12;2653:55;2727:73;2792:7;2787:2;2774:16;2769:2;2765;2761:11;2727:73;:::i;:::-;2717:83;;;2012:794;;;;;;;:::o;2811:416::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2992:9;2979:23;3011:31;3036:5;3011:31;:::i;:::-;3061:5;-1:-1:-1;3118:2:1;3103:18;;3090:32;3160:15;;3153:23;3141:36;;3131:64;;3191:1;3188;3181:12;3232:315;3300:6;3308;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;3416:9;3403:23;3435:31;3460:5;3435:31;:::i;:::-;3485:5;3537:2;3522:18;;;;3509:32;;-1:-1:-1;;;3232:315:1:o;3552:245::-;3610:6;3663:2;3651:9;3642:7;3638:23;3634:32;3631:52;;;3679:1;3676;3669:12;3631:52;3718:9;3705:23;3737:30;3761:5;3737:30;:::i;3802:249::-;3871:6;3924:2;3912:9;3903:7;3899:23;3895:32;3892:52;;;3940:1;3937;3930:12;3892:52;3972:9;3966:16;3991:30;4015:5;3991:30;:::i;4056:450::-;4125:6;4178:2;4166:9;4157:7;4153:23;4149:32;4146:52;;;4194:1;4191;4184:12;4146:52;4234:9;4221:23;4267:18;4259:6;4256:30;4253:50;;;4299:1;4296;4289:12;4253:50;4322:22;;4375:4;4367:13;;4363:27;-1:-1:-1;4353:55:1;;4404:1;4401;4394:12;4353:55;4427:73;4492:7;4487:2;4474:16;4469:2;4465;4461:11;4427:73;:::i;4511:180::-;4570:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:52;;;4639:1;4636;4629:12;4591:52;-1:-1:-1;4662:23:1;;4511:180;-1:-1:-1;4511:180:1:o;4696:257::-;4737:3;4775:5;4769:12;4802:6;4797:3;4790:19;4818:63;4874:6;4867:4;4862:3;4858:14;4851:4;4844:5;4840:16;4818:63;:::i;:::-;4935:2;4914:15;-1:-1:-1;;4910:29:1;4901:39;;;;4942:4;4897:50;;4696:257;-1:-1:-1;;4696:257:1:o;4958:185::-;5000:3;5038:5;5032:12;5053:52;5098:6;5093:3;5086:4;5079:5;5075:16;5053:52;:::i;:::-;5121:16;;;;;4958:185;-1:-1:-1;;4958:185:1:o;5148:973::-;5233:12;;5198:3;;5288:1;5308:18;;;;5361;;;;5388:61;;5442:4;5434:6;5430:17;5420:27;;5388:61;5468:2;5516;5508:6;5505:14;5485:18;5482:38;5479:161;;;5562:10;5557:3;5553:20;5550:1;5543:31;5597:4;5594:1;5587:15;5625:4;5622:1;5615:15;5479:161;5656:18;5683:104;;;;5801:1;5796:319;;;;5649:466;;5683:104;-1:-1:-1;;5716:24:1;;5704:37;;5761:16;;;;-1:-1:-1;5683:104:1;;5796:319;59565:1;59558:14;;;59602:4;59589:18;;5890:1;5904:165;5918:6;5915:1;5912:13;5904:165;;;5996:14;;5983:11;;;5976:35;6039:16;;;;5933:10;;5904:165;;;5908:3;;6098:6;6093:3;6089:16;6082:23;;5649:466;;;;;;;5148:973;;;;:::o;7277:276::-;7408:3;7446:6;7440:13;7462:53;7508:6;7503:3;7496:4;7488:6;7484:17;7462:53;:::i;:::-;7531:16;;;;;7277:276;-1:-1:-1;;7277:276:1:o;7558:470::-;7737:3;7775:6;7769:13;7791:53;7837:6;7832:3;7825:4;7817:6;7813:17;7791:53;:::i;:::-;7907:13;;7866:16;;;;7929:57;7907:13;7866:16;7963:4;7951:17;;7929:57;:::i;:::-;8002:20;;7558:470;-1:-1:-1;;;;7558:470:1:o;8033:664::-;8260:3;8298:6;8292:13;8314:53;8360:6;8355:3;8348:4;8340:6;8336:17;8314:53;:::i;:::-;8430:13;;8389:16;;;;8452:57;8430:13;8389:16;8486:4;8474:17;;8452:57;:::i;:::-;8576:13;;8531:20;;;8598:57;8576:13;8531:20;8632:4;8620:17;;8598:57;:::i;:::-;8671:20;;8033:664;-1:-1:-1;;;;;8033:664:1:o;8702:858::-;8977:3;9015:6;9009:13;9031:53;9077:6;9072:3;9065:4;9057:6;9053:17;9031:53;:::i;:::-;9147:13;;9106:16;;;;9169:57;9147:13;9106:16;9203:4;9191:17;;9169:57;:::i;:::-;9293:13;;9248:20;;;9315:57;9293:13;9248:20;9349:4;9337:17;;9315:57;:::i;:::-;9439:13;;9394:20;;;9461:57;9439:13;9394:20;9495:4;9483:17;;9461:57;:::i;:::-;9534:20;;8702:858;-1:-1:-1;;;;;;8702:858:1:o;9565:1052::-;9888:3;9926:6;9920:13;9942:53;9988:6;9983:3;9976:4;9968:6;9964:17;9942:53;:::i;:::-;10058:13;;10017:16;;;;10080:57;10058:13;10017:16;10114:4;10102:17;;10080:57;:::i;:::-;10204:13;;10159:20;;;10226:57;10204:13;10159:20;10260:4;10248:17;;10226:57;:::i;:::-;10350:13;;10305:20;;;10372:57;10350:13;10305:20;10406:4;10394:17;;10372:57;:::i;:::-;10496:13;;10451:20;;;10518:57;10496:13;10451:20;10552:4;10540:17;;10518:57;:::i;:::-;10591:20;;9565:1052;-1:-1:-1;;;;;;;9565:1052:1:o;10622:1257::-;10993:3;11031:6;11025:13;11057:4;11070:51;11114:6;11109:3;11104:2;11096:6;11092:15;11070:51;:::i;:::-;11184:13;;11143:16;;;;11206:55;11184:13;11143:16;11228:15;;;11206:55;:::i;:::-;11328:13;;11283:20;;;11350:55;11328:13;11283:20;11372:15;;;11350:55;:::i;:::-;11472:13;;11427:20;;;11494:55;11472:13;11427:20;11516:15;;;11494:55;:::i;:::-;11616:13;;11571:20;;;11638:55;11616:13;11571:20;11660:15;;;11638:55;:::i;:::-;11760:13;;11715:20;;;11782:55;11760:13;11715:20;11804:15;;;11782:55;:::i;:::-;11853:20;;;;;10622:1257;-1:-1:-1;;;;;;;;;10622:1257:1:o;11884:1783::-;12399:3;12437:6;12431:13;12453:53;12499:6;12494:3;12487:4;12479:6;12475:17;12453:53;:::i;:::-;12569:13;;12528:16;;;;12591:57;12569:13;12528:16;12625:4;12613:17;;12591:57;:::i;:::-;12679:6;12673:13;12695:72;12758:8;12747;12740:5;12736:20;12729:4;12721:6;12717:17;12695:72;:::i;:::-;12849:13;;12793:20;;;;12789:35;;12871:57;12849:13;12789:35;12905:4;12893:17;;12871:57;:::i;:::-;12959:6;12953:13;12975:72;13038:8;13027;13020:5;13016:20;13009:4;13001:6;12997:17;12975:72;:::i;:::-;13129:13;;13073:20;;;;13069:35;;13151:57;13129:13;13069:35;13185:4;13173:17;;13151:57;:::i;:::-;13275:13;;13230:20;;;13297:57;13275:13;13230:20;13331:4;13319:17;;13297:57;:::i;:::-;13385:6;13379:13;13401:72;13464:8;13453;13446:5;13442:20;13435:4;13427:6;13423:17;13401:72;:::i;:::-;13552:13;;13496:20;;;;13492:35;;13574:54;13552:13;13492:35;13608:4;13596:17;;13574:54;:::i;:::-;13644:17;;11884:1783;-1:-1:-1;;;;;;;;;;;11884:1783:1:o;13672:1053::-;14048:3;14086:6;14080:13;14102:53;14148:6;14143:3;14136:4;14128:6;14124:17;14102:53;:::i;:::-;14218:13;;14177:16;;;;14240:57;14218:13;14177:16;14274:4;14262:17;;14240:57;:::i;:::-;14364:13;;14319:20;;;14386:57;14364:13;14319:20;14420:4;14408:17;;14386:57;:::i;:::-;14510:13;;14465:20;;;14532:57;14510:13;14465:20;14566:4;14554:17;;14532:57;:::i;:::-;-1:-1:-1;;;14611:20:1;;14640:49;;;14716:2;14705:14;;13672:1053;-1:-1:-1;;;;;;13672:1053:1:o;14730:649::-;15093:66;15088:3;15081:79;15063:3;15189:6;15183:13;15205:62;15260:6;15255:2;15250:3;15246:12;15239:4;15231:6;15227:17;15205:62;:::i;:::-;-1:-1:-1;;;15326:2:1;15286:16;;;;15318:11;;;15311:35;-1:-1:-1;15370:2:1;15362:11;;14730:649;-1:-1:-1;14730:649:1:o;15384:852::-;-1:-1:-1;;;15783:57:1;;15863:13;;15765:3;;15885:62;15863:13;15935:2;15926:12;;15919:4;15907:17;;15885:62;:::i;:::-;16011:66;16006:2;15966:16;;;15998:11;;;15991:87;16103:13;;16125:63;16103:13;16174:2;16166:11;;16159:4;16147:17;;16125:63;:::i;:::-;16208:17;16227:2;16204:26;;15384:852;-1:-1:-1;;;;15384:852:1:o;16241:2342::-;-1:-1:-1;;;17337:57:1;;17417:13;;17319:3;;17439:62;17417:13;17489:2;17480:12;;17473:4;17461:17;;17439:62;:::i;:::-;-1:-1:-1;;;17560:2:1;17520:16;;;17552:11;;;17545:74;17644:13;;17666:63;17644:13;17715:2;17707:11;;17700:4;17688:17;;17666:63;:::i;:::-;-1:-1:-1;;;17789:2:1;17748:17;;;;17781:11;;;17774:76;17875:13;;17897:63;17875:13;17946:2;17938:11;;17931:4;17919:17;;17897:63;:::i;:::-;18025:66;18020:2;17979:17;;;;18012:11;;;18005:87;18117:13;;18139:63;18117:13;18188:2;18180:11;;18173:4;18161:17;;18139:63;:::i;:::-;18267:66;18262:2;18221:17;;;;18254:11;;;18247:87;18359:13;;18381:64;18359:13;18430:3;18422:12;;18415:4;18403:17;;18381:64;:::i;:::-;18461:116;18491:85;18517:58;18570:3;18559:8;18555:2;18551:17;18547:27;6734:66;6722:79;;6826:2;6817:12;;6657:178;18517:58;18509:6;18491:85;:::i;:::-;-1:-1:-1;;;6905:35:1;;6965:1;6956:11;;6840:133;18461:116;18454:123;16241:2342;-1:-1:-1;;;;;;;;;;16241:2342:1:o;18588:1701::-;-1:-1:-1;;;19386:57:1;;19466:13;;19368:3;;19488:62;19466:13;19538:2;19529:12;;19522:4;19510:17;;19488:62;:::i;:::-;19614:66;19609:2;19569:16;;;19601:11;;;19594:87;19706:13;;19728:63;19706:13;19777:2;19769:11;;19762:4;19750:17;;19728:63;:::i;:::-;19818:8;19814:2;19810:17;19800:27;;;-1:-1:-1;;;19879:2:1;19874;19870;19866:11;19859:23;19913:6;19907:13;19929:63;19983:8;19978:2;19974;19970:11;19963:4;19955:6;19951:17;19929:63;:::i;:::-;20052:2;20011:17;;20044:11;;;20037:23;20085:13;;20107:63;20085:13;20156:2;20148:11;;20141:4;20129:17;;20107:63;:::i;:::-;-1:-1:-1;;;20230:2:1;20189:17;;;;20222:11;;;20215:41;20280:2;20272:11;;18588:1701;-1:-1:-1;;;;;;18588:1701:1:o;20294:::-;-1:-1:-1;;;21092:57:1;;21172:13;;21074:3;;21194:62;21172:13;21244:2;21235:12;;21228:4;21216:17;;21194:62;:::i;:::-;21320:66;21315:2;21275:16;;;21307:11;;;21300:87;21412:13;;21434:63;21412:13;21483:2;21475:11;;21468:4;21456:17;;21434:63;:::i;:::-;21524:8;21520:2;21516:17;21506:27;;;-1:-1:-1;;;21585:2:1;21580;21576;21572:11;21565:23;21619:6;21613:13;21635:63;21689:8;21684:2;21680;21676:11;21669:4;21661:6;21657:17;21635:63;:::i;:::-;21758:2;21717:17;;21750:11;;;21743:23;21791:13;;21813:63;21791:13;21862:2;21854:11;;21847:4;21835:17;;21813:63;:::i;:::-;-1:-1:-1;;;21936:2:1;21895:17;;;;21928:11;;;21921:41;21986:2;21978:11;;20294:1701;-1:-1:-1;;;;;;20294:1701:1:o;22000:1891::-;-1:-1:-1;;;22798:57:1;;22878:13;;22780:3;;22900:62;22878:13;22950:2;22941:12;;22934:4;22922:17;;22900:62;:::i;:::-;23026:66;23021:2;22981:16;;;23013:11;;;23006:87;-1:-1:-1;;;23153:2:1;23145:11;;23138:23;;;23186:13;;23208:63;23186:13;23257:2;23249:11;;23242:4;23230:17;;23208:63;:::i;:::-;-1:-1:-1;;;23331:2:1;23290:17;;;;23323:11;;;23316:74;23415:13;;23437:63;23415:13;23486:2;23478:11;;23471:4;23459:17;;23437:63;:::i;:::-;23565:66;23560:2;23519:17;;;;23552:11;;;23545:87;23656:3;23648:12;;23641:24;23690:13;;23712:64;23690:13;23761:3;23753:12;;23746:4;23734:17;;23712:64;:::i;:::-;-1:-1:-1;;;23836:3:1;23795:17;;;;23828:12;;;23821:36;23881:3;23873:12;;22000:1891;-1:-1:-1;;;;;;22000:1891:1:o;23896:1682::-;24557:66;24552:3;24545:79;24654:66;24649:2;24644:3;24640:12;24633:88;24760:24;24755:3;24751:34;24746:2;24741:3;24737:12;24730:56;24527:3;24815:6;24809:13;24831:60;24884:6;24879:2;24874:3;24870:12;24865:2;24857:6;24853:15;24831:60;:::i;:::-;24955:66;24950:2;24910:16;;;24942:11;;;24935:87;-1:-1:-1;;;25046:3:1;25038:12;;25031:27;25083:13;;25105:62;25083:13;25152:3;25144:12;;25139:2;25127:15;;25105:62;:::i;:::-;-1:-1:-1;;;25227:3:1;25186:17;;;;25219:12;;;25212:35;25272:13;;25294:62;25272:13;25341:3;25333:12;;25328:2;25316:15;;25294:62;:::i;:::-;25422:66;25416:3;25375:17;;;;25408:12;;;25401:88;-1:-1:-1;;;25513:3:1;25505:12;;25498:46;25568:3;25560:12;;23896:1682;-1:-1:-1;;;;;23896:1682:1:o;25583:586::-;-1:-1:-1;;;25941:3:1;25934:22;25916:3;25985:6;25979:13;26001:61;26055:6;26051:1;26046:3;26042:11;26035:4;26027:6;26023:17;26001:61;:::i;:::-;-1:-1:-1;;;26121:1:1;26081:16;;;;26113:10;;;26106:30;-1:-1:-1;26160:2:1;26152:11;;25583:586;-1:-1:-1;25583:586:1:o;26174:2012::-;27133:66;27128:3;27121:79;27239:14;27234:3;27230:24;27225:2;27220:3;27216:12;27209:46;27103:3;27284:6;27278:13;27300:60;27353:6;27348:2;27343:3;27339:12;27334:2;27326:6;27322:15;27300:60;:::i;:::-;27424:66;27419:2;27379:16;;;27411:11;;;27404:87;-1:-1:-1;;;27515:2:1;27507:11;;27500:67;27592:13;;27614:61;27592:13;27661:2;27653:11;;27648:2;27636:15;;27614:61;:::i;:::-;27702:8;27698:2;27694:17;27684:27;;;-1:-1:-1;;;27762:2:1;27757;27753;27749:11;27742:23;27796:6;27790:13;27812:61;27864:8;27859:2;27855;27851:11;27846:2;27838:6;27834:15;27812:61;:::i;:::-;27933:2;27892:17;;27925:11;;;27918:23;27966:13;;27988:61;27966:13;28035:2;28027:11;;28022:2;28010:15;;27988:61;:::i;:::-;28065:115;28095:84;28121:57;28174:2;28163:8;28159:2;28155:17;28151:26;6203:66;6191:79;;-1:-1:-1;;;6295:2:1;6286:12;;6279:70;6374:2;6365:12;;6126:257;28095:84;-1:-1:-1;;;6453:33:1;;6511:1;6502:11;;6388:131;28065:115;28058:122;26174:2012;-1:-1:-1;;;;;;;;;26174:2012:1:o;28191:874::-;28602:66;28597:3;28590:79;28572:3;28698:6;28692:13;28714:62;28769:6;28764:2;28759:3;28755:12;28748:4;28740:6;28736:17;28714:62;:::i;:::-;28840:66;28835:2;28795:16;;;28827:11;;;28820:87;28932:13;;28954:63;28932:13;29003:2;28995:11;;28988:4;28976:17;;28954:63;:::i;:::-;29037:17;29056:2;29033:26;;28191:874;-1:-1:-1;;;;28191:874:1:o;29070:::-;29481:66;29476:3;29469:79;29451:3;29577:6;29571:13;29593:62;29648:6;29643:2;29638:3;29634:12;29627:4;29619:6;29615:17;29593:62;:::i;:::-;29719:66;29714:2;29674:16;;;29706:11;;;29699:87;29811:13;;29833:63;29811:13;29882:2;29874:11;;29867:4;29855:17;;29833:63;:::i;:::-;29916:17;29935:2;29912:26;;29070:874;-1:-1:-1;;;;29070:874:1:o;29949:861::-;30360:66;30355:3;30348:79;30330:3;30456:6;30450:13;30472:62;30527:6;30522:2;30517:3;30513:12;30506:4;30498:6;30494:17;30472:62;:::i;:::-;-1:-1:-1;;;30593:2:1;30553:16;;;30585:11;;;30578:74;30677:13;;30699:63;30677:13;30748:2;30740:11;;30733:4;30721:17;;30699:63;:::i;:::-;30782:17;30801:2;30778:26;;29949:861;-1:-1:-1;;;;29949:861:1:o;30815:1696::-;-1:-1:-1;;;31613:51:1;;31687:13;;31595:3;;31709:62;31687:13;31759:2;31750:12;;31743:4;31731:17;;31709:62;:::i;:::-;-1:-1:-1;;;31830:2:1;31790:16;;;31822:11;;;31815:45;31885:13;;31907:63;31885:13;31956:2;31948:11;;31941:4;31929:17;;31907:63;:::i;:::-;-1:-1:-1;;;32030:2:1;31989:17;;;;32022:11;;;32015:45;32085:13;;32107:63;32085:13;32156:2;32148:11;;32141:4;32129:17;;32107:63;:::i;:::-;-1:-1:-1;;;32230:2:1;32189:17;;;;32222:11;;;32215:45;32285:13;;32307:63;32285:13;32356:2;32348:11;;32341:4;32329:17;;32307:63;:::i;:::-;-1:-1:-1;;;32430:2:1;32389:17;;;;32422:11;;;32415:63;32502:2;32494:11;;30815:1696;-1:-1:-1;;;;;;30815:1696:1:o;32516:1753::-;-1:-1:-1;;;33314:51:1;;33388:13;;33296:3;;33410:62;33388:13;33460:2;33451:12;;33444:4;33432:17;;33410:62;:::i;:::-;-1:-1:-1;;;33531:2:1;33491:16;;;33523:11;;;33516:45;33586:13;;33608:63;33586:13;33657:2;33649:11;;33642:4;33630:17;;33608:63;:::i;:::-;-1:-1:-1;;;33731:2:1;33690:17;;;;33723:11;;;33716:45;33786:13;;33808:63;33786:13;33857:2;33849:11;;33842:4;33830:17;;33808:63;:::i;:::-;-1:-1:-1;;;33931:2:1;33890:17;;;;33923:11;;;33916:45;33986:13;;34008:63;33986:13;34057:2;34049:11;;34042:4;34030:17;;34008:63;:::i;:::-;34136:66;34131:2;34090:17;;;;34123:11;;;34116:87;-1:-1:-1;;;34227:2:1;34219:11;;34212:24;34260:2;34252:11;;32516:1753;-1:-1:-1;;;;;;32516:1753:1:o;34274:1987::-;-1:-1:-1;;;35221:51:1;;35295:13;;35203:3;;35317:62;35295:13;35367:2;35358:12;;35351:4;35339:17;;35317:62;:::i;:::-;-1:-1:-1;;;35438:2:1;35398:16;;;35430:11;;;35423:45;35493:13;;35515:63;35493:13;35564:2;35556:11;;35549:4;35537:17;;35515:63;:::i;:::-;-1:-1:-1;;;35638:2:1;35597:17;;;;35630:11;;;35623:45;35693:13;;35715:63;35693:13;35764:2;35756:11;;35749:4;35737:17;;35715:63;:::i;:::-;-1:-1:-1;;;35838:2:1;35797:17;;;;35830:11;;;35823:45;35893:13;;35915:63;35893:13;35964:2;35956:11;;35949:4;35937:17;;35915:63;:::i;:::-;-1:-1:-1;;;36038:2:1;35997:17;;;;36030:11;;;36023:49;36097:13;;36119:63;36097:13;36168:2;36160:11;;36153:4;36141:17;;36119:63;:::i;:::-;36198:57;36251:2;36240:8;36236:2;36232:17;36228:26;-1:-1:-1;;;6589:30:1;;6644:1;6635:11;;6524:128;36266:1088;-1:-1:-1;;;36766:51:1;;36840:13;;36748:3;;36862:62;36840:13;36912:2;36903:12;;36896:4;36884:17;;36862:62;:::i;:::-;-1:-1:-1;;;36983:2:1;36943:16;;;36975:11;;;36968:45;37038:13;;37060:63;37038:13;37109:2;37101:11;;37094:4;37082:17;;37060:63;:::i;:::-;37188:66;37183:2;37142:17;;;;37175:11;;;37168:87;-1:-1:-1;;;37279:2:1;37271:11;;37264:57;37345:2;37337:11;;36266:1088;-1:-1:-1;;;;36266:1088:1:o;37359:940::-;37722:34;37717:3;37710:47;37787:66;37782:2;37777:3;37773:12;37766:88;37692:3;37883:6;37877:13;37899:60;37952:6;37947:2;37942:3;37938:12;37933:2;37925:6;37921:15;37899:60;:::i;:::-;38023:66;38018:2;37978:16;;;;38010:11;;;38003:87;-1:-1:-1;38119:66:1;38114:2;38106:11;;38099:87;-1:-1:-1;;;38210:3:1;38202:12;;38195:70;38289:3;38281:12;;37359:940;-1:-1:-1;37359:940:1:o;38304:696::-;38667:66;38662:3;38655:79;-1:-1:-1;;;38759:2:1;38754:3;38750:12;38743:28;38637:3;38800:6;38794:13;38816:60;38869:6;38864:2;38859:3;38855:12;38850:2;38842:6;38838:15;38816:60;:::i;:::-;-1:-1:-1;;;38935:2:1;38895:16;;;;38927:11;;;38920:47;-1:-1:-1;38991:2:1;38983:11;;38304:696;-1:-1:-1;38304:696:1:o;39005:1091::-;-1:-1:-1;;;39560:3:1;39553:16;39535:3;39598:6;39592:13;39614:61;39668:6;39664:1;39659:3;39655:11;39648:4;39640:6;39636:17;39614:61;:::i;:::-;39735:13;;39694:16;;;;39757:62;39735:13;39806:1;39798:10;;39791:4;39779:17;;39757:62;:::i;:::-;-1:-1:-1;;;39879:1:1;39838:17;;;;39871:10;;;39864:23;39912:13;;39934:62;39912:13;39983:1;39975:10;;39968:4;39956:17;;39934:62;:::i;:::-;-1:-1:-1;;;40056:1:1;40015:17;;;;40048:10;;;40041:23;40088:1;40080:10;;39005:1091;-1:-1:-1;;;;;39005:1091:1:o;40101:1568::-;40762:34;40757:3;40750:47;40827:66;40822:2;40817:3;40813:12;40806:88;40732:3;40923:6;40917:13;40939:60;40992:6;40987:2;40982:3;40978:12;40973:2;40965:6;40961:15;40939:60;:::i;:::-;41063:66;41058:2;41018:16;;;41050:11;;;41043:87;41155:13;;41177:61;41155:13;41224:2;41216:11;;41211:2;41199:15;;41177:61;:::i;:::-;-1:-1:-1;;;41298:2:1;41257:17;;;;41290:11;;;41283:61;41369:13;;41391:61;41369:13;41438:2;41430:11;;41425:2;41413:15;;41391:61;:::i;:::-;41517:66;41512:2;41471:17;;;;41504:11;;;41497:87;-1:-1:-1;;;41608:3:1;41600:12;;41593:42;41659:3;41651:12;;40101:1568;-1:-1:-1;;;;;40101:1568:1:o;41674:1071::-;-1:-1:-1;;;42174:68:1;;42265:13;;42156:3;;42287:62;42265:13;42337:2;42328:12;;42321:4;42309:17;;42287:62;:::i;:::-;42413:66;42408:2;42368:16;;;42400:11;;;42393:87;-1:-1:-1;;;42504:2:1;42496:11;;42489:27;42541:13;;42563:63;42541:13;42612:2;42604:11;;42597:4;42585:17;;42563:63;:::i;:::-;-1:-1:-1;;;42686:2:1;42645:17;;;;42678:11;;;42671:41;42736:2;42728:11;;41674:1071;-1:-1:-1;;;;41674:1071:1:o;42750:1361::-;43411:66;43406:3;43399:79;-1:-1:-1;;;43503:2:1;43498:3;43494:12;43487:27;43381:3;43543:6;43537:13;43559:60;43612:6;43607:2;43602:3;43598:12;43593:2;43585:6;43581:15;43559:60;:::i;:::-;43647:6;43642:3;43638:16;43628:26;;-1:-1:-1;;;43705:2:1;43700;43696;43692:11;43685:23;43739:6;43733:13;43755:61;43807:8;43802:2;43798;43794:11;43789:2;43781:6;43777:15;43755:61;:::i;:::-;43876:2;43835:17;;43868:11;;;43861:23;43909:13;;43931:61;43909:13;43978:2;43970:11;;43965:2;43953:15;;43931:61;:::i;:::-;-1:-1:-1;;;44052:2:1;44011:17;;;;44044:11;;;44037:41;44102:2;44094:11;;42750:1361;-1:-1:-1;;;;;42750:1361:1:o;44116:448::-;44378:31;44373:3;44366:44;44348:3;44439:6;44433:13;44455:62;44510:6;44505:2;44500:3;44496:12;44489:4;44481:6;44477:17;44455:62;:::i;:::-;44537:16;;;;44555:2;44533:25;;44116:448;-1:-1:-1;;44116:448:1:o;44569:603::-;44932:31;44927:3;44920:44;44902:3;44993:6;44987:13;45009:62;45064:6;45059:2;45054:3;45050:12;45043:4;45035:6;45031:17;45009:62;:::i;:::-;-1:-1:-1;;;45130:2:1;45090:16;;;;45122:11;;;45115:24;-1:-1:-1;45163:2:1;45155:11;;44569:603;-1:-1:-1;44569:603:1:o;45177:600::-;-1:-1:-1;;;45535:3:1;45528:20;45510:3;45577:6;45571:13;45593:61;45647:6;45643:1;45638:3;45634:11;45627:4;45619:6;45615:17;45593:61;:::i;:::-;45717:26;45713:1;45673:16;;;;45705:10;;;45698:46;-1:-1:-1;45768:2:1;45760:11;;45177:600;-1:-1:-1;45177:600:1:o;45782:1998::-;-1:-1:-1;;;46723:55:1;;46801:13;;46705:3;;46823:62;46801:13;46873:2;46864:12;;46857:4;46845:17;;46823:62;:::i;:::-;-1:-1:-1;;;46944:2:1;46904:16;;;46936:11;;;46929:72;47026:13;;47048:63;47026:13;47097:2;47089:11;;47082:4;47070:17;;47048:63;:::i;:::-;-1:-1:-1;;;47171:2:1;47130:17;;;;47163:11;;;47156:71;47246:46;47288:2;47280:11;;47272:6;47246:46;:::i;:::-;-1:-1:-1;;;47301:63:1;;47236:56;-1:-1:-1;47383:46:1;47425:2;47417:11;;47409:6;47383:46;:::i;:::-;47373:56;;47449:66;47445:2;47438:78;-1:-1:-1;;;47540:4:1;47536:2;47532:13;47525:32;47588:6;47582:13;47604:63;47658:8;47653:2;47649;47645:11;47638:4;47630:6;47626:17;47604:63;:::i;:::-;-1:-1:-1;;;47727:2:1;47686:17;;;;47719:11;;;47712:35;47771:2;47763:11;;45782:1998;-1:-1:-1;;;;;;;45782:1998:1:o;47785:896::-;48291:66;48279:79;;-1:-1:-1;;;48383:2:1;48374:12;;48367:42;-1:-1:-1;48428:47:1;48471:2;48462:12;;48454:6;48428:47;:::i;:::-;-1:-1:-1;;;48484:65:1;;48568:46;48610:2;48602:11;;48594:6;48568:46;:::i;:::-;-1:-1:-1;;;48623:26:1;;48673:1;48665:10;;47785:896;-1:-1:-1;;;;;47785:896:1:o;48686:1579::-;-1:-1:-1;;;49491:3:1;49484:20;49466:3;49533:6;49527:13;49549:61;49603:6;49599:1;49594:3;49590:11;49583:4;49575:6;49571:17;49549:61;:::i;:::-;49638:6;49633:3;49629:16;49619:26;;-1:-1:-1;;;49695:2:1;49691:1;49687:2;49683:10;49676:22;49729:6;49723:13;49745:62;49798:8;49794:1;49790:2;49786:10;49779:4;49771:6;49767:17;49745:62;:::i;:::-;49867:1;49826:17;;49859:10;;;49852:22;49899:13;;49921:62;49899:13;49970:1;49962:10;;49955:4;49943:17;;49921:62;:::i;:::-;-1:-1:-1;;;50043:1:1;50002:17;;;;50035:10;;;50028:25;50078:13;;50100:63;50078:13;50149:2;50141:11;;50134:4;50122:17;;50100:63;:::i;:::-;-1:-1:-1;;;50223:2:1;50182:17;;;;50215:11;;;50208:24;50256:2;50248:11;;48686:1579;-1:-1:-1;;;;;;48686:1579:1:o;50478:488::-;-1:-1:-1;;;;;50747:15:1;;;50729:34;;50799:15;;50794:2;50779:18;;50772:43;50846:2;50831:18;;50824:34;;;50894:3;50889:2;50874:18;;50867:31;;;50672:4;;50915:45;;50940:19;;50932:6;50915:45;:::i;:::-;50907:53;50478:488;-1:-1:-1;;;;;;50478:488:1:o;51163:219::-;51312:2;51301:9;51294:21;51275:4;51332:44;51372:2;51361:9;51357:18;51349:6;51332:44;:::i;51748:414::-;51950:2;51932:21;;;51989:2;51969:18;;;51962:30;52028:34;52023:2;52008:18;;52001:62;-1:-1:-1;;;52094:2:1;52079:18;;52072:48;52152:3;52137:19;;51748:414::o;56525:356::-;56727:2;56709:21;;;56746:18;;;56739:30;56805:34;56800:2;56785:18;;56778:62;56872:2;56857:18;;56525:356::o;58114:413::-;58316:2;58298:21;;;58355:2;58335:18;;;58328:30;58394:34;58389:2;58374:18;;58367:62;-1:-1:-1;;;58460:2:1;58445:18;;58438:47;58517:3;58502:19;;58114:413::o;59618:128::-;59658:3;59689:1;59685:6;59682:1;59679:13;59676:39;;;59695:18;;:::i;:::-;-1:-1:-1;59731:9:1;;59618:128::o;59751:120::-;59791:1;59817;59807:35;;59822:18;;:::i;:::-;-1:-1:-1;59856:9:1;;59751:120::o;59876:422::-;59965:1;60008:5;59965:1;60022:270;60043:7;60033:8;60030:21;60022:270;;;60102:4;60098:1;60094:6;60090:17;60084:4;60081:27;60078:53;;;60111:18;;:::i;:::-;60161:7;60151:8;60147:22;60144:55;;;60181:16;;;;60144:55;60260:22;;;;60220:15;;;;60022:270;;;60026:3;59876:422;;;;;:::o;60303:131::-;60363:5;60392:36;60419:8;60413:4;60488:5;60518:8;60508:80;;-1:-1:-1;60559:1:1;60573:5;;60508:80;60607:4;60597:76;;-1:-1:-1;60644:1:1;60658:5;;60597:76;60689:4;60707:1;60702:59;;;;60775:1;60770:130;;;;60682:218;;60702:59;60732:1;60723:10;;60746:5;;;60770:130;60807:3;60797:8;60794:17;60791:43;;;60814:18;;:::i;:::-;-1:-1:-1;;60870:1:1;60856:16;;60885:5;;60682:218;;60984:2;60974:8;60971:16;60965:3;60959:4;60956:13;60952:36;60946:2;60936:8;60933:16;60928:2;60922:4;60919:12;60915:35;60912:77;60909:159;;;-1:-1:-1;61021:19:1;;;61053:5;;60909:159;61100:34;61125:8;61119:4;61100:34;:::i;:::-;61170:6;61166:1;61162:6;61158:19;61149:7;61146:32;61143:58;;;61181:18;;:::i;:::-;61219:20;;60439:806;-1:-1:-1;;;60439:806:1:o;61250:168::-;61290:7;61356:1;61352;61348:6;61344:14;61341:1;61338:21;61333:1;61326:9;61319:17;61315:45;61312:71;;;61363:18;;:::i;:::-;-1:-1:-1;61403:9:1;;61250:168::o;61423:125::-;61463:4;61491:1;61488;61485:8;61482:34;;;61496:18;;:::i;:::-;-1:-1:-1;61533:9:1;;61423:125::o;61553:258::-;61625:1;61635:113;61649:6;61646:1;61643:13;61635:113;;;61725:11;;;61719:18;61706:11;;;61699:39;61671:2;61664:10;61635:113;;;61766:6;61763:1;61760:13;61757:48;;;-1:-1:-1;;61801:1:1;61783:16;;61776:27;61553:258::o;61816:136::-;61855:3;61883:5;61873:39;;61892:18;;:::i;:::-;-1:-1:-1;;;61928:18:1;;61816:136::o;61957:380::-;62036:1;62032:12;;;;62079;;;62100:61;;62154:4;62146:6;62142:17;62132:27;;62100:61;62207:2;62199:6;62196:14;62176:18;62173:38;62170:161;;;62253:10;62248:3;62244:20;62241:1;62234:31;62288:4;62285:1;62278:15;62316:4;62313:1;62306:15;62170:161;;61957:380;;;:::o;62342:135::-;62381:3;-1:-1:-1;;62402:17:1;;62399:43;;;62422:18;;:::i;:::-;-1:-1:-1;62469:1:1;62458:13;;62342:135::o;62482:112::-;62514:1;62540;62530:35;;62545:18;;:::i;:::-;-1:-1:-1;62579:9:1;;62482:112::o;62599:127::-;62660:10;62655:3;62651:20;62648:1;62641:31;62691:4;62688:1;62681:15;62715:4;62712:1;62705:15;62731:127;62792:10;62787:3;62783:20;62780:1;62773:31;62823:4;62820:1;62813:15;62847:4;62844:1;62837:15;62863:127;62924:10;62919:3;62915:20;62912:1;62905:31;62955:4;62952:1;62945:15;62979:4;62976:1;62969:15;62995:127;63056:10;63051:3;63047:20;63044:1;63037:31;63087:4;63084:1;63077:15;63111:4;63108:1;63101:15;63127:131;-1:-1:-1;;;;;63202:31:1;;63192:42;;63182:70;;63248:1;63245;63238:12;63263:131;-1:-1:-1;;;;;;63337:32:1;;63327:43;;63317:71;;63384:1;63381;63374:12

Swarm Source

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