ETH Price: $3,320.73 (+1.53%)
Gas: 10 Gwei

Token

On-Chain Mountains (GMGN)
 

Overview

Max Total Supply

184 GMGN

Holders

54

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
willaa.eth
Balance
1 GMGN
0xd57e933531A06743FA28dA1e5EE0f7181eDd1699
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

5000 beautiful animated mountain views. Generated and stored completely on-chain. No IPFS. 0% royalties. Mint price: 0.03 ETH.

# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
GMGN

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-10-06
*/

/*                                      .--.   
                                      !      \ 
                                      \      | 
                                       '.__.'


                                 -                                  --                   
                               /- \-                              --  \-                 
                             /-     \           -\              -/      \-               
             -            /--        \-       /- -\           -/          \-             
           -/ \-        /-             \    /-     \       --/              \-           
         -/     \-    /-                \---        -\   -/                   \--        
       -/         \ --                    \-          --/                       \-      
     -/            \-                       \       -/            On-chain        \-    
   -/                \-                      \-   -/             Mountains          \-  
 -/                    \                       \-/                                    \-
________________________________________________________________________________________

5000 beautiful animated mountain views with realistic atmospheric effects. Generated and stored completely on-chain. No IPFS.
Unique linear mint system for each wallet with 10 different scenes:

1st mint - you get Sunrise, 
2th - Day,
3th - Cloudy Day, 
4th - Sunset,
5th - Night Stars, 
6th - Night Crescent, 
7th - Night Moon, 
8th - Mars, 
9th - Mars Sunset, 
10th - Halloween Mystic Night,
all next - random scene.

Website: http://onchainmountains.art 
Twitter: https://twitter.com/Chain_Mountains

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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



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




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


    /**
     * @dev Converts a `hex string` to uint256
     */
     function fromHex(string memory c) internal pure returns (uint256) {
        string memory s1 = Strings.substr(c,0,1);
        string memory s2 = Strings.substr(c,1,2);
        uint a;
        uint b;
        
        if (bytes1(bytes(s1)) >= bytes1('0') && bytes1(bytes(s1)) <= bytes1('9')) {
            a = strToUint(s1);
        }
        if (bytes1(bytes(s1)) >= bytes1('a') && bytes1(bytes(s1)) <= bytes1('f')) {
            a = 10 + uint256(uint8(bytes1(bytes(s1)))) -  uint256(uint8(bytes1('a')));
        }
        
        if (bytes1(bytes(s2)) >= bytes1('0') && bytes1(bytes(s2)) <= bytes1('9')) {
            b = strToUint(s2);
        }
        if (bytes1(bytes(s2)) >= bytes1('a') && bytes1(bytes(s2)) <= bytes1('f')) {
            b = 10 + uint256(uint8(bytes1(bytes(s2)))) -  uint256(uint8(bytes1('a')));
        }
        return b + 16 * a;
     }
     
    
    /**
     * @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 "00";
        }
        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 Strings.substr(string(buffer), 2,4);
    }
    
      function strToUint(string memory s) internal pure returns (uint256) {
        bytes memory b = bytes(s);
        uint256 result = 0;
        for (uint256 i = 0; i < b.length; i++) { // c = b[i] was not needed
            if (b[i] >= 0x30 && b[i] <= 0x39) {
                result = result * 10 + (uint(uint8((b[i]))) - 48); // bytes and int are not compatible with the operator -.
            }
        }
        return result; // this was missing
    }

    function substr(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }
}




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









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





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














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







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





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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}









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


/**
 * @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 scenes to tokens
    mapping(uint256 => uint256) public scenes;
    
    // 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);

        if (_balances[to] < 10) {
            scenes[tokenId] = _balances[to];
        } else {
            scenes[tokenId] = uint256(keccak256(abi.encodePacked(string(abi.encodePacked(MLB.t(tokenId)))))) % 10;   
        }
        
        _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(to).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 {}
}







/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

 
contract GMGN is ERC721Enumerable, ReentrancyGuard, Ownable {
    using Strings for string;
    using MLB for *;
        
    uint256 public constant MINT_PRICE = 30000000000000000; 
    uint256 public constant MAX_PER_TX = 10; 
    uint256 public MAX_TOKENS = 5000;
    bool public saleIsActive = true;
     
    string[] public TYPES = [
        "sunrise",
        "day",
        "dayClouds",
        "sunset",
        "nightStars"
        "nightCres",
        "nightMoon",
        "mars",
        "marsSunset",
        "halloween"
    ];
           
    
    function getScene(uint tokenId) public view returns (string memory) {
        require(tokenId < totalSupply(), "Scene not minted yet.");
        
        uint lp = scenes[tokenId];
            
        MLB.chartCoords memory cr;
        MLB.layerSettings memory ls;
        MLB.layout memory out;
        MLB.colorSettings memory cs;
        MLB.draw memory d;

        uint[13] memory rands = MLB.getRand(tokenId, lp);
               
        cr.sx = 0;    
        cr.sy = 5050;          
        cr.x = cr.sx;      
        cr.xold = cr.x;
        cr.n = 12;
        cr.xstep = 40 * 12 / cr.n;        
        cr.y = [cr.sy, cr.sy, cr.sy, cr.sy, cr.sy];  
        cr.yold = [cr.sy, cr.sy, cr.sy, cr.sy, cr.sy];  
        cr.sunOffset = rands[10] % 101;        
        
        ls.kHighs = [10, 7, 5, 4, 3];
        ls.maxHighs = [80, 100, 140, 160, 200];
        ls.probMove = [6,5,4,4,4];
        ls.moveThres = [4,5,5,5,5];
        ls.layersAmount = 2 + rands[11] % 4;
        if (lp == 9 && ls.layersAmount > 3) ls.layersAmount = 3;
        if (lp == 3 && ls.layersAmount < 4) ls.layersAmount = 4;
        cs.delta[0] = 0; cs.delta[1] = 0; cs.delta[2] = 0;
        cs.delta[rands[6] % 3] = 5 + rands[7] % 8;

        out.o = "";      
        out.pathCloud = "";
        out.paths = ["", "", "", "", ""];
            
        for (uint i = 0; i < cr.n; i++) {   
            cr.x += cr.xstep;
            for (uint k = 0; k < ls.layersAmount; k++) {
                
                d.move = Strings.strToUint(Strings.substr(MLB.t(rands[k]), i, i + 1));
                d.direction = d.move > ls.moveThres[k] ? 1 : 0;   
                if (i == cr.n - 2) d.direction = 0;
                d.offset = 20 + k * 10 + k * 5 * (1+d.move % 4);
                if (i == 0) {
                    cr.y[k] = cr.y[k] - d.offset;    
                    cr.yold[k] = cr.y[k];
                    out.paths[k] = string(abi.encodePacked(out.paths[k], " L", MLB.t(cr.sx), ",", MLB.t(cr.y[k]))); 
                }
                if (d.direction > 0) {
                    cr.y[k] = cr.y[k] - (1+d.move % ls.probMove[k]) * ls.kHighs[k];
                } else {
                    cr.y[k] = cr.y[k] + (1+d.move % ls.probMove[k]) * ls.kHighs[k];
                }
                
                if (cr.y[k] < cr.sy - ls.maxHighs[k]) cr.y[k] = cr.sy -  ls.maxHighs[k];
                if (cr.y[k] > cr.sy - d.offset) cr.y[k] = cr.sy - d.offset;                  
                
                if (i == cr.n - 1) {        
                    cr.y[k] = cr.sy - d.offset;   
                }
                
                d.flipflag = 1;
                d.kflip = 1 + d.move % 3;
                d.pointsMax = 4 + d.move % 4;        
                d.y1old = cr.yold[k];
                for (uint j = 1; j <= d.pointsMax; j++) { 
                    d.x1 = cr.xold + (cr.x - cr.xold) / d.pointsMax * j;        
                    if (d.flipflag == 1) {
                        if (cr.y[k] > cr.yold[k]) {
                            d.y1 = cr.yold[k] + (cr.y[k] - cr.yold[k]) / d.pointsMax * j + d.kflip * ((d.move * j) % 11 > 4 ? 1 : 0);                           
                        } else {
                            d.y1 = cr.yold[k] - (cr.yold[k] - cr.y[k]) / d.pointsMax * j + d.kflip * ((d.move * j) % 11 > 4 ? 1 : 0);                           
                        }
                    } else {
                        if (cr.y[k] > cr.yold[k]) {
                            d.y1 = cr.yold[k] + (cr.y[k] - cr.yold[k]) / d.pointsMax * j - d.kflip * ((d.move * j) % 11 > 4 ? 1 : 0);                       
                        } else {
                            d.y1 = cr.yold[k] - (cr.yold[k] - cr.y[k]) / d.pointsMax * j - d.kflip * ((d.move * j) % 11 > 4 ? 1 : 0);                       
                        }
                    }
                    if (j < d.pointsMax - 1) {
                        if (d.flipflag == 1) {
                            d.flipflag = 0;
                        } else {
                            d.flipflag = 1;
                        }
                    }
                    if (d.move > 7 && k < 3) {
                        if (j < d.pointsMax) {
                            if (d.direction > 0) {
                                d.y1 = d.y1 + d.move;                
                            } else {
                                d.y1 = d.y1 - d.move;                
                            }
                        }
                        out.paths[k] = string(abi.encodePacked(out.paths[k], " L",MLB.t(cr.xold + (cr.x - cr.xold) / d.pointsMax * (j-1)),",",MLB.t(d.y1)));  
                        
                    } else {
                        out.paths[k] = string(abi.encodePacked(out.paths[k], " C", MLB.t(cr.xold + (cr.x - cr.xold) / d.pointsMax * (j-1)),","));
                        out.paths[k] = string(abi.encodePacked(out.paths[k], MLB.t(d.y1old)," ",MLB.t(d.x1),",",MLB.t(d.y1)," "));
                        out.paths[k] = string(abi.encodePacked(out.paths[k],MLB.t((cr.xold + (cr.x - cr.xold) / d.pointsMax * (2*j-1)/2)),",",MLB.t((d.y1+d.y1old)/2))); 
                    }           
                    
                    d.y1old = d.y1;   
                }             
                if (i == cr.n - 1) {
                    out.paths[k] = string(abi.encodePacked(out.paths[k], " L",MLB.t(cr.x),",",MLB.t(cr.y[k])," L",MLB.t(cr.x),",",MLB.t(cr.sy)));                      
                }
                cr.yold[k] = cr.y[k];                 
                
            }
            
            cr.xold = cr.x;
            
            /* clouds */
            d.move = rands[5];
            d.direction = d.move > 4 ? 1 : 0;  
            if (lp == 2) {    
                if (i == 0) { 
                    d.yc = cr.sy - 200;
                } else if(i == cr.n - 1) {
                    d.yc = cr.sy - 200;
                } else {
                    if (d.direction > 0) {
                        d.yc = cr.sy - 200 - (d.move%3) * 30;
                    } else {
                        d.yc = cr.sy - 200 + (d.move%3) * 30;
                    }
                    if (d.yc < cr.sy - 300) d.yc = cr.sy - 300;
                    if (d.yc > cr.sy) d.yc = cr.sy + 50;
                }
            } else {   
                if (i == 0) { 
                    d.yc = cr.sy - 100;
                }  else if(i == cr.n - 1) {
                    d.yc = cr.sy - 100;
                } else {
                    if (d.direction > 0) {
                        d.yc = cr.sy - 100 - (d.move%7) * 20;
                    } else {
                        d.yc = cr.sy - 100 + (d.move%7) * 20;
                    }
                    if (d.yc < cr.sy - 300) d.yc = cr.sy - 300;
                    if (d.yc > cr.sy) d.yc = cr.sy + 50;
                }
            }         
            out.pathCloud = string(abi.encodePacked(out.pathCloud," L",MLB.t(cr.x),",",MLB.t(d.yc)));
        }
        
        cs.fillopacity = "30%";
        if (lp == 2 || lp == 0 || lp == 3 || lp == 8 ) cs.fillopacity = "10%";
        if (lp >= 0 && lp <= 9) out.o = string(abi.encodePacked(MLB.getLP(tokenId, lp, cs, cr, ls)));

        out.o = string(abi.encodePacked(out.o,'<filter id="farBlur"><feGaussianBlur stdDeviation="2"/></filter><filter id="farBlur2"><feGaussianBlur stdDeviation="1"/></filter>'));
                
        /* mountains layer 3-5 */
        if (ls.layersAmount == 4) out.o = string(abi.encodePacked(out.o, '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy),out.paths[4],' z" stroke="none" fill-opacity="',cs.fillopacity,'%" fill="url(#gradient5)" filter="url(#farBlur)"></path>'));
        if (ls.layersAmount >= 3) out.o = string(abi.encodePacked(out.o, '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy),out.paths[3],' z" stroke="none" fill="url(#gradient4)" filter="url(#farBlur2)"></path>'));
        if (ls.layersAmount >= 2) out.o = string(abi.encodePacked(out.o, '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy),out.paths[2],' z" stroke="none" fill="url(#gradient3)"></path>'));
        
        /* clouds */
        if (lp == 2) {    
            out.o = string(abi.encodePacked(out.o, '<filter id="clouds2" height="300%" width="200%" x="-50%" y="-100%"><feTurbulence type="fractalNoise" baseFrequency=".05" numOctaves="10" /><feDisplacementMap in="SourceGraphic" scale="120" result="cloud"/><feGaussianBlur in="cloud" stdDeviation="8" /></filter>'));
            out.o = string(abi.encodePacked(out.o, '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy-200),out.pathCloud,' L',MLB.t(cr.sx),',',MLB.t(cr.sy-200),' z" stroke="#000" filter="url(#clouds2)" fill="#888" fill-opacity="40%"><animateMotion dur="240s" repeatCount="indefinite" path="M0,0 L480,0 L0,0z" /></path>'));
        } else {
            out.o = string(abi.encodePacked(out.o,  '<filter id="clouds" height="1000%" width="400%" x="-200%" y="-500%"><feTurbulence type="fractalNoise" baseFrequency=".005" numOctaves="10" /><feDisplacementMap in="SourceGraphic" scale="240" result="cloud"/><feGaussianBlur in="cloud" stdDeviation="15" /></filter>'));
            out.o = string(abi.encodePacked(out.o, '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy-100),out.pathCloud,' L',MLB.t(cr.sx),',',MLB.t(cr.sy-100),' z" stroke="#000" filter="url(#clouds)" fill="#fff" fill-opacity="30%"><animateMotion dur="180s" repeatCount="indefinite" path="M0,0 L480,0 L0,0z" /></path>')); 
        }
        
        /* mountains layer 1,2 */
        if (ls.layersAmount >= 1) out.o = string(abi.encodePacked(out.o,  '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy),out.paths[1],' z" stroke="none" fill="url(#gradient2)"></path>'));
        out.o = string(abi.encodePacked(out.o, '<path d="M',MLB.t(cr.sx),',',MLB.t(cr.sy),out.paths[0],' z" stroke="none" fill="url(#gradient1)" ></path>'));        
        return string(abi.encodePacked('<svg id="lps" xmlns="http://www.w3.org/2000/svg"  viewBox="0 4750 480 300"><style>text { font-family: arial }.t{font-size: 10px; fill: #adadad}.at{font-size: 10px; fill:#f6cb27} rect { width:10px; stroke: none}</style><rect x="0" y="4750" style="width:480px;height:100%;fill:url(#lsstyle',MLB.t(lp),'); stroke:none"/>',out.o,'</svg>'));        
     }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        require(tokenId < totalSupply(), "Scene not minted yet.");
        string memory o = getScene(tokenId);
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Mountains #', MLB.t(tokenId), '", "description": "5000 beautiful animated mountain views. Generated and stored completely on-chain. No IPFS.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(o)), '"}'))));
        o = string(abi.encodePacked('data:application/json;base64,', json));

        return o;
    }

    function flipSaleState() external onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    function mint(uint256 amount) external nonReentrant payable {
        require(saleIsActive, "Sale inactive");
        require(amount <= MAX_PER_TX, "Mint up to 10 per tx.");
        require(totalSupply() + amount <= MAX_TOKENS, "Max supply reached");
        require(msg.value >= MINT_PRICE * amount || owner() == _msgSender(), "Try 0.03 eth per scene");
        uint256 index;
        for (uint256 i = 0; i < amount; i++) {
            index = totalSupply();        
            _safeMint(_msgSender(), index);    
        }
    }
    
    function withdrawFunds() external onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    constructor() ERC721("On-Chain Mountains", "GMGN") Ownable() {}
}

/// [MIT License]
/// @title Spectacular mountains
/// @notice functions
/// @author @Cryptodizzie

library MLB {
    
      /* struct draw */
    struct draw {        
        uint move;
        uint direction;
        uint offset;
        uint flipflag;
        uint kflip;
        uint pointsMax;
        uint y1old; uint y1; uint x1;
        uint yc;
    }
    
    /* struct chartCoords */
    struct chartCoords {        
        uint n;
        uint sx; uint sy;  
        uint x; uint xold; uint xstep;          
        uint[5] y;
        uint[5] yold;
        uint sunOffset;
    }
    
    /* struct layerSettings */
    struct layerSettings {
        uint layersAmount;
        uint8[5] kHighs;
        uint8[5] maxHighs;
        uint8[5] probMove;
        uint8[5] moveThres;
    }

    struct layout {
        string[5] paths;
        string o;
        string pathCloud;
    }

    struct colorSettings{        
        uint256[3] delta;
        string sc;
        string sc2;
        string offset_canvas;
        string bottomcolor;
        string fillopacity;
        string[6] bc;
    }
    
        
    function getLP(uint tokenId, uint lp, colorSettings memory cs, chartCoords memory cr, layerSettings memory ls) public pure returns (string memory) {
        uint[13] memory rands = getRand(tokenId, lp);
        string memory dummy;
        
        cs.offset_canvas = "30%";
        
        string memory aer = string(abi.encodePacked('<g transform="translate(100,4720) scale(0.04,0.04)"><path style="fill-opacity:10%" fill="#264823" d="M',t(cr.sx + 150),',',t(cr.sy - 100),'.32c2.97-9.83,9.83-15.37,19.46-18.19c4.14-1.22,9.64-2.21,11.62-5.21c2.09-3.18,0.81-8.63,0.84-13.09c0.06-8.85-0.01-17.71,0.03-26.56c0.04-8.7,3.91-12.62,12.48-12.64c11.97-0.02,23.95,0.08,35.92-0.05c4.3-0.05,7.69,1.34,10.63,4.44c4.97,5.25,10.21,10.26,15.12,15.57c2.06,2.22,3.71,2.7,6.7,1.53c27.01-10.59,53.76-21.94,81.23-31.19c60.14-20.25,115.01-9.4,162.86,32.23c36.03,31.34,34.98,87.11-1.01,118.55c-12.77,11.16-26.8,20.3-42.42,26.93c-2.17,0.92-3.22,2.24-3.86,4.5c-2.9,10.3-5.99,20.56-9.07,30.81c-2.09,6.96-5.32,9.4-12.46,9.4c-27.44,0.02-54.88,0.02-82.31,0c-7.08-0.01-10.41-2.57-12.39-9.49c-3.11-10.89-6.08-21.83-9.36-32.67c-0.48-1.6-2.07-3.44-3.6-4.06c-22.97-9.27-46.04-18.32-69.03-27.55c-2.27-0.91-3.53-0.46-5.11,1.2c-5.05,5.35-10.33,10.49-15.41,15.8c-2.84,2.97-6.12,4.44-10.28,4.41c-12.22-0.1-24.44,0-36.67-0.05c-7.83-0.03-11.91-4.13-11.96-12.06c-0.07-12.47-0.08-24.94,0.03-37.41c0.02-2.46-0.54-3.85-3.08-4.65c-3.55-1.11-6.87-2.98-10.43-4.06c-9.4-2.86-15.83-8.57-18.47-18.2Cz"/><animateMotion dur="1800s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></g>'));
        
        if (lp == 0) {
            /* sunrise */
            cs.bottomcolor = "#474747";
            cs.bc[1] = "#676767";
            cs.sc = "#e1866f";
            cs.sc2 = "#f7e68c";

            
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] =  rgbTint(cs.bc[i], i, 1);
            }
            cs.sc  =  rgbShift(cs.sc, cs.delta[0]*2, cs.delta[1]*2, cs.delta[2]*2, 1);

            /* sunrise */            
            dummy = string(abi.encodePacked('<filter id="sun"><feGaussianBlur stdDeviation="3"/></filter>', stars(4, cr.sx, cr.sy - 300, cr.sx + 400, cr.sy - 100, tokenId),'<circle r="40" cx="',t(cr.sx + 200 + cr.sunOffset),'" cy="',t(cr.sy - 100),'" filter="url(#sun)" fill-opacity="100%" fill="#ffffaa"><animate attributeName="cy" begin="0s" dur="90s" repeatCount="0" from="',t(cr.sy - 100),'" to ="',t(cr.sy - 150),'" fill="freeze"/><animate attributeName="r" begin="0s" dur="15s" repeatCount="0" from="40" to="34" fill="freeze"/></circle>'));
            
        }
        if (lp == 1) {
            
            /* daylight */
            cs.bottomcolor = "#163042";
            cs.bc[1] = "#356382";
            cs.sc = "#0487e2";            
            cs.sc2 = "#afafaf";    
            
            cs.bottomcolor = rgbShift(cs.bottomcolor, cs.delta[0], cs.delta[1], cs.delta[2], 1);
            cs.bc[1] =  rgbShift(cs.bc[1], cs.delta[0], cs.delta[1], cs.delta[2], 1);
            
            /* daylight */
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] = rgbTint(cs.bc[i], i, 1);
            }
            /* daylight sun */            
            dummy = string(abi.encodePacked('<filter id="sun" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="3"/></filter><circle r="20" cx="',t(cr.sx+100),'" cy="',t(cr.sy-200),'" filter="url(#sun)" fill="#ffffaa"><animateMotion dur="3600s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></circle>'));
            
        }   
        
        if (lp == 2) {
            
             /* daycloudy */
            cs.bottomcolor = "#111111";
            cs.bc[1] = "#333333";
            cs.sc = "#cccccc";
            cs.sc2 = "#8f8f8f";
            
            if (cs.delta[0] > 5) cs.delta[0] -=4;
            if (cs.delta[1] > 5) cs.delta[1] -=4; 
            if (cs.delta[2] > 5) cs.delta[2] -=4;
            cs.bottomcolor =  rgbShift(cs.bottomcolor, cs.delta[0],cs.delta[1],cs.delta[2], 1);
            cs.bc[1] =  rgbShift(cs.bc[1], cs.delta[0],cs.delta[1],cs.delta[2], 1);
            
            /* daycloudy */
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] =  rgbTint(cs.bc[i], i, 1);
            }

            /* daycloudy sun */            
            dummy = string(abi.encodePacked('<filter id="sun" x="-200%" y="-200%" width="400%" height="400%"><feGaussianBlur stdDeviation="8"/></filter><circle r="20" cx="',t(cr.sx+100),'" cy="',t(cr.sy-200),'" filter="url(#sun)" fill-opacity="60%" fill="#ffffff"><animateMotion dur="3600s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></circle>','<circle r="80" cx="',t(cr.sx+100),'" cy="',t(cr.sy-200),'" filter="url(#sun)" fill-opacity="20%" fill="#ffffff"><animateMotion dur="3600s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></circle>'));
     
        }
        
        if (lp == 3) {
             /* sunset */
            cs.bottomcolor = "#241818";
            cs.bc[1] = "#4d3535";
            cs.sc = "#0487e2";
            cs.sc2 = "#d44e41";
            cs.offset_canvas = "10%";

            cs.bc[1] =  rgbTint(cs.bc[1], 2, 1);
            cs.bc[2] =  rgbTint(cs.bc[1], 1, 1);
            cs.bc[3] =  rgbTint(cs.bc[1], 2, 1);            
            cs.bc[4] = "#8a5047";
            cs.bc[5] =  rgbTint(cs.bc[1], 4, 1);
            
            cs.sc  =  rgbShift(cs.sc, cs.delta[0]*2, cs.delta[1]*2, cs.delta[2]*2, 1);
            /* sunset */
            dummy = string(abi.encodePacked('<filter id="sun"><feGaussianBlur stdDeviation="3"/></filter><linearGradient id="sungrad" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="30%" stop-color="#ffff88"/><stop offset="90%" stop-color="#cf4b3e"/><animate attributeName="y2" begin="0s" dur="90s" repeatCount="0" from="100%" to="0%" fill="freeze"></animate></linearGradient>'));
            dummy = string(abi.encodePacked(dummy, stars(6, cr.sx, cr.sy - 300, cr.sx + 400, cr.sy - 150, tokenId),'<circle id="suncircle" r="34" cx="',t(cr.sx + 200 + cr.sunOffset),'" cy="',t(cr.sy - 150),'" filter="url(#sun)" fill-opacity="100%" fill="url(#sungrad)"><animate attributeName="cy" begin="0s" dur="90s" repeatCount="0" from="',t(cr.sy - 150),'" to ="',t(cr.sy - 50),'" fill="freeze"/><animate attributeName="r" begin="0s" dur="15s" repeatCount="0" from="34" to="40" fill="freeze"/></circle>'));
        }
        if (lp == 4) {
            /* night stars */  
            cs.sc = "#000000";
            cs.sc2 = "#99a0b4";
            cs.bottomcolor = "#272823";
            cs.bc[1] = "#292927";

            /* night */
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] =  rgbTint(cs.bc[1], i, 1);
            }
            /* night stars */                
            dummy = string(abi.encodePacked(stars(100, cr.sx, cr.sy-300, cr.sx+400, cr.sy, tokenId)));                                 
        }
        if (lp == 5) {
            /* night crescent moon*/
            cs.sc = "#000000";
            cs.sc2 = "#99a0b4";
            cs.bottomcolor = "#272823";
            cs.bc[1] = "#292927";
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] =  rgbTint(cs.bc[1], i, 1);
            }
            
            dummy = string(abi.encodePacked('<radialGradient id="half_moon" fx="15%" fy="40%" r="100%" spreadMethod="pad"><stop offset="50%" stop-color="#000"/><stop offset="100%" stop-color="#ffffdd"/></radialGradient>'));            
            dummy = string(abi.encodePacked(dummy, '<filter id="moon"><feGaussianBlur stdDeviation="1"/></filter>', stars(20, cr.sx, cr.sy - 300, cr.sx + 400, cr.sy, tokenId)));
            dummy = string(abi.encodePacked(dummy, '<circle r="20" cx="',t(cr.sx + 100),'" cy="',t(cr.sy - 200),'" filter="url(#moon)" fill-opacity="100%" fill="url(#half_moon)"><animateMotion dur="3600s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></circle>'));
        }
        if (lp == 6) {
            /* night full moon */  
            cs.sc = "#000000";
            cs.sc2 = "#99a0b4";
            cs.bottomcolor = "#272823";
            cs.bc[1] = "#292927";
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] =  rgbTint(cs.bc[1], i, 1);
            }
                                              
            dummy = string(abi.encodePacked('<filter id="moon"><feGaussianBlur stdDeviation="1"/></filter>', stars(20, cr.sx, cr.sy - 300, cr.sx + 400, cr.sy, tokenId)));
            dummy = string(abi.encodePacked(dummy, '<circle r="20" cx="',t(cr.sx + 100),'" cy="',t(cr.sy - 200),'" filter="url(#moon)" fill-opacity="100%" fill="#c8c0b9"><animateMotion dur="3600s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></circle>'));
        }
        if (lp == 7) {
            cs.bottomcolor = "#413023";
            cs.bc[1] = "#754f33";
            cs.sc = "#f1e0c4";
            cs.sc2 = "#907c55";
            
            cs.bottomcolor =  rgbShift(cs.bottomcolor, cs.delta[0], 0, 0, 1);
            cs.bc[1] =  rgbShift(cs.bc[1], cs.delta[0], 0, 0, 1);
            
            /* mars */
            for (uint i = 1; i<=4; i++) {
                cs.bc[i+1] =  rgbTint(cs.bc[i], i, 1);
            }
            
            /* mars sun */            
            dummy = string(abi.encodePacked('<filter id="sun" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="2"/></filter><circle r="10" cx="',t(cr.sx + 100),'" cy="',t(cr.sy - 200),'" filter="url(#sun)" fill="#ffffff"><animateMotion dur="3600s" repeatCount="indefinite" path="M0,0 A 600,150 1 0 1 600,100 A 600,150 0 0 1 -600,150z" /></circle>'));  
        }
        if (lp == 8) {
            cs.bottomcolor = "#000000";
            cs.bc[1] = "#33394d";
            cs.sc = "#51698c";
            cs.sc2 = "#4d4240";
            cs.offset_canvas = "10%";
           
            /* mars sunset */
            cs.bc[1] =  rgbTint(cs.bc[1], 2, 0);
            cs.bc[2] =  rgbTint(cs.bc[1], 1, 1);
            cs.bc[3] =  rgbTint(cs.bc[1], 2, 1);            
            cs.bc[4] = "#33394d";
            cs.bc[5] =  rgbTint(cs.bc[1], 4, 1);            

            /* mars sunset */            
            dummy = string(abi.encodePacked('<filter id="sun" x="-200%" y="-200%" width="400%" height="400%"><feGaussianBlur stdDeviation="2"/></filter><filter id="sunhalo" x="-200%" y="-200%" width="400%" height="400%"><feGaussianBlur stdDeviation="18"/></filter><ellipse rx="70" ry="100" cx="',t(cr.sx + 200 + cr.sunOffset),'" cy="',t(cr.sy - 120),'" filter="url(#sunhalo)" fill-opacity="50%" fill="#a6b9dc"><animate attributeName="cy" begin="0s" dur="85s" repeatCount="0" from="',t(cr.sy - 120),'" to ="',t(cr.sy - 20),'" fill="freeze"/></ellipse>'));            
            dummy = string(abi.encodePacked(dummy, '<circle id="suncircle" r="10" cx="',t(cr.sx + 200 + cr.sunOffset),'" cy="',t(cr.sy - 150),'" filter="url(#sun)" fill-opacity="100%" fill="#fff"><animate attributeName="cy" begin="0s" dur="90s" repeatCount="0" from="',t(cr.sy - 150),'" to ="',t(cr.sy - 50),'" fill="freeze"/><animate attributeName="r" begin="0s" dur="15s" repeatCount="0" from="10" to="14" fill="freeze"/></circle>'));
        }
        if (lp == 9) {
            cs.sc = "#000000";
            cs.sc2 = "#99a0b4";
            cs.bottomcolor = "#000000";
            cs.bc[1] = "#4f1511";

            /* halloween */
            cs.bc[2] =  rgbTint(cs.bc[1], 1, 1);
            cs.bc[3] =  rgbTint(cs.bc[1], 2, 1);
            
            /* halloween */                                    
            dummy = string(abi.encodePacked('<filter x="-200%" y="-200%" width="400%" height="400%" id="pumpkin"><feColorMatrix type="matrix" result="color" values="1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"></feColorMatrix><feGaussianBlur in="color" stdDeviation="40" result="blur"></feGaussianBlur><feOffset in="blur" dx="0" dy="0" result="offset"></feOffset><feMerge><feMergeNode in="bg"></feMergeNode><feMergeNode in="offset"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter>',stars(20, cr.sx, cr.sy - 300, cr.sx + 400, cr.sy, tokenId)));

            uint trx; uint trxy;
            trx = rands[8] % 101;
            trxy = 50 + rands[9] % 251;
            dummy = string(abi.encodePacked(dummy , '<g transform="translate(100,4700) scale(0.04,0.04)"><animateMotion dur="600s" repeatCount="indefinite" path="M0,0 C',t(trx),',-100 200,',t(trxy),' 200,50 C200-100 20,',t(trxy),' ',t(trx),',50 z" />'));
            dummy = string(abi.encodePacked(dummy, '<path filter="url(#pumpkin)" style="stroke:none;fill:#c9782c;" d="M ',t(cr.sx + 400),' ',t(cr.sy - 100),'l-4,13l-4,12l-5,13l-5,12l-5,12l-8,11l-8,11l-8,10l-9,10l-8,11l-8,10l-10,9l-10,10l-10,9l-10,-14l-9,-14l-10,-13l-3,15l-4,15l-3,16l-3,15l-13,3l-13,3l-12,3l-13,2l-13,0l-13,1l-12,-1l-13,-3l-13,-1l-12,-4l-12,-3l-12,-4l-4,-15l-4,-14l-3,-15l-4,-15l-8,13l-7,14l-8,13l-12,-11l-12,-10l-11,-10l-10,-13l-10,-12l-10,-12l-8,-14l-8,-14l-7,-14l-5,-14l-6,-15l-6,-15l13,9l14,8l13,8l14,7l15,5l14,7l3,14l3,13l3,14l3,14l7,-11l8,-10l7,-11l6,-11l14,2l13,3l13,2l13,2l13,1l14,1l13,0l14,0l13,-1l13,-1l14,-2l13,-1l13,-4l13,-3l14,-1l9,13l9,14l9,14l4,-14l2,-13l3,-14l3,-13l13,-8l14,-7l13,-9l14,-7l13,-9l13,-9zm-420,-94l8,-20l11,-19l14,-15l15,-16l12,17l13,16l12,16l13,15l15,14l13,15l15,14l-22,3l-21,0l-21,0l-21,-2l-21,-5l-21,-5l-20,-8zm9,-66l8,-12l10,-13l9,-12l10,-10l6,-4l9,17l9,12l9,12l9,11l9,12l10,12l11,12l11,11l10,12l1,2l-1,-1l-13,-11l-13,-10l-12,-11l-9,-9l-9,-9l-9,-9l-6,-6l-9,-13l-11,-12l-13,9l-12,11l-15,11zm147,124l11,4l11,1l10,3l11,1l11,-2l10,-4l11,-3l10,-4l9,-5l-12,17l-9,18l-10,18l-8,18l-8,19l-10,-18l-11,-17l-11,-17l-12,-17l-12,-16zm102,-39l12,-16l13,-16l12,-16l12,-16l11,-17l10,-18l18,14l14,16l12,17l10,19l7,20l-19,10l-20,7l-21,5l-21,3l-21,3l-21,1l-21,-1zm-12,-18l9,-14l9,-13l9,-14l8,-15l8,-15l9,-14l5,-13l6,-13l5,-13l0,0l16,10l11,11l11,10l11,11l3,3l-3,-1l-10,-7l-12,-5l-11,-6l-10,-4l-8,14l-9,13l-8,14l-8,10l-7,11l-9,11l-8,10l-9,10l-9,11zm234,-133c-1,-1,-2,-2,-3,-2c2,6,3,14,5,18c4,8,8,15,11,19c3,4,6,23,5,43c-1,20,-5,30,-10,41c-1,-3,2,-19,2,-27c0,-8,0,-32,-1,-37c-3,-15,-24,-55,-36,-69c-6,-2,-12,-4,-18,-7c-16,-9,-22,-21,-49,-27c-18,-5,-34,-1,-46,1c2,3,10,9,10,9c5,6,9,13,13,20c1,5,3,10,3,13c0,3,9,16,13,21c7,10,3,26,4,36c-6,-8,-8,-18,-9,-25c-1,-7,-12,-20,-17,-30c-6,-10,-15,-16,-16,-20c1,-8,-4,-13,-7,-14c-3,-2,-14,-6,-21,-8c-4,-8,-14,-12,-44,-11c0,-7,-2,-10,-10,-12c-9,-4,-16,7,-23,-23c-7,-30,-52,-71,-67,-92c-15,-21,-32,17,-18,34c39,48,19,79,-3,78c-12,0,-16,6,-17,11c-9,0,-17,-2,-26,1c-4,1,-8,4,-9,6c-2,4,-18,24,-22,30c-2,12,-9,20,-15,28c1,-15,2,-25,6,-39c4,-7,9,-14,15,-20c-19,0,-30,-5,-58,-1c-14,3,-26,8,-36,14c-6,4,-13,11,-14,14c-1,2,-23,16,-24,28c-1,10,-6,25,-10,32c-6,12,-7,44,-7,44c0,0,-4,-23,-4,-23c1,-12,3,-24,4,-36c0,0,4,-18,9,-22c2,-2,5,-12,8,-19c-8,4,-17,9,-23,14c-53,43,-81,110,-84,188c-3,105,35,202,123,263c15,10,36,20,57,28c-17,-14,-36,-33,-51,-52c-5,-19,-10,-37,-11,-57c-1,-15,1,-26,6,-39c1,50,3,63,24,102c13,8,13,15,27,23c9,12,19,22,29,31c10,2,20,3,29,4c9,5,17,9,25,13c18,2,31,-1,49,-3c-8,-5,-17,-11,-20,-10c-8,3,-30,-26,-30,-31c-1,-9,-3,-23,-7,-36c12,16,21,36,24,45c4,5,11,8,24,12c9,9,18,20,28,25c10,2,86,8,102,-1c3,-6,14,-13,16,-18c4,-8,11,-14,16,-22c5,-7,9,-15,12,-24c5,-5,6,-13,14,-18c-4,11,-8,22,-13,33c0,8,-1,17,-4,24c-10,10,-18,19,-28,26c5,0,12,-1,18,-3c15,-3,42,-9,49,-12c3,-6,5,-12,7,-18c6,-5,13,-10,18,-16c9,-7,17,-15,24,-24c6,-7,12,-15,17,-23c5,-11,10,-24,14,-37c0,17,-2,34,-5,50c-9,11,-18,21,-27,30c-4,7,-8,12,-13,18c-3,4,-6,8,-9,12c10,-4,20,-9,30,-15c83,-55,142,-154,146,-253c3,-81,5,-146,-71,-206 "/></g>'));                            
        }
        
        if (rands[12] % 337 < 110 && lp < 4) dummy = string(abi.encodePacked(aer, dummy));
        
        dummy = string(abi.encodePacked(dummy, '<linearGradient id="lsstyle',t(lp),'" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="',cs.offset_canvas,'" stop-color="',cs.sc,'"/><stop offset="',(lp == 3 ? '60' : '100'),'%" stop-color="',cs.sc2,'"/>',(lp == 3 ? '<stop offset="70%" stop-color="#974638"/><animate attributeName="y2" begin="0s" dur="15s" repeatCount="0" from="100%" to="90%" fill="freeze"></animate>' : ''),'</linearGradient>'));
        
        /* mountains */
        for (uint layer = 1; layer <= ls.layersAmount; layer++) {    
            dummy = string(abi.encodePacked(dummy, '<linearGradient id="gradient',t(layer),'" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="',(layer == 3 ? "40%" : (layer == 2 ? "60%" : "20%")),'" stop-color="',cs.bc[layer],'"/><stop offset="100%" stop-color="',(layer == 1 ? cs.bottomcolor : cs.bc[5]),'"/></linearGradient>'));
        }
        return dummy;
    }
    
    function bytesToUint(bytes memory b) internal pure returns (uint256) {
        uint256 number;
        for(uint i=0;i<b.length;i++){
            number = number + uint(uint8(b[i])*(2**(8*(b.length-(i+1)))));
        }
        return number;
    }
    
    function t(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
     function getRand(uint tokenId, uint lp) public pure returns(uint[13] memory) {
         string memory tid = t(tokenId);
         string memory lid = t(lp);
         
         return [
                random(abi.encodePacked("FIRST",  tid, lid)),
                random(abi.encodePacked("SECOND", tid, lid)),
                random(abi.encodePacked("THIRD",  tid, lid)),
                random(abi.encodePacked("FOURTH", tid, lid)),
                random(abi.encodePacked("FIFTH",  tid, lid)),
                random(abi.encodePacked("CLOUDS", tid, lid)),
                random(abi.encodePacked("CHANNEL",  tid, lid)),
                random(abi.encodePacked("RGBVALUE", tid, lid)),
                random(abi.encodePacked("TR1X",  tid, lid)),
                random(abi.encodePacked("TR1Y",  tid, lid)),
                random(abi.encodePacked("SUNOFFSET", tid, lid)),
                random(abi.encodePacked("LAYERS", tid, lid)),
                random(abi.encodePacked("AEROSTAT", tid, lid))
        ];
    } 
    
    function random(bytes memory input) public pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(string(input))));
    }
    
        

    function hexToRGB(string memory rgb) public pure returns (uint[3] memory) {
        return [
            Strings.fromHex(Strings.substr(rgb, 1, 3)),
            Strings.fromHex(Strings.substr(rgb, 3, 5)),
            Strings.fromHex(Strings.substr(rgb, 5, 7))
        ];
    }
    
    function rgbTint(string memory rgb, uint k, uint sig)  public pure returns (string memory) {
        return rgbShift(rgb, k*10, k*10, k*10, sig);
    }
    
    function rgbShift(string memory rgb, uint dr, uint dg, uint db, uint sig) public pure returns (string memory) {            
        uint[3] memory rgbarr = hexToRGB(rgb);
        uint[3] memory rgbres;
        
        if (sig == 1) {
            rgbres = [rgbarr[0] + (255 - rgbarr[0]) * dr / 100, rgbarr[1] + (255 - rgbarr[1]) * dg / 100, rgbarr[2] + (255 - rgbarr[2]) * db / 100];
        } else {
            rgbres = [rgbarr[0] - (255 - rgbarr[0]) * dr / 100, rgbarr[1] - (255 - rgbarr[1]) * dg / 100, rgbarr[2] - (255 - rgbarr[2]) * db / 100];
        }
        
        if (rgbres[0] > 255) rgbres[0] = 255; 
        if (rgbres[1] > 255) rgbres[1] = 255;
        if (rgbres[2] > 255) rgbres[2] = 255;        
        return rgbToHex(rgbres);
    }
    
    function rgbToHex(uint[3] memory rgbres) public pure returns (string memory)  {
        return string(abi.encodePacked("#",Strings.toHexString(rgbres[0]),Strings.toHexString(rgbres[1]),Strings.toHexString(rgbres[2])));
    }
      
    function stars(uint n, uint fromx, uint fromy, uint tox, uint toy, uint tokenId)  public pure returns (string memory)  {
        require(toy != fromy, "Error toy and fromy");
        string memory result = "";
        uint x; uint y; uint opacity; uint offsetx; uint offsety; 
        for (uint i = 1; i<=n; i++) {
            
            offsetx = random(abi.encodePacked("XFAEB", t(tokenId * i))) % 201;    
            offsety = random(abi.encodePacked("YF24C", t(tokenId * i))) % 201;    
            
            x = (fromx * 100 + (tox * 100 - fromx * 100) / 200 * offsetx) / 100;
            y = (fromy * 100 + (toy * 100 - fromy * 100) / 200 * offsety) / 100;            
            if (y < fromy && toy >= fromy)  {
                opacity = 0;
            } else if (toy < fromy && y >= fromy) {
                opacity = 0;
            } else {
                opacity = 100 - 100 * (y-fromy) / (toy-fromy);
            }
            result = string(abi.encodePacked(result, '<circle cx="',t(x),'" cy="',t(y),'" r="0.5" fill="#fff" fill-opacity="',t(opacity),'%"></circle>'));
        }
        return result;
    }
}


/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TYPES","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":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getScene","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"scenes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

611388600d55600e805460ff1916600117905560076101a09081526673756e7269736560c81b6101c052608090815260036101e09081526264617960e81b6102005260a052600961022081815268646179436c6f75647360b81b6102405260c0526006610260908152651cdd5b9cd95d60d21b6102805260e05260136102a09081527f6e6967687453746172736e6967687443726573000000000000000000000000006102c052610100526102e0818152683734b3b43a26b7b7b760b91b61030052610120526004610320908152636d61727360e01b6103405261014052600a610360908152691b585c9cd4dd5b9cd95d60b21b61038052610160526103e06040526103a0818152683430b63637bbb2b2b760b91b6103c052610180526200012a91600f9162000210565b503480156200013857600080fd5b5060408051808201825260128152714f6e2d436861696e204d6f756e7461696e7360701b60208083019182528351808501909452600484526323a6a3a760e11b9084015281519192916200018f9160009162000274565b508051620001a590600190602084019062000274565b50506001600b5550620001b833620001be565b620003b6565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000262579160200282015b828111156200026257825180516200025191849160209091019062000274565b509160200191906001019062000231565b5062000270929150620002ff565b5090565b828054620002829062000379565b90600052602060002090601f016020900481019282620002a65760008555620002f1565b82601f10620002c157805160ff1916838001178555620002f1565b82800160010185558215620002f1579182015b82811115620002f1578251825591602001919060010190620002d4565b506200027092915062000320565b808211156200027057600062000316828262000337565b50600101620002ff565b5b8082111562000270576000815560010162000321565b508054620003459062000379565b6000825580601f1062000356575050565b601f01602090049060005260206000209081019062000376919062000320565b50565b600181811c908216806200038e57607f821691505b60208210811415620003b057634e487b7160e01b600052602260045260246000fd5b50919050565b61505180620003c66000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063b88d4fde11610095578063eb8d244411610064578063eb8d24441461050d578063f2fde38b14610527578063f43a22dc14610547578063f47c84c51461055c57600080fd5b8063b88d4fde14610469578063c002d23d14610489578063c87b56dd146104a4578063e985e9c5146104c457600080fd5b806395d89b41116100d157806395d89b4114610401578063a0712d6814610416578063a22cb46514610429578063aa45a16e1461044957600080fd5b806370a08231146103ae578063715018a6146103ce5780638da5cb5b146103e357600080fd5b806324600fc31161016457806334918dfd1161013e57806334918dfd1461033957806342842e0e1461034e5780634f6ccce71461036e5780636352211e1461038e57600080fd5b806324600fc3146102d75780632f745c59146102ec57806332c57cec1461030c57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806318160ddd1461027857806322d7642e1461029757806323b872dd146102b757600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e23660046139b5565b610572565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b5061021161059d565b6040516101f39190614c05565b34801561022a57600080fd5b5061023e610239366004613a66565b61062f565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004613902565b6106c9565b005b34801561028457600080fd5b506009545b6040519081526020016101f3565b3480156102a357600080fd5b506102116102b2366004613a66565b6107df565b3480156102c357600080fd5b506102766102d23660046137df565b612024565b3480156102e357600080fd5b50610276612055565b3480156102f857600080fd5b50610289610307366004613902565b6120b2565b34801561031857600080fd5b50610289610327366004613a66565b60026020526000908152604090205481565b34801561034557600080fd5b50610276612148565b34801561035a57600080fd5b506102766103693660046137df565b612186565b34801561037a57600080fd5b50610289610389366004613a66565b6121a1565b34801561039a57600080fd5b5061023e6103a9366004613a66565b612234565b3480156103ba57600080fd5b506102896103c936600461378a565b6122ab565b3480156103da57600080fd5b50610276612332565b3480156103ef57600080fd5b50600c546001600160a01b031661023e565b34801561040d57600080fd5b50610211612368565b610276610424366004613a66565b612377565b34801561043557600080fd5b506102766104443660046138c6565b612559565b34801561045557600080fd5b50610211610464366004613a66565b61261e565b34801561047557600080fd5b5061027661048436600461381b565b6126ca565b34801561049557600080fd5b50610289666a94d74f43000081565b3480156104b057600080fd5b506102116104bf366004613a66565b612702565b3480156104d057600080fd5b506101e76104df3660046137ac565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561051957600080fd5b50600e546101e79060ff1681565b34801561053357600080fd5b5061027661054236600461378a565b6127c7565b34801561055357600080fd5b50610289600a81565b34801561056857600080fd5b50610289600d5481565b60006001600160e01b0319821663780e9d6360e01b1480610597575061059782612862565b92915050565b6060600080546105ac90614ecd565b80601f01602080910402602001604051908101604052809291908181526020018280546105d890614ecd565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166106ad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006106d482612234565b9050806001600160a01b0316836001600160a01b031614156107425760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106a4565b336001600160a01b038216148061075e575061075e81336104df565b6107d05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106a4565b6107da83836128b2565b505050565b60606107ea60095490565b82106108305760405162461bcd60e51b815260206004820152601560248201527429b1b2b732903737ba1036b4b73a32b2103cb2ba1760591b60448201526064016106a4565b6000828152600260205260409020546108476135e9565b61084f613641565b610857613687565b61085f6136ae565b6108b5604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405163105cffef60e21b815260048101899052602481018790526000907315bd6f38056a7b094a9f7004f918863d792ff2f990634173ffbc906044016101a06040518083038186803b15801561090b57600080fd5b505af415801561091f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610943919061392c565b6000602088018190526113ba6040890152606088018190526080880152600c808852909150610974906101e0614e57565b60a0878101919091526040805180830182528189018051825280516020808401919091528151838501528151606080850191909152825160808086019190915260c08d0194909452845195860185528251865282519186019190915281519385019390935280519284019290925290519082015260e08701526101408101516109ff90606590614f23565b6101008701526040805160a08082018352600a8252600760208084019190915260058385018190526004606080860182905260036080808801919091528c8501969096528651808601885260508152606481860152608c8189015280820186905260c8818801528c88015286518086018852600681528085018490528088018390528082018390528087018390528c820152865194850187528185529284018290529483018190529082018190528183015290870152610160820151610ac59190614f23565b610ad0906002614e3f565b8552600987148015610ae3575084516003105b15610aed57600385525b866003148015610afe575084516004115b15610b0857600485525b8251600090819052835160200181905283516040015260e0810151610b2f90600890614f23565b610b3a906005614e3f565b835160c0830151610b4d90600390614f23565b60038110610b5d57610b5d614f79565b602090810291909101919091526040805180830182526000808252878401919091528151808401835281815287830152815160c08101835260a081018281528152825180850184528281528185015282518085018452828152818401528251808501845282815260608201528251938401909252808352608082019290925285525b8651811015611ba5578660a0015187606001818151610bfe9190614e3f565b90525060005b86518110156118d257610c48610c43610c328584600d8110610c2857610c28614f79565b6020020151612920565b84610c3e816001614e3f565b612a26565b612af3565b845260808701518160058110610c6057610c60614f79565b602002015160ff16846000015111610c79576000610c7c565b60015b60ff1660208501528751610c9290600290614e8a565b821415610ca157600060208501525b8351610caf90600490614f23565b610cba906001614e3f565b610cc5826005614e6b565b610ccf9190614e6b565b610cda82600a614e6b565b610ce5906014614e3f565b610cef9190614e3f565b604085015281610ded5783604001518860c001518260058110610d1457610d14614f79565b6020020151610d239190614e8a565b8860c001518260058110610d3957610d39614f79565b602002015260c08801518160058110610d5457610d54614f79565b60200201518860e001518260058110610d6f57610d6f614f79565b602002015285518160058110610d8757610d87614f79565b6020020151610d998960200151612920565b610db28a60c001518460058110610c2857610c28614f79565b604051602001610dc493929190614617565b60408051601f1981840301815291905286518260058110610de757610de7614f79565b60200201525b602084015115610e995786602001518160058110610e0d57610e0d614f79565b602002015160ff1687606001518260058110610e2b57610e2b614f79565b60200201518551610e3f9160ff1690614f23565b610e4a906001614e3f565b610e549190614e6b565b8860c001518260058110610e6a57610e6a614f79565b6020020151610e799190614e8a565b8860c001518260058110610e8f57610e8f614f79565b6020020152610f37565b86602001518160058110610eaf57610eaf614f79565b602002015160ff1687606001518260058110610ecd57610ecd614f79565b60200201518551610ee19160ff1690614f23565b610eec906001614e3f565b610ef69190614e6b565b8860c001518260058110610f0c57610f0c614f79565b6020020151610f1b9190614e3f565b8860c001518260058110610f3157610f31614f79565b60200201525b86604001518160058110610f4d57610f4d614f79565b602002015160ff168860400151610f649190614e8a565b8860c001518260058110610f7a57610f7a614f79565b60200201511015610fce5786604001518160058110610f9b57610f9b614f79565b602002015160ff168860400151610fb29190614e8a565b8860c001518260058110610fc857610fc8614f79565b60200201525b83604001518860400151610fe29190614e8a565b8860c001518260058110610ff857610ff8614f79565b6020020151111561103357836040015188604001516110179190614e8a565b8860c00151826005811061102d5761102d614f79565b60200201525b875161104190600190614e8a565b821415611078578360400151886040015161105c9190614e8a565b8860c00151826005811061107257611072614f79565b60200201525b60016060850152835161108d90600390614f23565b611098906001614e3f565b608085015283516110ab90600490614f23565b6110b6906004614e3f565b60a085015260e088015181600581106110d1576110d1614f79565b602002015160c085015260015b8460a0015181116117df57808560a001518a608001518b606001516111039190614e8a565b61110d9190614e57565b6111179190614e6b565b89608001516111269190614e3f565b610100860152606085015160011415611305578860e00151826005811061114f5761114f614f79565b60200201518960c00151836005811061116a5761116a614f79565b60200201511115611247576004600b8287600001516111899190614e6b565b6111939190614f23565b1161119f5760006111a2565b60015b60ff1685608001516111b49190614e6b565b818660a001518b60e0015185600581106111d0576111d0614f79565b60200201518c60c0015186600581106111eb576111eb614f79565b60200201516111fa9190614e8a565b6112049190614e57565b61120e9190614e6b565b8a60e00151846005811061122457611224614f79565b60200201516112339190614e3f565b61123d9190614e3f565b60e08601526114d7565b6004600b82876000015161125b9190614e6b565b6112659190614f23565b11611271576000611274565b60015b60ff1685608001516112869190614e6b565b818660a001518b60c0015185600581106112a2576112a2614f79565b60200201518c60e0015186600581106112bd576112bd614f79565b60200201516112cc9190614e8a565b6112d69190614e57565b6112e09190614e6b565b8a60e0015184600581106112f6576112f6614f79565b60200201516112339190614e8a565b8860e00151826005811061131b5761131b614f79565b60200201518960c00151836005811061133657611336614f79565b60200201511115611409576004600b8287600001516113559190614e6b565b61135f9190614f23565b1161136b57600061136e565b60015b60ff1685608001516113809190614e6b565b818660a001518b60e00151856005811061139c5761139c614f79565b60200201518c60c0015186600581106113b7576113b7614f79565b60200201516113c69190614e8a565b6113d09190614e57565b6113da9190614e6b565b8a60e0015184600581106113f0576113f0614f79565b60200201516113ff9190614e3f565b61123d9190614e8a565b6004600b82876000015161141d9190614e6b565b6114279190614f23565b11611433576000611436565b60015b60ff1685608001516114489190614e6b565b818660a001518b60c00151856005811061146457611464614f79565b60200201518c60e00151866005811061147f5761147f614f79565b602002015161148e9190614e8a565b6114989190614e57565b6114a29190614e6b565b8a60e0015184600581106114b8576114b8614f79565b60200201516114c79190614e8a565b6114d19190614e8a565b60e08601525b60018560a001516114e89190614e8a565b811015611510578460600151600114156115085760006060860152611510565b600160608601525b845160071080156115215750600382105b15611621578460a0015181101561156e5760208501511561155757845160e086015161154d9190614e3f565b60e086015261156e565b845160e08601516115689190614e8a565b60e08601525b8651826005811061158157611581614f79565b60200201516115d5611594600184614e8a565b8760a001518c608001518d606001516115ad9190614e8a565b6115b79190614e57565b6115c19190614e6b565b8b608001516115d09190614e3f565b612920565b6115e28760e00151612920565b6040516020016115f493929190614617565b60408051601f198184030181529190528751836005811061161757611617614f79565b60200201526117c3565b8651826005811061163457611634614f79565b6020020151611647611594600184614e8a565b604051602001611658929190614873565b60408051601f198184030181529190528751836005811061167b5761167b614f79565b60200201528651826005811061169357611693614f79565b60200201516116a58660c00151612920565b6116b3876101000151612920565b6116c08860e00151612920565b6040516020016116d39493929190613c96565b60408051601f19818403018152919052875183600581106116f6576116f6614f79565b60200201528651826005811061170e5761170e614f79565b6020020151611765600260016117248583614e6b565b61172e9190614e8a565b8860a001518d608001518e606001516117479190614e8a565b6117519190614e57565b61175b9190614e6b565b6115c19190614e57565b61178860028860c001518960e0015161177e9190614e3f565b6115d09190614e57565b60405160200161179a93929190613c46565b60408051601f19818403018152919052875183600581106117bd576117bd614f79565b60200201525b60e085015160c0860152806117d781614f08565b9150506110de565b5087516117ee90600190614e8a565b82141561188a578551816005811061180857611808614f79565b602002015161181a8960600151612920565b6118338a60c001518460058110610c2857610c28614f79565b6118408b60600151612920565b61184d8c60400151612920565b604051602001611861959493929190614677565b60408051601f198184030181529190528651826005811061188457611884614f79565b60200201525b8760c0015181600581106118a0576118a0614f79565b60200201518860e0015182600581106118bb576118bb614f79565b6020020152806118ca81614f08565b915050610c04565b506060870151608088015260a08201518084526004106118f35760006118f6565b60015b60ff1660208401526002881415611a2f57806119285760c8876040015161191d9190614e8a565b610120840152611b4e565b865161193690600190614e8a565b81141561194e5760c8876040015161191d9190614e8a565b60208301511561199757825161196690600390614f23565b61197190601e614e6b565b60c888604001516119829190614e8a565b61198c9190614e8a565b6101208401526119d2565b82516119a590600390614f23565b6119b090601e614e6b565b60c888604001516119c19190614e8a565b6119cb9190614e3f565b6101208401525b61012c87604001516119e49190614e8a565b8361012001511015611a095761012c8760400151611a029190614e8a565b6101208401525b86604001518361012001511115611a2a57604087015161191d906032614e3f565b611b4e565b80611a45576064876040015161191d9190614e8a565b8651611a5390600190614e8a565b811415611a6b576064876040015161191d9190614e8a565b602083015115611ab4578251611a8390600790614f23565b611a8e906014614e6b565b60648860400151611a9f9190614e8a565b611aa99190614e8a565b610120840152611aef565b8251611ac290600790614f23565b611acd906014614e6b565b60648860400151611ade9190614e8a565b611ae89190614e3f565b6101208401525b61012c8760400151611b019190614e8a565b8361012001511015611b265761012c8760400151611b1f9190614e8a565b6101208401525b86604001518361012001511115611b4e576040870151611b47906032614e3f565b6101208401525b8460400151611b608860600151612920565b611b6e856101200151612920565b604051602001611b8093929190614617565b60408051601f1981840301815291815286015280611b9d81614f08565b915050610bdf565b5060408051808201909152600381526233302560e81b602082015260a08401526002871480611bd2575086155b80611bdd5750866003145b80611be85750866008145b15611c0d5760408051808201909152600381526231302560e81b602082015260a08401525b60098711611cce5760405163eb1c754960e01b81527315bd6f38056a7b094a9f7004f918863d792ff2f99063eb1c754990611c54908c908b9088908c908c90600401614cf0565b60006040518083038186803b158015611c6c57600080fd5b505af4158015611c80573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ca891908101906139ef565b604051602001611cb89190613c2a565b60408051601f1981840301815291905260208501525b602080850151604051611ce1920161455a565b60408051601f198184030181529190526020850152845160041415611d54578360200151611d128760200151612920565b611d1f8860400151612920565b86516080015160a0870151604051611d3e95949392919060200161444c565b60408051601f1981840301815291905260208501525b8451600311611dab578360200151611d6f8760200151612920565b611d7c8860400151612920565b865160600151604051611d959493929190602001613f20565b60408051601f1981840301815291905260208501525b8451600211611e05578360200151611dc68760200151612920565b611dd38860400151612920565b865160026020020151604051602001611def9493929190613e70565b60408051601f1981840301815291905260208501525b8660021415611eae57602080850151604051611e219201614719565b60408051601f198184030181529190526020858101829052870151611e4590612920565b611e5960c889604001516115d09190614e8a565b8660400151611e6b8a60200151612920565b611e7f60c88c604001516115d09190614e8a565b604051602001611e9496959493929190613fee565b60408051601f198184030181529190526020850152611f4a565b602080850151604051611ec19201613d13565b60408051601f198184030181529190526020858101829052870151611ee590612920565b611ef9606489604001516115d09190614e8a565b8660400151611f0b8a60200151612920565b611f1f60648c604001516115d09190614e8a565b604051602001611f3496959493929190614174565b60408051601f1981840301815291905260208501525b8451600111611fa0578360200151611f658760200151612920565b611f728860400151612920565b8651602090810151604051611f8a959493920161439c565b60408051601f1981840301815291905260208501525b8360200151611fb28760200151612920565b611fbf8860400151612920565b865151604051611fd594939291906020016142eb565b60408051601f198184030181529190526020850152611ff387612920565b6020808601516040516120079392016148be565b604051602081830303815290604052975050505050505050919050565b61202e3382612bb7565b61204a5760405162461bcd60e51b81526004016106a490614c9f565b6107da838383612caa565b600c546001600160a01b0316331461207f5760405162461bcd60e51b81526004016106a490614c6a565b6040514790339082156108fc029083906000818181858888f193505050501580156120ae573d6000803e3d6000fd5b5050565b60006120bd836122ab565b821061211f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106a4565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600c546001600160a01b031633146121725760405162461bcd60e51b81526004016106a490614c6a565b600e805460ff19811660ff90911615179055565b6107da838383604051806020016040528060008152506126ca565b60006121ac60095490565b821061220f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106a4565b6009828154811061222257612222614f79565b90600052602060002001549050919050565b6000818152600360205260408120546001600160a01b0316806105975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106a4565b60006001600160a01b0382166123165760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106a4565b506001600160a01b031660009081526004602052604090205490565b600c546001600160a01b0316331461235c5760405162461bcd60e51b81526004016106a490614c6a565b6123666000612e55565b565b6060600180546105ac90614ecd565b6002600b5414156123ca5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a4565b6002600b55600e5460ff166124115760405162461bcd60e51b815260206004820152600d60248201526c53616c6520696e61637469766560981b60448201526064016106a4565b600a81111561245a5760405162461bcd60e51b815260206004820152601560248201527426b4b73a103ab8103a37901898103832b9103a3c1760591b60448201526064016106a4565b600d548161246760095490565b6124719190614e3f565b11156124b45760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b60448201526064016106a4565b6124c581666a94d74f430000614e6b565b341015806124dd5750600c546001600160a01b031633145b6125225760405162461bcd60e51b815260206004820152601660248201527554727920302e30332065746820706572207363656e6560501b60448201526064016106a4565b6000805b8281101561254f57600954915061253d3383612ea7565b8061254781614f08565b915050612526565b50506001600b5550565b6001600160a01b0382163314156125b25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106a4565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f818154811061262e57600080fd5b90600052602060002001600091509050805461264990614ecd565b80601f016020809104026020016040519081016040528092919081815260200182805461267590614ecd565b80156126c25780601f10612697576101008083540402835291602001916126c2565b820191906000526020600020905b8154815290600101906020018083116126a557829003601f168201915b505050505081565b6126d43383612bb7565b6126f05760405162461bcd60e51b81526004016106a490614c9f565b6126fc84848484612ec1565b50505050565b606061270d60095490565b82106127535760405162461bcd60e51b815260206004820152601560248201527429b1b2b732903737ba1036b4b73a32b2103cb2ba1760591b60448201526064016106a4565b600061275e836107df565b9050600061279c61276e85612920565b61277784612ef4565b604051602001612788929190614a75565b604051602081830303815290604052612ef4565b9050806040516020016127af9190614b8d565b60408051601f19818403018152919052949350505050565b600c546001600160a01b031633146127f15760405162461bcd60e51b81526004016106a490614c6a565b6001600160a01b0381166128565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a4565b61285f81612e55565b50565b60006001600160e01b031982166380ac58cd60e01b148061289357506001600160e01b03198216635b5e139f60e01b145b8061059757506301ffc9a760e01b6001600160e01b0319831614610597565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906128e782612234565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816129445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561296e578061295881614f08565b91506129679050600a83614e57565b9150612948565b60008167ffffffffffffffff81111561298957612989614f8f565b6040519080825280601f01601f1916602001820160405280156129b3576020820181803683370190505b5090505b8415612a1e576129c8600183614e8a565b91506129d5600a86614f23565b6129e0906030614e3f565b60f81b8183815181106129f5576129f5614f79565b60200101906001600160f81b031916908160001a905350612a17600a86614e57565b94506129b7565b949350505050565b6060836000612a358585614e8a565b67ffffffffffffffff811115612a4d57612a4d614f8f565b6040519080825280601f01601f191660200182016040528015612a77576020820181803683370190505b509050845b84811015612ae957828181518110612a9657612a96614f79565b01602001516001600160f81b03191682612ab08884614e8a565b81518110612ac057612ac0614f79565b60200101906001600160f81b031916908160001a90535080612ae181614f08565b915050612a7c565b5095945050505050565b60008181805b8251811015612baf57603060f81b838281518110612b1957612b19614f79565b01602001516001600160f81b03191610801590612b5a5750603960f81b838281518110612b4857612b48614f79565b01602001516001600160f81b03191611155b15612b9d576030838281518110612b7357612b73614f79565b0160200151612b85919060f81c614e8a565b612b9083600a614e6b565b612b9a9190614e3f565b91505b80612ba781614f08565b915050612af9565b509392505050565b6000818152600360205260408120546001600160a01b0316612c305760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106a4565b6000612c3b83612234565b9050806001600160a01b0316846001600160a01b03161480612c765750836001600160a01b0316612c6b8461062f565b6001600160a01b0316145b80612a1e57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16612a1e565b826001600160a01b0316612cbd82612234565b6001600160a01b031614612d255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106a4565b6001600160a01b038216612d875760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106a4565b612d9283838361305a565b612d9d6000826128b2565b6001600160a01b0383166000908152600460205260408120805460019290612dc6908490614e8a565b90915550506001600160a01b0382166000908152600460205260408120805460019290612df4908490614e3f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120ae828260405180602001604052806000815250613112565b612ecc848484612caa565b612ed884848484613145565b6126fc5760405162461bcd60e51b81526004016106a490614c18565b805160609080612f14575050604080516020810190915260008152919050565b60006003612f23836002614e3f565b612f2d9190614e57565b612f38906004614e6b565b90506000612f47826020614e3f565b67ffffffffffffffff811115612f5f57612f5f614f8f565b6040519080825280601f01601f191660200182016040528015612f89576020820181803683370190505b5090506000604051806060016040528060408152602001614fbc604091399050600181016020830160005b86811015613015576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612fb4565b50600386066001811461302f57600281146130405761304c565b613d3d60f01b60011983015261304c565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166130b5576130b081600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6130d8565b816001600160a01b0316836001600160a01b0316146130d8576130d88382613252565b6001600160a01b0382166130ef576107da816132ef565b826001600160a01b0316826001600160a01b0316146107da576107da828261339e565b61311c83836133e2565b6131296000848484613145565b6107da5760405162461bcd60e51b81526004016106a490614c18565b60006001600160a01b0384163b1561324757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613189903390899088908890600401614bd2565b602060405180830381600087803b1580156131a357600080fd5b505af19250505080156131d3575060408051601f3d908101601f191682019092526131d0918101906139d2565b60015b61322d573d808015613201576040519150601f19603f3d011682016040523d82523d6000602084013e613206565b606091505b5080516132255760405162461bcd60e51b81526004016106a490614c18565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a1e565b506001949350505050565b6000600161325f846122ab565b6132699190614e8a565b6000838152600860205260409020549091508082146132bc576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061330190600190614e8a565b6000838152600a60205260408120546009805493945090928490811061332957613329614f79565b90600052602060002001549050806009838154811061334a5761334a614f79565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061338257613382614f63565b6001900381819060005260206000200160009055905550505050565b60006133a9836122ab565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166134385760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106a4565b6000818152600360205260409020546001600160a01b03161561349d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106a4565b6134a96000838361305a565b6001600160a01b038216600090815260046020526040902054600a11156134f7576001600160a01b038216600090815260046020908152604080832054848452600290925290912055613562565b600a61350282612920565b6040516020016135129190613c2a565b60408051601f198184030181529082905261352f91602001613c2a565b6040516020818303038152906040528051906020012060001c6135529190614f23565b6000828152600260205260409020555b6001600160a01b038216600090815260046020526040812080546001929061358b908490614e3f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016136276136f1565b81526020016136346136f1565b8152602001600081525090565b6040518060a001604052806000815260200161365b6136f1565b81526020016136686136f1565b81526020016136756136f1565b81526020016136826136f1565b905290565b604051806060016040528061369a61370f565b815260200160608152602001606081525090565b6040518060e001604052806136c1613736565b81526020016060815260200160608152602001606081526020016060815260200160608152602001613682613754565b6040518060a001604052806005906020820280368337509192915050565b6040518060a001604052806005905b606081526020019060019003908161371e5790505090565b60405180606001604052806003906020820280368337509192915050565b6040805160c081019091526060815260056020820161371e565b80356001600160a01b038116811461378557600080fd5b919050565b60006020828403121561379c57600080fd5b6137a58261376e565b9392505050565b600080604083850312156137bf57600080fd5b6137c88361376e565b91506137d66020840161376e565b90509250929050565b6000806000606084860312156137f457600080fd5b6137fd8461376e565b925061380b6020850161376e565b9150604084013590509250925092565b6000806000806080858703121561383157600080fd5b61383a8561376e565b93506138486020860161376e565b925060408501359150606085013567ffffffffffffffff81111561386b57600080fd5b8501601f8101871361387c57600080fd5b803561388f61388a82614e17565b614de6565b8181528860208385010111156138a457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156138d957600080fd5b6138e28361376e565b9150602083013580151581146138f757600080fd5b809150509250929050565b6000806040838503121561391557600080fd5b61391e8361376e565b946020939093013593505050565b60006101a080838503121561394057600080fd5b83601f84011261394f57600080fd5b60405181810181811067ffffffffffffffff8211171561397157613971614f8f565b604052808483810187101561398557600080fd5b600093505b600d8410156139aa5780518252600193909301926020918201910161398a565b509095945050505050565b6000602082840312156139c757600080fd5b81356137a581614fa5565b6000602082840312156139e457600080fd5b81516137a581614fa5565b600060208284031215613a0157600080fd5b815167ffffffffffffffff811115613a1857600080fd5b8201601f81018413613a2957600080fd5b8051613a3761388a82614e17565b818152856020838501011115613a4c57600080fd5b613a5d826020830160208601614ea1565b95945050505050565b600060208284031215613a7857600080fd5b5035919050565b60008260c081018360005b60068110156139aa578383038752613aa3838351613b25565b6020978801979093509190910190600101613a8a565b8060005b60038110156126fc578151845260209384019390910190600101613abd565b8060005b60058110156126fc578151845260209384019390910190600101613ae0565b8060005b60058110156126fc57815160ff16845260209384019390910190600101613b03565b60008151808452613b3d816020860160208601614ea1565b601f01601f19169290920160200192915050565b60008151613b63818560208601614ea1565b9290920192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613bb560c0840182613adc565b5060e0810151613bc9610160840182613adc565b5061010001516102009190910152565b805182526020810151613bef6020840182613aff565b506040810151613c0260c0840182613aff565b506060810151613c16610160840182613aff565b5060808101516107da610200840182613aff565b60008251613c3c818460208701614ea1565b9190910192915050565b60008451613c58818460208901614ea1565b845190830190613c6c818360208901614ea1565b600b60fa1b91019081528351613c89816001840160208801614ea1565b0160010195945050505050565b60008551613ca8818460208a01614ea1565b855190830190613cbc818360208a01614ea1565b600160fd1b91018181528551909190613cdc816001850160208a01614ea1565b600b60fa1b600193909101928301528451613cfe816002850160208901614ea1565b60029201918201526003019695505050505050565b60008251613d25818460208701614ea1565b7f3c66696c7465722069643d22636c6f75647322206865696768743d22313030309201918252507f25222077696474683d22343030252220783d222d323030252220793d222d353060208201527f3025223e3c666554757262756c656e636520747970653d226672616374616c4e60408201527f6f6973652220626173654672657175656e63793d222e30303522206e756d4f6360608201527f74617665733d22313022202f3e3c6665446973706c6163656d656e744d61702060808201527f696e3d22536f757263654772617068696322207363616c653d2232343022207260a08201527f6573756c743d22636c6f7564222f3e3c6665476175737369616e426c7572206960c08201527f6e3d22636c6f75642220737464446576696174696f6e3d22313522202f3e3c2f60e0820152663334b63a32b91f60c91b61010082015261010701919050565b60008551613e82818460208a01614ea1565b693c7061746820643d224d60b01b9083019081528551613ea981600a840160208a01614ea1565b600b60fa1b600a92909101918201528451613ecb81600b840160208901614ea1565b8451910190613ee181600b840160208801614ea1565b600080516020614ffc833981519152600b92909101918201526f3234b2b73a1994911f1e17b830ba341f60811b602b820152603b019695505050505050565b60008551613f32818460208a01614ea1565b693c7061746820643d224d60b01b9083019081528551613f5981600a840160208a01614ea1565b600b60fa1b600a92909101918201528451613f7b81600b840160208901614ea1565b8451910190613f9181600b840160208801614ea1565b600080516020614ffc833981519152600b92909101918201527f6469656e743429222066696c7465723d2275726c2823666172426c7572322922602b820152671f1e17b830ba341f60c11b604b8201526053019695505050505050565b6000875160206140018285838d01614ea1565b693c7061746820643d224d60b01b918401918252885161402781600a8501848d01614ea1565b808301925050600b60fa1b80600a840152885161404a81600b8601858d01614ea1565b885193019261405f81600b8601858c01614ea1565b61081360f21b600b9490910193840152865161408181600d8601858b01614ea1565b600d930192830152845161409b81600e8501848901614ea1565b614165600e828501017f207a22207374726f6b653d2223303030222066696c7465723d2275726c28236381527f6c6f7564733229222066696c6c3d2223383838222066696c6c2d6f706163697460208201527f793d22343025223e3c616e696d6174654d6f74696f6e206475723d223234307360408201527f2220726570656174436f756e743d22696e646566696e6974652220706174683d60608201527f224d302c30204c3438302c30204c302c307a22202f3e3c2f706174683e0000006080820152609d0190565b9b9a5050505050505050505050565b6000875160206141878285838d01614ea1565b693c7061746820643d224d60b01b91840191825288516141ad81600a8501848d01614ea1565b808301925050600b60fa1b80600a84015288516141d081600b8601858d01614ea1565b88519301926141e581600b8601858c01614ea1565b61081360f21b600b9490910193840152865161420781600d8601858b01614ea1565b600d930192830152845161422181600e8501848901614ea1565b614165600e828501017f207a22207374726f6b653d2223303030222066696c7465723d2275726c28236381527f6c6f75647329222066696c6c3d2223666666222066696c6c2d6f70616369747960208201527f3d22333025223e3c616e696d6174654d6f74696f6e206475723d22313830732260408201527f20726570656174436f756e743d22696e646566696e6974652220706174683d2260608201527f4d302c30204c3438302c30204c302c307a22202f3e3c2f706174683e000000006080820152609c0190565b600085516142fd818460208a01614ea1565b693c7061746820643d224d60b01b908301908152855161432481600a840160208a01614ea1565b600b60fa1b600a9290910191820152845161434681600b840160208901614ea1565b845191019061435c81600b840160208801614ea1565b600080516020614ffc833981519152600b9290910191820152703234b2b73a189491101f1e17b830ba341f60791b602b820152603c019695505050505050565b600085516143ae818460208a01614ea1565b693c7061746820643d224d60b01b90830190815285516143d581600a840160208a01614ea1565b600b60fa1b600a929091019182015284516143f781600b840160208901614ea1565b845191019061440d81600b840160208801614ea1565b600080516020614ffc833981519152600b92909101918201526f3234b2b73a1914911f1e17b830ba341f60811b602b820152603b019695505050505050565b6000865161445e818460208b01614ea1565b693c7061746820643d224d60b01b908301908152865161448581600a840160208b01614ea1565b600b60fa1b600a929091019182015285516144a781600b840160208a01614ea1565b85519101906144bd81600b840160208901614ea1565b7f207a22207374726f6b653d226e6f6e65222066696c6c2d6f7061636974793d22600b929091019182015283516144fb81602b840160208801614ea1565b7f25222066696c6c3d2275726c28236772616469656e743529222066696c746572602b92909101918201527f3d2275726c2823666172426c757229223e3c2f706174683e0000000000000000604b820152606301979650505050505050565b6000825161456c818460208701614ea1565b7f3c66696c7465722069643d22666172426c7572223e3c6665476175737369616e9201918252507f426c757220737464446576696174696f6e3d2232222f3e3c2f66696c7465723e60208201527f3c66696c7465722069643d22666172426c757232223e3c66654761757373696160408201527f6e426c757220737464446576696174696f6e3d2231222f3e3c2f66696c7465726060820152601f60f91b6080820152608101919050565b60008451614629818460208901614ea1565b61081360f21b9083019081528451614648816002840160208901614ea1565b600b60fa1b60029290910191820152835161466a816003840160208801614ea1565b0160030195945050505050565b60008651614689818460208b01614ea1565b808301905061081360f21b80825287516146aa816002850160208c01614ea1565b808301925050600b60fa1b80600284015287516146ce816003860160208c01614ea1565b60039301928301919091528551906146ed826005850160208a01614ea1565b60059290910191820152835161470a816006840160208801614ea1565b01600601979650505050505050565b6000825161472b818460208701614ea1565b7f3c66696c7465722069643d22636c6f7564733222206865696768743d223330309201918252507f25222077696474683d22323030252220783d222d3530252220793d222d31303060208201527f25223e3c666554757262756c656e636520747970653d226672616374616c4e6f60408201527f6973652220626173654672657175656e63793d222e303522206e756d4f63746160608201527f7665733d22313022202f3e3c6665446973706c6163656d656e744d617020696e60808201527f3d22536f757263654772617068696322207363616c653d22313230222072657360a08201527f756c743d22636c6f7564222f3e3c6665476175737369616e426c757220696e3d60c08201527f22636c6f75642220737464446576696174696f6e3d223822202f3e3c2f66696c60e0820152633a32b91f60e11b61010082015261010401919050565b60008351614885818460208801614ea1565b61204360f01b90830190815283516148a4816002840160208801614ea1565b600b60fa1b60029290910191820152600301949350505050565b7f3c7376672069643d226c70732220786d6c6e733d22687474703a2f2f7777772e81527f77332e6f72672f323030302f73766722202076696577426f783d22302034373560208201527f302034383020333030223e3c7374796c653e74657874207b20666f6e742d666160408201527f6d696c793a20617269616c207d2e747b666f6e742d73697a653a20313070783b60608201527f2066696c6c3a20236164616461647d2e61747b666f6e742d73697a653a20313060808201527f70783b2066696c6c3a236636636232377d2072656374207b2077696474683a3160a08201527f3070783b207374726f6b653a206e6f6e657d3c2f7374796c653e3c726563742060c08201527f783d22302220793d223437353022207374796c653d2277696474683a3438307060e08201527f783b6865696768743a313030253b66696c6c3a75726c28236c737374796c6500610100820152600061011f8451614a298183860160208901614ea1565b70149d9039ba3937b5b29d3737b73291179f60791b90840182810191909152614a6b614a59610130830187613b51565b651e17b9bb339f60d11b815260060190565b9695505050505050565b747b226e616d65223a20224d6f756e7461696e73202360581b81528251600090614aa6816015850160208801614ea1565b7f222c20226465736372697074696f6e223a2022353030302062656175746966756015918401918201527f6c20616e696d61746564206d6f756e7461696e2076696577732e2047656e657260358201527f6174656420616e642073746f72656420636f6d706c6574656c79206f6e2d636860558201527f61696e2e204e6f20495046532e222c2022696d616765223a2022646174613a696075820152731b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60621b60958201528351614b728160a9840160208801614ea1565b61227d60f01b60a9929091019182015260ab01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614bc581601d850160208701614ea1565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a6b90830184613b25565b6020815260006137a56020830184613b25565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000610520878352866020840152806040840152614d118184018751613ab9565b506020850151610120610580840152614d2e610640840182613b25565b9050604086015161051f1980858403016105a0860152614d4e8383613b25565b92506060880151915080858403016105c0860152614d6c8383613b25565b92506080880151915080858403016105e0860152614d8a8383613b25565b925060a088015191508085840301610600860152614da88383613b25565b925060c08801519150808584030161062086015250614dc78282613a7f565b92505050614dd86060830185613b6d565b614a6b610280830184613bd9565b604051601f8201601f1916810167ffffffffffffffff81118282101715614e0f57614e0f614f8f565b604052919050565b600067ffffffffffffffff821115614e3157614e31614f8f565b50601f01601f191660200190565b60008219821115614e5257614e52614f37565b500190565b600082614e6657614e66614f4d565b500490565b6000816000190483118215151615614e8557614e85614f37565b500290565b600082821015614e9c57614e9c614f37565b500390565b60005b83811015614ebc578181015183820152602001614ea4565b838111156126fc5750506000910152565b600181811c90821680614ee157607f821691505b60208210811415614f0257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614f1c57614f1c614f37565b5060010190565b600082614f3257614f32614f4d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461285f57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f207a22207374726f6b653d226e6f6e65222066696c6c3d2275726c2823677261a26469706673582212205f54962cadb27f30045e4fa94afd63d1a4444e76462d8bddeea5027a0a73518b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806370a08231116100f7578063b88d4fde11610095578063eb8d244411610064578063eb8d24441461050d578063f2fde38b14610527578063f43a22dc14610547578063f47c84c51461055c57600080fd5b8063b88d4fde14610469578063c002d23d14610489578063c87b56dd146104a4578063e985e9c5146104c457600080fd5b806395d89b41116100d157806395d89b4114610401578063a0712d6814610416578063a22cb46514610429578063aa45a16e1461044957600080fd5b806370a08231146103ae578063715018a6146103ce5780638da5cb5b146103e357600080fd5b806324600fc31161016457806334918dfd1161013e57806334918dfd1461033957806342842e0e1461034e5780634f6ccce71461036e5780636352211e1461038e57600080fd5b806324600fc3146102d75780632f745c59146102ec57806332c57cec1461030c57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806318160ddd1461027857806322d7642e1461029757806323b872dd146102b757600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e23660046139b5565b610572565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b5061021161059d565b6040516101f39190614c05565b34801561022a57600080fd5b5061023e610239366004613a66565b61062f565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004613902565b6106c9565b005b34801561028457600080fd5b506009545b6040519081526020016101f3565b3480156102a357600080fd5b506102116102b2366004613a66565b6107df565b3480156102c357600080fd5b506102766102d23660046137df565b612024565b3480156102e357600080fd5b50610276612055565b3480156102f857600080fd5b50610289610307366004613902565b6120b2565b34801561031857600080fd5b50610289610327366004613a66565b60026020526000908152604090205481565b34801561034557600080fd5b50610276612148565b34801561035a57600080fd5b506102766103693660046137df565b612186565b34801561037a57600080fd5b50610289610389366004613a66565b6121a1565b34801561039a57600080fd5b5061023e6103a9366004613a66565b612234565b3480156103ba57600080fd5b506102896103c936600461378a565b6122ab565b3480156103da57600080fd5b50610276612332565b3480156103ef57600080fd5b50600c546001600160a01b031661023e565b34801561040d57600080fd5b50610211612368565b610276610424366004613a66565b612377565b34801561043557600080fd5b506102766104443660046138c6565b612559565b34801561045557600080fd5b50610211610464366004613a66565b61261e565b34801561047557600080fd5b5061027661048436600461381b565b6126ca565b34801561049557600080fd5b50610289666a94d74f43000081565b3480156104b057600080fd5b506102116104bf366004613a66565b612702565b3480156104d057600080fd5b506101e76104df3660046137ac565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561051957600080fd5b50600e546101e79060ff1681565b34801561053357600080fd5b5061027661054236600461378a565b6127c7565b34801561055357600080fd5b50610289600a81565b34801561056857600080fd5b50610289600d5481565b60006001600160e01b0319821663780e9d6360e01b1480610597575061059782612862565b92915050565b6060600080546105ac90614ecd565b80601f01602080910402602001604051908101604052809291908181526020018280546105d890614ecd565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166106ad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006106d482612234565b9050806001600160a01b0316836001600160a01b031614156107425760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106a4565b336001600160a01b038216148061075e575061075e81336104df565b6107d05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106a4565b6107da83836128b2565b505050565b60606107ea60095490565b82106108305760405162461bcd60e51b815260206004820152601560248201527429b1b2b732903737ba1036b4b73a32b2103cb2ba1760591b60448201526064016106a4565b6000828152600260205260409020546108476135e9565b61084f613641565b610857613687565b61085f6136ae565b6108b5604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405163105cffef60e21b815260048101899052602481018790526000907315bd6f38056a7b094a9f7004f918863d792ff2f990634173ffbc906044016101a06040518083038186803b15801561090b57600080fd5b505af415801561091f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610943919061392c565b6000602088018190526113ba6040890152606088018190526080880152600c808852909150610974906101e0614e57565b60a0878101919091526040805180830182528189018051825280516020808401919091528151838501528151606080850191909152825160808086019190915260c08d0194909452845195860185528251865282519186019190915281519385019390935280519284019290925290519082015260e08701526101408101516109ff90606590614f23565b6101008701526040805160a08082018352600a8252600760208084019190915260058385018190526004606080860182905260036080808801919091528c8501969096528651808601885260508152606481860152608c8189015280820186905260c8818801528c88015286518086018852600681528085018490528088018390528082018390528087018390528c820152865194850187528185529284018290529483018190529082018190528183015290870152610160820151610ac59190614f23565b610ad0906002614e3f565b8552600987148015610ae3575084516003105b15610aed57600385525b866003148015610afe575084516004115b15610b0857600485525b8251600090819052835160200181905283516040015260e0810151610b2f90600890614f23565b610b3a906005614e3f565b835160c0830151610b4d90600390614f23565b60038110610b5d57610b5d614f79565b602090810291909101919091526040805180830182526000808252878401919091528151808401835281815287830152815160c08101835260a081018281528152825180850184528281528185015282518085018452828152818401528251808501845282815260608201528251938401909252808352608082019290925285525b8651811015611ba5578660a0015187606001818151610bfe9190614e3f565b90525060005b86518110156118d257610c48610c43610c328584600d8110610c2857610c28614f79565b6020020151612920565b84610c3e816001614e3f565b612a26565b612af3565b845260808701518160058110610c6057610c60614f79565b602002015160ff16846000015111610c79576000610c7c565b60015b60ff1660208501528751610c9290600290614e8a565b821415610ca157600060208501525b8351610caf90600490614f23565b610cba906001614e3f565b610cc5826005614e6b565b610ccf9190614e6b565b610cda82600a614e6b565b610ce5906014614e3f565b610cef9190614e3f565b604085015281610ded5783604001518860c001518260058110610d1457610d14614f79565b6020020151610d239190614e8a565b8860c001518260058110610d3957610d39614f79565b602002015260c08801518160058110610d5457610d54614f79565b60200201518860e001518260058110610d6f57610d6f614f79565b602002015285518160058110610d8757610d87614f79565b6020020151610d998960200151612920565b610db28a60c001518460058110610c2857610c28614f79565b604051602001610dc493929190614617565b60408051601f1981840301815291905286518260058110610de757610de7614f79565b60200201525b602084015115610e995786602001518160058110610e0d57610e0d614f79565b602002015160ff1687606001518260058110610e2b57610e2b614f79565b60200201518551610e3f9160ff1690614f23565b610e4a906001614e3f565b610e549190614e6b565b8860c001518260058110610e6a57610e6a614f79565b6020020151610e799190614e8a565b8860c001518260058110610e8f57610e8f614f79565b6020020152610f37565b86602001518160058110610eaf57610eaf614f79565b602002015160ff1687606001518260058110610ecd57610ecd614f79565b60200201518551610ee19160ff1690614f23565b610eec906001614e3f565b610ef69190614e6b565b8860c001518260058110610f0c57610f0c614f79565b6020020151610f1b9190614e3f565b8860c001518260058110610f3157610f31614f79565b60200201525b86604001518160058110610f4d57610f4d614f79565b602002015160ff168860400151610f649190614e8a565b8860c001518260058110610f7a57610f7a614f79565b60200201511015610fce5786604001518160058110610f9b57610f9b614f79565b602002015160ff168860400151610fb29190614e8a565b8860c001518260058110610fc857610fc8614f79565b60200201525b83604001518860400151610fe29190614e8a565b8860c001518260058110610ff857610ff8614f79565b6020020151111561103357836040015188604001516110179190614e8a565b8860c00151826005811061102d5761102d614f79565b60200201525b875161104190600190614e8a565b821415611078578360400151886040015161105c9190614e8a565b8860c00151826005811061107257611072614f79565b60200201525b60016060850152835161108d90600390614f23565b611098906001614e3f565b608085015283516110ab90600490614f23565b6110b6906004614e3f565b60a085015260e088015181600581106110d1576110d1614f79565b602002015160c085015260015b8460a0015181116117df57808560a001518a608001518b606001516111039190614e8a565b61110d9190614e57565b6111179190614e6b565b89608001516111269190614e3f565b610100860152606085015160011415611305578860e00151826005811061114f5761114f614f79565b60200201518960c00151836005811061116a5761116a614f79565b60200201511115611247576004600b8287600001516111899190614e6b565b6111939190614f23565b1161119f5760006111a2565b60015b60ff1685608001516111b49190614e6b565b818660a001518b60e0015185600581106111d0576111d0614f79565b60200201518c60c0015186600581106111eb576111eb614f79565b60200201516111fa9190614e8a565b6112049190614e57565b61120e9190614e6b565b8a60e00151846005811061122457611224614f79565b60200201516112339190614e3f565b61123d9190614e3f565b60e08601526114d7565b6004600b82876000015161125b9190614e6b565b6112659190614f23565b11611271576000611274565b60015b60ff1685608001516112869190614e6b565b818660a001518b60c0015185600581106112a2576112a2614f79565b60200201518c60e0015186600581106112bd576112bd614f79565b60200201516112cc9190614e8a565b6112d69190614e57565b6112e09190614e6b565b8a60e0015184600581106112f6576112f6614f79565b60200201516112339190614e8a565b8860e00151826005811061131b5761131b614f79565b60200201518960c00151836005811061133657611336614f79565b60200201511115611409576004600b8287600001516113559190614e6b565b61135f9190614f23565b1161136b57600061136e565b60015b60ff1685608001516113809190614e6b565b818660a001518b60e00151856005811061139c5761139c614f79565b60200201518c60c0015186600581106113b7576113b7614f79565b60200201516113c69190614e8a565b6113d09190614e57565b6113da9190614e6b565b8a60e0015184600581106113f0576113f0614f79565b60200201516113ff9190614e3f565b61123d9190614e8a565b6004600b82876000015161141d9190614e6b565b6114279190614f23565b11611433576000611436565b60015b60ff1685608001516114489190614e6b565b818660a001518b60c00151856005811061146457611464614f79565b60200201518c60e00151866005811061147f5761147f614f79565b602002015161148e9190614e8a565b6114989190614e57565b6114a29190614e6b565b8a60e0015184600581106114b8576114b8614f79565b60200201516114c79190614e8a565b6114d19190614e8a565b60e08601525b60018560a001516114e89190614e8a565b811015611510578460600151600114156115085760006060860152611510565b600160608601525b845160071080156115215750600382105b15611621578460a0015181101561156e5760208501511561155757845160e086015161154d9190614e3f565b60e086015261156e565b845160e08601516115689190614e8a565b60e08601525b8651826005811061158157611581614f79565b60200201516115d5611594600184614e8a565b8760a001518c608001518d606001516115ad9190614e8a565b6115b79190614e57565b6115c19190614e6b565b8b608001516115d09190614e3f565b612920565b6115e28760e00151612920565b6040516020016115f493929190614617565b60408051601f198184030181529190528751836005811061161757611617614f79565b60200201526117c3565b8651826005811061163457611634614f79565b6020020151611647611594600184614e8a565b604051602001611658929190614873565b60408051601f198184030181529190528751836005811061167b5761167b614f79565b60200201528651826005811061169357611693614f79565b60200201516116a58660c00151612920565b6116b3876101000151612920565b6116c08860e00151612920565b6040516020016116d39493929190613c96565b60408051601f19818403018152919052875183600581106116f6576116f6614f79565b60200201528651826005811061170e5761170e614f79565b6020020151611765600260016117248583614e6b565b61172e9190614e8a565b8860a001518d608001518e606001516117479190614e8a565b6117519190614e57565b61175b9190614e6b565b6115c19190614e57565b61178860028860c001518960e0015161177e9190614e3f565b6115d09190614e57565b60405160200161179a93929190613c46565b60408051601f19818403018152919052875183600581106117bd576117bd614f79565b60200201525b60e085015160c0860152806117d781614f08565b9150506110de565b5087516117ee90600190614e8a565b82141561188a578551816005811061180857611808614f79565b602002015161181a8960600151612920565b6118338a60c001518460058110610c2857610c28614f79565b6118408b60600151612920565b61184d8c60400151612920565b604051602001611861959493929190614677565b60408051601f198184030181529190528651826005811061188457611884614f79565b60200201525b8760c0015181600581106118a0576118a0614f79565b60200201518860e0015182600581106118bb576118bb614f79565b6020020152806118ca81614f08565b915050610c04565b506060870151608088015260a08201518084526004106118f35760006118f6565b60015b60ff1660208401526002881415611a2f57806119285760c8876040015161191d9190614e8a565b610120840152611b4e565b865161193690600190614e8a565b81141561194e5760c8876040015161191d9190614e8a565b60208301511561199757825161196690600390614f23565b61197190601e614e6b565b60c888604001516119829190614e8a565b61198c9190614e8a565b6101208401526119d2565b82516119a590600390614f23565b6119b090601e614e6b565b60c888604001516119c19190614e8a565b6119cb9190614e3f565b6101208401525b61012c87604001516119e49190614e8a565b8361012001511015611a095761012c8760400151611a029190614e8a565b6101208401525b86604001518361012001511115611a2a57604087015161191d906032614e3f565b611b4e565b80611a45576064876040015161191d9190614e8a565b8651611a5390600190614e8a565b811415611a6b576064876040015161191d9190614e8a565b602083015115611ab4578251611a8390600790614f23565b611a8e906014614e6b565b60648860400151611a9f9190614e8a565b611aa99190614e8a565b610120840152611aef565b8251611ac290600790614f23565b611acd906014614e6b565b60648860400151611ade9190614e8a565b611ae89190614e3f565b6101208401525b61012c8760400151611b019190614e8a565b8361012001511015611b265761012c8760400151611b1f9190614e8a565b6101208401525b86604001518361012001511115611b4e576040870151611b47906032614e3f565b6101208401525b8460400151611b608860600151612920565b611b6e856101200151612920565b604051602001611b8093929190614617565b60408051601f1981840301815291815286015280611b9d81614f08565b915050610bdf565b5060408051808201909152600381526233302560e81b602082015260a08401526002871480611bd2575086155b80611bdd5750866003145b80611be85750866008145b15611c0d5760408051808201909152600381526231302560e81b602082015260a08401525b60098711611cce5760405163eb1c754960e01b81527315bd6f38056a7b094a9f7004f918863d792ff2f99063eb1c754990611c54908c908b9088908c908c90600401614cf0565b60006040518083038186803b158015611c6c57600080fd5b505af4158015611c80573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ca891908101906139ef565b604051602001611cb89190613c2a565b60408051601f1981840301815291905260208501525b602080850151604051611ce1920161455a565b60408051601f198184030181529190526020850152845160041415611d54578360200151611d128760200151612920565b611d1f8860400151612920565b86516080015160a0870151604051611d3e95949392919060200161444c565b60408051601f1981840301815291905260208501525b8451600311611dab578360200151611d6f8760200151612920565b611d7c8860400151612920565b865160600151604051611d959493929190602001613f20565b60408051601f1981840301815291905260208501525b8451600211611e05578360200151611dc68760200151612920565b611dd38860400151612920565b865160026020020151604051602001611def9493929190613e70565b60408051601f1981840301815291905260208501525b8660021415611eae57602080850151604051611e219201614719565b60408051601f198184030181529190526020858101829052870151611e4590612920565b611e5960c889604001516115d09190614e8a565b8660400151611e6b8a60200151612920565b611e7f60c88c604001516115d09190614e8a565b604051602001611e9496959493929190613fee565b60408051601f198184030181529190526020850152611f4a565b602080850151604051611ec19201613d13565b60408051601f198184030181529190526020858101829052870151611ee590612920565b611ef9606489604001516115d09190614e8a565b8660400151611f0b8a60200151612920565b611f1f60648c604001516115d09190614e8a565b604051602001611f3496959493929190614174565b60408051601f1981840301815291905260208501525b8451600111611fa0578360200151611f658760200151612920565b611f728860400151612920565b8651602090810151604051611f8a959493920161439c565b60408051601f1981840301815291905260208501525b8360200151611fb28760200151612920565b611fbf8860400151612920565b865151604051611fd594939291906020016142eb565b60408051601f198184030181529190526020850152611ff387612920565b6020808601516040516120079392016148be565b604051602081830303815290604052975050505050505050919050565b61202e3382612bb7565b61204a5760405162461bcd60e51b81526004016106a490614c9f565b6107da838383612caa565b600c546001600160a01b0316331461207f5760405162461bcd60e51b81526004016106a490614c6a565b6040514790339082156108fc029083906000818181858888f193505050501580156120ae573d6000803e3d6000fd5b5050565b60006120bd836122ab565b821061211f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106a4565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600c546001600160a01b031633146121725760405162461bcd60e51b81526004016106a490614c6a565b600e805460ff19811660ff90911615179055565b6107da838383604051806020016040528060008152506126ca565b60006121ac60095490565b821061220f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106a4565b6009828154811061222257612222614f79565b90600052602060002001549050919050565b6000818152600360205260408120546001600160a01b0316806105975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106a4565b60006001600160a01b0382166123165760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106a4565b506001600160a01b031660009081526004602052604090205490565b600c546001600160a01b0316331461235c5760405162461bcd60e51b81526004016106a490614c6a565b6123666000612e55565b565b6060600180546105ac90614ecd565b6002600b5414156123ca5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a4565b6002600b55600e5460ff166124115760405162461bcd60e51b815260206004820152600d60248201526c53616c6520696e61637469766560981b60448201526064016106a4565b600a81111561245a5760405162461bcd60e51b815260206004820152601560248201527426b4b73a103ab8103a37901898103832b9103a3c1760591b60448201526064016106a4565b600d548161246760095490565b6124719190614e3f565b11156124b45760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b60448201526064016106a4565b6124c581666a94d74f430000614e6b565b341015806124dd5750600c546001600160a01b031633145b6125225760405162461bcd60e51b815260206004820152601660248201527554727920302e30332065746820706572207363656e6560501b60448201526064016106a4565b6000805b8281101561254f57600954915061253d3383612ea7565b8061254781614f08565b915050612526565b50506001600b5550565b6001600160a01b0382163314156125b25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106a4565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f818154811061262e57600080fd5b90600052602060002001600091509050805461264990614ecd565b80601f016020809104026020016040519081016040528092919081815260200182805461267590614ecd565b80156126c25780601f10612697576101008083540402835291602001916126c2565b820191906000526020600020905b8154815290600101906020018083116126a557829003601f168201915b505050505081565b6126d43383612bb7565b6126f05760405162461bcd60e51b81526004016106a490614c9f565b6126fc84848484612ec1565b50505050565b606061270d60095490565b82106127535760405162461bcd60e51b815260206004820152601560248201527429b1b2b732903737ba1036b4b73a32b2103cb2ba1760591b60448201526064016106a4565b600061275e836107df565b9050600061279c61276e85612920565b61277784612ef4565b604051602001612788929190614a75565b604051602081830303815290604052612ef4565b9050806040516020016127af9190614b8d565b60408051601f19818403018152919052949350505050565b600c546001600160a01b031633146127f15760405162461bcd60e51b81526004016106a490614c6a565b6001600160a01b0381166128565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a4565b61285f81612e55565b50565b60006001600160e01b031982166380ac58cd60e01b148061289357506001600160e01b03198216635b5e139f60e01b145b8061059757506301ffc9a760e01b6001600160e01b0319831614610597565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906128e782612234565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816129445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561296e578061295881614f08565b91506129679050600a83614e57565b9150612948565b60008167ffffffffffffffff81111561298957612989614f8f565b6040519080825280601f01601f1916602001820160405280156129b3576020820181803683370190505b5090505b8415612a1e576129c8600183614e8a565b91506129d5600a86614f23565b6129e0906030614e3f565b60f81b8183815181106129f5576129f5614f79565b60200101906001600160f81b031916908160001a905350612a17600a86614e57565b94506129b7565b949350505050565b6060836000612a358585614e8a565b67ffffffffffffffff811115612a4d57612a4d614f8f565b6040519080825280601f01601f191660200182016040528015612a77576020820181803683370190505b509050845b84811015612ae957828181518110612a9657612a96614f79565b01602001516001600160f81b03191682612ab08884614e8a565b81518110612ac057612ac0614f79565b60200101906001600160f81b031916908160001a90535080612ae181614f08565b915050612a7c565b5095945050505050565b60008181805b8251811015612baf57603060f81b838281518110612b1957612b19614f79565b01602001516001600160f81b03191610801590612b5a5750603960f81b838281518110612b4857612b48614f79565b01602001516001600160f81b03191611155b15612b9d576030838281518110612b7357612b73614f79565b0160200151612b85919060f81c614e8a565b612b9083600a614e6b565b612b9a9190614e3f565b91505b80612ba781614f08565b915050612af9565b509392505050565b6000818152600360205260408120546001600160a01b0316612c305760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106a4565b6000612c3b83612234565b9050806001600160a01b0316846001600160a01b03161480612c765750836001600160a01b0316612c6b8461062f565b6001600160a01b0316145b80612a1e57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16612a1e565b826001600160a01b0316612cbd82612234565b6001600160a01b031614612d255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106a4565b6001600160a01b038216612d875760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106a4565b612d9283838361305a565b612d9d6000826128b2565b6001600160a01b0383166000908152600460205260408120805460019290612dc6908490614e8a565b90915550506001600160a01b0382166000908152600460205260408120805460019290612df4908490614e3f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120ae828260405180602001604052806000815250613112565b612ecc848484612caa565b612ed884848484613145565b6126fc5760405162461bcd60e51b81526004016106a490614c18565b805160609080612f14575050604080516020810190915260008152919050565b60006003612f23836002614e3f565b612f2d9190614e57565b612f38906004614e6b565b90506000612f47826020614e3f565b67ffffffffffffffff811115612f5f57612f5f614f8f565b6040519080825280601f01601f191660200182016040528015612f89576020820181803683370190505b5090506000604051806060016040528060408152602001614fbc604091399050600181016020830160005b86811015613015576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612fb4565b50600386066001811461302f57600281146130405761304c565b613d3d60f01b60011983015261304c565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166130b5576130b081600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6130d8565b816001600160a01b0316836001600160a01b0316146130d8576130d88382613252565b6001600160a01b0382166130ef576107da816132ef565b826001600160a01b0316826001600160a01b0316146107da576107da828261339e565b61311c83836133e2565b6131296000848484613145565b6107da5760405162461bcd60e51b81526004016106a490614c18565b60006001600160a01b0384163b1561324757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613189903390899088908890600401614bd2565b602060405180830381600087803b1580156131a357600080fd5b505af19250505080156131d3575060408051601f3d908101601f191682019092526131d0918101906139d2565b60015b61322d573d808015613201576040519150601f19603f3d011682016040523d82523d6000602084013e613206565b606091505b5080516132255760405162461bcd60e51b81526004016106a490614c18565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a1e565b506001949350505050565b6000600161325f846122ab565b6132699190614e8a565b6000838152600860205260409020549091508082146132bc576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061330190600190614e8a565b6000838152600a60205260408120546009805493945090928490811061332957613329614f79565b90600052602060002001549050806009838154811061334a5761334a614f79565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061338257613382614f63565b6001900381819060005260206000200160009055905550505050565b60006133a9836122ab565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166134385760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106a4565b6000818152600360205260409020546001600160a01b03161561349d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106a4565b6134a96000838361305a565b6001600160a01b038216600090815260046020526040902054600a11156134f7576001600160a01b038216600090815260046020908152604080832054848452600290925290912055613562565b600a61350282612920565b6040516020016135129190613c2a565b60408051601f198184030181529082905261352f91602001613c2a565b6040516020818303038152906040528051906020012060001c6135529190614f23565b6000828152600260205260409020555b6001600160a01b038216600090815260046020526040812080546001929061358b908490614e3f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016136276136f1565b81526020016136346136f1565b8152602001600081525090565b6040518060a001604052806000815260200161365b6136f1565b81526020016136686136f1565b81526020016136756136f1565b81526020016136826136f1565b905290565b604051806060016040528061369a61370f565b815260200160608152602001606081525090565b6040518060e001604052806136c1613736565b81526020016060815260200160608152602001606081526020016060815260200160608152602001613682613754565b6040518060a001604052806005906020820280368337509192915050565b6040518060a001604052806005905b606081526020019060019003908161371e5790505090565b60405180606001604052806003906020820280368337509192915050565b6040805160c081019091526060815260056020820161371e565b80356001600160a01b038116811461378557600080fd5b919050565b60006020828403121561379c57600080fd5b6137a58261376e565b9392505050565b600080604083850312156137bf57600080fd5b6137c88361376e565b91506137d66020840161376e565b90509250929050565b6000806000606084860312156137f457600080fd5b6137fd8461376e565b925061380b6020850161376e565b9150604084013590509250925092565b6000806000806080858703121561383157600080fd5b61383a8561376e565b93506138486020860161376e565b925060408501359150606085013567ffffffffffffffff81111561386b57600080fd5b8501601f8101871361387c57600080fd5b803561388f61388a82614e17565b614de6565b8181528860208385010111156138a457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156138d957600080fd5b6138e28361376e565b9150602083013580151581146138f757600080fd5b809150509250929050565b6000806040838503121561391557600080fd5b61391e8361376e565b946020939093013593505050565b60006101a080838503121561394057600080fd5b83601f84011261394f57600080fd5b60405181810181811067ffffffffffffffff8211171561397157613971614f8f565b604052808483810187101561398557600080fd5b600093505b600d8410156139aa5780518252600193909301926020918201910161398a565b509095945050505050565b6000602082840312156139c757600080fd5b81356137a581614fa5565b6000602082840312156139e457600080fd5b81516137a581614fa5565b600060208284031215613a0157600080fd5b815167ffffffffffffffff811115613a1857600080fd5b8201601f81018413613a2957600080fd5b8051613a3761388a82614e17565b818152856020838501011115613a4c57600080fd5b613a5d826020830160208601614ea1565b95945050505050565b600060208284031215613a7857600080fd5b5035919050565b60008260c081018360005b60068110156139aa578383038752613aa3838351613b25565b6020978801979093509190910190600101613a8a565b8060005b60038110156126fc578151845260209384019390910190600101613abd565b8060005b60058110156126fc578151845260209384019390910190600101613ae0565b8060005b60058110156126fc57815160ff16845260209384019390910190600101613b03565b60008151808452613b3d816020860160208601614ea1565b601f01601f19169290920160200192915050565b60008151613b63818560208601614ea1565b9290920192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613bb560c0840182613adc565b5060e0810151613bc9610160840182613adc565b5061010001516102009190910152565b805182526020810151613bef6020840182613aff565b506040810151613c0260c0840182613aff565b506060810151613c16610160840182613aff565b5060808101516107da610200840182613aff565b60008251613c3c818460208701614ea1565b9190910192915050565b60008451613c58818460208901614ea1565b845190830190613c6c818360208901614ea1565b600b60fa1b91019081528351613c89816001840160208801614ea1565b0160010195945050505050565b60008551613ca8818460208a01614ea1565b855190830190613cbc818360208a01614ea1565b600160fd1b91018181528551909190613cdc816001850160208a01614ea1565b600b60fa1b600193909101928301528451613cfe816002850160208901614ea1565b60029201918201526003019695505050505050565b60008251613d25818460208701614ea1565b7f3c66696c7465722069643d22636c6f75647322206865696768743d22313030309201918252507f25222077696474683d22343030252220783d222d323030252220793d222d353060208201527f3025223e3c666554757262756c656e636520747970653d226672616374616c4e60408201527f6f6973652220626173654672657175656e63793d222e30303522206e756d4f6360608201527f74617665733d22313022202f3e3c6665446973706c6163656d656e744d61702060808201527f696e3d22536f757263654772617068696322207363616c653d2232343022207260a08201527f6573756c743d22636c6f7564222f3e3c6665476175737369616e426c7572206960c08201527f6e3d22636c6f75642220737464446576696174696f6e3d22313522202f3e3c2f60e0820152663334b63a32b91f60c91b61010082015261010701919050565b60008551613e82818460208a01614ea1565b693c7061746820643d224d60b01b9083019081528551613ea981600a840160208a01614ea1565b600b60fa1b600a92909101918201528451613ecb81600b840160208901614ea1565b8451910190613ee181600b840160208801614ea1565b600080516020614ffc833981519152600b92909101918201526f3234b2b73a1994911f1e17b830ba341f60811b602b820152603b019695505050505050565b60008551613f32818460208a01614ea1565b693c7061746820643d224d60b01b9083019081528551613f5981600a840160208a01614ea1565b600b60fa1b600a92909101918201528451613f7b81600b840160208901614ea1565b8451910190613f9181600b840160208801614ea1565b600080516020614ffc833981519152600b92909101918201527f6469656e743429222066696c7465723d2275726c2823666172426c7572322922602b820152671f1e17b830ba341f60c11b604b8201526053019695505050505050565b6000875160206140018285838d01614ea1565b693c7061746820643d224d60b01b918401918252885161402781600a8501848d01614ea1565b808301925050600b60fa1b80600a840152885161404a81600b8601858d01614ea1565b885193019261405f81600b8601858c01614ea1565b61081360f21b600b9490910193840152865161408181600d8601858b01614ea1565b600d930192830152845161409b81600e8501848901614ea1565b614165600e828501017f207a22207374726f6b653d2223303030222066696c7465723d2275726c28236381527f6c6f7564733229222066696c6c3d2223383838222066696c6c2d6f706163697460208201527f793d22343025223e3c616e696d6174654d6f74696f6e206475723d223234307360408201527f2220726570656174436f756e743d22696e646566696e6974652220706174683d60608201527f224d302c30204c3438302c30204c302c307a22202f3e3c2f706174683e0000006080820152609d0190565b9b9a5050505050505050505050565b6000875160206141878285838d01614ea1565b693c7061746820643d224d60b01b91840191825288516141ad81600a8501848d01614ea1565b808301925050600b60fa1b80600a84015288516141d081600b8601858d01614ea1565b88519301926141e581600b8601858c01614ea1565b61081360f21b600b9490910193840152865161420781600d8601858b01614ea1565b600d930192830152845161422181600e8501848901614ea1565b614165600e828501017f207a22207374726f6b653d2223303030222066696c7465723d2275726c28236381527f6c6f75647329222066696c6c3d2223666666222066696c6c2d6f70616369747960208201527f3d22333025223e3c616e696d6174654d6f74696f6e206475723d22313830732260408201527f20726570656174436f756e743d22696e646566696e6974652220706174683d2260608201527f4d302c30204c3438302c30204c302c307a22202f3e3c2f706174683e000000006080820152609c0190565b600085516142fd818460208a01614ea1565b693c7061746820643d224d60b01b908301908152855161432481600a840160208a01614ea1565b600b60fa1b600a9290910191820152845161434681600b840160208901614ea1565b845191019061435c81600b840160208801614ea1565b600080516020614ffc833981519152600b9290910191820152703234b2b73a189491101f1e17b830ba341f60791b602b820152603c019695505050505050565b600085516143ae818460208a01614ea1565b693c7061746820643d224d60b01b90830190815285516143d581600a840160208a01614ea1565b600b60fa1b600a929091019182015284516143f781600b840160208901614ea1565b845191019061440d81600b840160208801614ea1565b600080516020614ffc833981519152600b92909101918201526f3234b2b73a1914911f1e17b830ba341f60811b602b820152603b019695505050505050565b6000865161445e818460208b01614ea1565b693c7061746820643d224d60b01b908301908152865161448581600a840160208b01614ea1565b600b60fa1b600a929091019182015285516144a781600b840160208a01614ea1565b85519101906144bd81600b840160208901614ea1565b7f207a22207374726f6b653d226e6f6e65222066696c6c2d6f7061636974793d22600b929091019182015283516144fb81602b840160208801614ea1565b7f25222066696c6c3d2275726c28236772616469656e743529222066696c746572602b92909101918201527f3d2275726c2823666172426c757229223e3c2f706174683e0000000000000000604b820152606301979650505050505050565b6000825161456c818460208701614ea1565b7f3c66696c7465722069643d22666172426c7572223e3c6665476175737369616e9201918252507f426c757220737464446576696174696f6e3d2232222f3e3c2f66696c7465723e60208201527f3c66696c7465722069643d22666172426c757232223e3c66654761757373696160408201527f6e426c757220737464446576696174696f6e3d2231222f3e3c2f66696c7465726060820152601f60f91b6080820152608101919050565b60008451614629818460208901614ea1565b61081360f21b9083019081528451614648816002840160208901614ea1565b600b60fa1b60029290910191820152835161466a816003840160208801614ea1565b0160030195945050505050565b60008651614689818460208b01614ea1565b808301905061081360f21b80825287516146aa816002850160208c01614ea1565b808301925050600b60fa1b80600284015287516146ce816003860160208c01614ea1565b60039301928301919091528551906146ed826005850160208a01614ea1565b60059290910191820152835161470a816006840160208801614ea1565b01600601979650505050505050565b6000825161472b818460208701614ea1565b7f3c66696c7465722069643d22636c6f7564733222206865696768743d223330309201918252507f25222077696474683d22323030252220783d222d3530252220793d222d31303060208201527f25223e3c666554757262756c656e636520747970653d226672616374616c4e6f60408201527f6973652220626173654672657175656e63793d222e303522206e756d4f63746160608201527f7665733d22313022202f3e3c6665446973706c6163656d656e744d617020696e60808201527f3d22536f757263654772617068696322207363616c653d22313230222072657360a08201527f756c743d22636c6f7564222f3e3c6665476175737369616e426c757220696e3d60c08201527f22636c6f75642220737464446576696174696f6e3d223822202f3e3c2f66696c60e0820152633a32b91f60e11b61010082015261010401919050565b60008351614885818460208801614ea1565b61204360f01b90830190815283516148a4816002840160208801614ea1565b600b60fa1b60029290910191820152600301949350505050565b7f3c7376672069643d226c70732220786d6c6e733d22687474703a2f2f7777772e81527f77332e6f72672f323030302f73766722202076696577426f783d22302034373560208201527f302034383020333030223e3c7374796c653e74657874207b20666f6e742d666160408201527f6d696c793a20617269616c207d2e747b666f6e742d73697a653a20313070783b60608201527f2066696c6c3a20236164616461647d2e61747b666f6e742d73697a653a20313060808201527f70783b2066696c6c3a236636636232377d2072656374207b2077696474683a3160a08201527f3070783b207374726f6b653a206e6f6e657d3c2f7374796c653e3c726563742060c08201527f783d22302220793d223437353022207374796c653d2277696474683a3438307060e08201527f783b6865696768743a313030253b66696c6c3a75726c28236c737374796c6500610100820152600061011f8451614a298183860160208901614ea1565b70149d9039ba3937b5b29d3737b73291179f60791b90840182810191909152614a6b614a59610130830187613b51565b651e17b9bb339f60d11b815260060190565b9695505050505050565b747b226e616d65223a20224d6f756e7461696e73202360581b81528251600090614aa6816015850160208801614ea1565b7f222c20226465736372697074696f6e223a2022353030302062656175746966756015918401918201527f6c20616e696d61746564206d6f756e7461696e2076696577732e2047656e657260358201527f6174656420616e642073746f72656420636f6d706c6574656c79206f6e2d636860558201527f61696e2e204e6f20495046532e222c2022696d616765223a2022646174613a696075820152731b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60621b60958201528351614b728160a9840160208801614ea1565b61227d60f01b60a9929091019182015260ab01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614bc581601d850160208701614ea1565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a6b90830184613b25565b6020815260006137a56020830184613b25565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000610520878352866020840152806040840152614d118184018751613ab9565b506020850151610120610580840152614d2e610640840182613b25565b9050604086015161051f1980858403016105a0860152614d4e8383613b25565b92506060880151915080858403016105c0860152614d6c8383613b25565b92506080880151915080858403016105e0860152614d8a8383613b25565b925060a088015191508085840301610600860152614da88383613b25565b925060c08801519150808584030161062086015250614dc78282613a7f565b92505050614dd86060830185613b6d565b614a6b610280830184613bd9565b604051601f8201601f1916810167ffffffffffffffff81118282101715614e0f57614e0f614f8f565b604052919050565b600067ffffffffffffffff821115614e3157614e31614f8f565b50601f01601f191660200190565b60008219821115614e5257614e52614f37565b500190565b600082614e6657614e66614f4d565b500490565b6000816000190483118215151615614e8557614e85614f37565b500290565b600082821015614e9c57614e9c614f37565b500390565b60005b83811015614ebc578181015183820152602001614ea4565b838111156126fc5750506000910152565b600181811c90821680614ee157607f821691505b60208210811415614f0257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614f1c57614f1c614f37565b5060010190565b600082614f3257614f32614f4d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461285f57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f207a22207374726f6b653d226e6f6e65222066696c6c3d2275726c2823677261a26469706673582212205f54962cadb27f30045e4fa94afd63d1a4444e76462d8bddeea5027a0a73518b64736f6c63430008070033

Deployed Bytecode Sourcemap

48439:12507:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42288:224;;;;;;;;;;-1:-1:-1;42288:224:0;;;;;:::i;:::-;;:::i;:::-;;;34158:14:1;;34151:22;34133:41;;34121:2;34106:18;42288:224:0;;;;;;;;29165:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30724:221::-;;;;;;;;;;-1:-1:-1;30724:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;33456:32:1;;;33438:51;;33426:2;33411:18;30724:221:0;33292:203:1;30247:411:0;;;;;;;;;;-1:-1:-1;30247:411:0;;;;;:::i;:::-;;:::i;:::-;;42928:113;;;;;;;;;;-1:-1:-1;43016:10:0;:17;42928:113;;;43446:25:1;;;43434:2;43419:18;42928:113:0;43300:177:1;49024:10412:0;;;;;;;;;;-1:-1:-1;49024:10412:0;;;;;:::i;:::-;;:::i;31614:339::-;;;;;;;;;;-1:-1:-1;31614:339:0;;;;;:::i;:::-;;:::i;60721:147::-;;;;;;;;;;;;;:::i;42596:256::-;;;;;;;;;;-1:-1:-1;42596:256:0;;;;;:::i;:::-;;:::i;27419:41::-;;;;;;;;;;-1:-1:-1;27419:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;60065:91;;;;;;;;;;;;;:::i;32024:185::-;;;;;;;;;;-1:-1:-1;32024:185:0;;;;;:::i;:::-;;:::i;43118:233::-;;;;;;;;;;-1:-1:-1;43118:233:0;;;;;:::i;:::-;;:::i;28859:239::-;;;;;;;;;;-1:-1:-1;28859:239:0;;;;;:::i;:::-;;:::i;28589:208::-;;;;;;;;;;-1:-1:-1;28589:208:0;;;;;:::i;:::-;;:::i;13464:94::-;;;;;;;;;;;;;:::i;12813:87::-;;;;;;;;;;-1:-1:-1;12886:6:0;;-1:-1:-1;;;;;12886:6:0;12813:87;;29334:104;;;;;;;;;;;;;:::i;60168:541::-;;;;;;:::i;:::-;;:::i;31017:295::-;;;;;;;;;;-1:-1:-1;31017:295:0;;;;;:::i;:::-;;:::i;48762:236::-;;;;;;;;;;-1:-1:-1;48762:236:0;;;;;:::i;:::-;;:::i;32280:328::-;;;;;;;;;;-1:-1:-1;32280:328:0;;;;;:::i;:::-;;:::i;48569:54::-;;;;;;;;;;;;48606:17;48569:54;;59444:613;;;;;;;;;;-1:-1:-1;59444:613:0;;;;;:::i;:::-;;:::i;31383:164::-;;;;;;;;;;-1:-1:-1;31383:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31504:25:0;;;31480:4;31504:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31383:164;48717:31;;;;;;;;;;-1:-1:-1;48717:31:0;;;;;;;;13713:192;;;;;;;;;;-1:-1:-1;13713:192:0;;;;;:::i;:::-;;:::i;48631:39::-;;;;;;;;;;;;48668:2;48631:39;;48678:32;;;;;;;;;;;;;;;;42288:224;42390:4;-1:-1:-1;;;;;;42414:50:0;;-1:-1:-1;;;42414:50:0;;:90;;;42468:36;42492:11;42468:23;:36::i;:::-;42407:97;42288:224;-1:-1:-1;;42288:224:0:o;29165:100::-;29219:13;29252:5;29245:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29165:100;:::o;30724:221::-;30800:7;34207:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34207:16:0;30820:73;;;;-1:-1:-1;;;30820:73:0;;39677:2:1;30820:73:0;;;39659:21:1;39716:2;39696:18;;;39689:30;39755:34;39735:18;;;39728:62;-1:-1:-1;;;39806:18:1;;;39799:42;39858:19;;30820:73:0;;;;;;;;;-1:-1:-1;30913:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30913:24:0;;30724:221::o;30247:411::-;30328:13;30344:23;30359:7;30344:14;:23::i;:::-;30328:39;;30392:5;-1:-1:-1;;;;;30386:11:0;:2;-1:-1:-1;;;;;30386:11:0;;;30378:57;;;;-1:-1:-1;;;30378:57:0;;41211:2:1;30378:57:0;;;41193:21:1;41250:2;41230:18;;;41223:30;41289:34;41269:18;;;41262:62;-1:-1:-1;;;41340:18:1;;;41333:31;41381:19;;30378:57:0;41009:397:1;30378:57:0;11753:10;-1:-1:-1;;;;;30470:21:0;;;;:62;;-1:-1:-1;30495:37:0;30512:5;11753:10;31383:164;:::i;30495:37::-;30448:168;;;;-1:-1:-1;;;30448:168:0;;38070:2:1;30448:168:0;;;38052:21:1;38109:2;38089:18;;;38082:30;38148:34;38128:18;;;38121:62;38219:26;38199:18;;;38192:54;38263:19;;30448:168:0;37868:420:1;30448:168:0;30629:21;30638:2;30642:7;30629:8;:21::i;:::-;30317:341;30247:411;;:::o;49024:10412::-;49077:13;49121;43016:10;:17;;42928:113;49121:13;49111:7;:23;49103:57;;;;-1:-1:-1;;;49103:57:0;;40451:2:1;49103:57:0;;;40433:21:1;40490:2;40470:18;;;40463:30;-1:-1:-1;;;40509:18:1;;;40502:51;40570:18;;49103:57:0;40249:345:1;49103:57:0;49181:7;49191:15;;;:6;:15;;;;;;49231:25;;:::i;:::-;49267:27;;:::i;:::-;49305:21;;:::i;:::-;49337:27;;:::i;:::-;49375:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49375:17:0;49429:24;;-1:-1:-1;;;49429:24:0;;;;;43664:25:1;;;43705:18;;;43698:34;;;49405:21:0;;49429:3;;:11;;43637:18:1;;49429:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49489:1;49481:5;;;:9;;;49513:4;49505:5;;;:12;49538:4;;;:12;;;49567:7;;;:14;49599:2;49592:9;;;49405:48;;-1:-1:-1;49623:14:0;;:7;:14;:::i;:::-;49612:8;;;;:25;;;;49656:42;;;;;;;;49664:5;;;;;49656:42;;49671:5;;49656:42;;;;;;;;49678:5;;49656:42;;;;49685:5;;-1:-1:-1;49656:42:0;;;;;;;49692:5;;49656:42;;;;;;;;:4;;;:42;;;;49711:45;;;;;;;49722:5;;49711:45;;49729:5;;49711:45;;;;;;;49736:5;;49711:45;;;;;;;49743:5;;49711:45;;;;;;;49750:5;;49711:45;;;;:7;;;:45;49784:9;;;;:15;;49796:3;;49784:15;:::i;:::-;49769:12;;;:30;49828:28;;;;;;;;;49841:2;49828:28;;49845:1;49828:28;;;;;;;;49848:1;49828:28;;;;;;49851:1;49828:28;;;;;;;49854:1;49828:28;;;;;;;;:9;;;:28;;;;49867:38;;;;;;;49882:2;49867:38;;49886:3;49867:38;;;;49891:3;49867:38;;;;;;;;;;49901:3;49867:38;;;;:11;;;:38;49916:25;;;;;;;49931:1;49916:25;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;;:25;49952:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;;;:26;50011:9;;;;:13;;49851:1;50011:13;:::i;:::-;50007:17;;:1;:17;:::i;:::-;49989:35;;50045:1;50039:7;;:30;;;;-1:-1:-1;50050:15:0;;50068:1;-1:-1:-1;50039:30:0;50035:55;;;50089:1;50071:19;;50035:55;50105:2;50111:1;50105:7;:30;;;;-1:-1:-1;50116:15:0;;50134:1;-1:-1:-1;50105:30:0;50101:55;;;50155:1;50137:19;;50101:55;50167:8;;50181:1;50167:15;;;;50184:8;;50167:11;50184;:15;;;50201:8;;:11;;:15;50256:8;;;;:12;;50267:1;;50256:12;:::i;:::-;50252:16;;:1;:16;:::i;:::-;50227:8;;50236;;;;:12;;50247:1;;50236:12;:::i;:::-;50227:22;;;;;;;:::i;:::-;;;;;;;;;:41;;;;50281:10;;;;;;;;-1:-1:-1;50281:10:0;;;:5;;;:10;;;;50308:18;;;;;;;;;;:13;;;:18;50337:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50337:32:0;;;;;;;;;;;;;;;;;;;;;50394:5795;50415:4;;50411:8;;50394:5795;;;50452:2;:8;;;50444:2;:4;;:16;;;;;;;:::i;:::-;;;-1:-1:-1;50480:6:0;50475:4256;50496:15;;50492:19;;50475:4256;;;50564:60;50582:41;50597:15;50603:5;50609:1;50603:8;;;;;;;:::i;:::-;;;;;50597:5;:15::i;:::-;50614:1;50617:5;50614:1;50621;50617:5;:::i;:::-;50582:14;:41::i;:::-;50564:17;:60::i;:::-;50555:69;;50666:12;;;;50679:1;50666:15;;;;;;;:::i;:::-;;;;;50657:24;;:1;:6;;;:24;:32;;50688:1;50657:32;;;50684:1;50657:32;50643:46;;:11;;;:46;50720:4;;:8;;50727:1;;50720:8;:::i;:::-;50715:1;:13;50711:34;;;50744:1;50730:11;;;:15;50711:34;50800:6;;:10;;50809:1;;50800:10;:::i;:::-;50798:12;;:1;:12;:::i;:::-;50789:5;:1;50793;50789:5;:::i;:::-;:22;;;;:::i;:::-;50780:6;:1;50784:2;50780:6;:::i;:::-;50775:11;;:2;:11;:::i;:::-;:36;;;;:::i;:::-;50764:8;;;:47;50834:6;50830:248;;50885:1;:8;;;50875:2;:4;;;50880:1;50875:7;;;;;;;:::i;:::-;;;;;:18;;;;:::i;:::-;50865:2;:4;;;50870:1;50865:7;;;;;;;:::i;:::-;;;;:28;50933:4;;;;50938:1;50933:7;;;;;;;:::i;:::-;;;;;50920:2;:7;;;50928:1;50920:10;;;;;;;:::i;:::-;;;;:20;51002:9;;51012:1;51002:12;;;;;;;:::i;:::-;;;;;51022;51028:2;:5;;;51022;:12::i;:::-;51041:14;51047:2;:4;;;51052:1;51047:7;;;;;;;:::i;51041:14::-;50985:71;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50985:71:0;;;;;;;;;50963:9;;50973:1;50963:12;;;;;;;:::i;:::-;;;;:94;50830:248;51100:11;;;;:15;51096:237;;51190:2;:9;;;51200:1;51190:12;;;;;;;:::i;:::-;;;;;51160:42;;51172:2;:11;;;51184:1;51172:14;;;;;;;:::i;:::-;;;;;51163:6;;:23;;;;;;:::i;:::-;51161:25;;:1;:25;:::i;:::-;51160:42;;;;:::i;:::-;51150:2;:4;;;51155:1;51150:7;;;;;;;:::i;:::-;;;;;:52;;;;:::i;:::-;51140:2;:4;;;51145:1;51140:7;;;;;;;:::i;:::-;;;;:62;51096:237;;;51301:2;:9;;;51311:1;51301:12;;;;;;;:::i;:::-;;;;;51271:42;;51283:2;:11;;;51295:1;51283:14;;;;;;;:::i;:::-;;;;;51274:6;;:23;;;;;;:::i;:::-;51272:25;;:1;:25;:::i;:::-;51271:42;;;;:::i;:::-;51261:2;:4;;;51266:1;51261:7;;;;;;;:::i;:::-;;;;;:52;;;;:::i;:::-;51251:2;:4;;;51256:1;51251:7;;;;;;;:::i;:::-;;;;:62;51096:237;51391:2;:11;;;51403:1;51391:14;;;;;;;:::i;:::-;;;;;51383:22;;:2;:5;;;:22;;;;:::i;:::-;51373:2;:4;;;51378:1;51373:7;;;;;;;:::i;:::-;;;;;:32;51369:71;;;51426:2;:11;;;51438:1;51426:14;;;;;;;:::i;:::-;;;;;51417:23;;:2;:5;;;:23;;;;:::i;:::-;51407:2;:4;;;51412:1;51407:7;;;;;;;:::i;:::-;;;;:33;51369:71;51481:1;:8;;;51473:2;:5;;;:16;;;;:::i;:::-;51463:2;:4;;;51468:1;51463:7;;;;;;;:::i;:::-;;;;;:26;51459:58;;;51509:1;:8;;;51501:2;:5;;;:16;;;;:::i;:::-;51491:2;:4;;;51496:1;51491:7;;;;;;;:::i;:::-;;;;:26;51459:58;51581:4;;:8;;51588:1;;51581:8;:::i;:::-;51576:1;:13;51572:99;;;51640:1;:8;;;51632:2;:5;;;:16;;;;:::i;:::-;51622:2;:4;;;51627:1;51622:7;;;;;;;:::i;:::-;;;;:26;51572:99;51720:1;51707:10;;;:14;51754:6;;:10;;51763:1;;51754:10;:::i;:::-;51750:14;;:1;:14;:::i;:::-;51740:7;;;:24;51801:6;;:10;;51810:1;;51801:10;:::i;:::-;51797:14;;:1;:14;:::i;:::-;51783:11;;;:28;51848:7;;;;51856:1;51848:10;;;;;;;:::i;:::-;;;;;51838:7;;;:20;51891:1;51877:2526;51899:1;:11;;;51894:1;:16;51877:2526;;51991:1;51977;:11;;;51966:2;:7;;;51959:2;:4;;;:14;;;;:::i;:::-;51958:30;;;;:::i;:::-;:34;;;;:::i;:::-;51948:2;:7;;;:44;;;;:::i;:::-;51941:4;;;:51;52027:10;;;;52041:1;52027:15;52023:943;;;52085:2;:7;;;52093:1;52085:10;;;;;;;:::i;:::-;;;;;52075:2;:4;;;52080:1;52075:7;;;;;;;:::i;:::-;;;;;:20;52071:412;;;52222:1;52217:2;52212:1;52203;:6;;;:10;;;;:::i;:::-;52202:17;;;;:::i;:::-;:21;:29;;52230:1;52202:29;;;52226:1;52202:29;52191:41;;:1;:7;;;:41;;;;:::i;:::-;52187:1;52173;:11;;;52159:2;:7;;;52167:1;52159:10;;;;;;;:::i;:::-;;;;;52149:2;:4;;;52154:1;52149:7;;;;;;;:::i;:::-;;;;;:20;;;;:::i;:::-;52148:36;;;;:::i;:::-;:40;;;;:::i;:::-;52135:2;:7;;;52143:1;52135:10;;;;;;;:::i;:::-;;;;;:53;;;;:::i;:::-;:97;;;;:::i;:::-;52128:4;;;:104;52023:943;;52071:412;52418:1;52413:2;52408:1;52399;:6;;;:10;;;;:::i;:::-;52398:17;;;;:::i;:::-;:21;:29;;52426:1;52398:29;;;52422:1;52398:29;52387:41;;:1;:7;;;:41;;;;:::i;:::-;52383:1;52369;:11;;;52358:2;:4;;;52363:1;52358:7;;;;;;;:::i;:::-;;;;;52345:2;:7;;;52353:1;52345:10;;;;;;;:::i;:::-;;;;;:20;;;;:::i;:::-;52344:36;;;;:::i;:::-;:40;;;;:::i;:::-;52331:2;:7;;;52339:1;52331:10;;;;;;;:::i;:::-;;;;;:53;;;;:::i;52023:943::-;52553:2;:7;;;52561:1;52553:10;;;;;;;:::i;:::-;;;;;52543:2;:4;;;52548:1;52543:7;;;;;;;:::i;:::-;;;;;:20;52539:404;;;52690:1;52685:2;52680:1;52671;:6;;;:10;;;;:::i;:::-;52670:17;;;;:::i;:::-;:21;:29;;52698:1;52670:29;;;52694:1;52670:29;52659:41;;:1;:7;;;:41;;;;:::i;:::-;52655:1;52641;:11;;;52627:2;:7;;;52635:1;52627:10;;;;;;;:::i;:::-;;;;;52617:2;:4;;;52622:1;52617:7;;;;;;;:::i;:::-;;;;;:20;;;;:::i;:::-;52616:36;;;;:::i;:::-;:40;;;;:::i;:::-;52603:2;:7;;;52611:1;52603:10;;;;;;;:::i;:::-;;;;;:53;;;;:::i;:::-;:97;;;;:::i;52539:404::-;52882:1;52877:2;52872:1;52863;:6;;;:10;;;;:::i;:::-;52862:17;;;;:::i;:::-;:21;:29;;52890:1;52862:29;;;52886:1;52862:29;52851:41;;:1;:7;;;:41;;;;:::i;:::-;52847:1;52833;:11;;;52822:2;:4;;;52827:1;52822:7;;;;;;;:::i;:::-;;;;;52809:2;:7;;;52817:1;52809:10;;;;;;;:::i;:::-;;;;;:20;;;;:::i;:::-;52808:36;;;;:::i;:::-;:40;;;;:::i;:::-;52795:2;:7;;;52803:1;52795:10;;;;;;;:::i;:::-;;;;;:53;;;;:::i;:::-;:97;;;;:::i;:::-;52788:4;;;:104;52539:404;53010:1;52996;:11;;;:15;;;;:::i;:::-;52992:1;:19;52988:248;;;53044:1;:10;;;53058:1;53044:15;53040:173;;;53105:1;53092:10;;;:14;53040:173;;;53184:1;53171:10;;;:14;53040:173;53262:6;;53271:1;-1:-1:-1;53262:19:0;;;;;53280:1;53276;:5;53262:19;53258:1053;;;53318:1;:11;;;53314:1;:15;53310:312;;;53366:11;;;;:15;53362:233;;53432:6;;53425:4;;;;:13;;53432:6;53425:13;:::i;:::-;53418:4;;;:20;53362:233;;;53541:6;;53534:4;;;;:13;;53541:6;53534:13;:::i;:::-;53527:4;;;:20;53362:233;53687:9;;53697:1;53687:12;;;;;;;:::i;:::-;;;;;53706:55;53756:3;53758:1;53756;:3;:::i;:::-;53741:1;:11;;;53730:2;:7;;;53723:2;:4;;;:14;;;;:::i;:::-;53722:30;;;;:::i;:::-;:38;;;;:::i;:::-;53712:2;:7;;;:48;;;;:::i;:::-;53706:5;:55::i;:::-;53766:11;53772:1;:4;;;53766:5;:11::i;:::-;53670:108;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53670:108:0;;;;;;;;;53648:9;;53658:1;53648:12;;;;;;;:::i;:::-;;;;:131;53258:1053;;;53903:9;;53913:1;53903:12;;;;;;;:::i;:::-;;;;;53923:55;53973:3;53975:1;53973;:3;:::i;53923:55::-;53886:97;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53886:97:0;;;;;;;;;53864:9;;53874:1;53864:12;;;;;;;:::i;:::-;;;;:120;54050:9;;54060:1;54050:12;;;;;;;:::i;:::-;;;;;54064:14;54070:1;:7;;;54064:5;:14::i;:::-;54083:11;54089:1;:4;;;54083:5;:11::i;:::-;54099;54105:1;:4;;;54099:5;:11::i;:::-;54033:82;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54033:82:0;;;;;;;;;54011:9;;54021:1;54011:12;;;;;;;:::i;:::-;;;;:105;54182:9;;54192:1;54182:12;;;;;;;:::i;:::-;;;;;54195:61;54253:1;54250;54246:3;54248:1;54253;54246:3;:::i;:::-;:5;;;;:::i;:::-;54231:1;:11;;;54220:2;:7;;;54213:2;:4;;;:14;;;;:::i;:::-;54212:30;;;;:::i;:::-;:40;;;;:::i;:::-;:42;;;;:::i;54195:61::-;54261:23;54282:1;54273;:7;;;54268:1;:4;;;:12;;;;:::i;:::-;54267:16;;;;:::i;54261:23::-;54165:120;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54165:120:0;;;;;;;;;54143:9;;54153:1;54143:12;;;;;;;:::i;:::-;;;;:143;53258:1053;54376:4;;;;54366:7;;;:14;51912:3;;;;:::i;:::-;;;;51877:2526;;;-1:-1:-1;54443:4:0;;:8;;54450:1;;54443:8;:::i;:::-;54438:1;:13;54434:208;;;54515:9;;54525:1;54515:12;;;;;;;:::i;:::-;;;;;54534:11;54540:2;:4;;;54534:5;:11::i;:::-;54550:14;54556:2;:4;;;54561:1;54556:7;;;;;;;:::i;54550:14::-;54570:11;54576:2;:4;;;54570:5;:11::i;:::-;54586:12;54592:2;:5;;;54586;:12::i;:::-;54498:101;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54498:101:0;;;;;;;;;54476:9;;54486:1;54476:12;;;;;;;:::i;:::-;;;;:124;54434:208;54673:2;:4;;;54678:1;54673:7;;;;;;;:::i;:::-;;;;;54660:2;:7;;;54668:1;54660:10;;;;;;;:::i;:::-;;;;:20;50513:3;;;;:::i;:::-;;;;50475:4256;;;-1:-1:-1;54769:4:0;;;;54759:7;;;:14;54837:8;;;;54828:17;;;54883:1;-1:-1:-1;54874:18:0;;54891:1;54874:18;;;54887:1;54874:18;54860:32;;:11;;;:32;54919:1;54913:7;;54909:1157;;;54949:6;54945:531;;54996:3;54988:2;:5;;;:11;;;;:::i;:::-;54981:4;;;:18;54909:1157;;54945:531;55033:4;;:8;;55040:1;;55033:8;:::i;:::-;55028:1;:13;55025:451;;;55081:3;55073:2;:5;;;:11;;;;:::i;55025:451::-;55137:11;;;;:15;55133:201;;55203:6;;:8;;55210:1;;55203:8;:::i;:::-;55202:15;;55215:2;55202:15;:::i;:::-;55196:3;55188:2;:5;;;:11;;;;:::i;:::-;:29;;;;:::i;:::-;55181:4;;;:36;55133:201;;;55296:6;;:8;;55303:1;;55296:8;:::i;:::-;55295:15;;55308:2;55295:15;:::i;:::-;55289:3;55281:2;:5;;;:11;;;;:::i;:::-;:29;;;;:::i;:::-;55274:4;;;:36;55133:201;55375:3;55367:2;:5;;;:11;;;;:::i;:::-;55360:1;:4;;;:18;55356:42;;;55395:3;55387:2;:5;;;:11;;;;:::i;:::-;55380:4;;;:18;55356:42;55432:2;:5;;;55425:1;:4;;;:12;55421:35;;;55446:5;;;;:10;;55454:2;55446:10;:::i;55421:35::-;54909:1157;;;55523:6;55519:532;;55570:3;55562:2;:5;;;:11;;;;:::i;55519:532::-;55608:4;;:8;;55615:1;;55608:8;:::i;:::-;55603:1;:13;55600:451;;;55656:3;55648:2;:5;;;:11;;;;:::i;55600:451::-;55712:11;;;;:15;55708:201;;55778:6;;:8;;55785:1;;55778:8;:::i;:::-;55777:15;;55790:2;55777:15;:::i;:::-;55771:3;55763:2;:5;;;:11;;;;:::i;:::-;:29;;;;:::i;:::-;55756:4;;;:36;55708:201;;;55871:6;;:8;;55878:1;;55871:8;:::i;:::-;55870:15;;55883:2;55870:15;:::i;:::-;55864:3;55856:2;:5;;;:11;;;;:::i;:::-;:29;;;;:::i;:::-;55849:4;;;:36;55708:201;55950:3;55942:2;:5;;;:11;;;;:::i;:::-;55935:1;:4;;;:18;55931:42;;;55970:3;55962:2;:5;;;:11;;;;:::i;:::-;55955:4;;;:18;55931:42;56007:2;:5;;;56000:1;:4;;;:12;55996:35;;;56021:5;;;;:10;;56029:2;56021:10;:::i;:::-;56014:4;;;:17;55996:35;56129:3;:13;;;56148:11;56154:2;:4;;;56148:5;:11::i;:::-;56164;56170:1;:4;;;56164:5;:11::i;:::-;56112:64;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56112:64:0;;;;;;;;;56089:13;;:88;50421:3;;;;:::i;:::-;;;;50394:5795;;;-1:-1:-1;56209:22:0;;;;;;;;;;;;-1:-1:-1;;;56209:22:0;;;;:14;;;:22;56252:1;56246:7;;;:18;;-1:-1:-1;56257:7:0;;56246:18;:29;;;;56268:2;56274:1;56268:7;56246:29;:40;;;;56279:2;56285:1;56279:7;56246:40;56242:69;;;56289:22;;;;;;;;;;;;-1:-1:-1;;;56289:22:0;;;;:14;;;:22;56242:69;56343:1;56337:2;:7;56322:92;;56378:34;;-1:-1:-1;;;56378:34:0;;:3;;:9;;:34;;56388:7;;56397:2;;56401;;56405;;56409;;56378:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56378:34:0;;;;;;;;;;;;:::i;:::-;56361:52;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56361:52:0;;;;;;;;;;56346:5;;:68;56322:92;56459:5;;;;;56442:155;;;;;;:::i;:::-;;;;-1:-1:-1;;56442:155:0;;;;;;;;;;56427:5;;:171;56666:15;;56685:1;56666:20;56662:231;;;56720:3;:5;;;56740:12;56746:2;:5;;;56740;:12::i;:::-;56757;56763:2;:5;;;56757;:12::i;:::-;56770:9;;:12;;;56818:14;;;;56703:189;;;;;;;56770:12;56818:14;56770:12;56703:189;;:::i;:::-;;;;-1:-1:-1;;56703:189:0;;;;;;;;;;56688:5;;:205;56662:231;56908:15;;56927:1;-1:-1:-1;56904:197:0;;56962:3;:5;;;56982:12;56988:2;:5;;;56982;:12::i;:::-;56999;57005:2;:5;;;56999;:12::i;:::-;57012:9;;:12;;;56945:155;;;;;;;57012:12;;56945:155;;:::i;:::-;;;;-1:-1:-1;;56945:155:0;;;;;;;;;;56930:5;;:171;56904:197;57116:15;;57135:1;-1:-1:-1;57112:173:0;;57170:3;:5;;;57190:12;57196:2;:5;;;57190;:12::i;:::-;57207;57213:2;:5;;;57207;:12::i;:::-;57220:9;;57230:1;57220:12;;;;57153:131;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57153:131:0;;;;;;;;;;57138:5;;:147;57112:173;57332:2;57338:1;57332:7;57328:1317;;;57392:5;;;;;57375:287;;;;;;:::i;:::-;;;;-1:-1:-1;;57375:287:0;;;;;;;;;;57360:5;;;:303;;;57736:5;;;57730:12;;:5;:12::i;:::-;57747:16;57759:3;57753:2;:5;;;:9;;;;:::i;57747:16::-;57764:3;:13;;;57783:12;57789:2;:5;;;57783;:12::i;:::-;57800:16;57812:3;57806:2;:5;;;:9;;;;:::i;57800:16::-;57693:284;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57693:284:0;;;;;;;;;;57678:5;;:300;57328:1317;;;58043:5;;;;;58026:291;;;;;;:::i;:::-;;;;-1:-1:-1;;58026:291:0;;;;;;;;;;58011:5;;;:307;;;58391:5;;;58385:12;;:5;:12::i;:::-;58402:16;58414:3;58408:2;:5;;;:9;;;;:::i;58402:16::-;58419:3;:13;;;58438:12;58444:2;:5;;;58438;:12::i;:::-;58455:16;58467:3;58461:2;:5;;;:9;;;;:::i;58455:16::-;58348:283;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58348:283:0;;;;;;;;;;58333:5;;:299;57328:1317;58704:15;;58723:1;-1:-1:-1;58700:174:0;;58758:3;:5;;;58779:12;58785:2;:5;;;58779;:12::i;:::-;58796;58802:2;:5;;;58796;:12::i;:::-;58809:9;;:12;;;;;58741:132;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58741:132:0;;;;;;;;;;58726:5;;:148;58700:174;58917:3;:5;;;58937:12;58943:2;:5;;;58937;:12::i;:::-;58954;58960:2;:5;;;58954;:12::i;:::-;58967:9;;:12;58900:132;;;;;;;58967:12;;58900:132;;:::i;:::-;;;;-1:-1:-1;;58900:132:0;;;;;;;;;;58885:5;;:148;59373:9;59379:2;59373:5;:9::i;:::-;59403:5;;;;;59066:352;;;;;;;:::i;:::-;;;;;;;;;;;;;59052:367;;;;;;;;;49024:10412;;;:::o;31614:339::-;31809:41;11753:10;31842:7;31809:18;:41::i;:::-;31801:103;;;;-1:-1:-1;;;31801:103:0;;;;;;;:::i;:::-;31917:28;31927:4;31933:2;31937:7;31917:9;:28::i;60721:147::-;12886:6;;-1:-1:-1;;;;;12886:6:0;11753:10;13033:23;13025:68;;;;-1:-1:-1;;;13025:68:0;;;;;;;:::i;:::-;60823:37:::1;::::0;60791:21:::1;::::0;60831:10:::1;::::0;60823:37;::::1;;;::::0;60791:21;;60776:12:::1;60823:37:::0;60776:12;60823:37;60791:21;60831:10;60823:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;60765:103;60721:147::o:0;42596:256::-;42693:7;42729:23;42746:5;42729:16;:23::i;:::-;42721:5;:31;42713:87;;;;-1:-1:-1;;;42713:87:0;;34611:2:1;42713:87:0;;;34593:21:1;34650:2;34630:18;;;34623:30;34689:34;34669:18;;;34662:62;-1:-1:-1;;;34740:18:1;;;34733:41;34791:19;;42713:87:0;34409:407:1;42713:87:0;-1:-1:-1;;;;;;42818:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42596:256::o;60065:91::-;12886:6;;-1:-1:-1;;;;;12886:6:0;11753:10;13033:23;13025:68;;;;-1:-1:-1;;;13025:68:0;;;;;;;:::i;:::-;60136:12:::1;::::0;;-1:-1:-1;;60120:28:0;::::1;60136:12;::::0;;::::1;60135:13;60120:28;::::0;;60065:91::o;32024:185::-;32162:39;32179:4;32185:2;32189:7;32162:39;;;;;;;;;;;;:16;:39::i;43118:233::-;43193:7;43229:30;43016:10;:17;;42928:113;43229:30;43221:5;:38;43213:95;;;;-1:-1:-1;;;43213:95:0;;42729:2:1;43213:95:0;;;42711:21:1;42768:2;42748:18;;;42741:30;42807:34;42787:18;;;42780:62;-1:-1:-1;;;42858:18:1;;;42851:42;42910:19;;43213:95:0;42527:408:1;43213:95:0;43326:10;43337:5;43326:17;;;;;;;;:::i;:::-;;;;;;;;;43319:24;;43118:233;;;:::o;28859:239::-;28931:7;28967:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28967:16:0;29002:19;28994:73;;;;-1:-1:-1;;;28994:73:0;;38906:2:1;28994:73:0;;;38888:21:1;38945:2;38925:18;;;38918:30;38984:34;38964:18;;;38957:62;-1:-1:-1;;;39035:18:1;;;39028:39;39084:19;;28994:73:0;38704:405:1;28589:208:0;28661:7;-1:-1:-1;;;;;28689:19:0;;28681:74;;;;-1:-1:-1;;;28681:74:0;;38495:2:1;28681:74:0;;;38477:21:1;38534:2;38514:18;;;38507:30;38573:34;38553:18;;;38546:62;-1:-1:-1;;;38624:18:1;;;38617:40;38674:19;;28681:74:0;38293:406:1;28681:74:0;-1:-1:-1;;;;;;28773:16:0;;;;;:9;:16;;;;;;;28589:208::o;13464:94::-;12886:6;;-1:-1:-1;;;;;12886:6:0;11753:10;13033:23;13025:68;;;;-1:-1:-1;;;13025:68:0;;;;;;;:::i;:::-;13529:21:::1;13547:1;13529:9;:21::i;:::-;13464:94::o:0;29334:104::-;29390:13;29423:7;29416:14;;;;;:::i;60168:541::-;15752:1;16348:7;;:19;;16340:63;;;;-1:-1:-1;;;16340:63:0;;43142:2:1;16340:63:0;;;43124:21:1;43181:2;43161:18;;;43154:30;43220:33;43200:18;;;43193:61;43271:18;;16340:63:0;42940:355:1;16340:63:0;15752:1;16481:7;:18;60247:12:::1;::::0;::::1;;60239:38;;;::::0;-1:-1:-1;;;60239:38:0;;37315:2:1;60239:38:0::1;::::0;::::1;37297:21:1::0;37354:2;37334:18;;;37327:30;-1:-1:-1;;;37373:18:1;;;37366:43;37426:18;;60239:38:0::1;37113:337:1::0;60239:38:0::1;48668:2;60296:6;:20;;60288:54;;;::::0;-1:-1:-1;;;60288:54:0;;36206:2:1;60288:54:0::1;::::0;::::1;36188:21:1::0;36245:2;36225:18;;;36218:30;-1:-1:-1;;;36264:18:1;;;36257:51;36325:18;;60288:54:0::1;36004:345:1::0;60288:54:0::1;60387:10;;60377:6;60361:13;43016:10:::0;:17;;42928:113;60361:13:::1;:22;;;;:::i;:::-;:36;;60353:67;;;::::0;-1:-1:-1;;;60353:67:0;;42382:2:1;60353:67:0::1;::::0;::::1;42364:21:1::0;42421:2;42401:18;;;42394:30;-1:-1:-1;;;42440:18:1;;;42433:48;42498:18;;60353:67:0::1;42180:342:1::0;60353:67:0::1;60452:19;60465:6:::0;48606:17:::1;60452:19;:::i;:::-;60439:9;:32;;:59;;;-1:-1:-1::0;12886:6:0;;-1:-1:-1;;;;;12886:6:0;11753:10;60475:23:::1;60439:59;60431:94;;;::::0;-1:-1:-1;;;60431:94:0;;41613:2:1;60431:94:0::1;::::0;::::1;41595:21:1::0;41652:2;41632:18;;;41625:30;-1:-1:-1;;;41671:18:1;;;41664:52;41733:18;;60431:94:0::1;41411:346:1::0;60431:94:0::1;60536:13;::::0;60560:142:::1;60584:6;60580:1;:10;60560:142;;;43016:10:::0;:17;60612:21;-1:-1:-1;60656:30:0::1;11753:10:::0;60680:5:::1;60656:9;:30::i;:::-;60592:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60560:142;;;-1:-1:-1::0;;15708:1:0;16660:7;:22;-1:-1:-1;60168:541:0:o;31017:295::-;-1:-1:-1;;;;;31120:24:0;;11753:10;31120:24;;31112:62;;;;-1:-1:-1;;;31112:62:0;;36961:2:1;31112:62:0;;;36943:21:1;37000:2;36980:18;;;36973:30;37039:27;37019:18;;;37012:55;37084:18;;31112:62:0;36759:349:1;31112:62:0;11753:10;31187:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31187:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31187:53:0;;;;;;;;;;31256:48;;34133:41:1;;;31187:42:0;;11753:10;31256:48;;34106:18:1;31256:48:0;;;;;;;31017:295;;:::o;48762:236::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32280:328::-;32455:41;11753:10;32488:7;32455:18;:41::i;:::-;32447:103;;;;-1:-1:-1;;;32447:103:0;;;;;;;:::i;:::-;32561:39;32575:4;32581:2;32585:7;32594:5;32561:13;:39::i;:::-;32280:328;;;;:::o;59444:613::-;59509:13;59553;43016:10;:17;;42928:113;59553:13;59543:7;:23;59535:57;;;;-1:-1:-1;;;59535:57:0;;40451:2:1;59535:57:0;;;40433:21:1;40490:2;40470:18;;;40463:30;-1:-1:-1;;;40509:18:1;;;40502:51;40570:18;;59535:57:0;40249:345:1;59535:57:0;59603:15;59621:17;59630:7;59621:8;:17::i;:::-;59603:35;;59659:18;59680:270;59749:14;59755:7;59749:5;:14::i;:::-;59917:23;59937:1;59917:13;:23::i;:::-;59707:240;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59680:13;:270::i;:::-;59659:291;;60022:4;59972:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59972:55:0;;;;;;;;;;59444:613;-1:-1:-1;;;;59444:613:0:o;13713:192::-;12886:6;;-1:-1:-1;;;;;12886:6:0;11753:10;13033:23;13025:68;;;;-1:-1:-1;;;13025:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13802:22:0;::::1;13794:73;;;::::0;-1:-1:-1;;;13794:73:0;;35442:2:1;13794:73:0::1;::::0;::::1;35424:21:1::0;35481:2;35461:18;;;35454:30;35520:34;35500:18;;;35493:62;-1:-1:-1;;;35571:18:1;;;35564:36;35617:19;;13794:73:0::1;35240:402:1::0;13794:73:0::1;13878:19;13888:8;13878:9;:19::i;:::-;13713:192:::0;:::o;28220:305::-;28322:4;-1:-1:-1;;;;;;28359:40:0;;-1:-1:-1;;;28359:40:0;;:105;;-1:-1:-1;;;;;;;28416:48:0;;-1:-1:-1;;;28416:48:0;28359:105;:158;;;-1:-1:-1;;;;;;;;;;26843:40:0;;;28481:36;26734:157;38337:174;38412:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38412:29:0;-1:-1:-1;;;;;38412:29:0;;;;;;;;:24;;38466:23;38412:24;38466:14;:23::i;:::-;-1:-1:-1;;;;;38457:46:0;;;;;;;;;;;38337:174;;:::o;79408:525::-;79457:13;79487:10;79483:53;;-1:-1:-1;;79514:10:0;;;;;;;;;;;;-1:-1:-1;;;79514:10:0;;;;;79408:525::o;79483:53::-;79561:5;79546:12;79602:78;79609:9;;79602:78;;79635:8;;;;:::i;:::-;;-1:-1:-1;79658:10:0;;-1:-1:-1;79666:2:0;79658:10;;:::i;:::-;;;79602:78;;;79690:19;79722:6;79712:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79712:17:0;;79690:39;;79740:154;79747:10;;79740:154;;79774:11;79784:1;79774:11;;:::i;:::-;;-1:-1:-1;79843:10:0;79851:2;79843:5;:10;:::i;:::-;79830:24;;:2;:24;:::i;:::-;79817:39;;79800:6;79807;79800:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;79800:56:0;;;;;;;;-1:-1:-1;79871:11:0;79880:2;79871:11;;:::i;:::-;;;79740:154;;;79918:6;79408:525;-1:-1:-1;;;;79408:525:0:o;10705:416::-;10835:13;10891:3;10861:21;10938;10949:10;10938:8;:21;:::i;:::-;10928:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10928:32:0;-1:-1:-1;10906:54:0;-1:-1:-1;10988:10:0;10971:111;11004:8;11000:1;:12;10971:111;;;11059:8;11068:1;11059:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;11059:11:0;11034:6;11041:14;11045:10;11041:1;:14;:::i;:::-;11034:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;11034:36:0;;;;;;;;-1:-1:-1;11014:3:0;;;;:::i;:::-;;;;10971:111;;;-1:-1:-1;11106:6:0;10705:416;-1:-1:-1;;;;;10705:416:0:o;10235:462::-;10294:7;10337:1;10294:7;;10379:267;10403:1;:8;10399:1;:12;10379:267;;;10472:4;10464:12;;:1;10466;10464:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;10464:4:0;:12;;;;:28;;;10488:4;10480:12;;:1;10482;10480:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;10480:4:0;:12;;10464:28;10460:175;;;10559:2;10549:1;10551;10549:4;;;;;;;;:::i;:::-;;;;;10537:24;;;10549:4;;10537:24;:::i;:::-;10522:11;:6;10531:2;10522:11;:::i;:::-;:40;;;;:::i;:::-;10513:49;;10460:175;10413:3;;;;:::i;:::-;;;;10379:267;;;-1:-1:-1;10663:6:0;10235:462;-1:-1:-1;;;10235:462:0:o;34412:348::-;34505:4;34207:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34207:16:0;34522:73;;;;-1:-1:-1;;;34522:73:0;;37657:2:1;34522:73:0;;;37639:21:1;37696:2;37676:18;;;37669:30;37735:34;37715:18;;;37708:62;-1:-1:-1;;;37786:18:1;;;37779:42;37838:19;;34522:73:0;37455:408:1;34522:73:0;34606:13;34622:23;34637:7;34622:14;:23::i;:::-;34606:39;;34675:5;-1:-1:-1;;;;;34664:16:0;:7;-1:-1:-1;;;;;34664:16:0;;:51;;;;34708:7;-1:-1:-1;;;;;34684:31:0;:20;34696:7;34684:11;:20::i;:::-;-1:-1:-1;;;;;34684:31:0;;34664:51;:87;;;-1:-1:-1;;;;;;31504:25:0;;;31480:4;31504:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34719:32;31383:164;37641:578;37800:4;-1:-1:-1;;;;;37773:31:0;:23;37788:7;37773:14;:23::i;:::-;-1:-1:-1;;;;;37773:31:0;;37765:85;;;;-1:-1:-1;;;37765:85:0;;40801:2:1;37765:85:0;;;40783:21:1;40840:2;40820:18;;;40813:30;40879:34;40859:18;;;40852:62;-1:-1:-1;;;40930:18:1;;;40923:39;40979:19;;37765:85:0;40599:405:1;37765:85:0;-1:-1:-1;;;;;37869:16:0;;37861:65;;;;-1:-1:-1;;;37861:65:0;;36556:2:1;37861:65:0;;;36538:21:1;36595:2;36575:18;;;36568:30;36634:34;36614:18;;;36607:62;-1:-1:-1;;;36685:18:1;;;36678:34;36729:19;;37861:65:0;36354:400:1;37861:65:0;37939:39;37960:4;37966:2;37970:7;37939:20;:39::i;:::-;38043:29;38060:1;38064:7;38043:8;:29::i;:::-;-1:-1:-1;;;;;38085:15:0;;;;;;:9;:15;;;;;:20;;38104:1;;38085:15;:20;;38104:1;;38085:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38116:13:0;;;;;;:9;:13;;;;;:18;;38133:1;;38116:13;:18;;38133:1;;38116:18;:::i;:::-;;;;-1:-1:-1;;38145:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38145:21:0;-1:-1:-1;;;;;38145:21:0;;;;;;;;;38184:27;;38145:16;;38184:27;;;;;;;37641:578;;;:::o;13913:173::-;13988:6;;;-1:-1:-1;;;;;14005:17:0;;;-1:-1:-1;;;;;;14005:17:0;;;;;;;14038:40;;13988:6;;;14005:17;13988:6;;14038:40;;13969:16;;14038:40;13958:128;13913:173;:::o;35102:110::-;35178:26;35188:2;35192:7;35178:26;;;;;;;;;;;;:9;:26::i;33490:315::-;33647:28;33657:4;33663:2;33667:7;33647:9;:28::i;:::-;33694:48;33717:4;33723:2;33727:7;33736:5;33694:22;:48::i;:::-;33686:111;;;;-1:-1:-1;;;33686:111:0;;;;;;;:::i;84141:1607::-;84239:11;;84199:13;;84265:8;84261:23;;-1:-1:-1;;84275:9:0;;;;;;;;;-1:-1:-1;84275:9:0;;;84141:1607;-1:-1:-1;84141:1607:0:o;84261:23::-;84336:18;84374:1;84363:7;:3;84369:1;84363:7;:::i;:::-;84362:13;;;;:::i;:::-;84357:19;;:1;:19;:::i;:::-;84336:40;-1:-1:-1;84434:19:0;84466:15;84336:40;84479:2;84466:15;:::i;:::-;84456:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84456:26:0;;84434:48;;84495:18;84516:5;;;;;;;;;;;;;;;;;84495:26;;84585:1;84578:5;84574:13;84630:2;84622:6;84618:15;84681:1;84649:777;84704:3;84701:1;84698:10;84649:777;;;84759:1;84802:12;;;;;84796:19;84897:4;84885:2;84881:14;;;;;84863:40;;84857:47;85006:2;85002:14;;;84998:25;;84984:40;;84978:47;85135:1;85131:13;;;85127:24;;85113:39;;85107:46;85255:16;;;;85241:31;;85235:38;84933:1;84929:11;;;85027:4;84974:58;;;84965:68;85058:11;;85103:57;;;85094:67;;;;85186:11;;85231:49;;85222:59;85310:3;85306:13;85339:22;;85409:1;85394:17;;;;84752:9;84649:777;;;84653:44;85458:1;85453:3;85449:11;85479:1;85474:84;;;;85577:1;85572:82;;;;85442:212;;85474:84;-1:-1:-1;;;;;85507:17:0;;85500:43;85474:84;;85572:82;-1:-1:-1;;;;;85605:17:0;;85598:41;85442:212;-1:-1:-1;;;85670:26:0;;;85677:6;84141:1607;-1:-1:-1;;;;84141:1607:0:o;43964:589::-;-1:-1:-1;;;;;44170:18:0;;44166:187;;44205:40;44237:7;45380:10;:17;;45353:24;;;;:15;:24;;;;;:44;;;45408:24;;;;;;;;;;;;45276:164;44205:40;44166:187;;;44275:2;-1:-1:-1;;;;;44267:10:0;:4;-1:-1:-1;;;;;44267:10:0;;44263:90;;44294:47;44327:4;44333:7;44294:32;:47::i;:::-;-1:-1:-1;;;;;44367:16:0;;44363:183;;44400:45;44437:7;44400:36;:45::i;44363:183::-;44473:4;-1:-1:-1;;;;;44467:10:0;:2;-1:-1:-1;;;;;44467:10:0;;44463:83;;44494:40;44522:2;44526:7;44494:27;:40::i;35439:321::-;35569:18;35575:2;35579:7;35569:5;:18::i;:::-;35620:54;35651:1;35655:2;35659:7;35668:5;35620:22;:54::i;:::-;35598:154;;;;-1:-1:-1;;;35598:154:0;;;;;;;:::i;39076:803::-;39231:4;-1:-1:-1;;;;;39252:13:0;;19229:20;19277:8;39248:624;;39288:72;;-1:-1:-1;;;39288:72:0;;-1:-1:-1;;;;;39288:36:0;;;;;:72;;11753:10;;39339:4;;39345:7;;39354:5;;39288:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39288:72:0;;;;;;;;-1:-1:-1;;39288:72:0;;;;;;;;;;;;:::i;:::-;;;39284:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39534:13:0;;39530:272;;39577:60;;-1:-1:-1;;;39577:60:0;;;;;;;:::i;39530:272::-;39752:6;39746:13;39737:6;39733:2;39729:15;39722:38;39284:533;-1:-1:-1;;;;;;39411:55:0;-1:-1:-1;;;39411:55:0;;-1:-1:-1;39404:62:0;;39248:624;-1:-1:-1;39856:4:0;39076:803;;;;;;:::o;46067:988::-;46333:22;46383:1;46358:22;46375:4;46358:16;:22::i;:::-;:26;;;;:::i;:::-;46395:18;46416:26;;;:17;:26;;;;;;46333:51;;-1:-1:-1;46549:28:0;;;46545:328;;-1:-1:-1;;;;;46616:18:0;;46594:19;46616:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46667:30;;;;;;:44;;;46784:30;;:17;:30;;;;;:43;;;46545:328;-1:-1:-1;46969:26:0;;;;:17;:26;;;;;;;;46962:33;;;-1:-1:-1;;;;;47013:18:0;;;;;:12;:18;;;;;:34;;;;;;;47006:41;46067:988::o;47350:1079::-;47628:10;:17;47603:22;;47628:21;;47648:1;;47628:21;:::i;:::-;47660:18;47681:24;;;:15;:24;;;;;;48054:10;:26;;47603:46;;-1:-1:-1;47681:24:0;;47603:46;;48054:26;;;;;;:::i;:::-;;;;;;;;;48032:48;;48118:11;48093:10;48104;48093:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48198:28;;;:15;:28;;;;;;;:41;;;48370:24;;;;;48363:31;48405:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47421:1008;;;47350:1079;:::o;44854:221::-;44939:14;44956:20;44973:2;44956:16;:20::i;:::-;-1:-1:-1;;;;;44987:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45032:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44854:221:0:o;36096:619::-;-1:-1:-1;;;;;36176:16:0;;36168:61;;;;-1:-1:-1;;;36168:61:0;;39316:2:1;36168:61:0;;;39298:21:1;;;39335:18;;;39328:30;39394:34;39374:18;;;39367:62;39446:18;;36168:61:0;39114:356:1;36168:61:0;34183:4;34207:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34207:16:0;:30;36240:58;;;;-1:-1:-1;;;36240:58:0;;35849:2:1;36240:58:0;;;35831:21:1;35888:2;35868:18;;;35861:30;35927;35907:18;;;35900:58;35975:18;;36240:58:0;35647:352:1;36240:58:0;36309:45;36338:1;36342:2;36346:7;36309:20;:45::i;:::-;-1:-1:-1;;;;;36371:13:0;;;;;;:9;:13;;;;;;36387:2;-1:-1:-1;36367:219:0;;;-1:-1:-1;;;;;36424:13:0;;;;;;:9;:13;;;;;;;;;36406:15;;;:6;:15;;;;;;:31;36367:219;;;36569:2;36547:14;36553:7;36547:5;:14::i;:::-;36530:32;;;;;;;;:::i;:::-;;;;-1:-1:-1;;36530:32:0;;;;;;;;;;36506:58;;36530:32;36506:58;;:::i;:::-;;;;;;;;;;;;;36496:69;;;;;;36488:78;;:83;;;;:::i;:::-;36470:15;;;;:6;:15;;;;;:101;36367:219;-1:-1:-1;;;;;36606:13:0;;;;;;:9;:13;;;;;:18;;36623:1;;36606:13;:18;;36623:1;;36606:18;:::i;:::-;;;;-1:-1:-1;;36635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36635:21:0;-1:-1:-1;;;;;36635:21:0;;;;;;;;36674:33;;36635:16;;;36674:33;;36635:16;;36674:33;36096:619;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:888::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1408:18;1400:6;1397:30;1394:50;;;1440:1;1437;1430:12;1394:50;1463:22;;1516:4;1508:13;;1504:27;-1:-1:-1;1494:55:1;;1545:1;1542;1535:12;1494:55;1581:2;1568:16;1606:48;1622:31;1650:2;1622:31;:::i;:::-;1606:48;:::i;:::-;1677:2;1670:5;1663:17;1717:7;1712:2;1707;1703;1699:11;1695:20;1692:33;1689:53;;;1738:1;1735;1728:12;1689:53;1793:2;1788;1784;1780:11;1775:2;1768:5;1764:14;1751:45;1837:1;1832:2;1827;1820:5;1816:14;1812:23;1805:34;1858:5;1848:15;;;;;981:888;;;;;;;:::o;1874:347::-;1939:6;1947;2000:2;1988:9;1979:7;1975:23;1971:32;1968:52;;;2016:1;2013;2006:12;1968:52;2039:29;2058:9;2039:29;:::i;:::-;2029:39;;2118:2;2107:9;2103:18;2090:32;2165:5;2158:13;2151:21;2144:5;2141:32;2131:60;;2187:1;2184;2177:12;2131:60;2210:5;2200:15;;;1874:347;;;;;:::o;2226:254::-;2294:6;2302;2355:2;2343:9;2334:7;2330:23;2326:32;2323:52;;;2371:1;2368;2361:12;2323:52;2394:29;2413:9;2394:29;:::i;:::-;2384:39;2470:2;2455:18;;;;2442:32;;-1:-1:-1;;;2226:254:1:o;2485:821::-;2579:6;2610:3;2654:2;2642:9;2633:7;2629:23;2625:32;2622:52;;;2670:1;2667;2660:12;2622:52;2719:7;2712:4;2701:9;2697:20;2693:34;2683:62;;2741:1;2738;2731:12;2683:62;2774:2;2768:9;2816:2;2808:6;2804:15;2885:6;2873:10;2870:22;2849:18;2837:10;2834:34;2831:62;2828:88;;;2896:18;;:::i;:::-;2932:2;2925:22;2967:6;2993:9;3017:18;;;3014:31;-1:-1:-1;3011:51:1;;;3058:1;3055;3048:12;3011:51;3080:1;3071:10;;3090:185;3104:4;3101:1;3098:11;3090:185;;;3163:10;;3151:23;;3124:1;3117:9;;;;;3197:4;3221:12;;;;3253;3090:185;;;-1:-1:-1;3294:6:1;;2485:821;-1:-1:-1;;;;;2485:821:1:o;3311:245::-;3369:6;3422:2;3410:9;3401:7;3397:23;3393:32;3390:52;;;3438:1;3435;3428:12;3390:52;3477:9;3464:23;3496:30;3520:5;3496:30;:::i;3561:249::-;3630:6;3683:2;3671:9;3662:7;3658:23;3654:32;3651:52;;;3699:1;3696;3689:12;3651:52;3731:9;3725:16;3750:30;3774:5;3750:30;:::i;3815:635::-;3895:6;3948:2;3936:9;3927:7;3923:23;3919:32;3916:52;;;3964:1;3961;3954:12;3916:52;3997:9;3991:16;4030:18;4022:6;4019:30;4016:50;;;4062:1;4059;4052:12;4016:50;4085:22;;4138:4;4130:13;;4126:27;-1:-1:-1;4116:55:1;;4167:1;4164;4157:12;4116:55;4196:2;4190:9;4221:48;4237:31;4265:2;4237:31;:::i;4221:48::-;4292:2;4285:5;4278:17;4332:7;4327:2;4322;4318;4314:11;4310:20;4307:33;4304:53;;;4353:1;4350;4343:12;4304:53;4366:54;4417:2;4412;4405:5;4401:14;4396:2;4392;4388:11;4366:54;:::i;:::-;4439:5;3815:635;-1:-1:-1;;;;;3815:635:1:o;4455:180::-;4514:6;4567:2;4555:9;4546:7;4542:23;4538:32;4535:52;;;4583:1;4580;4573:12;4535:52;-1:-1:-1;4606:23:1;;4455:180;-1:-1:-1;4455:180:1:o;4640:474::-;4688:3;4719;4773;4766:5;4762:15;4800:5;4823:1;4833:255;4847:4;4844:1;4841:11;4833:255;;;4916:5;4910:4;4906:16;4901:3;4894:29;4944:37;4976:4;4967:6;4961:13;4944:37;:::i;:::-;5004:4;5066:12;;;;4936:45;;-1:-1:-1;5031:15:1;;;;;4867:1;4860:9;4833:255;;5119:337;5223:5;5246:1;5256:194;5270:4;5267:1;5264:11;5256:194;;;5329:13;;5317:26;;5366:4;5390:12;;;;5425:15;;;;5290:1;5283:9;5256:194;;5461:326;5554:5;5577:1;5587:194;5601:4;5598:1;5595:11;5587:194;;;5660:13;;5648:26;;5697:4;5721:12;;;;5756:15;;;;5621:1;5614:9;5587:194;;5792:335;5883:5;5906:1;5916:205;5930:4;5927:1;5924:11;5916:205;;;5993:13;;6008:4;5989:24;5977:37;;6037:4;6061:12;;;;6096:15;;;;5950:1;5943:9;5916:205;;6132:257;6173:3;6211:5;6205:12;6238:6;6233:3;6226:19;6254:63;6310:6;6303:4;6298:3;6294:14;6287:4;6280:5;6276:16;6254:63;:::i;:::-;6371:2;6350:15;-1:-1:-1;;6346:29:1;6337:39;;;;6378:4;6333:50;;6132:257;-1:-1:-1;;6132:257:1:o;6394:185::-;6436:3;6474:5;6468:12;6489:52;6534:6;6529:3;6522:4;6515:5;6511:16;6489:52;:::i;:::-;6557:16;;;;;6394:185;-1:-1:-1;;6394:185:1:o;7854:672::-;7937:5;7931:12;7926:3;7919:25;7993:4;7986:5;7982:16;7976:23;7969:4;7964:3;7960:14;7953:47;8049:4;8042:5;8038:16;8032:23;8025:4;8020:3;8016:14;8009:47;8105:4;8098:5;8094:16;8088:23;8081:4;8076:3;8072:14;8065:47;8161:4;8154:5;8150:16;8144:23;8137:4;8132:3;8128:14;8121:47;8217:4;8210:5;8206:16;8200:23;8193:4;8188:3;8184:14;8177:47;8270:4;8263:5;8259:16;8253:23;8285:54;8333:4;8328:3;8324:14;8310:12;8285:54;:::i;:::-;;8387:4;8380:5;8376:16;8370:23;8402:58;8452:6;8447:3;8443:16;8427:14;8402:58;:::i;:::-;-1:-1:-1;8511:6:1;8500:18;8494:25;8485:6;8476:16;;;;8469:51;7854:672::o;8531:566::-;8616:5;8610:12;8605:3;8598:25;8669:4;8662:5;8658:16;8652:23;8684:52;8730:4;8725:3;8721:14;8707:12;8684:52;:::i;:::-;;8784:4;8777:5;8773:16;8767:23;8799:54;8847:4;8842:3;8838:14;8822;8799:54;:::i;:::-;;8901:4;8894:5;8890:16;8884:23;8916:56;8964:6;8959:3;8955:16;8939:14;8916:56;:::i;:::-;;9020:4;9013:5;9009:16;9003:23;9035:56;9083:6;9078:3;9074:16;9058:14;9035:56;:::i;9102:276::-;9233:3;9271:6;9265:13;9287:53;9333:6;9328:3;9321:4;9313:6;9309:17;9287:53;:::i;:::-;9356:16;;;;;9102:276;-1:-1:-1;;9102:276:1:o;9383:808::-;9711:3;9749:6;9743:13;9765:53;9811:6;9806:3;9799:4;9791:6;9787:17;9765:53;:::i;:::-;9881:13;;9840:16;;;;9903:57;9881:13;9840:16;9937:4;9925:17;;9903:57;:::i;:::-;-1:-1:-1;;;9982:20:1;;10011:18;;;10054:13;;10076:65;10054:13;10128:1;10117:13;;10110:4;10098:17;;10076:65;:::i;:::-;10161:20;10183:1;10157:28;;9383:808;-1:-1:-1;;;;;9383:808:1:o;10196:1308::-;10774:3;10812:6;10806:13;10828:53;10874:6;10869:3;10862:4;10854:6;10850:17;10828:53;:::i;:::-;10944:13;;10903:16;;;;10966:57;10944:13;10903:16;11000:4;10988:17;;10966:57;:::i;:::-;-1:-1:-1;;;11045:20:1;;11096:17;;;11138:13;;11045:20;;11084:3;11160:65;11138:13;11212:1;11201:13;;11194:4;11182:17;;11160:65;:::i;:::-;-1:-1:-1;;;11288:1:1;11244:20;;;;11280:10;;;11273:23;11321:13;;11343:62;11321:13;11392:1;11384:10;;11377:4;11365:17;;11343:62;:::i;:::-;11465:1;11424:17;;11457:10;;;11450:22;11496:1;11488:10;;10196:1308;-1:-1:-1;;;;;;10196:1308:1:o;11509:1246::-;11741:3;11779:6;11773:13;11795:53;11841:6;11836:3;11829:4;11821:6;11817:17;11795:53;:::i;:::-;11909:66;11870:16;;11895:81;;;-1:-1:-1;12010:66:1;12003:4;11992:16;;11985:92;12109:66;12104:2;12093:14;;12086:90;12208:66;12203:2;12192:14;;12185:90;12308:66;12302:3;12291:15;;12284:91;12408:66;12402:3;12391:15;;12384:91;12508:66;12502:3;12491:15;;12484:91;12608:66;12602:3;12591:15;;12584:91;-1:-1:-1;;;12702:3:1;12691:15;;12684:34;12745:3;12734:15;;11509:1246;-1:-1:-1;11509:1246:1:o;12760:1459::-;13338:3;13376:6;13370:13;13392:53;13438:6;13433:3;13426:4;13418:6;13414:17;13392:53;:::i;:::-;-1:-1:-1;;;13467:16:1;;;13492:47;;;13564:13;;13586:66;13564:13;13638:2;13627:14;;13620:4;13608:17;;13586:66;:::i;:::-;-1:-1:-1;;;13715:2:1;13671:20;;;;13707:11;;;13700:24;13749:13;;13771:63;13749:13;13820:2;13812:11;;13805:4;13793:17;;13771:63;:::i;:::-;13895:13;;13853:17;;;13917:63;13895:13;13966:2;13958:11;;13951:4;13939:17;;13917:63;:::i;:::-;-1:-1:-1;;;;;;;;;;;14040:2:1;13999:17;;;;14032:11;;;14025:87;-1:-1:-1;;;14136:2:1;14128:11;;14121:65;14210:2;14202:11;;12760:1459;-1:-1:-1;;;;;;12760:1459:1:o;14224:1521::-;14802:3;14840:6;14834:13;14856:53;14902:6;14897:3;14890:4;14882:6;14878:17;14856:53;:::i;:::-;-1:-1:-1;;;14931:16:1;;;14956:47;;;15028:13;;15050:66;15028:13;15102:2;15091:14;;15084:4;15072:17;;15050:66;:::i;:::-;-1:-1:-1;;;15179:2:1;15135:20;;;;15171:11;;;15164:24;15213:13;;15235:63;15213:13;15284:2;15276:11;;15269:4;15257:17;;15235:63;:::i;:::-;15359:13;;15317:17;;;15381:63;15359:13;15430:2;15422:11;;15415:4;15403:17;;15381:63;:::i;:::-;-1:-1:-1;;;;;;;;;;;15504:2:1;15463:17;;;;15496:11;;;15489:87;15605:66;15600:2;15592:11;;15585:87;-1:-1:-1;;;15696:2:1;15688:11;;15681:31;15736:2;15728:11;;14224:1521;-1:-1:-1;;;;;;14224:1521:1:o;15750:1987::-;16626:3;16664:6;16658:13;16690:4;16703:51;16747:6;16742:3;16737:2;16729:6;16725:15;16703:51;:::i;:::-;-1:-1:-1;;;16776:16:1;;;16801:47;;;16873:13;;16895:64;16873:13;16945:2;16934:14;;16917:15;;;16895:64;:::i;:::-;16989:8;16982:5;16978:20;16968:30;;;-1:-1:-1;;;17049:2:1;17044;17040;17036:11;17029:23;17083:6;17077:13;17099:61;17151:8;17146:2;17142;17138:11;17133:2;17125:6;17121:15;17099:61;:::i;:::-;17221:13;;17179:17;;;17243:61;17221:13;17290:2;17282:11;;17265:15;;;17243:61;:::i;:::-;-1:-1:-1;;;17364:2:1;17323:17;;;;17356:11;;;17349:25;17399:13;;17421:61;17399:13;17468:2;17460:11;;17443:15;;;17421:61;:::i;:::-;17542:2;17501:17;;17534:11;;;17527:23;17575:13;;17597:61;17575:13;17644:2;17636:11;;17619:15;;;17597:61;:::i;:::-;17674:57;17727:2;17716:8;17712:2;17708:17;17704:26;6661:66;6649:79;;6758:66;6753:2;6744:12;;6737:88;6855:66;6850:2;6841:12;;6834:88;6952:66;6947:2;6938:12;;6931:88;7050:66;7044:3;7035:13;;7028:89;7142:3;7133:13;;6584:568;17674:57;17667:64;15750:1987;-1:-1:-1;;;;;;;;;;;15750:1987:1:o;17742:::-;18618:3;18656:6;18650:13;18682:4;18695:51;18739:6;18734:3;18729:2;18721:6;18717:15;18695:51;:::i;:::-;-1:-1:-1;;;18768:16:1;;;18793:47;;;18865:13;;18887:64;18865:13;18937:2;18926:14;;18909:15;;;18887:64;:::i;:::-;18981:8;18974:5;18970:20;18960:30;;;-1:-1:-1;;;19041:2:1;19036;19032;19028:11;19021:23;19075:6;19069:13;19091:61;19143:8;19138:2;19134;19130:11;19125:2;19117:6;19113:15;19091:61;:::i;:::-;19213:13;;19171:17;;;19235:61;19213:13;19282:2;19274:11;;19257:15;;;19235:61;:::i;:::-;-1:-1:-1;;;19356:2:1;19315:17;;;;19348:11;;;19341:25;19391:13;;19413:61;19391:13;19460:2;19452:11;;19435:15;;;19413:61;:::i;:::-;19534:2;19493:17;;19526:11;;;19519:23;19567:13;;19589:61;19567:13;19636:2;19628:11;;19611:15;;;19589:61;:::i;:::-;19666:57;19719:2;19708:8;19704:2;19700:17;19696:26;7234:66;7222:79;;7331:66;7326:2;7317:12;;7310:88;7428:66;7423:2;7414:12;;7407:88;7525:66;7520:2;7511:12;;7504:88;7623:66;7617:3;7608:13;;7601:89;7715:3;7706:13;;7157:568;19734:1461;20312:3;20350:6;20344:13;20366:53;20412:6;20407:3;20400:4;20392:6;20388:17;20366:53;:::i;:::-;-1:-1:-1;;;20441:16:1;;;20466:47;;;20538:13;;20560:66;20538:13;20612:2;20601:14;;20594:4;20582:17;;20560:66;:::i;:::-;-1:-1:-1;;;20689:2:1;20645:20;;;;20681:11;;;20674:24;20723:13;;20745:63;20723:13;20794:2;20786:11;;20779:4;20767:17;;20745:63;:::i;:::-;20869:13;;20827:17;;;20891:63;20869:13;20940:2;20932:11;;20925:4;20913:17;;20891:63;:::i;:::-;-1:-1:-1;;;;;;;;;;;21014:2:1;20973:17;;;;21006:11;;;20999:87;-1:-1:-1;;;21110:2:1;21102:11;;21095:67;21186:2;21178:11;;19734:1461;-1:-1:-1;;;;;;19734:1461:1:o;21200:1459::-;21778:3;21816:6;21810:13;21832:53;21878:6;21873:3;21866:4;21858:6;21854:17;21832:53;:::i;:::-;-1:-1:-1;;;21907:16:1;;;21932:47;;;22004:13;;22026:66;22004:13;22078:2;22067:14;;22060:4;22048:17;;22026:66;:::i;:::-;-1:-1:-1;;;22155:2:1;22111:20;;;;22147:11;;;22140:24;22189:13;;22211:63;22189:13;22260:2;22252:11;;22245:4;22233:17;;22211:63;:::i;:::-;22335:13;;22293:17;;;22357:63;22335:13;22406:2;22398:11;;22391:4;22379:17;;22357:63;:::i;:::-;-1:-1:-1;;;;;;;;;;;22480:2:1;22439:17;;;;22472:11;;;22465:87;-1:-1:-1;;;22576:2:1;22568:11;;22561:65;22650:2;22642:11;;21200:1459;-1:-1:-1;;;;;;21200:1459:1:o;22664:1872::-;23391:3;23429:6;23423:13;23445:53;23491:6;23486:3;23479:4;23471:6;23467:17;23445:53;:::i;:::-;-1:-1:-1;;;23520:16:1;;;23545:47;;;23617:13;;23639:66;23617:13;23691:2;23680:14;;23673:4;23661:17;;23639:66;:::i;:::-;-1:-1:-1;;;23768:2:1;23724:20;;;;23760:11;;;23753:24;23802:13;;23824:63;23802:13;23873:2;23865:11;;23858:4;23846:17;;23824:63;:::i;:::-;23948:13;;23906:17;;;23970:63;23948:13;24019:2;24011:11;;24004:4;23992:17;;23970:63;:::i;:::-;24098:66;24093:2;24052:17;;;;24085:11;;;24078:87;24190:13;;24212:63;24190:13;24261:2;24253:11;;24246:4;24234:17;;24212:63;:::i;:::-;24340:66;24335:2;24294:17;;;;24327:11;;;24320:87;24436:66;24431:2;24423:11;;24416:87;24527:2;24519:11;;22664:1872;-1:-1:-1;;;;;;;22664:1872:1:o;24541:840::-;24773:3;24811:6;24805:13;24827:53;24873:6;24868:3;24861:4;24853:6;24849:17;24827:53;:::i;:::-;24941:66;24902:16;;24927:81;;;-1:-1:-1;25042:66:1;25035:4;25024:16;;25017:92;25141:66;25136:2;25125:14;;25118:90;25240:66;25235:2;25224:14;;25217:90;-1:-1:-1;;;25334:3:1;25323:15;;25316:28;25371:3;25360:15;;24541:840;-1:-1:-1;24541:840:1:o;25386:941::-;25815:3;25853:6;25847:13;25869:53;25915:6;25910:3;25903:4;25895:6;25891:17;25869:53;:::i;:::-;-1:-1:-1;;;25944:16:1;;;25969:19;;;26013:13;;26035:65;26013:13;26087:1;26076:13;;26069:4;26057:17;;26035:65;:::i;:::-;-1:-1:-1;;;26163:1:1;26119:20;;;;26155:10;;;26148:23;26196:13;;26218:62;26196:13;26267:1;26259:10;;26252:4;26240:17;;26218:62;:::i;:::-;26300:17;26319:1;26296:25;;25386:941;-1:-1:-1;;;;;25386:941:1:o;26332:1633::-;27059:3;27097:6;27091:13;27113:53;27159:6;27154:3;27147:4;27139:6;27135:17;27113:53;:::i;:::-;27197:6;27192:3;27188:16;27175:29;;-1:-1:-1;;;27250:2:1;27243:5;27236:17;27284:6;27278:13;27300:65;27356:8;27352:1;27345:5;27341:13;27334:4;27326:6;27322:17;27300:65;:::i;:::-;27395:8;27388:5;27384:20;27374:30;;;-1:-1:-1;;;27454:2:1;27450:1;27446:2;27442:10;27435:22;27488:6;27482:13;27504:62;27557:8;27553:1;27549:2;27545:10;27538:4;27530:6;27526:17;27504:62;:::i;:::-;27626:1;27585:17;;27618:10;;;27611:22;;;;27658:13;;;27680:62;27658:13;27729:1;27721:10;;27714:4;27702:17;;27680:62;:::i;:::-;27802:1;27761:17;;;;27794:10;;;27787:22;27834:13;;27856:62;27834:13;27905:1;27897:10;;27890:4;27878:17;;27856:62;:::i;:::-;27938:17;27957:1;27934:25;;26332:1633;-1:-1:-1;;;;;;;26332:1633:1:o;27970:1243::-;28202:3;28240:6;28234:13;28256:53;28302:6;28297:3;28290:4;28282:6;28278:17;28256:53;:::i;:::-;28370:66;28331:16;;28356:81;;;-1:-1:-1;28471:66:1;28464:4;28453:16;;28446:92;28570:66;28565:2;28554:14;;28547:90;28669:66;28664:2;28653:14;;28646:90;28769:66;28763:3;28752:15;;28745:91;28869:66;28863:3;28852:15;;28845:91;28969:66;28963:3;28952:15;;28945:91;29069:66;29063:3;29052:15;;29045:91;-1:-1:-1;;;29163:3:1;29152:15;;29145:31;29203:3;29192:15;;27970:1243;-1:-1:-1;27970:1243:1:o;29218:769::-;29599:3;29637:6;29631:13;29653:53;29699:6;29694:3;29687:4;29679:6;29675:17;29653:53;:::i;:::-;-1:-1:-1;;;29728:16:1;;;29753:19;;;29797:13;;29819:65;29797:13;29871:1;29860:13;;29853:4;29841:17;;29819:65;:::i;:::-;-1:-1:-1;;;29947:1:1;29903:20;;;;29939:10;;;29932:23;29979:1;29971:10;;29218:769;-1:-1:-1;;;;29218:769:1:o;29992:1529::-;30504:66;30499:3;30492:79;30601:66;30596:2;30591:3;30587:12;30580:88;30698:66;30693:2;30688:3;30684:12;30677:88;30795:34;30790:2;30785:3;30781:12;30774:56;30861:34;30855:3;30850;30846:13;30839:57;30927:34;30921:3;30916;30912:13;30905:57;30993:34;30987:3;30982;30978:13;30971:57;31059:66;31053:3;31048;31044:13;31037:89;31157:33;31151:3;31146;31142:13;31135:56;30474:3;31210;31242:6;31236:13;31258:60;31311:6;31306:2;31301:3;31297:12;31292:2;31284:6;31280:15;31258:60;:::i;:::-;-1:-1:-1;;;31337:16:1;;;31369:11;;;31362:67;;;;31445:70;31475:39;31509:3;31501:12;;31493:6;31475:39;:::i;:::-;-1:-1:-1;;;7795:21:1;;7841:1;7832:11;;7730:119;31445:70;31438:77;29992:1529;-1:-1:-1;;;;;;29992:1529:1:o;31526:1308::-;-1:-1:-1;;;32026:66:1;;32115:13;;32008:3;;32137:62;32115:13;32187:2;32178:12;;32171:4;32159:17;;32137:62;:::i;:::-;32263:66;32258:2;32218:16;;;32250:11;;;32243:87;32359:34;32354:2;32346:11;;32339:55;32423:34;32418:2;32410:11;;32403:55;32488:66;32482:3;32474:12;;32467:88;-1:-1:-1;;;32579:3:1;32571:12;;32564:44;32633:13;;32655:64;32633:13;32704:3;32696:12;;32689:4;32677:17;;32655:64;:::i;:::-;-1:-1:-1;;;32779:3:1;32738:17;;;;32771:12;;;32764:36;32824:3;32816:12;;31526:1308;-1:-1:-1;;;;31526:1308:1:o;32839:448::-;33101:31;33096:3;33089:44;33071:3;33162:6;33156:13;33178:62;33233:6;33228:2;33223:3;33219:12;33212:4;33204:6;33200:17;33178:62;:::i;:::-;33260:16;;;;33278:2;33256:25;;32839:448;-1:-1:-1;;32839:448:1:o;33500:488::-;-1:-1:-1;;;;;33769:15:1;;;33751:34;;33821:15;;33816:2;33801:18;;33794:43;33868:2;33853:18;;33846:34;;;33916:3;33911:2;33896:18;;33889:31;;;33694:4;;33937:45;;33962:19;;33954:6;33937:45;:::i;34185:219::-;34334:2;34323:9;34316:21;34297:4;34354:44;34394:2;34383:9;34379:18;34371:6;34354:44;:::i;34821:414::-;35023:2;35005:21;;;35062:2;35042:18;;;35035:30;35101:34;35096:2;35081:18;;35074:62;-1:-1:-1;;;35167:2:1;35152:18;;35145:48;35225:3;35210:19;;34821:414::o;39888:356::-;40090:2;40072:21;;;40109:18;;;40102:30;40168:34;40163:2;40148:18;;40141:62;40235:2;40220:18;;39888:356::o;41762:413::-;41964:2;41946:21;;;42003:2;41983:18;;;41976:30;42042:34;42037:2;42022:18;;42015:62;-1:-1:-1;;;42108:2:1;42093:18;;42086:47;42165:3;42150:19;;41762:413::o;43743:1903::-;44137:4;44166;44197:6;44186:9;44179:25;44240:6;44235:2;44224:9;44220:18;44213:34;44283:2;44278;44267:9;44263:18;44256:30;44295:70;44361:2;44350:9;44346:18;44337:6;44331:13;44295:70;:::i;:::-;;44412:2;44404:6;44400:15;44394:22;44454:6;44447:4;44436:9;44432:20;44425:36;44484:52;44530:4;44519:9;44515:20;44501:12;44484:52;:::i;:::-;44470:66;;44585:2;44577:6;44573:15;44567:22;44612:4;44608:9;44683:2;44671:9;44663:6;44659:22;44655:31;44648:4;44637:9;44633:20;44626:61;44710:40;44743:6;44727:14;44710:40;:::i;:::-;44696:54;;44799:4;44791:6;44787:17;44781:24;44759:46;;44871:2;44859:9;44851:6;44847:22;44843:31;44836:4;44825:9;44821:20;44814:61;44898:40;44931:6;44915:14;44898:40;:::i;:::-;44884:54;;44987:4;44979:6;44975:17;44969:24;44947:46;;45059:2;45047:9;45039:6;45035:22;45031:31;45024:4;45013:9;45009:20;45002:61;45086:40;45119:6;45103:14;45086:40;:::i;:::-;45072:54;;45175:4;45167:6;45163:17;45157:24;45135:46;;45247:2;45235:9;45227:6;45223:22;45219:31;45212:4;45201:9;45197:20;45190:61;45274:40;45307:6;45291:14;45274:40;:::i;:::-;45260:54;;45363:4;45355:6;45351:17;45345:24;45323:46;;45435:2;45423:9;45415:6;45411:22;45407:31;45400:4;45389:9;45385:20;45378:61;;45456:47;45496:6;45480:14;45456:47;:::i;:::-;45448:55;;;;45512:59;45565:4;45554:9;45550:20;45542:6;45512:59;:::i;:::-;45580:60;45635:3;45624:9;45620:19;45612:6;45580:60;:::i;45651:275::-;45722:2;45716:9;45787:2;45768:13;;-1:-1:-1;;45764:27:1;45752:40;;45822:18;45807:34;;45843:22;;;45804:62;45801:88;;;45869:18;;:::i;:::-;45905:2;45898:22;45651:275;;-1:-1:-1;45651:275:1:o;45931:186::-;45979:4;46012:18;46004:6;46001:30;45998:56;;;46034:18;;:::i;:::-;-1:-1:-1;46100:2:1;46079:15;-1:-1:-1;;46075:29:1;46106:4;46071:40;;45931:186::o;46122:128::-;46162:3;46193:1;46189:6;46186:1;46183:13;46180:39;;;46199:18;;:::i;:::-;-1:-1:-1;46235:9:1;;46122:128::o;46255:120::-;46295:1;46321;46311:35;;46326:18;;:::i;:::-;-1:-1:-1;46360:9:1;;46255:120::o;46380:168::-;46420:7;46486:1;46482;46478:6;46474:14;46471:1;46468:21;46463:1;46456:9;46449:17;46445:45;46442:71;;;46493:18;;:::i;:::-;-1:-1:-1;46533:9:1;;46380:168::o;46553:125::-;46593:4;46621:1;46618;46615:8;46612:34;;;46626:18;;:::i;:::-;-1:-1:-1;46663:9:1;;46553:125::o;46683:258::-;46755:1;46765:113;46779:6;46776:1;46773:13;46765:113;;;46855:11;;;46849:18;46836:11;;;46829:39;46801:2;46794:10;46765:113;;;46896:6;46893:1;46890:13;46887:48;;;-1:-1:-1;;46931:1:1;46913:16;;46906:27;46683:258::o;46946:380::-;47025:1;47021:12;;;;47068;;;47089:61;;47143:4;47135:6;47131:17;47121:27;;47089:61;47196:2;47188:6;47185:14;47165:18;47162:38;47159:161;;;47242:10;47237:3;47233:20;47230:1;47223:31;47277:4;47274:1;47267:15;47305:4;47302:1;47295:15;47159:161;;46946:380;;;:::o;47331:135::-;47370:3;-1:-1:-1;;47391:17:1;;47388:43;;;47411:18;;:::i;:::-;-1:-1:-1;47458:1:1;47447:13;;47331:135::o;47471:112::-;47503:1;47529;47519:35;;47534:18;;:::i;:::-;-1:-1:-1;47568:9:1;;47471:112::o;47588:127::-;47649:10;47644:3;47640:20;47637:1;47630:31;47680:4;47677:1;47670:15;47704:4;47701:1;47694:15;47720:127;47781:10;47776:3;47772:20;47769:1;47762:31;47812:4;47809:1;47802:15;47836:4;47833:1;47826:15;47852:127;47913:10;47908:3;47904:20;47901:1;47894:31;47944:4;47941:1;47934:15;47968:4;47965:1;47958:15;47984:127;48045:10;48040:3;48036:20;48033:1;48026:31;48076:4;48073:1;48066:15;48100:4;48097:1;48090:15;48116:127;48177:10;48172:3;48168:20;48165:1;48158:31;48208:4;48205:1;48198:15;48232:4;48229:1;48222:15;48248:131;-1:-1:-1;;;;;;48322:32:1;;48312:43;;48302:71;;48369:1;48366;48359:12

Swarm Source

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