ETH Price: $3,591.21 (-2.80%)

Token

ERC-20: PIXELpablos.lol (PIXPAB)
 

Overview

Max Total Supply

2,812 PIXPAB

Holders

350

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x74b30febe7f209157b33243840c5aee09c8f5f1c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PIXELPablosLol

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-28
*/

// SPDX-License-Identifier: MIT

// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMW0xx0XKkolldKMMMWKdolloOWMMMMMMMMMMMMMMMMMWNXKOkxookNMWOooolccllooollkWMMNxllllkNMMMMMMMMMM
// MMMMWNNWWk'  ';..    oWMMNl     lNMW0xdollkNMMMMMOo:'..     ;XMX;             :XMMK,    ;KMMMMMMMMMM
// MMMWx;;od'..';;.     :KWMNc     lNMk.     ,KMMMMWx,.       .lXMX;             :XMMNl    ,KMMMMMMMMMM
// MMMWo  ..  .xNNO,     .kMNc     :XM0:.    .:cdXKl.      .lk0NMMX;       .....'dNMMNl   .:KMMMMMMMMMM
// MMMWk.     .xMMK,     .dMNc     ;KMMWKc      .Oo        ,KMMMNNK;      l000KKXNMMMX: .. cXMMMMMMMMMM
// MMMNl      .dWMK,      dWNc     ,0MMMWx.     .l;     ...cXMMMXKK;      c00KXWWWMMMX: ..'kNMMMMMMMMMM
// MMMWl       oWMK,      cNNc     '0MMMMNkc'          .cdoOWMMMMM0'       ...cXMMMMMX: .,,dNMMMMMMMMMM
// MMMWo       :O0d.    .,xNNc     '0MMMMXkx:              ;KMMWNKx.          :XMWWMMNc  ..lNMMMMMMMMMM
// MMMWd.              .kNMMNc     .OMMMWo.     .,;,.      'ONNXXx,      .,,.'xWMMMMMWo   .cXMMMMMMMMMM
// MMMMx.            ..oNMMMNc     .OMWKk;     .xWWNl.      ...,dx,     .dNXdxNWNXNMMWd. .:xNMMMMMMMMMM
// MMMMx.      .cxkO00KNMMMMNc     .OMO'      .,OMMWKxd;.      .oc.     .:oc..:;'.lXMWd. .'l00kKKO0WMMM
// MMMMx.      ,KMMMMMMMMMMMNc     .kMx.     :0XWMMMMMMWo      .l;                ;KMWd   ..,' .,.;KMMM
// MMMMx.      .OMMMMMMMMMMMNc     .kMx.     lWMMMMMMMMMd.     .do.               ;XMWd.          ,KMMM
// MMMMO'......:0MMMMMMMMMMMNd'....,OMO'....'xWMMMMMMMMMk'....',lo;       ........cXMMx...........:KMMM
// MMMMWX0KKKXNWMMMMMMMMMMMMMWNXXXKXWMWK0KKXNWMMMMMMMMMMWXKXXNNN0dxd:lxocxXXXXKKK0XWMMNK0KK0KKKKKKXWMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXXWXKWMWMMWWMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMWWWNNWMMMWNNNNNWWMWNNNNNNNNWMMMWNNWMMMMMMWWWWWWWMMMMWNNNNNNWMMMMMWNWMMMMMMMWWWWWWMMMWNNWMMMMM
// MMMWXKkccc,:0WKd:''''';OWO;......;kNMWx,:0MMMWKOo;,;;,:kNMNx,'''';OMMMMXl'oNMMMX0xc,;;,lKWWx,:0MMMMM
// MMMXl'.'d:  :0l   .,.  'kd. .;.   .xWWd..kMMM0,  .;::. .oXO. .cooxXMMMMK; :XMMWd. .,c;..,kNo.'OMMMMM
// MMMX;  ,0x. .xc  .kNl  .xd. 'o,   .dWWd.;0MMMO.  lXWWl  .k0' .::::o0WMMK:.oNMMWl  .OM0'  :Ko.:KMMMMM
// MMMX;  .c;  :Oc  .d0:  'Ox.  ..   .lXWd.,0MMMO.  cXNWl  .kW0dooo;  ;XMMK:.lNMMWo  .kMK,  ;Ko.;0MMMMM
// MMMN:   .;:dXNc   ... .,Od. .;'    ,0Mx.'kXXN0,  ,dxx;  .kMKdool,  ;XMMX:.c0XXNd. .lko.  :Xd.,kXXNMM
// MMMN:  .xWWMMNl  .:l'..:0O;.      .cXWx. .''dNk.        cXWd.      lKk0X: ...:0Xc       .xWd...',xWM
// MMMWklldKMMMMWOllxXWOdkXWNKOdooooxKNWWKollloOWNxllllllloKMM0olllllxXXxONklllldXMKollllllkNM0olllo0WM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupplyById;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupplyById(uint256 id) public view virtual returns (uint256) {
        return _totalSupplyById[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupplyById(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                require(amounts[i] <= 1, "only one per token id");
                _totalSupplyById[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupplyById[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupplyById");
                unchecked {
                    _totalSupplyById[id] = supply - amount;
                }
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Pausable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155Supply, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}

pragma solidity 0.8.13;



contract PIXELPablosLol is ERC1155Pausable, Ownable {
    uint256 internal currentIndex;

    string public constant name = "PIXELpablos.lol";
    string public constant symbol = "PIXPAB";

    bool public isHoldersActive = false;
    bool public isPublicActive = false;

    address public genesisContract = 0xd3605059c3cE9fACf625Fa72D727508B7b7F280F;

    uint256 public constant MAX_MINT_SUPPLY = 10000;
    uint256 public constant MINT_PRICE = 0.01 * 1 ether;

    uint256 public totalSupply = 0;
    bytes32 public merkleRoot;

    mapping(address => uint256) public whitelistedAddresses;

    modifier onlyHoldersActive() {
      require(isHoldersActive, "GenesisNotActive");
      _;
    }

    modifier onlyPublicActive() {
      require(isPublicActive, "PublicNotActive");
      _;
    }

    event NewNFTClaimed(uint256[] tokenIds, address mintedBy);
    event NewNFTMinted(uint256[] tokenIds, address mintedBy);
    event NewURI(string newURI, address updatedBy);
    event UpdatedMerkleRoot(bytes32 hash, address updatedBy);
    event UpdatedGenesisContract(address _contract, address updatedBy);
    event WithdrawnPayment(uint256 contractBalance, address withdrawnBy);

    constructor(
      bytes32 _merkleRoot,
      string memory newURI
    ) ERC1155(newURI) {
      merkleRoot = _merkleRoot;

      emit NewURI(newURI, msg.sender);
      emit UpdatedMerkleRoot(_merkleRoot, msg.sender);
    }

    /**
     * @dev updateTokenURI updates the new token URI in contract.
     *
     * Emits a {NewURI} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function updateTokenURI(string memory newUri)
        external
        onlyOwner
        returns (bool)
    {
        _setURI(newUri);
        emit NewURI(newUri, msg.sender);
        return true;
    }

    /**
     * @dev updatedMerkleRoot updates the merkle hash in contract.
     *
     * Emits a {UpdatedMerkleRoot} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function updateMerkleRoot(bytes32 hash)
        external
        onlyOwner
        returns (bool)
    {
        merkleRoot = hash;
        emit UpdatedMerkleRoot(hash, msg.sender);
        return true;
    }

    function updateGenesisContract(address _contract)
        external
        onlyOwner
        returns (bool)
    {
        genesisContract = _contract;
        emit UpdatedGenesisContract(_contract, msg.sender);
        return true;
    }

    /**
     * @dev pauseContract is used to pause contract.
     *
     * Emits a {Paused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function pauseContract() external onlyOwner returns (bool) {
        _pause();
        return true;
    }

    /**
     * @dev unpauseContract is used to unpause contract.
     *
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function unpauseContract() external onlyOwner returns (bool) {
        _unpause();
        return true;
    }

    /**
     * @dev claim is used to claim new tokens
     *
     * Emits a {NewNFTClaimed} event.
     *
     * Requirements:
     *
     * - Total supply must not exceed MAX_MINT_SUPPLY
     * - msg.value must be greater than or equal to MINT_PRICE * amountRequested
     * - Token must not exist
     * - Token must be owned by msg.sender
     **/

    function claim(uint256[] memory tokenIds, bytes32[] calldata _merkleProof)
      external
      payable 
      onlyHoldersActive
    returns (bool) {
      uint256 amountRequested = tokenIds.length;

      require(totalSupply + amountRequested <= MAX_MINT_SUPPLY, "MaximumMintSupplyReached");

      bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
      
      require(
        MerkleProof.verify(_merkleProof, merkleRoot, leaf),
        "InvalidMerkleProof"
      );

      uint256 genesisQuantity = IERC721(genesisContract).balanceOf(msg.sender);
      uint256 allowedQuantityToMint = 0;

      require(genesisQuantity > 0, "NonGenesisHolder");

      if (genesisQuantity >= 400) {
        allowedQuantityToMint = 200;
      }
      else if (genesisQuantity >= 200) {
        allowedQuantityToMint = 100;
      }
      else if (genesisQuantity >= 50) {
        allowedQuantityToMint = 50;
      }
      else if (genesisQuantity >= 50) {
        allowedQuantityToMint = 16;
      }
      else if (genesisQuantity >= 25) {
        allowedQuantityToMint = 8;
      }
      else if (genesisQuantity >= 10) {
        allowedQuantityToMint = 4;
      }
      else if (genesisQuantity >= 5) {
        allowedQuantityToMint = 2;
      }
      else if (genesisQuantity >= 1) {
        allowedQuantityToMint = 1;
      }

      require(
        amountRequested <= allowedQuantityToMint
        && whitelistedAddresses[msg.sender] < allowedQuantityToMint,
        "MaximumAllowance"
      );

      uint256[] memory amounts = new uint256[](amountRequested);

      for (uint256 i = 0; i < amountRequested; i++) {
          require(
            !(exists(tokenIds[i])),
            "TokenAlreadyExists"
          );

          bool isRightfulGenesisOwner = IERC721(genesisContract).ownerOf(tokenIds[i]) == msg.sender;

          require(isRightfulGenesisOwner == true, "NonRightfulGenesisHolder");

          amounts[i] = 1;
      }

      _mintBatch(msg.sender, tokenIds, amounts, "");

      totalSupply += amountRequested;
      whitelistedAddresses[msg.sender] += amountRequested;

      emit NewNFTClaimed(tokenIds, msg.sender);

      return true;
    }

    /**
     * @dev mint is used to mint new tokens.
     *
     * Emits a {NewNFTMinted} event.
     *
     * Requirements:
     *
     * - Total supply must not exceed MAX_MINT_SUPPLY
     * - msg.value must be greater than or equal to MINT_PRICE * amountRequested
     **/

    function mint(uint256 amountRequested)
      external
      payable 
      onlyPublicActive
    returns (bool) {
      require(totalSupply + amountRequested <= MAX_MINT_SUPPLY, "MaximumMintSupplyReached");
      require(msg.value >= MINT_PRICE * amountRequested, "InsufficientAmount");

      uint256[] memory tokenIds = new uint256[](amountRequested);
      uint256[] memory amounts = new uint256[](amountRequested);

      uint256 updatedIndex = currentIndex;

      for (uint256 i = 0; i < amountRequested; i++) {
        while (
          exists(updatedIndex)
        ) {
          updatedIndex++;
        }

        uint256 tokenId = updatedIndex;

        tokenIds[i] = tokenId;
        amounts[i] = 1;

        updatedIndex++;
      }

      currentIndex = updatedIndex;

      _mintBatch(msg.sender, tokenIds, amounts, "");

      emit NewNFTMinted(tokenIds, msg.sender);

      totalSupply += amountRequested;

      return true;
    }

    /**
     * @dev uri is used to get the URI of the token.
     *
     * Requirements:
     *
     * - Token must exist
     **/

    function uri(uint256 _id)
      public
      view
      override
    returns (string memory) {
        require(exists(_id), "TokenInexistent");

        return string(
          abi.encodePacked(
            super.uri(_id), Strings.toString(_id)
          )
        );
    }

    function startSaleHolder() external onlyOwner {
        isHoldersActive = true;
    }

    function endSaleHolder() external onlyOwner {
        isHoldersActive = false;
    }

    function startSalePublic() external onlyOwner {
        isPublicActive = true;
    }

    function endSalePublic() external onlyOwner {
        isPublicActive = false;
    }

    /**
     * @dev withdrawPayment is used to withdraw payment from contract.
     *
     * Emits a {WithdrawnPayment} event.
     *
     * Requirements:
     *
     * - Only the defaultPlatformAddress can call this function
     **/

    function withdrawPayment() external onlyOwner returns (bool) {
        uint256 contractBalance = address(this).balance;

        require(contractBalance > 0, "UnAuthorizedRequest");

        (bool sent, ) = owner().call{value: contractBalance}("");

        require(sent == true, "TransactionFailed");

        emit WithdrawnPayment(contractBalance, msg.sender);

        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"newURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"}],"name":"NewNFTClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"}],"name":"NewNFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"NewURI","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedGenesisContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"UpdatedMerkleRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"contractBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"withdrawnBy","type":"address"}],"name":"WithdrawnPayment","type":"event"},{"inputs":[],"name":"MAX_MINT_SUPPLY","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endSaleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSalePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHoldersActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountRequested","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"pauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSaleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSalePublic","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupplyById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"updateGenesisContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"updateTokenURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawPayment","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526000600660006101000a81548160ff0219169083151502179055506000600660016101000a81548160ff02191690831515021790555073d3605059c3ce9facf625fa72d727508b7b7f280f600660026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600755348015620000a157600080fd5b5060405162006002380380620060028339818101604052810190620000c791906200050c565b80620000d9816200019a60201b60201c565b506000600460006101000a81548160ff0219169083151502179055506200011562000109620001b660201b60201c565b620001be60201b60201c565b816008819055507fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a4839581336040516200014f92919062000614565b60405180910390a17fa2a63702a7eb4271f96e4ea16c164231eb3f32a28bc80e9c880c36363a5c414682336040516200018a92919062000659565b60405180910390a15050620006ea565b8060029080519060200190620001b292919062000284565b5050565b600033905090565b6000600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029290620006b5565b90600052602060002090601f016020900481019282620002b6576000855562000302565b82601f10620002d157805160ff191683800117855562000302565b8280016001018555821562000302579182015b8281111562000301578251825591602001919060010190620002e4565b5b50905062000311919062000315565b5090565b5b808211156200033057600081600090555060010162000316565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6200035d8162000348565b81146200036957600080fd5b50565b6000815190506200037d8162000352565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003d8826200038d565b810181811067ffffffffffffffff82111715620003fa57620003f96200039e565b5b80604052505050565b60006200040f62000334565b90506200041d8282620003cd565b919050565b600067ffffffffffffffff82111562000440576200043f6200039e565b5b6200044b826200038d565b9050602081019050919050565b60005b83811015620004785780820151818401526020810190506200045b565b8381111562000488576000848401525b50505050565b6000620004a56200049f8462000422565b62000403565b905082815260208101848484011115620004c457620004c362000388565b5b620004d184828562000458565b509392505050565b600082601f830112620004f157620004f062000383565b5b8151620005038482602086016200048e565b91505092915050565b600080604083850312156200052657620005256200033e565b5b600062000536858286016200036c565b925050602083015167ffffffffffffffff8111156200055a576200055962000343565b5b6200056885828601620004d9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60006200059b8262000572565b620005a781856200057d565b9350620005b981856020860162000458565b620005c4816200038d565b840191505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005fc82620005cf565b9050919050565b6200060e81620005ef565b82525050565b600060408201905081810360008301526200063081856200058e565b905062000641602083018462000603565b9392505050565b620006538162000348565b82525050565b600060408201905062000670600083018562000648565b6200067f602083018462000603565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006ce57607f821691505b602082108103620006e457620006e362000686565b5b50919050565b61590880620006fa6000396000f3fe60806040526004361061020e5760003560e01c80638da5cb5b11610118578063b33712c5116100a0578063d8e99f921161006f578063d8e99f92146107b2578063e8dbce56146107dd578063e985e9c5146107f4578063f242432a14610831578063f2fde38b1461085a5761020e565b8063b33712c5146106f4578063be3b5fe91461071f578063bf2f44b71461074a578063c002d23d146107875761020e565b8063a118babd116100e7578063a118babd14610633578063a22cb4651461065e578063a329e1db14610687578063a3330d25146106b2578063aaddd756146106dd5761020e565b80638da5cb5b1461057057806395d89b411461059b57806398cd6153146105c6578063a0712d68146106035761020e565b80632eb4a7ab1161019b5780634e1273f41161016a5780634e1273f4146104775780634f558e79146104b45780635c975abb146104f1578063626fe4191461051c578063715018a6146105595761020e565b80632eb4a7ab146103b457806331afeb31146103df578063439766ce1461040f5780634783f0ef1461043a5761020e565b80630d9a11a0116101e25780630d9a11a0146102f55780630e89341c1461030c57806318160ddd146103495780631a08c774146103745780632eb2c2d61461038b5761020e565b8062fdd58e1461021357806301ffc9a71461025057806306c933d81461028d57806306fdde03146102ca575b600080fd5b34801561021f57600080fd5b5061023a600480360381019061023591906137df565b610883565b604051610247919061382e565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906138a1565b61094b565b60405161028491906138e9565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613904565b610a2d565b6040516102c1919061382e565b60405180910390f35b3480156102d657600080fd5b506102df610a45565b6040516102ec91906139ca565b60405180910390f35b34801561030157600080fd5b5061030a610a7e565b005b34801561031857600080fd5b50610333600480360381019061032e91906139ec565b610b17565b60405161034091906139ca565b60405180910390f35b34801561035557600080fd5b5061035e610b9a565b60405161036b919061382e565b60405180910390f35b34801561038057600080fd5b50610389610ba0565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613c16565b610c39565b005b3480156103c057600080fd5b506103c9610cda565b6040516103d69190613cfe565b60405180910390f35b6103f960048036038101906103f49190613d74565b610ce0565b60405161040691906138e9565b60405180910390f35b34801561041b57600080fd5b50610424611331565b60405161043191906138e9565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613e1c565b6113be565b60405161046e91906138e9565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613f0c565b611485565b6040516104ab9190614042565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906139ec565b61159e565b6040516104e891906138e9565b60405180910390f35b3480156104fd57600080fd5b506105066115b2565b60405161051391906138e9565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613904565b6115c9565b60405161055091906138e9565b60405180910390f35b34801561056557600080fd5b5061056e6116ca565b005b34801561057c57600080fd5b50610585611752565b6040516105929190614073565b60405180910390f35b3480156105a757600080fd5b506105b061177c565b6040516105bd91906139ca565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e8919061412f565b6117b5565b6040516105fa91906138e9565b60405180910390f35b61061d600480360381019061061891906139ec565b61187e565b60405161062a91906138e9565b60405180910390f35b34801561063f57600080fd5b50610648611b2d565b60405161065591906138e9565b60405180910390f35b34801561066a57600080fd5b50610685600480360381019061068091906141a4565b611cef565b005b34801561069357600080fd5b5061069c611d05565b6040516106a9919061382e565b60405180910390f35b3480156106be57600080fd5b506106c7611d0b565b6040516106d491906138e9565b60405180910390f35b3480156106e957600080fd5b506106f2611d1e565b005b34801561070057600080fd5b50610709611db7565b60405161071691906138e9565b60405180910390f35b34801561072b57600080fd5b50610734611e44565b60405161074191906138e9565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906139ec565b611e57565b60405161077e919061382e565b60405180910390f35b34801561079357600080fd5b5061079c611e74565b6040516107a9919061382e565b60405180910390f35b3480156107be57600080fd5b506107c7611e7f565b6040516107d49190614073565b60405180910390f35b3480156107e957600080fd5b506107f2611ea5565b005b34801561080057600080fd5b5061081b600480360381019061081691906141e4565b611f3e565b60405161082891906138e9565b60405180910390f35b34801561083d57600080fd5b5061085860048036038101906108539190614224565b611fd2565b005b34801561086657600080fd5b50610881600480360381019061087c9190613904565b612073565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ea9061432d565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1657507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a265750610a258261216a565b5b9050919050565b60096020528060005260406000206000915090505481565b6040518060400160405280600f81526020017f504958454c7061626c6f732e6c6f6c000000000000000000000000000000000081525081565b610a866121d4565b73ffffffffffffffffffffffffffffffffffffffff16610aa4611752565b73ffffffffffffffffffffffffffffffffffffffff1614610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190614399565b60405180910390fd5b6000600660006101000a81548160ff021916908315150217905550565b6060610b228261159e565b610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890614405565b60405180910390fd5b610b6a826121dc565b610b7383612270565b604051602001610b84929190614461565b6040516020818303038152906040529050919050565b60075481565b610ba86121d4565b73ffffffffffffffffffffffffffffffffffffffff16610bc6611752565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614399565b60405180910390fd5b6000600660016101000a81548160ff021916908315150217905550565b610c416121d4565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610c875750610c8685610c816121d4565b611f3e565b5b610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd906144f7565b60405180910390fd5b610cd385858585856123d0565b5050505050565b60085481565b6000600660009054906101000a900460ff16610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614563565b60405180910390fd5b60008451905061271081600754610d4891906145b2565b1115610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090614654565b60405180910390fd5b600033604051602001610d9c91906146bc565b604051602081830303815290604052805190602001209050610e02858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600854836126e3565b610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890614723565b60405180910390fd5b6000600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610e9e9190614073565b602060405180830381865afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf9190614758565b90506000808211610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906147d1565b60405180910390fd5b6101908210610f375760c89050610fb1565b60c88210610f485760649050610fb0565b60328210610f595760329050610faf565b60328210610f6a5760109050610fae565b60198210610f7b5760089050610fad565b600a8210610f8c5760049050610fac565b60058210610f9d5760029050610fab565b60018210610faa57600190505b5b5b5b5b5b5b5b808411158015610fff575080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b61103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110359061483d565b60405180910390fd5b60008467ffffffffffffffff81111561105a57611059613a1e565b5b6040519080825280602002602001820160405280156110885781602001602082028036833780820191505090505b50905060005b8581101561125d576110b98a82815181106110ac576110ab61485d565b5b602002602001015161159e565b156110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f0906148d8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8d85815181106111635761116261485d565b5b60200260200101516040518263ffffffff1660e01b8152600401611187919061382e565b602060405180830381865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c8919061490d565b73ffffffffffffffffffffffffffffffffffffffff161490506001151581151514611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90614986565b60405180910390fd5b600183838151811061123d5761123c61485d565b5b602002602001018181525050508080611255906149a6565b91505061108e565b50611279338a83604051806020016040528060008152506126fa565b846007600082825461128b91906145b2565b9250508190555084600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112e191906145b2565b925050819055507fde2d71f52faa890a279c058c686c85fa154568fcee8b0fff9226f489dbb4008089336040516113199291906149ee565b60405180910390a16001955050505050509392505050565b600061133b6121d4565b73ffffffffffffffffffffffffffffffffffffffff16611359611752565b73ffffffffffffffffffffffffffffffffffffffff16146113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690614399565b60405180910390fd5b6113b7612917565b6001905090565b60006113c86121d4565b73ffffffffffffffffffffffffffffffffffffffff166113e6611752565b73ffffffffffffffffffffffffffffffffffffffff161461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614399565b60405180910390fd5b816008819055507fa2a63702a7eb4271f96e4ea16c164231eb3f32a28bc80e9c880c36363a5c41468233604051611474929190614a1e565b60405180910390a160019050919050565b606081518351146114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290614ab9565b60405180910390fd5b6000835167ffffffffffffffff8111156114e8576114e7613a1e565b5b6040519080825280602002602001820160405280156115165781602001602082028036833780820191505090505b50905060005b84518110156115935761156385828151811061153b5761153a61485d565b5b60200260200101518583815181106115565761155561485d565b5b6020026020010151610883565b8282815181106115765761157561485d565b5b6020026020010181815250508061158c906149a6565b905061151c565b508091505092915050565b6000806115aa83611e57565b119050919050565b6000600460009054906101000a900460ff16905090565b60006115d36121d4565b73ffffffffffffffffffffffffffffffffffffffff166115f1611752565b73ffffffffffffffffffffffffffffffffffffffff1614611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90614399565b60405180910390fd5b81600660026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f80232346ebb2dea71c1fd1c47b02ae6346d278c5f92ef1d4463ec0cb31e4596782336040516116b9929190614ad9565b60405180910390a160019050919050565b6116d26121d4565b73ffffffffffffffffffffffffffffffffffffffff166116f0611752565b73ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90614399565b60405180910390fd5b61175060006129ba565b565b6000600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600681526020017f504958504142000000000000000000000000000000000000000000000000000081525081565b60006117bf6121d4565b73ffffffffffffffffffffffffffffffffffffffff166117dd611752565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614399565b60405180910390fd5b61183c82612a80565b7fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a48395823360405161186d929190614b02565b60405180910390a160019050919050565b6000600660019054906101000a900460ff166118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690614b7e565b60405180910390fd5b612710826007546118e091906145b2565b1115611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890614654565b60405180910390fd5b81662386f26fc100006119349190614b9e565b341015611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90614c44565b60405180910390fd5b60008267ffffffffffffffff81111561199257611991613a1e565b5b6040519080825280602002602001820160405280156119c05781602001602082028036833780820191505090505b50905060008367ffffffffffffffff8111156119df576119de613a1e565b5b604051908082528060200260200182016040528015611a0d5781602001602082028036833780820191505090505b5090506000600554905060005b85811015611aac575b611a2c8261159e565b15611a44578180611a3c906149a6565b925050611a23565b600082905080858381518110611a5d57611a5c61485d565b5b6020026020010181815250506001848381518110611a7e57611a7d61485d565b5b6020026020010181815250508280611a95906149a6565b935050508080611aa4906149a6565b915050611a1a565b5080600581905550611acf338484604051806020016040528060008152506126fa565b7f7ac6136baaa4f9a0d76c1972a3d2b0061580ddb478a8bf27fd0c9fd3d2d100e98333604051611b009291906149ee565b60405180910390a18460076000828254611b1a91906145b2565b9250508190555060019350505050919050565b6000611b376121d4565b73ffffffffffffffffffffffffffffffffffffffff16611b55611752565b73ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba290614399565b60405180910390fd5b600047905060008111611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea90614cb0565b60405180910390fd5b6000611bfd611752565b73ffffffffffffffffffffffffffffffffffffffff1682604051611c2090614d01565b60006040518083038185875af1925050503d8060008114611c5d576040519150601f19603f3d011682016040523d82523d6000602084013e611c62565b606091505b505090506001151581151514611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca490614d62565b60405180910390fd5b7fb0caa7e5a1709d95503ec9da196222012fad8495f101214d86c3b72ce101810f8233604051611cde929190614d82565b60405180910390a160019250505090565b611d01611cfa6121d4565b8383612a9a565b5050565b61271081565b600660019054906101000a900460ff1681565b611d266121d4565b73ffffffffffffffffffffffffffffffffffffffff16611d44611752565b73ffffffffffffffffffffffffffffffffffffffff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190614399565b60405180910390fd5b6001600660016101000a81548160ff021916908315150217905550565b6000611dc16121d4565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611752565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90614399565b60405180910390fd5b611e3d612c06565b6001905090565b600660009054906101000a900460ff1681565b600060036000838152602001908152602001600020549050919050565b662386f26fc1000081565b600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ead6121d4565b73ffffffffffffffffffffffffffffffffffffffff16611ecb611752565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614399565b60405180910390fd5b6001600660006101000a81548160ff021916908315150217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fda6121d4565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612020575061201f8561201a6121d4565b611f3e565b5b61205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690614e1d565b60405180910390fd5b61206c8585858585612ca8565b5050505050565b61207b6121d4565b73ffffffffffffffffffffffffffffffffffffffff16612099611752565b73ffffffffffffffffffffffffffffffffffffffff16146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614399565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361215e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215590614eaf565b60405180910390fd5b612167816129ba565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6060600280546121eb90614efe565b80601f016020809104026020016040519081016040528092919081815260200182805461221790614efe565b80156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b50505050509050919050565b6060600082036122b7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123cb565b600082905060005b600082146122e95780806122d2906149a6565b915050600a826122e29190614f5e565b91506122bf565b60008167ffffffffffffffff81111561230557612304613a1e565b5b6040519080825280601f01601f1916602001820160405280156123375781602001600182028036833780820191505090505b5090505b600085146123c4576001826123509190614f8f565b9150600a8561235f9190614fc3565b603061236b91906145b2565b60f81b8183815181106123815761238061485d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123bd9190614f5e565b945061233b565b8093505050505b919050565b8151835114612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240b90615066565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a906150f8565b60405180910390fd5b600061248d6121d4565b905061249d818787878787612f29565b60005b845181101561264e5760008582815181106124be576124bd61485d565b5b6020026020010151905060008583815181106124dd576124dc61485d565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561257e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125759061518a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461263391906145b2565b9250508190555050505080612647906149a6565b90506124a0565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126c59291906151aa565b60405180910390a46126db818787878787612f87565b505050505050565b6000826126f0858461315e565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276090615253565b60405180910390fd5b81518351146127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490615066565b60405180910390fd5b60006127b76121d4565b90506127c881600087878787612f29565b60005b8451811015612881578381815181106127e7576127e661485d565b5b60200260200101516000808784815181106128055761280461485d565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461286791906145b2565b925050819055508080612879906149a6565b9150506127cb565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128f99291906151aa565b60405180910390a461291081600087878787612f87565b5050505050565b61291f6115b2565b1561295f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612956906152bf565b60405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129a36121d4565b6040516129b09190614073565b60405180910390a1565b6000600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060029080519060200190612a96929190613694565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aff90615351565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bf991906138e9565b60405180910390a3505050565b612c0e6115b2565b612c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c44906153bd565b60405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612c916121d4565b604051612c9e9190614073565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0e906150f8565b60405180910390fd5b6000612d216121d4565b9050612d41818787612d32886131d3565b612d3b886131d3565b87612f29565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcf9061518a565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e8d91906145b2565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612f0a9291906153dd565b60405180910390a4612f2082888888888861324d565b50505050505050565b612f37868686868686613424565b612f3f6115b2565b15612f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7690615478565b60405180910390fd5b505050505050565b612fa68473ffffffffffffffffffffffffffffffffffffffff16613652565b15613156578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612fec9594939291906154ed565b6020604051808303816000875af192505050801561302857506040513d601f19601f82011682018060405250810190613025919061556a565b60015b6130cd576130346155a4565b806308c379a00361309057506130486155c6565b806130535750613092565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308791906139ca565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c4906156c8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314b9061575a565b60405180910390fd5b505b505050505050565b60008082905060005b84518110156131c85760008582815181106131855761318461485d565b5b602002602001015190508083116131a7576131a08382613675565b92506131b4565b6131b18184613675565b92505b5080806131c0906149a6565b915050613167565b508091505092915050565b60606000600167ffffffffffffffff8111156131f2576131f1613a1e565b5b6040519080825280602002602001820160405280156132205781602001602082028036833780820191505090505b50905082816000815181106132385761323761485d565b5b60200260200101818152505080915050919050565b61326c8473ffffffffffffffffffffffffffffffffffffffff16613652565b1561341c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016132b295949392919061577a565b6020604051808303816000875af19250505080156132ee57506040513d601f19601f820116820180604052508101906132eb919061556a565b60015b613393576132fa6155a4565b806308c379a003613356575061330e6155c6565b806133195750613358565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334d91906139ca565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338a906156c8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461341a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134119061575a565b60405180910390fd5b505b505050505050565b61343286868686868661368c565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036135415760005b835181101561353f5760018382815181106134875761348661485d565b5b602002602001015111156134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790615820565b60405180910390fd5b8281815181106134e3576134e261485d565b5b6020026020010151600360008684815181106135025761350161485d565b5b60200260200101518152602001908152602001600020600082825461352791906145b2565b9250508190555080613538906149a6565b9050613469565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361364a5760005b83518110156136485760008482815181106135965761359561485d565b5b6020026020010151905060008483815181106135b5576135b461485d565b5b602002602001015190506000600360008481526020019081526020016000205490508181101561361a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613611906158b2565b60405180910390fd5b818103600360008581526020019081526020016000208190555050505080613641906149a6565b9050613578565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b505050505050565b8280546136a090614efe565b90600052602060002090601f0160209004810192826136c25760008555613709565b82601f106136db57805160ff1916838001178555613709565b82800160010185558215613709579182015b828111156137085782518255916020019190600101906136ed565b5b509050613716919061371a565b5090565b5b8082111561373357600081600090555060010161371b565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137768261374b565b9050919050565b6137868161376b565b811461379157600080fd5b50565b6000813590506137a38161377d565b92915050565b6000819050919050565b6137bc816137a9565b81146137c757600080fd5b50565b6000813590506137d9816137b3565b92915050565b600080604083850312156137f6576137f5613741565b5b600061380485828601613794565b9250506020613815858286016137ca565b9150509250929050565b613828816137a9565b82525050565b6000602082019050613843600083018461381f565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61387e81613849565b811461388957600080fd5b50565b60008135905061389b81613875565b92915050565b6000602082840312156138b7576138b6613741565b5b60006138c58482850161388c565b91505092915050565b60008115159050919050565b6138e3816138ce565b82525050565b60006020820190506138fe60008301846138da565b92915050565b60006020828403121561391a57613919613741565b5b600061392884828501613794565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561396b578082015181840152602081019050613950565b8381111561397a576000848401525b50505050565b6000601f19601f8301169050919050565b600061399c82613931565b6139a6818561393c565b93506139b681856020860161394d565b6139bf81613980565b840191505092915050565b600060208201905081810360008301526139e48184613991565b905092915050565b600060208284031215613a0257613a01613741565b5b6000613a10848285016137ca565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a5682613980565b810181811067ffffffffffffffff82111715613a7557613a74613a1e565b5b80604052505050565b6000613a88613737565b9050613a948282613a4d565b919050565b600067ffffffffffffffff821115613ab457613ab3613a1e565b5b602082029050602081019050919050565b600080fd5b6000613add613ad884613a99565b613a7e565b90508083825260208201905060208402830185811115613b0057613aff613ac5565b5b835b81811015613b295780613b1588826137ca565b845260208401935050602081019050613b02565b5050509392505050565b600082601f830112613b4857613b47613a19565b5b8135613b58848260208601613aca565b91505092915050565b600080fd5b600067ffffffffffffffff821115613b8157613b80613a1e565b5b613b8a82613980565b9050602081019050919050565b82818337600083830152505050565b6000613bb9613bb484613b66565b613a7e565b905082815260208101848484011115613bd557613bd4613b61565b5b613be0848285613b97565b509392505050565b600082601f830112613bfd57613bfc613a19565b5b8135613c0d848260208601613ba6565b91505092915050565b600080600080600060a08688031215613c3257613c31613741565b5b6000613c4088828901613794565b9550506020613c5188828901613794565b945050604086013567ffffffffffffffff811115613c7257613c71613746565b5b613c7e88828901613b33565b935050606086013567ffffffffffffffff811115613c9f57613c9e613746565b5b613cab88828901613b33565b925050608086013567ffffffffffffffff811115613ccc57613ccb613746565b5b613cd888828901613be8565b9150509295509295909350565b6000819050919050565b613cf881613ce5565b82525050565b6000602082019050613d136000830184613cef565b92915050565b600080fd5b60008083601f840112613d3457613d33613a19565b5b8235905067ffffffffffffffff811115613d5157613d50613d19565b5b602083019150836020820283011115613d6d57613d6c613ac5565b5b9250929050565b600080600060408486031215613d8d57613d8c613741565b5b600084013567ffffffffffffffff811115613dab57613daa613746565b5b613db786828701613b33565b935050602084013567ffffffffffffffff811115613dd857613dd7613746565b5b613de486828701613d1e565b92509250509250925092565b613df981613ce5565b8114613e0457600080fd5b50565b600081359050613e1681613df0565b92915050565b600060208284031215613e3257613e31613741565b5b6000613e4084828501613e07565b91505092915050565b600067ffffffffffffffff821115613e6457613e63613a1e565b5b602082029050602081019050919050565b6000613e88613e8384613e49565b613a7e565b90508083825260208201905060208402830185811115613eab57613eaa613ac5565b5b835b81811015613ed45780613ec08882613794565b845260208401935050602081019050613ead565b5050509392505050565b600082601f830112613ef357613ef2613a19565b5b8135613f03848260208601613e75565b91505092915050565b60008060408385031215613f2357613f22613741565b5b600083013567ffffffffffffffff811115613f4157613f40613746565b5b613f4d85828601613ede565b925050602083013567ffffffffffffffff811115613f6e57613f6d613746565b5b613f7a85828601613b33565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fb9816137a9565b82525050565b6000613fcb8383613fb0565b60208301905092915050565b6000602082019050919050565b6000613fef82613f84565b613ff98185613f8f565b935061400483613fa0565b8060005b8381101561403557815161401c8882613fbf565b975061402783613fd7565b925050600181019050614008565b5085935050505092915050565b6000602082019050818103600083015261405c8184613fe4565b905092915050565b61406d8161376b565b82525050565b60006020820190506140886000830184614064565b92915050565b600067ffffffffffffffff8211156140a9576140a8613a1e565b5b6140b282613980565b9050602081019050919050565b60006140d26140cd8461408e565b613a7e565b9050828152602081018484840111156140ee576140ed613b61565b5b6140f9848285613b97565b509392505050565b600082601f83011261411657614115613a19565b5b81356141268482602086016140bf565b91505092915050565b60006020828403121561414557614144613741565b5b600082013567ffffffffffffffff81111561416357614162613746565b5b61416f84828501614101565b91505092915050565b614181816138ce565b811461418c57600080fd5b50565b60008135905061419e81614178565b92915050565b600080604083850312156141bb576141ba613741565b5b60006141c985828601613794565b92505060206141da8582860161418f565b9150509250929050565b600080604083850312156141fb576141fa613741565b5b600061420985828601613794565b925050602061421a85828601613794565b9150509250929050565b600080600080600060a086880312156142405761423f613741565b5b600061424e88828901613794565b955050602061425f88828901613794565b9450506040614270888289016137ca565b9350506060614281888289016137ca565b925050608086013567ffffffffffffffff8111156142a2576142a1613746565b5b6142ae88828901613be8565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614317602b8361393c565b9150614322826142bb565b604082019050919050565b600060208201905081810360008301526143468161430a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061438360208361393c565b915061438e8261434d565b602082019050919050565b600060208201905081810360008301526143b281614376565b9050919050565b7f546f6b656e496e6578697374656e740000000000000000000000000000000000600082015250565b60006143ef600f8361393c565b91506143fa826143b9565b602082019050919050565b6000602082019050818103600083015261441e816143e2565b9050919050565b600081905092915050565b600061443b82613931565b6144458185614425565b935061445581856020860161394d565b80840191505092915050565b600061446d8285614430565b91506144798284614430565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006144e160328361393c565b91506144ec82614485565b604082019050919050565b60006020820190508181036000830152614510816144d4565b9050919050565b7f47656e657369734e6f7441637469766500000000000000000000000000000000600082015250565b600061454d60108361393c565b915061455882614517565b602082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145bd826137a9565b91506145c8836137a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145fd576145fc614583565b5b828201905092915050565b7f4d6178696d756d4d696e74537570706c79526561636865640000000000000000600082015250565b600061463e60188361393c565b915061464982614608565b602082019050919050565b6000602082019050818103600083015261466d81614631565b9050919050565b60008160601b9050919050565b600061468c82614674565b9050919050565b600061469e82614681565b9050919050565b6146b66146b18261376b565b614693565b82525050565b60006146c882846146a5565b60148201915081905092915050565b7f496e76616c69644d65726b6c6550726f6f660000000000000000000000000000600082015250565b600061470d60128361393c565b9150614718826146d7565b602082019050919050565b6000602082019050818103600083015261473c81614700565b9050919050565b600081519050614752816137b3565b92915050565b60006020828403121561476e5761476d613741565b5b600061477c84828501614743565b91505092915050565b7f4e6f6e47656e65736973486f6c64657200000000000000000000000000000000600082015250565b60006147bb60108361393c565b91506147c682614785565b602082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f4d6178696d756d416c6c6f77616e636500000000000000000000000000000000600082015250565b600061482760108361393c565b9150614832826147f1565b602082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e416c72656164794578697374730000000000000000000000000000600082015250565b60006148c260128361393c565b91506148cd8261488c565b602082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b6000815190506149078161377d565b92915050565b60006020828403121561492357614922613741565b5b6000614931848285016148f8565b91505092915050565b7f4e6f6e526967687466756c47656e65736973486f6c6465720000000000000000600082015250565b600061497060188361393c565b915061497b8261493a565b602082019050919050565b6000602082019050818103600083015261499f81614963565b9050919050565b60006149b1826137a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149e3576149e2614583565b5b600182019050919050565b60006040820190508181036000830152614a088185613fe4565b9050614a176020830184614064565b9392505050565b6000604082019050614a336000830185613cef565b614a406020830184614064565b9392505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614aa360298361393c565b9150614aae82614a47565b604082019050919050565b60006020820190508181036000830152614ad281614a96565b9050919050565b6000604082019050614aee6000830185614064565b614afb6020830184614064565b9392505050565b60006040820190508181036000830152614b1c8185613991565b9050614b2b6020830184614064565b9392505050565b7f5075626c69634e6f744163746976650000000000000000000000000000000000600082015250565b6000614b68600f8361393c565b9150614b7382614b32565b602082019050919050565b60006020820190508181036000830152614b9781614b5b565b9050919050565b6000614ba9826137a9565b9150614bb4836137a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bed57614bec614583565b5b828202905092915050565b7f496e73756666696369656e74416d6f756e740000000000000000000000000000600082015250565b6000614c2e60128361393c565b9150614c3982614bf8565b602082019050919050565b60006020820190508181036000830152614c5d81614c21565b9050919050565b7f556e417574686f72697a65645265717565737400000000000000000000000000600082015250565b6000614c9a60138361393c565b9150614ca582614c64565b602082019050919050565b60006020820190508181036000830152614cc981614c8d565b9050919050565b600081905092915050565b50565b6000614ceb600083614cd0565b9150614cf682614cdb565b600082019050919050565b6000614d0c82614cde565b9150819050919050565b7f5472616e73616374696f6e4661696c6564000000000000000000000000000000600082015250565b6000614d4c60118361393c565b9150614d5782614d16565b602082019050919050565b60006020820190508181036000830152614d7b81614d3f565b9050919050565b6000604082019050614d97600083018561381f565b614da46020830184614064565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614e0760298361393c565b9150614e1282614dab565b604082019050919050565b60006020820190508181036000830152614e3681614dfa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e9960268361393c565b9150614ea482614e3d565b604082019050919050565b60006020820190508181036000830152614ec881614e8c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f1657607f821691505b602082108103614f2957614f28614ecf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f69826137a9565b9150614f74836137a9565b925082614f8457614f83614f2f565b5b828204905092915050565b6000614f9a826137a9565b9150614fa5836137a9565b925082821015614fb857614fb7614583565b5b828203905092915050565b6000614fce826137a9565b9150614fd9836137a9565b925082614fe957614fe8614f2f565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061505060288361393c565b915061505b82614ff4565b604082019050919050565b6000602082019050818103600083015261507f81615043565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006150e260258361393c565b91506150ed82615086565b604082019050919050565b60006020820190508181036000830152615111816150d5565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615174602a8361393c565b915061517f82615118565b604082019050919050565b600060208201905081810360008301526151a381615167565b9050919050565b600060408201905081810360008301526151c48185613fe4565b905081810360208301526151d88184613fe4565b90509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061523d60218361393c565b9150615248826151e1565b604082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006152a960108361393c565b91506152b482615273565b602082019050919050565b600060208201905081810360008301526152d88161529c565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061533b60298361393c565b9150615346826152df565b604082019050919050565b6000602082019050818103600083015261536a8161532e565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006153a760148361393c565b91506153b282615371565b602082019050919050565b600060208201905081810360008301526153d68161539a565b9050919050565b60006040820190506153f2600083018561381f565b6153ff602083018461381f565b9392505050565b7f455243313135355061757361626c653a20746f6b656e207472616e736665722060008201527f7768696c65207061757365640000000000000000000000000000000000000000602082015250565b6000615462602c8361393c565b915061546d82615406565b604082019050919050565b6000602082019050818103600083015261549181615455565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154bf82615498565b6154c981856154a3565b93506154d981856020860161394d565b6154e281613980565b840191505092915050565b600060a0820190506155026000830188614064565b61550f6020830187614064565b81810360408301526155218186613fe4565b905081810360608301526155358185613fe4565b9050818103608083015261554981846154b4565b90509695505050505050565b60008151905061556481613875565b92915050565b6000602082840312156155805761557f613741565b5b600061558e84828501615555565b91505092915050565b60008160e01c9050919050565b600060033d11156155c35760046000803e6155c0600051615597565b90505b90565b600060443d10615653576155d8613737565b60043d036004823e80513d602482011167ffffffffffffffff82111715615600575050615653565b808201805167ffffffffffffffff81111561561e5750505050615653565b80602083010160043d03850181111561563b575050505050615653565b61564a82602001850186613a4d565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006156b260348361393c565b91506156bd82615656565b604082019050919050565b600060208201905081810360008301526156e1816156a5565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061574460288361393c565b915061574f826156e8565b604082019050919050565b6000602082019050818103600083015261577381615737565b9050919050565b600060a08201905061578f6000830188614064565b61579c6020830187614064565b6157a9604083018661381f565b6157b6606083018561381f565b81810360808301526157c881846154b4565b90509695505050505050565b7f6f6e6c79206f6e652070657220746f6b656e2069640000000000000000000000600082015250565b600061580a60158361393c565b9150615815826157d4565b602082019050919050565b60006020820190508181036000830152615839816157fd565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79427949640000000000000000000000000000000000000000602082015250565b600061589c602c8361393c565b91506158a782615840565b604082019050919050565b600060208201905081810360008301526158cb8161588f565b905091905056fea264697066735822122092f503294a5628b9e3256468c06435c17681a4b5876344a760a3d7b15c8502ed64736f6c634300080d0033b5287ef25a7b56dde4889ba81763f37d4de08e453ce1649305fbecc8fa0af44b00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569666d6b6136686332337975736132723568626d6e766d7262766879696c3373766a78347a68626f79693477326a33626335796e792f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020e5760003560e01c80638da5cb5b11610118578063b33712c5116100a0578063d8e99f921161006f578063d8e99f92146107b2578063e8dbce56146107dd578063e985e9c5146107f4578063f242432a14610831578063f2fde38b1461085a5761020e565b8063b33712c5146106f4578063be3b5fe91461071f578063bf2f44b71461074a578063c002d23d146107875761020e565b8063a118babd116100e7578063a118babd14610633578063a22cb4651461065e578063a329e1db14610687578063a3330d25146106b2578063aaddd756146106dd5761020e565b80638da5cb5b1461057057806395d89b411461059b57806398cd6153146105c6578063a0712d68146106035761020e565b80632eb4a7ab1161019b5780634e1273f41161016a5780634e1273f4146104775780634f558e79146104b45780635c975abb146104f1578063626fe4191461051c578063715018a6146105595761020e565b80632eb4a7ab146103b457806331afeb31146103df578063439766ce1461040f5780634783f0ef1461043a5761020e565b80630d9a11a0116101e25780630d9a11a0146102f55780630e89341c1461030c57806318160ddd146103495780631a08c774146103745780632eb2c2d61461038b5761020e565b8062fdd58e1461021357806301ffc9a71461025057806306c933d81461028d57806306fdde03146102ca575b600080fd5b34801561021f57600080fd5b5061023a600480360381019061023591906137df565b610883565b604051610247919061382e565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906138a1565b61094b565b60405161028491906138e9565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613904565b610a2d565b6040516102c1919061382e565b60405180910390f35b3480156102d657600080fd5b506102df610a45565b6040516102ec91906139ca565b60405180910390f35b34801561030157600080fd5b5061030a610a7e565b005b34801561031857600080fd5b50610333600480360381019061032e91906139ec565b610b17565b60405161034091906139ca565b60405180910390f35b34801561035557600080fd5b5061035e610b9a565b60405161036b919061382e565b60405180910390f35b34801561038057600080fd5b50610389610ba0565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613c16565b610c39565b005b3480156103c057600080fd5b506103c9610cda565b6040516103d69190613cfe565b60405180910390f35b6103f960048036038101906103f49190613d74565b610ce0565b60405161040691906138e9565b60405180910390f35b34801561041b57600080fd5b50610424611331565b60405161043191906138e9565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613e1c565b6113be565b60405161046e91906138e9565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613f0c565b611485565b6040516104ab9190614042565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906139ec565b61159e565b6040516104e891906138e9565b60405180910390f35b3480156104fd57600080fd5b506105066115b2565b60405161051391906138e9565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613904565b6115c9565b60405161055091906138e9565b60405180910390f35b34801561056557600080fd5b5061056e6116ca565b005b34801561057c57600080fd5b50610585611752565b6040516105929190614073565b60405180910390f35b3480156105a757600080fd5b506105b061177c565b6040516105bd91906139ca565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e8919061412f565b6117b5565b6040516105fa91906138e9565b60405180910390f35b61061d600480360381019061061891906139ec565b61187e565b60405161062a91906138e9565b60405180910390f35b34801561063f57600080fd5b50610648611b2d565b60405161065591906138e9565b60405180910390f35b34801561066a57600080fd5b50610685600480360381019061068091906141a4565b611cef565b005b34801561069357600080fd5b5061069c611d05565b6040516106a9919061382e565b60405180910390f35b3480156106be57600080fd5b506106c7611d0b565b6040516106d491906138e9565b60405180910390f35b3480156106e957600080fd5b506106f2611d1e565b005b34801561070057600080fd5b50610709611db7565b60405161071691906138e9565b60405180910390f35b34801561072b57600080fd5b50610734611e44565b60405161074191906138e9565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906139ec565b611e57565b60405161077e919061382e565b60405180910390f35b34801561079357600080fd5b5061079c611e74565b6040516107a9919061382e565b60405180910390f35b3480156107be57600080fd5b506107c7611e7f565b6040516107d49190614073565b60405180910390f35b3480156107e957600080fd5b506107f2611ea5565b005b34801561080057600080fd5b5061081b600480360381019061081691906141e4565b611f3e565b60405161082891906138e9565b60405180910390f35b34801561083d57600080fd5b5061085860048036038101906108539190614224565b611fd2565b005b34801561086657600080fd5b50610881600480360381019061087c9190613904565b612073565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ea9061432d565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1657507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a265750610a258261216a565b5b9050919050565b60096020528060005260406000206000915090505481565b6040518060400160405280600f81526020017f504958454c7061626c6f732e6c6f6c000000000000000000000000000000000081525081565b610a866121d4565b73ffffffffffffffffffffffffffffffffffffffff16610aa4611752565b73ffffffffffffffffffffffffffffffffffffffff1614610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190614399565b60405180910390fd5b6000600660006101000a81548160ff021916908315150217905550565b6060610b228261159e565b610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890614405565b60405180910390fd5b610b6a826121dc565b610b7383612270565b604051602001610b84929190614461565b6040516020818303038152906040529050919050565b60075481565b610ba86121d4565b73ffffffffffffffffffffffffffffffffffffffff16610bc6611752565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614399565b60405180910390fd5b6000600660016101000a81548160ff021916908315150217905550565b610c416121d4565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610c875750610c8685610c816121d4565b611f3e565b5b610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd906144f7565b60405180910390fd5b610cd385858585856123d0565b5050505050565b60085481565b6000600660009054906101000a900460ff16610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890614563565b60405180910390fd5b60008451905061271081600754610d4891906145b2565b1115610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090614654565b60405180910390fd5b600033604051602001610d9c91906146bc565b604051602081830303815290604052805190602001209050610e02858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600854836126e3565b610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890614723565b60405180910390fd5b6000600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610e9e9190614073565b602060405180830381865afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf9190614758565b90506000808211610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906147d1565b60405180910390fd5b6101908210610f375760c89050610fb1565b60c88210610f485760649050610fb0565b60328210610f595760329050610faf565b60328210610f6a5760109050610fae565b60198210610f7b5760089050610fad565b600a8210610f8c5760049050610fac565b60058210610f9d5760029050610fab565b60018210610faa57600190505b5b5b5b5b5b5b5b808411158015610fff575080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b61103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110359061483d565b60405180910390fd5b60008467ffffffffffffffff81111561105a57611059613a1e565b5b6040519080825280602002602001820160405280156110885781602001602082028036833780820191505090505b50905060005b8581101561125d576110b98a82815181106110ac576110ab61485d565b5b602002602001015161159e565b156110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f0906148d8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8d85815181106111635761116261485d565b5b60200260200101516040518263ffffffff1660e01b8152600401611187919061382e565b602060405180830381865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c8919061490d565b73ffffffffffffffffffffffffffffffffffffffff161490506001151581151514611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90614986565b60405180910390fd5b600183838151811061123d5761123c61485d565b5b602002602001018181525050508080611255906149a6565b91505061108e565b50611279338a83604051806020016040528060008152506126fa565b846007600082825461128b91906145b2565b9250508190555084600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112e191906145b2565b925050819055507fde2d71f52faa890a279c058c686c85fa154568fcee8b0fff9226f489dbb4008089336040516113199291906149ee565b60405180910390a16001955050505050509392505050565b600061133b6121d4565b73ffffffffffffffffffffffffffffffffffffffff16611359611752565b73ffffffffffffffffffffffffffffffffffffffff16146113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690614399565b60405180910390fd5b6113b7612917565b6001905090565b60006113c86121d4565b73ffffffffffffffffffffffffffffffffffffffff166113e6611752565b73ffffffffffffffffffffffffffffffffffffffff161461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614399565b60405180910390fd5b816008819055507fa2a63702a7eb4271f96e4ea16c164231eb3f32a28bc80e9c880c36363a5c41468233604051611474929190614a1e565b60405180910390a160019050919050565b606081518351146114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290614ab9565b60405180910390fd5b6000835167ffffffffffffffff8111156114e8576114e7613a1e565b5b6040519080825280602002602001820160405280156115165781602001602082028036833780820191505090505b50905060005b84518110156115935761156385828151811061153b5761153a61485d565b5b60200260200101518583815181106115565761155561485d565b5b6020026020010151610883565b8282815181106115765761157561485d565b5b6020026020010181815250508061158c906149a6565b905061151c565b508091505092915050565b6000806115aa83611e57565b119050919050565b6000600460009054906101000a900460ff16905090565b60006115d36121d4565b73ffffffffffffffffffffffffffffffffffffffff166115f1611752565b73ffffffffffffffffffffffffffffffffffffffff1614611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90614399565b60405180910390fd5b81600660026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f80232346ebb2dea71c1fd1c47b02ae6346d278c5f92ef1d4463ec0cb31e4596782336040516116b9929190614ad9565b60405180910390a160019050919050565b6116d26121d4565b73ffffffffffffffffffffffffffffffffffffffff166116f0611752565b73ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90614399565b60405180910390fd5b61175060006129ba565b565b6000600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600681526020017f504958504142000000000000000000000000000000000000000000000000000081525081565b60006117bf6121d4565b73ffffffffffffffffffffffffffffffffffffffff166117dd611752565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614399565b60405180910390fd5b61183c82612a80565b7fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a48395823360405161186d929190614b02565b60405180910390a160019050919050565b6000600660019054906101000a900460ff166118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690614b7e565b60405180910390fd5b612710826007546118e091906145b2565b1115611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890614654565b60405180910390fd5b81662386f26fc100006119349190614b9e565b341015611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90614c44565b60405180910390fd5b60008267ffffffffffffffff81111561199257611991613a1e565b5b6040519080825280602002602001820160405280156119c05781602001602082028036833780820191505090505b50905060008367ffffffffffffffff8111156119df576119de613a1e565b5b604051908082528060200260200182016040528015611a0d5781602001602082028036833780820191505090505b5090506000600554905060005b85811015611aac575b611a2c8261159e565b15611a44578180611a3c906149a6565b925050611a23565b600082905080858381518110611a5d57611a5c61485d565b5b6020026020010181815250506001848381518110611a7e57611a7d61485d565b5b6020026020010181815250508280611a95906149a6565b935050508080611aa4906149a6565b915050611a1a565b5080600581905550611acf338484604051806020016040528060008152506126fa565b7f7ac6136baaa4f9a0d76c1972a3d2b0061580ddb478a8bf27fd0c9fd3d2d100e98333604051611b009291906149ee565b60405180910390a18460076000828254611b1a91906145b2565b9250508190555060019350505050919050565b6000611b376121d4565b73ffffffffffffffffffffffffffffffffffffffff16611b55611752565b73ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba290614399565b60405180910390fd5b600047905060008111611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea90614cb0565b60405180910390fd5b6000611bfd611752565b73ffffffffffffffffffffffffffffffffffffffff1682604051611c2090614d01565b60006040518083038185875af1925050503d8060008114611c5d576040519150601f19603f3d011682016040523d82523d6000602084013e611c62565b606091505b505090506001151581151514611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca490614d62565b60405180910390fd5b7fb0caa7e5a1709d95503ec9da196222012fad8495f101214d86c3b72ce101810f8233604051611cde929190614d82565b60405180910390a160019250505090565b611d01611cfa6121d4565b8383612a9a565b5050565b61271081565b600660019054906101000a900460ff1681565b611d266121d4565b73ffffffffffffffffffffffffffffffffffffffff16611d44611752565b73ffffffffffffffffffffffffffffffffffffffff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190614399565b60405180910390fd5b6001600660016101000a81548160ff021916908315150217905550565b6000611dc16121d4565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611752565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90614399565b60405180910390fd5b611e3d612c06565b6001905090565b600660009054906101000a900460ff1681565b600060036000838152602001908152602001600020549050919050565b662386f26fc1000081565b600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ead6121d4565b73ffffffffffffffffffffffffffffffffffffffff16611ecb611752565b73ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614399565b60405180910390fd5b6001600660006101000a81548160ff021916908315150217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fda6121d4565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612020575061201f8561201a6121d4565b611f3e565b5b61205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690614e1d565b60405180910390fd5b61206c8585858585612ca8565b5050505050565b61207b6121d4565b73ffffffffffffffffffffffffffffffffffffffff16612099611752565b73ffffffffffffffffffffffffffffffffffffffff16146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614399565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361215e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215590614eaf565b60405180910390fd5b612167816129ba565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6060600280546121eb90614efe565b80601f016020809104026020016040519081016040528092919081815260200182805461221790614efe565b80156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b50505050509050919050565b6060600082036122b7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123cb565b600082905060005b600082146122e95780806122d2906149a6565b915050600a826122e29190614f5e565b91506122bf565b60008167ffffffffffffffff81111561230557612304613a1e565b5b6040519080825280601f01601f1916602001820160405280156123375781602001600182028036833780820191505090505b5090505b600085146123c4576001826123509190614f8f565b9150600a8561235f9190614fc3565b603061236b91906145b2565b60f81b8183815181106123815761238061485d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123bd9190614f5e565b945061233b565b8093505050505b919050565b8151835114612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240b90615066565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a906150f8565b60405180910390fd5b600061248d6121d4565b905061249d818787878787612f29565b60005b845181101561264e5760008582815181106124be576124bd61485d565b5b6020026020010151905060008583815181106124dd576124dc61485d565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561257e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125759061518a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461263391906145b2565b9250508190555050505080612647906149a6565b90506124a0565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126c59291906151aa565b60405180910390a46126db818787878787612f87565b505050505050565b6000826126f0858461315e565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276090615253565b60405180910390fd5b81518351146127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490615066565b60405180910390fd5b60006127b76121d4565b90506127c881600087878787612f29565b60005b8451811015612881578381815181106127e7576127e661485d565b5b60200260200101516000808784815181106128055761280461485d565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461286791906145b2565b925050819055508080612879906149a6565b9150506127cb565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516128f99291906151aa565b60405180910390a461291081600087878787612f87565b5050505050565b61291f6115b2565b1561295f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612956906152bf565b60405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129a36121d4565b6040516129b09190614073565b60405180910390a1565b6000600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060029080519060200190612a96929190613694565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aff90615351565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bf991906138e9565b60405180910390a3505050565b612c0e6115b2565b612c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c44906153bd565b60405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612c916121d4565b604051612c9e9190614073565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0e906150f8565b60405180910390fd5b6000612d216121d4565b9050612d41818787612d32886131d3565b612d3b886131d3565b87612f29565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcf9061518a565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e8d91906145b2565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612f0a9291906153dd565b60405180910390a4612f2082888888888861324d565b50505050505050565b612f37868686868686613424565b612f3f6115b2565b15612f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7690615478565b60405180910390fd5b505050505050565b612fa68473ffffffffffffffffffffffffffffffffffffffff16613652565b15613156578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612fec9594939291906154ed565b6020604051808303816000875af192505050801561302857506040513d601f19601f82011682018060405250810190613025919061556a565b60015b6130cd576130346155a4565b806308c379a00361309057506130486155c6565b806130535750613092565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308791906139ca565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c4906156c8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314b9061575a565b60405180910390fd5b505b505050505050565b60008082905060005b84518110156131c85760008582815181106131855761318461485d565b5b602002602001015190508083116131a7576131a08382613675565b92506131b4565b6131b18184613675565b92505b5080806131c0906149a6565b915050613167565b508091505092915050565b60606000600167ffffffffffffffff8111156131f2576131f1613a1e565b5b6040519080825280602002602001820160405280156132205781602001602082028036833780820191505090505b50905082816000815181106132385761323761485d565b5b60200260200101818152505080915050919050565b61326c8473ffffffffffffffffffffffffffffffffffffffff16613652565b1561341c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016132b295949392919061577a565b6020604051808303816000875af19250505080156132ee57506040513d601f19601f820116820180604052508101906132eb919061556a565b60015b613393576132fa6155a4565b806308c379a003613356575061330e6155c6565b806133195750613358565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334d91906139ca565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338a906156c8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461341a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134119061575a565b60405180910390fd5b505b505050505050565b61343286868686868661368c565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036135415760005b835181101561353f5760018382815181106134875761348661485d565b5b602002602001015111156134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790615820565b60405180910390fd5b8281815181106134e3576134e261485d565b5b6020026020010151600360008684815181106135025761350161485d565b5b60200260200101518152602001908152602001600020600082825461352791906145b2565b9250508190555080613538906149a6565b9050613469565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361364a5760005b83518110156136485760008482815181106135965761359561485d565b5b6020026020010151905060008483815181106135b5576135b461485d565b5b602002602001015190506000600360008481526020019081526020016000205490508181101561361a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613611906158b2565b60405180910390fd5b818103600360008581526020019081526020016000208190555050505080613641906149a6565b9050613578565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b505050505050565b8280546136a090614efe565b90600052602060002090601f0160209004810192826136c25760008555613709565b82601f106136db57805160ff1916838001178555613709565b82800160010185558215613709579182015b828111156137085782518255916020019190600101906136ed565b5b509050613716919061371a565b5090565b5b8082111561373357600081600090555060010161371b565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137768261374b565b9050919050565b6137868161376b565b811461379157600080fd5b50565b6000813590506137a38161377d565b92915050565b6000819050919050565b6137bc816137a9565b81146137c757600080fd5b50565b6000813590506137d9816137b3565b92915050565b600080604083850312156137f6576137f5613741565b5b600061380485828601613794565b9250506020613815858286016137ca565b9150509250929050565b613828816137a9565b82525050565b6000602082019050613843600083018461381f565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61387e81613849565b811461388957600080fd5b50565b60008135905061389b81613875565b92915050565b6000602082840312156138b7576138b6613741565b5b60006138c58482850161388c565b91505092915050565b60008115159050919050565b6138e3816138ce565b82525050565b60006020820190506138fe60008301846138da565b92915050565b60006020828403121561391a57613919613741565b5b600061392884828501613794565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561396b578082015181840152602081019050613950565b8381111561397a576000848401525b50505050565b6000601f19601f8301169050919050565b600061399c82613931565b6139a6818561393c565b93506139b681856020860161394d565b6139bf81613980565b840191505092915050565b600060208201905081810360008301526139e48184613991565b905092915050565b600060208284031215613a0257613a01613741565b5b6000613a10848285016137ca565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a5682613980565b810181811067ffffffffffffffff82111715613a7557613a74613a1e565b5b80604052505050565b6000613a88613737565b9050613a948282613a4d565b919050565b600067ffffffffffffffff821115613ab457613ab3613a1e565b5b602082029050602081019050919050565b600080fd5b6000613add613ad884613a99565b613a7e565b90508083825260208201905060208402830185811115613b0057613aff613ac5565b5b835b81811015613b295780613b1588826137ca565b845260208401935050602081019050613b02565b5050509392505050565b600082601f830112613b4857613b47613a19565b5b8135613b58848260208601613aca565b91505092915050565b600080fd5b600067ffffffffffffffff821115613b8157613b80613a1e565b5b613b8a82613980565b9050602081019050919050565b82818337600083830152505050565b6000613bb9613bb484613b66565b613a7e565b905082815260208101848484011115613bd557613bd4613b61565b5b613be0848285613b97565b509392505050565b600082601f830112613bfd57613bfc613a19565b5b8135613c0d848260208601613ba6565b91505092915050565b600080600080600060a08688031215613c3257613c31613741565b5b6000613c4088828901613794565b9550506020613c5188828901613794565b945050604086013567ffffffffffffffff811115613c7257613c71613746565b5b613c7e88828901613b33565b935050606086013567ffffffffffffffff811115613c9f57613c9e613746565b5b613cab88828901613b33565b925050608086013567ffffffffffffffff811115613ccc57613ccb613746565b5b613cd888828901613be8565b9150509295509295909350565b6000819050919050565b613cf881613ce5565b82525050565b6000602082019050613d136000830184613cef565b92915050565b600080fd5b60008083601f840112613d3457613d33613a19565b5b8235905067ffffffffffffffff811115613d5157613d50613d19565b5b602083019150836020820283011115613d6d57613d6c613ac5565b5b9250929050565b600080600060408486031215613d8d57613d8c613741565b5b600084013567ffffffffffffffff811115613dab57613daa613746565b5b613db786828701613b33565b935050602084013567ffffffffffffffff811115613dd857613dd7613746565b5b613de486828701613d1e565b92509250509250925092565b613df981613ce5565b8114613e0457600080fd5b50565b600081359050613e1681613df0565b92915050565b600060208284031215613e3257613e31613741565b5b6000613e4084828501613e07565b91505092915050565b600067ffffffffffffffff821115613e6457613e63613a1e565b5b602082029050602081019050919050565b6000613e88613e8384613e49565b613a7e565b90508083825260208201905060208402830185811115613eab57613eaa613ac5565b5b835b81811015613ed45780613ec08882613794565b845260208401935050602081019050613ead565b5050509392505050565b600082601f830112613ef357613ef2613a19565b5b8135613f03848260208601613e75565b91505092915050565b60008060408385031215613f2357613f22613741565b5b600083013567ffffffffffffffff811115613f4157613f40613746565b5b613f4d85828601613ede565b925050602083013567ffffffffffffffff811115613f6e57613f6d613746565b5b613f7a85828601613b33565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fb9816137a9565b82525050565b6000613fcb8383613fb0565b60208301905092915050565b6000602082019050919050565b6000613fef82613f84565b613ff98185613f8f565b935061400483613fa0565b8060005b8381101561403557815161401c8882613fbf565b975061402783613fd7565b925050600181019050614008565b5085935050505092915050565b6000602082019050818103600083015261405c8184613fe4565b905092915050565b61406d8161376b565b82525050565b60006020820190506140886000830184614064565b92915050565b600067ffffffffffffffff8211156140a9576140a8613a1e565b5b6140b282613980565b9050602081019050919050565b60006140d26140cd8461408e565b613a7e565b9050828152602081018484840111156140ee576140ed613b61565b5b6140f9848285613b97565b509392505050565b600082601f83011261411657614115613a19565b5b81356141268482602086016140bf565b91505092915050565b60006020828403121561414557614144613741565b5b600082013567ffffffffffffffff81111561416357614162613746565b5b61416f84828501614101565b91505092915050565b614181816138ce565b811461418c57600080fd5b50565b60008135905061419e81614178565b92915050565b600080604083850312156141bb576141ba613741565b5b60006141c985828601613794565b92505060206141da8582860161418f565b9150509250929050565b600080604083850312156141fb576141fa613741565b5b600061420985828601613794565b925050602061421a85828601613794565b9150509250929050565b600080600080600060a086880312156142405761423f613741565b5b600061424e88828901613794565b955050602061425f88828901613794565b9450506040614270888289016137ca565b9350506060614281888289016137ca565b925050608086013567ffffffffffffffff8111156142a2576142a1613746565b5b6142ae88828901613be8565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614317602b8361393c565b9150614322826142bb565b604082019050919050565b600060208201905081810360008301526143468161430a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061438360208361393c565b915061438e8261434d565b602082019050919050565b600060208201905081810360008301526143b281614376565b9050919050565b7f546f6b656e496e6578697374656e740000000000000000000000000000000000600082015250565b60006143ef600f8361393c565b91506143fa826143b9565b602082019050919050565b6000602082019050818103600083015261441e816143e2565b9050919050565b600081905092915050565b600061443b82613931565b6144458185614425565b935061445581856020860161394d565b80840191505092915050565b600061446d8285614430565b91506144798284614430565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006144e160328361393c565b91506144ec82614485565b604082019050919050565b60006020820190508181036000830152614510816144d4565b9050919050565b7f47656e657369734e6f7441637469766500000000000000000000000000000000600082015250565b600061454d60108361393c565b915061455882614517565b602082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145bd826137a9565b91506145c8836137a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145fd576145fc614583565b5b828201905092915050565b7f4d6178696d756d4d696e74537570706c79526561636865640000000000000000600082015250565b600061463e60188361393c565b915061464982614608565b602082019050919050565b6000602082019050818103600083015261466d81614631565b9050919050565b60008160601b9050919050565b600061468c82614674565b9050919050565b600061469e82614681565b9050919050565b6146b66146b18261376b565b614693565b82525050565b60006146c882846146a5565b60148201915081905092915050565b7f496e76616c69644d65726b6c6550726f6f660000000000000000000000000000600082015250565b600061470d60128361393c565b9150614718826146d7565b602082019050919050565b6000602082019050818103600083015261473c81614700565b9050919050565b600081519050614752816137b3565b92915050565b60006020828403121561476e5761476d613741565b5b600061477c84828501614743565b91505092915050565b7f4e6f6e47656e65736973486f6c64657200000000000000000000000000000000600082015250565b60006147bb60108361393c565b91506147c682614785565b602082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f4d6178696d756d416c6c6f77616e636500000000000000000000000000000000600082015250565b600061482760108361393c565b9150614832826147f1565b602082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e416c72656164794578697374730000000000000000000000000000600082015250565b60006148c260128361393c565b91506148cd8261488c565b602082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b6000815190506149078161377d565b92915050565b60006020828403121561492357614922613741565b5b6000614931848285016148f8565b91505092915050565b7f4e6f6e526967687466756c47656e65736973486f6c6465720000000000000000600082015250565b600061497060188361393c565b915061497b8261493a565b602082019050919050565b6000602082019050818103600083015261499f81614963565b9050919050565b60006149b1826137a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149e3576149e2614583565b5b600182019050919050565b60006040820190508181036000830152614a088185613fe4565b9050614a176020830184614064565b9392505050565b6000604082019050614a336000830185613cef565b614a406020830184614064565b9392505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614aa360298361393c565b9150614aae82614a47565b604082019050919050565b60006020820190508181036000830152614ad281614a96565b9050919050565b6000604082019050614aee6000830185614064565b614afb6020830184614064565b9392505050565b60006040820190508181036000830152614b1c8185613991565b9050614b2b6020830184614064565b9392505050565b7f5075626c69634e6f744163746976650000000000000000000000000000000000600082015250565b6000614b68600f8361393c565b9150614b7382614b32565b602082019050919050565b60006020820190508181036000830152614b9781614b5b565b9050919050565b6000614ba9826137a9565b9150614bb4836137a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bed57614bec614583565b5b828202905092915050565b7f496e73756666696369656e74416d6f756e740000000000000000000000000000600082015250565b6000614c2e60128361393c565b9150614c3982614bf8565b602082019050919050565b60006020820190508181036000830152614c5d81614c21565b9050919050565b7f556e417574686f72697a65645265717565737400000000000000000000000000600082015250565b6000614c9a60138361393c565b9150614ca582614c64565b602082019050919050565b60006020820190508181036000830152614cc981614c8d565b9050919050565b600081905092915050565b50565b6000614ceb600083614cd0565b9150614cf682614cdb565b600082019050919050565b6000614d0c82614cde565b9150819050919050565b7f5472616e73616374696f6e4661696c6564000000000000000000000000000000600082015250565b6000614d4c60118361393c565b9150614d5782614d16565b602082019050919050565b60006020820190508181036000830152614d7b81614d3f565b9050919050565b6000604082019050614d97600083018561381f565b614da46020830184614064565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614e0760298361393c565b9150614e1282614dab565b604082019050919050565b60006020820190508181036000830152614e3681614dfa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e9960268361393c565b9150614ea482614e3d565b604082019050919050565b60006020820190508181036000830152614ec881614e8c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f1657607f821691505b602082108103614f2957614f28614ecf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f69826137a9565b9150614f74836137a9565b925082614f8457614f83614f2f565b5b828204905092915050565b6000614f9a826137a9565b9150614fa5836137a9565b925082821015614fb857614fb7614583565b5b828203905092915050565b6000614fce826137a9565b9150614fd9836137a9565b925082614fe957614fe8614f2f565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061505060288361393c565b915061505b82614ff4565b604082019050919050565b6000602082019050818103600083015261507f81615043565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006150e260258361393c565b91506150ed82615086565b604082019050919050565b60006020820190508181036000830152615111816150d5565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615174602a8361393c565b915061517f82615118565b604082019050919050565b600060208201905081810360008301526151a381615167565b9050919050565b600060408201905081810360008301526151c48185613fe4565b905081810360208301526151d88184613fe4565b90509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061523d60218361393c565b9150615248826151e1565b604082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006152a960108361393c565b91506152b482615273565b602082019050919050565b600060208201905081810360008301526152d88161529c565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061533b60298361393c565b9150615346826152df565b604082019050919050565b6000602082019050818103600083015261536a8161532e565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006153a760148361393c565b91506153b282615371565b602082019050919050565b600060208201905081810360008301526153d68161539a565b9050919050565b60006040820190506153f2600083018561381f565b6153ff602083018461381f565b9392505050565b7f455243313135355061757361626c653a20746f6b656e207472616e736665722060008201527f7768696c65207061757365640000000000000000000000000000000000000000602082015250565b6000615462602c8361393c565b915061546d82615406565b604082019050919050565b6000602082019050818103600083015261549181615455565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154bf82615498565b6154c981856154a3565b93506154d981856020860161394d565b6154e281613980565b840191505092915050565b600060a0820190506155026000830188614064565b61550f6020830187614064565b81810360408301526155218186613fe4565b905081810360608301526155358185613fe4565b9050818103608083015261554981846154b4565b90509695505050505050565b60008151905061556481613875565b92915050565b6000602082840312156155805761557f613741565b5b600061558e84828501615555565b91505092915050565b60008160e01c9050919050565b600060033d11156155c35760046000803e6155c0600051615597565b90505b90565b600060443d10615653576155d8613737565b60043d036004823e80513d602482011167ffffffffffffffff82111715615600575050615653565b808201805167ffffffffffffffff81111561561e5750505050615653565b80602083010160043d03850181111561563b575050505050615653565b61564a82602001850186613a4d565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006156b260348361393c565b91506156bd82615656565b604082019050919050565b600060208201905081810360008301526156e1816156a5565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061574460288361393c565b915061574f826156e8565b604082019050919050565b6000602082019050818103600083015261577381615737565b9050919050565b600060a08201905061578f6000830188614064565b61579c6020830187614064565b6157a9604083018661381f565b6157b6606083018561381f565b81810360808301526157c881846154b4565b90509695505050505050565b7f6f6e6c79206f6e652070657220746f6b656e2069640000000000000000000000600082015250565b600061580a60158361393c565b9150615815826157d4565b602082019050919050565b60006020820190508181036000830152615839816157fd565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79427949640000000000000000000000000000000000000000602082015250565b600061589c602c8361393c565b91506158a782615840565b604082019050919050565b600060208201905081810360008301526158cb8161588f565b905091905056fea264697066735822122092f503294a5628b9e3256468c06435c17681a4b5876344a760a3d7b15c8502ed64736f6c634300080d0033

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

b5287ef25a7b56dde4889ba81763f37d4de08e453ce1649305fbecc8fa0af44b00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569666d6b6136686332337975736132723568626d6e766d7262766879696c3373766a78347a68626f79693477326a33626335796e792f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0xb5287ef25a7b56dde4889ba81763f37d4de08e453ce1649305fbecc8fa0af44b
Arg [1] : newURI (string): ipfs://bafybeifmka6hc23yusa2r5hbmnvmrbvhyil3svjx4zhboyi4w2j3bc5yny/

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : b5287ef25a7b56dde4889ba81763f37d4de08e453ce1649305fbecc8fa0af44b
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 697066733a2f2f62616679626569666d6b613668633233797573613272356862
Arg [4] : 6d6e766d7262766879696c3373766a78347a68626f79693477326a3362633579
Arg [5] : 6e792f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55066:8599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38221:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37244:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55620:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55163:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62733:86;;;;;;;;;;;;;:::i;:::-;;62344:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55549:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62921:85;;;;;;;;;;;;;:::i;:::-;;40160:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55586:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58688:2231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57880:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57203:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38618:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52689:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11989:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57426:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10040:103;;;;;;;;;;;;;:::i;:::-;;9389:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55217:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56751:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61215:981;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63260:402;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39215:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55435:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55308:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62827:86;;;;;;;;;;;;;:::i;:::-;;58203:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55266:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52470:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55489:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55351:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62638:87;;;;;;;;;;;;;:::i;:::-;;39442:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39682:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10298:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38221:231;38307:7;38354:1;38335:21;;:7;:21;;;38327:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38422:9;:13;38432:2;38422:13;;;;;;;;;;;:22;38436:7;38422:22;;;;;;;;;;;;;;;;38415:29;;38221:231;;;;:::o;37244:310::-;37346:4;37398:26;37383:41;;;:11;:41;;;;:110;;;;37456:37;37441:52;;;:11;:52;;;;37383:110;:163;;;;37510:36;37534:11;37510:23;:36::i;:::-;37383:163;37363:183;;37244:310;;;:::o;55620:55::-;;;;;;;;;;;;;;;;;:::o;55163:47::-;;;;;;;;;;;;;;;;;;;:::o;62733:86::-;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62806:5:::1;62788:15;;:23;;;;;;;;;;;;;;;;;;62733:86::o:0;62344:286::-;62426:13;62460:11;62467:3;62460:6;:11::i;:::-;62452:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;62561:14;62571:3;62561:9;:14::i;:::-;62577:21;62594:3;62577:16;:21::i;:::-;62530:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62504:118;;62344:286;;;:::o;55549:30::-;;;;:::o;62921:85::-;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62993:5:::1;62976:14;;:22;;;;;;;;;;;;;;;;;;62921:85::o:0;40160:442::-;40401:12;:10;:12::i;:::-;40393:20;;:4;:20;;;:60;;;;40417:36;40434:4;40440:12;:10;:12::i;:::-;40417:16;:36::i;:::-;40393:60;40371:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;40542:52;40565:4;40571:2;40575:3;40580:7;40589:4;40542:22;:52::i;:::-;40160:442;;;;;:::o;55586:25::-;;;;:::o;58688:2231::-;58834:4;55730:15;;;;;;;;;;;55722:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58849:23:::1;58875:8;:15;58849:41;;55477:5;58923:15;58909:11;;:29;;;;:::i;:::-;:48;;58901:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58997:12;59039:10;59022:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;59012:39;;;;;;58997:54;;59086:50;59105:12;;59086:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59119:10;;59131:4;59086:18;:50::i;:::-;59068:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;59187:23;59221:15;;;;;;;;;;;59213:34;;;59248:10;59213:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59187:72;;59268:29;59338:1:::0;59320:15:::1;:19;59312:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59394:3;59375:15;:22;59371:681;;59434:3;59410:27;;59371:681;;;59483:3;59464:15;:22;59460:592;;59523:3;59499:27;;59460:592;;;59572:2;59553:15;:21;59549:503;;59611:2;59587:26;;59549:503;;;59659:2;59640:15;:21;59636:416;;59698:2;59674:26;;59636:416;;;59746:2;59727:15;:21;59723:329;;59785:1;59761:25;;59723:329;;;59832:2;59813:15;:21;59809:243;;59871:1;59847:25;;59809:243;;;59918:1;59899:15;:20;59895:157;;59956:1;59932:25;;59895:157;;;60003:1;59984:15;:20;59980:72;;60041:1;60017:25;;59980:72;59895:157;59809:243;59723:329;59636:416;59549:503;59460:592;59371:681;60099:21;60080:15;:40;;:109;;;;;60168:21;60133:20;:32;60154:10;60133:32;;;;;;;;;;;;;;;;:56;60080:109;60062:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;60238:24;60279:15;60265:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60238:57;;60311:9;60306:376;60330:15;60326:1;:19;60306:376;;;60389:19;60396:8;60405:1;60396:11;;;;;;;;:::i;:::-;;;;;;;;60389:6;:19::i;:::-;60387:22;60365:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;60472:27;60551:10;60502:59;;60510:15;;;;;;;;;;;60502:32;;;60535:8;60544:1;60535:11;;;;;;;;:::i;:::-;;;;;;;;60502:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;60472:89;;60610:4;60584:30;;:22;:30;;;60576:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60671:1;60658:7;60666:1;60658:10;;;;;;;;:::i;:::-;;;;;;;:14;;;::::0;::::1;60352:330;60347:3;;;;;:::i;:::-;;;;60306:376;;;;60692:45;60703:10;60715:8;60725:7;60692:45;;;;;;;;;;;::::0;:10:::1;:45::i;:::-;60763:15;60748:11;;:30;;;;;;;:::i;:::-;;;;;;;;60823:15;60787:20;:32;60808:10;60787:32;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;60854:35;60868:8;60878:10;60854:35;;;;;;;:::i;:::-;;;;;;;;60907:4;60900:11;;;;;;;58688:2231:::0;;;;;:::o;57880:108::-;57933:4;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57950:8:::1;:6;:8::i;:::-;57976:4;57969:11;;57880:108:::0;:::o;57203:215::-;57298:4;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57333:4:::1;57320:10;:17;;;;57353:35;57371:4;57377:10;57353:35;;;;;;;:::i;:::-;;;;;;;;57406:4;57399:11;;57203:215:::0;;;:::o;38618:524::-;38774:16;38835:3;:10;38816:8;:15;:29;38808:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;38904:30;38951:8;:15;38937:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38904:63;;38985:9;38980:122;39004:8;:15;39000:1;:19;38980:122;;;39060:30;39070:8;39079:1;39070:11;;;;;;;;:::i;:::-;;;;;;;;39083:3;39087:1;39083:6;;;;;;;;:::i;:::-;;;;;;;;39060:9;:30::i;:::-;39041:13;39055:1;39041:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;39021:3;;;;:::i;:::-;;;38980:122;;;;39121:13;39114:20;;;38618:524;;;;:::o;52689:126::-;52746:4;52806:1;52770:33;52800:2;52770:29;:33::i;:::-;:37;52763:44;;52689:126;;;:::o;11989:86::-;12036:4;12060:7;;;;;;;;;;;12053:14;;11989:86;:::o;57426:245::-;57531:4;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57571:9:::1;57553:15;;:27;;;;;;;;;;;;;;;;;;57596:45;57619:9;57630:10;57596:45;;;;;;;:::i;:::-;;;;;;;;57659:4;57652:11;;57426:245:::0;;;:::o;10040:103::-;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10105:30:::1;10132:1;10105:18;:30::i;:::-;10040:103::o:0;9389:87::-;9435:7;9462:6;;;;;;;;;;;9455:13;;9389:87;:::o;55217:40::-;;;;;;;;;;;;;;;;;;;:::o;56751:210::-;56852:4;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56874:15:::1;56882:6;56874:7;:15::i;:::-;56905:26;56912:6;56920:10;56905:26;;;;;;;:::i;:::-;;;;;;;;56949:4;56942:11;;56751:210:::0;;;:::o;61215:981::-;61324:4;55837:14;;;;;;;;;;;55829:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;55477:5:::1;61361:15;61347:11;;:29;;;;:::i;:::-;:48;;61339:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61467:15;55526:14;61454:28;;;;:::i;:::-;61441:9;:41;;61433:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;61516:25;61558:15;61544:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61516:58;;61583:24;61624:15;61610:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61583:57;;61651:20;61674:12;;61651:35;;61702:9;61697:285;61721:15;61717:1;:19;61697:285;;;61754:90;61773:20;61780:12;61773:6;:20::i;:::-;61754:90;;;61818:14;;;;;:::i;:::-;;;;61754:90;;;61856:15;61874:12;61856:30;;61913:7;61899:8;61908:1;61899:11;;;;;;;;:::i;:::-;;;;;;;:21;;;::::0;::::1;61944:1;61931:7;61939:1;61931:10;;;;;;;;:::i;:::-;;;;;;;:14;;;::::0;::::1;61958;;;;;:::i;:::-;;;;61743:239;61738:3;;;;;:::i;:::-;;;;61697:285;;;;62007:12;61992;:27;;;;62030:45;62041:10;62053:8;62063:7;62030:45;;;;;;;;;;;::::0;:10:::1;:45::i;:::-;62091:34;62104:8;62114:10;62091:34;;;;;;;:::i;:::-;;;;;;;;62151:15;62136:11;;:30;;;;;;;:::i;:::-;;;;;;;;62184:4;62177:11;;;;;61215:981:::0;;;:::o;63260:402::-;63315:4;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63332:23:::1;63358:21;63332:47;;63418:1;63400:15;:19;63392:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;63457:9;63472:7;:5;:7::i;:::-;:12;;63492:15;63472:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63456:56;;;63541:4;63533:12;;:4;:12;;;63525:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63585:45;63602:15;63619:10;63585:45;;;;;;;:::i;:::-;;;;;;;;63650:4;63643:11;;;;63260:402:::0;:::o;39215:155::-;39310:52;39329:12;:10;:12::i;:::-;39343:8;39353;39310:18;:52::i;:::-;39215:155;;:::o;55435:47::-;55477:5;55435:47;:::o;55308:34::-;;;;;;;;;;;;;:::o;62827:86::-;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62901:4:::1;62884:14;;:21;;;;;;;;;;;;;;;;;;62827:86::o:0;58203:112::-;58258:4;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58275:10:::1;:8;:10::i;:::-;58303:4;58296:11;;58203:112:::0;:::o;55266:35::-;;;;;;;;;;;;;:::o;52470:121::-;52536:7;52563:16;:20;52580:2;52563:20;;;;;;;;;;;;52556:27;;52470:121;;;:::o;55489:51::-;55526:14;55489:51;:::o;55351:75::-;;;;;;;;;;;;;:::o;62638:87::-;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62713:4:::1;62695:15;;:22;;;;;;;;;;;;;;;;;;62638:87::o:0;39442:168::-;39541:4;39565:18;:27;39584:7;39565:27;;;;;;;;;;;;;;;:37;39593:8;39565:37;;;;;;;;;;;;;;;;;;;;;;;;;39558:44;;39442:168;;;;:::o;39682:401::-;39898:12;:10;:12::i;:::-;39890:20;;:4;:20;;;:60;;;;39914:36;39931:4;39937:12;:10;:12::i;:::-;39914:16;:36::i;:::-;39890:60;39868:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;40030:45;40048:4;40054:2;40058;40062:6;40070:4;40030:17;:45::i;:::-;39682:401;;;;;:::o;10298:201::-;9620:12;:10;:12::i;:::-;9609:23;;:7;:5;:7::i;:::-;:23;;;9601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10407:1:::1;10387:22;;:8;:22;;::::0;10379:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10463:28;10482:8;10463:18;:28::i;:::-;10298:201:::0;:::o;28562:157::-;28647:4;28686:25;28671:40;;;:11;:40;;;;28664:47;;28562:157;;;:::o;8113:98::-;8166:7;8193:10;8186:17;;8113:98;:::o;37965:105::-;38025:13;38058:4;38051:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37965:105;;;:::o;5675:723::-;5731:13;5961:1;5952:5;:10;5948:53;;5979:10;;;;;;;;;;;;;;;;;;;;;5948:53;6011:12;6026:5;6011:20;;6042:14;6067:78;6082:1;6074:4;:9;6067:78;;6100:8;;;;;:::i;:::-;;;;6131:2;6123:10;;;;;:::i;:::-;;;6067:78;;;6155:19;6187:6;6177:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6155:39;;6205:154;6221:1;6212:5;:10;6205:154;;6249:1;6239:11;;;;;:::i;:::-;;;6316:2;6308:5;:10;;;;:::i;:::-;6295:2;:24;;;;:::i;:::-;6282:39;;6265:6;6272;6265:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6345:2;6336:11;;;;;:::i;:::-;;;6205:154;;;6383:6;6369:21;;;;;5675:723;;;;:::o;42244:1074::-;42471:7;:14;42457:3;:10;:28;42449:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42563:1;42549:16;;:2;:16;;;42541:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42620:16;42639:12;:10;:12::i;:::-;42620:31;;42664:60;42685:8;42695:4;42701:2;42705:3;42710:7;42719:4;42664:20;:60::i;:::-;42742:9;42737:421;42761:3;:10;42757:1;:14;42737:421;;;42793:10;42806:3;42810:1;42806:6;;;;;;;;:::i;:::-;;;;;;;;42793:19;;42827:14;42844:7;42852:1;42844:10;;;;;;;;:::i;:::-;;;;;;;;42827:27;;42871:19;42893:9;:13;42903:2;42893:13;;;;;;;;;;;:19;42907:4;42893:19;;;;;;;;;;;;;;;;42871:41;;42950:6;42935:11;:21;;42927:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43083:6;43069:11;:20;43047:9;:13;43057:2;43047:13;;;;;;;;;;;:19;43061:4;43047:19;;;;;;;;;;;;;;;:42;;;;43140:6;43119:9;:13;43129:2;43119:13;;;;;;;;;;;:17;43133:2;43119:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;42778:380;;;42773:3;;;;:::i;:::-;;;42737:421;;;;43205:2;43175:47;;43199:4;43175:47;;43189:8;43175:47;;;43209:3;43214:7;43175:47;;;;;;;:::i;:::-;;;;;;;;43235:75;43271:8;43281:4;43287:2;43291:3;43296:7;43305:4;43235:35;:75::i;:::-;42438:880;42244:1074;;;;;:::o;3900:190::-;4025:4;4078;4049:25;4062:5;4069:4;4049:12;:25::i;:::-;:33;4042:40;;3900:190;;;;;:::o;45561:735::-;45753:1;45739:16;;:2;:16;;;45731:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45826:7;:14;45812:3;:10;:28;45804:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45898:16;45917:12;:10;:12::i;:::-;45898:31;;45942:66;45963:8;45981:1;45985:2;45989:3;45994:7;46003:4;45942:20;:66::i;:::-;46026:9;46021:103;46045:3;:10;46041:1;:14;46021:103;;;46102:7;46110:1;46102:10;;;;;;;;:::i;:::-;;;;;;;;46077:9;:17;46087:3;46091:1;46087:6;;;;;;;;:::i;:::-;;;;;;;;46077:17;;;;;;;;;;;:21;46095:2;46077:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;46057:3;;;;;:::i;:::-;;;;46021:103;;;;46177:2;46141:53;;46173:1;46141:53;;46155:8;46141:53;;;46181:3;46186:7;46141:53;;;;;;;:::i;:::-;;;;;;;;46207:81;46243:8;46261:1;46265:2;46269:3;46274:7;46283:4;46207:35;:81::i;:::-;45720:576;45561:735;;;;:::o;12789:118::-;12315:8;:6;:8::i;:::-;12314:9;12306:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;12859:4:::1;12849:7;;:14;;;;;;;;;;;;;;;;;;12879:20;12886:12;:10;:12::i;:::-;12879:20;;;;;;:::i;:::-;;;;;;;;12789:118::o:0;10659:191::-;10733:16;10752:6;;;;;;;;;;;10733:25;;10778:8;10769:6;;:17;;;;;;;;;;;;;;;;;;10833:8;10802:40;;10823:8;10802:40;;;;;;;;;;;;10722:128;10659:191;:::o;44162:88::-;44236:6;44229:4;:13;;;;;;;;;;;;:::i;:::-;;44162:88;:::o;48430:331::-;48585:8;48576:17;;:5;:17;;;48568:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48688:8;48650:18;:25;48669:5;48650:25;;;;;;;;;;;;;;;:35;48676:8;48650:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48734:8;48712:41;;48727:5;48712:41;;;48744:8;48712:41;;;;;;:::i;:::-;;;;;;;;48430:331;;;:::o;13048:120::-;12592:8;:6;:8::i;:::-;12584:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;13117:5:::1;13107:7;;:15;;;;;;;;;;;;;;;;;;13138:22;13147:12;:10;:12::i;:::-;13138:22;;;;;;:::i;:::-;;;;;;;;13048:120::o:0;41066:820::-;41268:1;41254:16;;:2;:16;;;41246:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41325:16;41344:12;:10;:12::i;:::-;41325:31;;41369:96;41390:8;41400:4;41406:2;41410:21;41428:2;41410:17;:21::i;:::-;41433:25;41451:6;41433:17;:25::i;:::-;41460:4;41369:20;:96::i;:::-;41478:19;41500:9;:13;41510:2;41500:13;;;;;;;;;;;:19;41514:4;41500:19;;;;;;;;;;;;;;;;41478:41;;41553:6;41538:11;:21;;41530:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41678:6;41664:11;:20;41642:9;:13;41652:2;41642:13;;;;;;;;;;;:19;41656:4;41642:19;;;;;;;;;;;;;;;:42;;;;41727:6;41706:9;:13;41716:2;41706:13;;;;;;;;;;;:17;41720:2;41706:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;41782:2;41751:46;;41776:4;41751:46;;41766:8;41751:46;;;41786:2;41790:6;41751:46;;;;;;;:::i;:::-;;;;;;;;41810:68;41841:8;41851:4;41857:2;41861;41865:6;41873:4;41810:30;:68::i;:::-;41235:651;;41066:820;;;;;:::o;54636:392::-;54875:66;54902:8;54912:4;54918:2;54922:3;54927:7;54936:4;54875:26;:66::i;:::-;54963:8;:6;:8::i;:::-;54962:9;54954:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54636:392;;;;;;:::o;50698:813::-;50938:15;:2;:13;;;:15::i;:::-;50934:570;;;50991:2;50974:43;;;51018:8;51028:4;51034:3;51039:7;51048:4;50974:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50970:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;51366:6;51359:14;;;;;;;;;;;:::i;:::-;;;;;;;;50970:523;;;51415:62;;;;;;;;;;:::i;:::-;;;;;;;;50970:523;51147:48;;;51135:60;;;:8;:60;;;;51131:159;;51220:50;;;;;;;;;;:::i;:::-;;;;;;;;51131:159;51054:251;50934:570;50698:813;;;;;;:::o;4452:675::-;4535:7;4555:20;4578:4;4555:27;;4598:9;4593:497;4617:5;:12;4613:1;:16;4593:497;;;4651:20;4674:5;4680:1;4674:8;;;;;;;;:::i;:::-;;;;;;;;4651:31;;4717:12;4701;:28;4697:382;;4844:42;4859:12;4873;4844:14;:42::i;:::-;4829:57;;4697:382;;;5021:42;5036:12;5050;5021:14;:42::i;:::-;5006:57;;4697:382;4636:454;4631:3;;;;;:::i;:::-;;;;4593:497;;;;5107:12;5100:19;;;4452:675;;;;:::o;51519:198::-;51585:16;51614:22;51653:1;51639:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51614:41;;51677:7;51666:5;51672:1;51666:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;51704:5;51697:12;;;51519:198;;;:::o;49946:744::-;50161:15;:2;:13;;;:15::i;:::-;50157:526;;;50214:2;50197:38;;;50236:8;50246:4;50252:2;50256:6;50264:4;50197:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50193:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;50545:6;50538:14;;;;;;;;;;;:::i;:::-;;;;;;;;50193:479;;;50594:62;;;;;;;;;;:::i;:::-;;;;;;;;50193:479;50331:43;;;50319:55;;;:8;:55;;;;50315:154;;50399:50;;;;;;;;;;:::i;:::-;;;;;;;;50315:154;50270:214;50157:526;49946:744;;;;;;:::o;52890:1015::-;53129:66;53156:8;53166:4;53172:2;53176:3;53181:7;53190:4;53129:26;:66::i;:::-;53228:1;53212:18;;:4;:18;;;53208:232;;53252:9;53247:182;53271:3;:10;53267:1;:14;53247:182;;;53329:1;53315:7;53323:1;53315:10;;;;;;;;:::i;:::-;;;;;;;;:15;;53307:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;53403:7;53411:1;53403:10;;;;;;;;:::i;:::-;;;;;;;;53375:16;:24;53392:3;53396:1;53392:6;;;;;;;;:::i;:::-;;;;;;;;53375:24;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;53283:3;;;;:::i;:::-;;;53247:182;;;;53208:232;53470:1;53456:16;;:2;:16;;;53452:446;;53494:9;53489:398;53513:3;:10;53509:1;:14;53489:398;;;53549:10;53562:3;53566:1;53562:6;;;;;;;;:::i;:::-;;;;;;;;53549:19;;53587:14;53604:7;53612:1;53604:10;;;;;;;;:::i;:::-;;;;;;;;53587:27;;53633:14;53650:16;:20;53667:2;53650:20;;;;;;;;;;;;53633:37;;53707:6;53697;:16;;53689:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53846:6;53837;:15;53814:16;:20;53831:2;53814:20;;;;;;;;;;;:38;;;;53530:357;;;53525:3;;;;:::i;:::-;;;53489:398;;;;53452:446;52890:1015;;;;;;:::o;14408:326::-;14468:4;14725:1;14703:7;:19;;;:23;14696:30;;14408:326;;;:::o;5135:224::-;5203:13;5266:1;5260:4;5253:15;5295:1;5289:4;5282:15;5336:4;5330;5320:21;5311:30;;5135:224;;;;:::o;49717:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:329::-;3272:6;3321:2;3309:9;3300:7;3296:23;3292:32;3289:119;;;3327:79;;:::i;:::-;3289:119;3447:1;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3418:117;3213:329;;;;:::o;3548:99::-;3600:6;3634:5;3628:12;3618:22;;3548:99;;;:::o;3653:169::-;3737:11;3771:6;3766:3;3759:19;3811:4;3806:3;3802:14;3787:29;;3653:169;;;;:::o;3828:307::-;3896:1;3906:113;3920:6;3917:1;3914:13;3906:113;;;4005:1;4000:3;3996:11;3990:18;3986:1;3981:3;3977:11;3970:39;3942:2;3939:1;3935:10;3930:15;;3906:113;;;4037:6;4034:1;4031:13;4028:101;;;4117:1;4108:6;4103:3;4099:16;4092:27;4028:101;3877:258;3828:307;;;:::o;4141:102::-;4182:6;4233:2;4229:7;4224:2;4217:5;4213:14;4209:28;4199:38;;4141:102;;;:::o;4249:364::-;4337:3;4365:39;4398:5;4365:39;:::i;:::-;4420:71;4484:6;4479:3;4420:71;:::i;:::-;4413:78;;4500:52;4545:6;4540:3;4533:4;4526:5;4522:16;4500:52;:::i;:::-;4577:29;4599:6;4577:29;:::i;:::-;4572:3;4568:39;4561:46;;4341:272;4249:364;;;;:::o;4619:313::-;4732:4;4770:2;4759:9;4755:18;4747:26;;4819:9;4813:4;4809:20;4805:1;4794:9;4790:17;4783:47;4847:78;4920:4;4911:6;4847:78;:::i;:::-;4839:86;;4619:313;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:117::-;5382:1;5379;5372:12;5396:180;5444:77;5441:1;5434:88;5541:4;5538:1;5531:15;5565:4;5562:1;5555:15;5582:281;5665:27;5687:4;5665:27;:::i;:::-;5657:6;5653:40;5795:6;5783:10;5780:22;5759:18;5747:10;5744:34;5741:62;5738:88;;;5806:18;;:::i;:::-;5738:88;5846:10;5842:2;5835:22;5625:238;5582:281;;:::o;5869:129::-;5903:6;5930:20;;:::i;:::-;5920:30;;5959:33;5987:4;5979:6;5959:33;:::i;:::-;5869:129;;;:::o;6004:311::-;6081:4;6171:18;6163:6;6160:30;6157:56;;;6193:18;;:::i;:::-;6157:56;6243:4;6235:6;6231:17;6223:25;;6303:4;6297;6293:15;6285:23;;6004:311;;;:::o;6321:117::-;6430:1;6427;6420:12;6461:710;6557:5;6582:81;6598:64;6655:6;6598:64;:::i;:::-;6582:81;:::i;:::-;6573:90;;6683:5;6712:6;6705:5;6698:21;6746:4;6739:5;6735:16;6728:23;;6799:4;6791:6;6787:17;6779:6;6775:30;6828:3;6820:6;6817:15;6814:122;;;6847:79;;:::i;:::-;6814:122;6962:6;6945:220;6979:6;6974:3;6971:15;6945:220;;;7054:3;7083:37;7116:3;7104:10;7083:37;:::i;:::-;7078:3;7071:50;7150:4;7145:3;7141:14;7134:21;;7021:144;7005:4;7000:3;6996:14;6989:21;;6945:220;;;6949:21;6563:608;;6461:710;;;;;:::o;7194:370::-;7265:5;7314:3;7307:4;7299:6;7295:17;7291:27;7281:122;;7322:79;;:::i;:::-;7281:122;7439:6;7426:20;7464:94;7554:3;7546:6;7539:4;7531:6;7527:17;7464:94;:::i;:::-;7455:103;;7271:293;7194:370;;;;:::o;7570:117::-;7679:1;7676;7669:12;7693:307;7754:4;7844:18;7836:6;7833:30;7830:56;;;7866:18;;:::i;:::-;7830:56;7904:29;7926:6;7904:29;:::i;:::-;7896:37;;7988:4;7982;7978:15;7970:23;;7693:307;;;:::o;8006:154::-;8090:6;8085:3;8080;8067:30;8152:1;8143:6;8138:3;8134:16;8127:27;8006:154;;;:::o;8166:410::-;8243:5;8268:65;8284:48;8325:6;8284:48;:::i;:::-;8268:65;:::i;:::-;8259:74;;8356:6;8349:5;8342:21;8394:4;8387:5;8383:16;8432:3;8423:6;8418:3;8414:16;8411:25;8408:112;;;8439:79;;:::i;:::-;8408:112;8529:41;8563:6;8558:3;8553;8529:41;:::i;:::-;8249:327;8166:410;;;;;:::o;8595:338::-;8650:5;8699:3;8692:4;8684:6;8680:17;8676:27;8666:122;;8707:79;;:::i;:::-;8666:122;8824:6;8811:20;8849:78;8923:3;8915:6;8908:4;8900:6;8896:17;8849:78;:::i;:::-;8840:87;;8656:277;8595:338;;;;:::o;8939:1509::-;9093:6;9101;9109;9117;9125;9174:3;9162:9;9153:7;9149:23;9145:33;9142:120;;;9181:79;;:::i;:::-;9142:120;9301:1;9326:53;9371:7;9362:6;9351:9;9347:22;9326:53;:::i;:::-;9316:63;;9272:117;9428:2;9454:53;9499:7;9490:6;9479:9;9475:22;9454:53;:::i;:::-;9444:63;;9399:118;9584:2;9573:9;9569:18;9556:32;9615:18;9607:6;9604:30;9601:117;;;9637:79;;:::i;:::-;9601:117;9742:78;9812:7;9803:6;9792:9;9788:22;9742:78;:::i;:::-;9732:88;;9527:303;9897:2;9886:9;9882:18;9869:32;9928:18;9920:6;9917:30;9914:117;;;9950:79;;:::i;:::-;9914:117;10055:78;10125:7;10116:6;10105:9;10101:22;10055:78;:::i;:::-;10045:88;;9840:303;10210:3;10199:9;10195:19;10182:33;10242:18;10234:6;10231:30;10228:117;;;10264:79;;:::i;:::-;10228:117;10369:62;10423:7;10414:6;10403:9;10399:22;10369:62;:::i;:::-;10359:72;;10153:288;8939:1509;;;;;;;;:::o;10454:77::-;10491:7;10520:5;10509:16;;10454:77;;;:::o;10537:118::-;10624:24;10642:5;10624:24;:::i;:::-;10619:3;10612:37;10537:118;;:::o;10661:222::-;10754:4;10792:2;10781:9;10777:18;10769:26;;10805:71;10873:1;10862:9;10858:17;10849:6;10805:71;:::i;:::-;10661:222;;;;:::o;10889:117::-;10998:1;10995;10988:12;11029:568;11102:8;11112:6;11162:3;11155:4;11147:6;11143:17;11139:27;11129:122;;11170:79;;:::i;:::-;11129:122;11283:6;11270:20;11260:30;;11313:18;11305:6;11302:30;11299:117;;;11335:79;;:::i;:::-;11299:117;11449:4;11441:6;11437:17;11425:29;;11503:3;11495:4;11487:6;11483:17;11473:8;11469:32;11466:41;11463:128;;;11510:79;;:::i;:::-;11463:128;11029:568;;;;;:::o;11603:914::-;11723:6;11731;11739;11788:2;11776:9;11767:7;11763:23;11759:32;11756:119;;;11794:79;;:::i;:::-;11756:119;11942:1;11931:9;11927:17;11914:31;11972:18;11964:6;11961:30;11958:117;;;11994:79;;:::i;:::-;11958:117;12099:78;12169:7;12160:6;12149:9;12145:22;12099:78;:::i;:::-;12089:88;;11885:302;12254:2;12243:9;12239:18;12226:32;12285:18;12277:6;12274:30;12271:117;;;12307:79;;:::i;:::-;12271:117;12420:80;12492:7;12483:6;12472:9;12468:22;12420:80;:::i;:::-;12402:98;;;;12197:313;11603:914;;;;;:::o;12523:122::-;12596:24;12614:5;12596:24;:::i;:::-;12589:5;12586:35;12576:63;;12635:1;12632;12625:12;12576:63;12523:122;:::o;12651:139::-;12697:5;12735:6;12722:20;12713:29;;12751:33;12778:5;12751:33;:::i;:::-;12651:139;;;;:::o;12796:329::-;12855:6;12904:2;12892:9;12883:7;12879:23;12875:32;12872:119;;;12910:79;;:::i;:::-;12872:119;13030:1;13055:53;13100:7;13091:6;13080:9;13076:22;13055:53;:::i;:::-;13045:63;;13001:117;12796:329;;;;:::o;13131:311::-;13208:4;13298:18;13290:6;13287:30;13284:56;;;13320:18;;:::i;:::-;13284:56;13370:4;13362:6;13358:17;13350:25;;13430:4;13424;13420:15;13412:23;;13131:311;;;:::o;13465:710::-;13561:5;13586:81;13602:64;13659:6;13602:64;:::i;:::-;13586:81;:::i;:::-;13577:90;;13687:5;13716:6;13709:5;13702:21;13750:4;13743:5;13739:16;13732:23;;13803:4;13795:6;13791:17;13783:6;13779:30;13832:3;13824:6;13821:15;13818:122;;;13851:79;;:::i;:::-;13818:122;13966:6;13949:220;13983:6;13978:3;13975:15;13949:220;;;14058:3;14087:37;14120:3;14108:10;14087:37;:::i;:::-;14082:3;14075:50;14154:4;14149:3;14145:14;14138:21;;14025:144;14009:4;14004:3;14000:14;13993:21;;13949:220;;;13953:21;13567:608;;13465:710;;;;;:::o;14198:370::-;14269:5;14318:3;14311:4;14303:6;14299:17;14295:27;14285:122;;14326:79;;:::i;:::-;14285:122;14443:6;14430:20;14468:94;14558:3;14550:6;14543:4;14535:6;14531:17;14468:94;:::i;:::-;14459:103;;14275:293;14198:370;;;;:::o;14574:894::-;14692:6;14700;14749:2;14737:9;14728:7;14724:23;14720:32;14717:119;;;14755:79;;:::i;:::-;14717:119;14903:1;14892:9;14888:17;14875:31;14933:18;14925:6;14922:30;14919:117;;;14955:79;;:::i;:::-;14919:117;15060:78;15130:7;15121:6;15110:9;15106:22;15060:78;:::i;:::-;15050:88;;14846:302;15215:2;15204:9;15200:18;15187:32;15246:18;15238:6;15235:30;15232:117;;;15268:79;;:::i;:::-;15232:117;15373:78;15443:7;15434:6;15423:9;15419:22;15373:78;:::i;:::-;15363:88;;15158:303;14574:894;;;;;:::o;15474:114::-;15541:6;15575:5;15569:12;15559:22;;15474:114;;;:::o;15594:184::-;15693:11;15727:6;15722:3;15715:19;15767:4;15762:3;15758:14;15743:29;;15594:184;;;;:::o;15784:132::-;15851:4;15874:3;15866:11;;15904:4;15899:3;15895:14;15887:22;;15784:132;;;:::o;15922:108::-;15999:24;16017:5;15999:24;:::i;:::-;15994:3;15987:37;15922:108;;:::o;16036:179::-;16105:10;16126:46;16168:3;16160:6;16126:46;:::i;:::-;16204:4;16199:3;16195:14;16181:28;;16036:179;;;;:::o;16221:113::-;16291:4;16323;16318:3;16314:14;16306:22;;16221:113;;;:::o;16370:732::-;16489:3;16518:54;16566:5;16518:54;:::i;:::-;16588:86;16667:6;16662:3;16588:86;:::i;:::-;16581:93;;16698:56;16748:5;16698:56;:::i;:::-;16777:7;16808:1;16793:284;16818:6;16815:1;16812:13;16793:284;;;16894:6;16888:13;16921:63;16980:3;16965:13;16921:63;:::i;:::-;16914:70;;17007:60;17060:6;17007:60;:::i;:::-;16997:70;;16853:224;16840:1;16837;16833:9;16828:14;;16793:284;;;16797:14;17093:3;17086:10;;16494:608;;;16370:732;;;;:::o;17108:373::-;17251:4;17289:2;17278:9;17274:18;17266:26;;17338:9;17332:4;17328:20;17324:1;17313:9;17309:17;17302:47;17366:108;17469:4;17460:6;17366:108;:::i;:::-;17358:116;;17108:373;;;;:::o;17487:118::-;17574:24;17592:5;17574:24;:::i;:::-;17569:3;17562:37;17487:118;;:::o;17611:222::-;17704:4;17742:2;17731:9;17727:18;17719:26;;17755:71;17823:1;17812:9;17808:17;17799:6;17755:71;:::i;:::-;17611:222;;;;:::o;17839:308::-;17901:4;17991:18;17983:6;17980:30;17977:56;;;18013:18;;:::i;:::-;17977:56;18051:29;18073:6;18051:29;:::i;:::-;18043:37;;18135:4;18129;18125:15;18117:23;;17839:308;;;:::o;18153:412::-;18231:5;18256:66;18272:49;18314:6;18272:49;:::i;:::-;18256:66;:::i;:::-;18247:75;;18345:6;18338:5;18331:21;18383:4;18376:5;18372:16;18421:3;18412:6;18407:3;18403:16;18400:25;18397:112;;;18428:79;;:::i;:::-;18397:112;18518:41;18552:6;18547:3;18542;18518:41;:::i;:::-;18237:328;18153:412;;;;;:::o;18585:340::-;18641:5;18690:3;18683:4;18675:6;18671:17;18667:27;18657:122;;18698:79;;:::i;:::-;18657:122;18815:6;18802:20;18840:79;18915:3;18907:6;18900:4;18892:6;18888:17;18840:79;:::i;:::-;18831:88;;18647:278;18585:340;;;;:::o;18931:509::-;19000:6;19049:2;19037:9;19028:7;19024:23;19020:32;19017:119;;;19055:79;;:::i;:::-;19017:119;19203:1;19192:9;19188:17;19175:31;19233:18;19225:6;19222:30;19219:117;;;19255:79;;:::i;:::-;19219:117;19360:63;19415:7;19406:6;19395:9;19391:22;19360:63;:::i;:::-;19350:73;;19146:287;18931:509;;;;:::o;19446:116::-;19516:21;19531:5;19516:21;:::i;:::-;19509:5;19506:32;19496:60;;19552:1;19549;19542:12;19496:60;19446:116;:::o;19568:133::-;19611:5;19649:6;19636:20;19627:29;;19665:30;19689:5;19665:30;:::i;:::-;19568:133;;;;:::o;19707:468::-;19772:6;19780;19829:2;19817:9;19808:7;19804:23;19800:32;19797:119;;;19835:79;;:::i;:::-;19797:119;19955:1;19980:53;20025:7;20016:6;20005:9;20001:22;19980:53;:::i;:::-;19970:63;;19926:117;20082:2;20108:50;20150:7;20141:6;20130:9;20126:22;20108:50;:::i;:::-;20098:60;;20053:115;19707:468;;;;;:::o;20181:474::-;20249:6;20257;20306:2;20294:9;20285:7;20281:23;20277:32;20274:119;;;20312:79;;:::i;:::-;20274:119;20432:1;20457:53;20502:7;20493:6;20482:9;20478:22;20457:53;:::i;:::-;20447:63;;20403:117;20559:2;20585:53;20630:7;20621:6;20610:9;20606:22;20585:53;:::i;:::-;20575:63;;20530:118;20181:474;;;;;:::o;20661:1089::-;20765:6;20773;20781;20789;20797;20846:3;20834:9;20825:7;20821:23;20817:33;20814:120;;;20853:79;;:::i;:::-;20814:120;20973:1;20998:53;21043:7;21034:6;21023:9;21019:22;20998:53;:::i;:::-;20988:63;;20944:117;21100:2;21126:53;21171:7;21162:6;21151:9;21147:22;21126:53;:::i;:::-;21116:63;;21071:118;21228:2;21254:53;21299:7;21290:6;21279:9;21275:22;21254:53;:::i;:::-;21244:63;;21199:118;21356:2;21382:53;21427:7;21418:6;21407:9;21403:22;21382:53;:::i;:::-;21372:63;;21327:118;21512:3;21501:9;21497:19;21484:33;21544:18;21536:6;21533:30;21530:117;;;21566:79;;:::i;:::-;21530:117;21671:62;21725:7;21716:6;21705:9;21701:22;21671:62;:::i;:::-;21661:72;;21455:288;20661:1089;;;;;;;;:::o;21756:230::-;21896:34;21892:1;21884:6;21880:14;21873:58;21965:13;21960:2;21952:6;21948:15;21941:38;21756:230;:::o;21992:366::-;22134:3;22155:67;22219:2;22214:3;22155:67;:::i;:::-;22148:74;;22231:93;22320:3;22231:93;:::i;:::-;22349:2;22344:3;22340:12;22333:19;;21992:366;;;:::o;22364:419::-;22530:4;22568:2;22557:9;22553:18;22545:26;;22617:9;22611:4;22607:20;22603:1;22592:9;22588:17;22581:47;22645:131;22771:4;22645:131;:::i;:::-;22637:139;;22364:419;;;:::o;22789:182::-;22929:34;22925:1;22917:6;22913:14;22906:58;22789:182;:::o;22977:366::-;23119:3;23140:67;23204:2;23199:3;23140:67;:::i;:::-;23133:74;;23216:93;23305:3;23216:93;:::i;:::-;23334:2;23329:3;23325:12;23318:19;;22977:366;;;:::o;23349:419::-;23515:4;23553:2;23542:9;23538:18;23530:26;;23602:9;23596:4;23592:20;23588:1;23577:9;23573:17;23566:47;23630:131;23756:4;23630:131;:::i;:::-;23622:139;;23349:419;;;:::o;23774:165::-;23914:17;23910:1;23902:6;23898:14;23891:41;23774:165;:::o;23945:366::-;24087:3;24108:67;24172:2;24167:3;24108:67;:::i;:::-;24101:74;;24184:93;24273:3;24184:93;:::i;:::-;24302:2;24297:3;24293:12;24286:19;;23945:366;;;:::o;24317:419::-;24483:4;24521:2;24510:9;24506:18;24498:26;;24570:9;24564:4;24560:20;24556:1;24545:9;24541:17;24534:47;24598:131;24724:4;24598:131;:::i;:::-;24590:139;;24317:419;;;:::o;24742:148::-;24844:11;24881:3;24866:18;;24742:148;;;;:::o;24896:377::-;25002:3;25030:39;25063:5;25030:39;:::i;:::-;25085:89;25167:6;25162:3;25085:89;:::i;:::-;25078:96;;25183:52;25228:6;25223:3;25216:4;25209:5;25205:16;25183:52;:::i;:::-;25260:6;25255:3;25251:16;25244:23;;25006:267;24896:377;;;;:::o;25279:435::-;25459:3;25481:95;25572:3;25563:6;25481:95;:::i;:::-;25474:102;;25593:95;25684:3;25675:6;25593:95;:::i;:::-;25586:102;;25705:3;25698:10;;25279:435;;;;;:::o;25720:237::-;25860:34;25856:1;25848:6;25844:14;25837:58;25929:20;25924:2;25916:6;25912:15;25905:45;25720:237;:::o;25963:366::-;26105:3;26126:67;26190:2;26185:3;26126:67;:::i;:::-;26119:74;;26202:93;26291:3;26202:93;:::i;:::-;26320:2;26315:3;26311:12;26304:19;;25963:366;;;:::o;26335:419::-;26501:4;26539:2;26528:9;26524:18;26516:26;;26588:9;26582:4;26578:20;26574:1;26563:9;26559:17;26552:47;26616:131;26742:4;26616:131;:::i;:::-;26608:139;;26335:419;;;:::o;26760:166::-;26900:18;26896:1;26888:6;26884:14;26877:42;26760:166;:::o;26932:366::-;27074:3;27095:67;27159:2;27154:3;27095:67;:::i;:::-;27088:74;;27171:93;27260:3;27171:93;:::i;:::-;27289:2;27284:3;27280:12;27273:19;;26932:366;;;:::o;27304:419::-;27470:4;27508:2;27497:9;27493:18;27485:26;;27557:9;27551:4;27547:20;27543:1;27532:9;27528:17;27521:47;27585:131;27711:4;27585:131;:::i;:::-;27577:139;;27304:419;;;:::o;27729:180::-;27777:77;27774:1;27767:88;27874:4;27871:1;27864:15;27898:4;27895:1;27888:15;27915:305;27955:3;27974:20;27992:1;27974:20;:::i;:::-;27969:25;;28008:20;28026:1;28008:20;:::i;:::-;28003:25;;28162:1;28094:66;28090:74;28087:1;28084:81;28081:107;;;28168:18;;:::i;:::-;28081:107;28212:1;28209;28205:9;28198:16;;27915:305;;;;:::o;28226:174::-;28366:26;28362:1;28354:6;28350:14;28343:50;28226:174;:::o;28406:366::-;28548:3;28569:67;28633:2;28628:3;28569:67;:::i;:::-;28562:74;;28645:93;28734:3;28645:93;:::i;:::-;28763:2;28758:3;28754:12;28747:19;;28406:366;;;:::o;28778:419::-;28944:4;28982:2;28971:9;28967:18;28959:26;;29031:9;29025:4;29021:20;29017:1;29006:9;29002:17;28995:47;29059:131;29185:4;29059:131;:::i;:::-;29051:139;;28778:419;;;:::o;29203:94::-;29236:8;29284:5;29280:2;29276:14;29255:35;;29203:94;;;:::o;29303:::-;29342:7;29371:20;29385:5;29371:20;:::i;:::-;29360:31;;29303:94;;;:::o;29403:100::-;29442:7;29471:26;29491:5;29471:26;:::i;:::-;29460:37;;29403:100;;;:::o;29509:157::-;29614:45;29634:24;29652:5;29634:24;:::i;:::-;29614:45;:::i;:::-;29609:3;29602:58;29509:157;;:::o;29672:256::-;29784:3;29799:75;29870:3;29861:6;29799:75;:::i;:::-;29899:2;29894:3;29890:12;29883:19;;29919:3;29912:10;;29672:256;;;;:::o;29934:168::-;30074:20;30070:1;30062:6;30058:14;30051:44;29934:168;:::o;30108:366::-;30250:3;30271:67;30335:2;30330:3;30271:67;:::i;:::-;30264:74;;30347:93;30436:3;30347:93;:::i;:::-;30465:2;30460:3;30456:12;30449:19;;30108:366;;;:::o;30480:419::-;30646:4;30684:2;30673:9;30669:18;30661:26;;30733:9;30727:4;30723:20;30719:1;30708:9;30704:17;30697:47;30761:131;30887:4;30761:131;:::i;:::-;30753:139;;30480:419;;;:::o;30905:143::-;30962:5;30993:6;30987:13;30978:22;;31009:33;31036:5;31009:33;:::i;:::-;30905:143;;;;:::o;31054:351::-;31124:6;31173:2;31161:9;31152:7;31148:23;31144:32;31141:119;;;31179:79;;:::i;:::-;31141:119;31299:1;31324:64;31380:7;31371:6;31360:9;31356:22;31324:64;:::i;:::-;31314:74;;31270:128;31054:351;;;;:::o;31411:166::-;31551:18;31547:1;31539:6;31535:14;31528:42;31411:166;:::o;31583:366::-;31725:3;31746:67;31810:2;31805:3;31746:67;:::i;:::-;31739:74;;31822:93;31911:3;31822:93;:::i;:::-;31940:2;31935:3;31931:12;31924:19;;31583:366;;;:::o;31955:419::-;32121:4;32159:2;32148:9;32144:18;32136:26;;32208:9;32202:4;32198:20;32194:1;32183:9;32179:17;32172:47;32236:131;32362:4;32236:131;:::i;:::-;32228:139;;31955:419;;;:::o;32380:166::-;32520:18;32516:1;32508:6;32504:14;32497:42;32380:166;:::o;32552:366::-;32694:3;32715:67;32779:2;32774:3;32715:67;:::i;:::-;32708:74;;32791:93;32880:3;32791:93;:::i;:::-;32909:2;32904:3;32900:12;32893:19;;32552:366;;;:::o;32924:419::-;33090:4;33128:2;33117:9;33113:18;33105:26;;33177:9;33171:4;33167:20;33163:1;33152:9;33148:17;33141:47;33205:131;33331:4;33205:131;:::i;:::-;33197:139;;32924:419;;;:::o;33349:180::-;33397:77;33394:1;33387:88;33494:4;33491:1;33484:15;33518:4;33515:1;33508:15;33535:168;33675:20;33671:1;33663:6;33659:14;33652:44;33535:168;:::o;33709:366::-;33851:3;33872:67;33936:2;33931:3;33872:67;:::i;:::-;33865:74;;33948:93;34037:3;33948:93;:::i;:::-;34066:2;34061:3;34057:12;34050:19;;33709:366;;;:::o;34081:419::-;34247:4;34285:2;34274:9;34270:18;34262:26;;34334:9;34328:4;34324:20;34320:1;34309:9;34305:17;34298:47;34362:131;34488:4;34362:131;:::i;:::-;34354:139;;34081:419;;;:::o;34506:143::-;34563:5;34594:6;34588:13;34579:22;;34610:33;34637:5;34610:33;:::i;:::-;34506:143;;;;:::o;34655:351::-;34725:6;34774:2;34762:9;34753:7;34749:23;34745:32;34742:119;;;34780:79;;:::i;:::-;34742:119;34900:1;34925:64;34981:7;34972:6;34961:9;34957:22;34925:64;:::i;:::-;34915:74;;34871:128;34655:351;;;;:::o;35012:174::-;35152:26;35148:1;35140:6;35136:14;35129:50;35012:174;:::o;35192:366::-;35334:3;35355:67;35419:2;35414:3;35355:67;:::i;:::-;35348:74;;35431:93;35520:3;35431:93;:::i;:::-;35549:2;35544:3;35540:12;35533:19;;35192:366;;;:::o;35564:419::-;35730:4;35768:2;35757:9;35753:18;35745:26;;35817:9;35811:4;35807:20;35803:1;35792:9;35788:17;35781:47;35845:131;35971:4;35845:131;:::i;:::-;35837:139;;35564:419;;;:::o;35989:233::-;36028:3;36051:24;36069:5;36051:24;:::i;:::-;36042:33;;36097:66;36090:5;36087:77;36084:103;;36167:18;;:::i;:::-;36084:103;36214:1;36207:5;36203:13;36196:20;;35989:233;;;:::o;36228:483::-;36399:4;36437:2;36426:9;36422:18;36414:26;;36486:9;36480:4;36476:20;36472:1;36461:9;36457:17;36450:47;36514:108;36617:4;36608:6;36514:108;:::i;:::-;36506:116;;36632:72;36700:2;36689:9;36685:18;36676:6;36632:72;:::i;:::-;36228:483;;;;;:::o;36717:332::-;36838:4;36876:2;36865:9;36861:18;36853:26;;36889:71;36957:1;36946:9;36942:17;36933:6;36889:71;:::i;:::-;36970:72;37038:2;37027:9;37023:18;37014:6;36970:72;:::i;:::-;36717:332;;;;;:::o;37055:228::-;37195:34;37191:1;37183:6;37179:14;37172:58;37264:11;37259:2;37251:6;37247:15;37240:36;37055:228;:::o;37289:366::-;37431:3;37452:67;37516:2;37511:3;37452:67;:::i;:::-;37445:74;;37528:93;37617:3;37528:93;:::i;:::-;37646:2;37641:3;37637:12;37630:19;;37289:366;;;:::o;37661:419::-;37827:4;37865:2;37854:9;37850:18;37842:26;;37914:9;37908:4;37904:20;37900:1;37889:9;37885:17;37878:47;37942:131;38068:4;37942:131;:::i;:::-;37934:139;;37661:419;;;:::o;38086:332::-;38207:4;38245:2;38234:9;38230:18;38222:26;;38258:71;38326:1;38315:9;38311:17;38302:6;38258:71;:::i;:::-;38339:72;38407:2;38396:9;38392:18;38383:6;38339:72;:::i;:::-;38086:332;;;;;:::o;38424:423::-;38565:4;38603:2;38592:9;38588:18;38580:26;;38652:9;38646:4;38642:20;38638:1;38627:9;38623:17;38616:47;38680:78;38753:4;38744:6;38680:78;:::i;:::-;38672:86;;38768:72;38836:2;38825:9;38821:18;38812:6;38768:72;:::i;:::-;38424:423;;;;;:::o;38853:165::-;38993:17;38989:1;38981:6;38977:14;38970:41;38853:165;:::o;39024:366::-;39166:3;39187:67;39251:2;39246:3;39187:67;:::i;:::-;39180:74;;39263:93;39352:3;39263:93;:::i;:::-;39381:2;39376:3;39372:12;39365:19;;39024:366;;;:::o;39396:419::-;39562:4;39600:2;39589:9;39585:18;39577:26;;39649:9;39643:4;39639:20;39635:1;39624:9;39620:17;39613:47;39677:131;39803:4;39677:131;:::i;:::-;39669:139;;39396:419;;;:::o;39821:348::-;39861:7;39884:20;39902:1;39884:20;:::i;:::-;39879:25;;39918:20;39936:1;39918:20;:::i;:::-;39913:25;;40106:1;40038:66;40034:74;40031:1;40028:81;40023:1;40016:9;40009:17;40005:105;40002:131;;;40113:18;;:::i;:::-;40002:131;40161:1;40158;40154:9;40143:20;;39821:348;;;;:::o;40175:168::-;40315:20;40311:1;40303:6;40299:14;40292:44;40175:168;:::o;40349:366::-;40491:3;40512:67;40576:2;40571:3;40512:67;:::i;:::-;40505:74;;40588:93;40677:3;40588:93;:::i;:::-;40706:2;40701:3;40697:12;40690:19;;40349:366;;;:::o;40721:419::-;40887:4;40925:2;40914:9;40910:18;40902:26;;40974:9;40968:4;40964:20;40960:1;40949:9;40945:17;40938:47;41002:131;41128:4;41002:131;:::i;:::-;40994:139;;40721:419;;;:::o;41146:169::-;41286:21;41282:1;41274:6;41270:14;41263:45;41146:169;:::o;41321:366::-;41463:3;41484:67;41548:2;41543:3;41484:67;:::i;:::-;41477:74;;41560:93;41649:3;41560:93;:::i;:::-;41678:2;41673:3;41669:12;41662:19;;41321:366;;;:::o;41693:419::-;41859:4;41897:2;41886:9;41882:18;41874:26;;41946:9;41940:4;41936:20;41932:1;41921:9;41917:17;41910:47;41974:131;42100:4;41974:131;:::i;:::-;41966:139;;41693:419;;;:::o;42118:147::-;42219:11;42256:3;42241:18;;42118:147;;;;:::o;42271:114::-;;:::o;42391:398::-;42550:3;42571:83;42652:1;42647:3;42571:83;:::i;:::-;42564:90;;42663:93;42752:3;42663:93;:::i;:::-;42781:1;42776:3;42772:11;42765:18;;42391:398;;;:::o;42795:379::-;42979:3;43001:147;43144:3;43001:147;:::i;:::-;42994:154;;43165:3;43158:10;;42795:379;;;:::o;43180:167::-;43320:19;43316:1;43308:6;43304:14;43297:43;43180:167;:::o;43353:366::-;43495:3;43516:67;43580:2;43575:3;43516:67;:::i;:::-;43509:74;;43592:93;43681:3;43592:93;:::i;:::-;43710:2;43705:3;43701:12;43694:19;;43353:366;;;:::o;43725:419::-;43891:4;43929:2;43918:9;43914:18;43906:26;;43978:9;43972:4;43968:20;43964:1;43953:9;43949:17;43942:47;44006:131;44132:4;44006:131;:::i;:::-;43998:139;;43725:419;;;:::o;44150:332::-;44271:4;44309:2;44298:9;44294:18;44286:26;;44322:71;44390:1;44379:9;44375:17;44366:6;44322:71;:::i;:::-;44403:72;44471:2;44460:9;44456:18;44447:6;44403:72;:::i;:::-;44150:332;;;;;:::o;44488:228::-;44628:34;44624:1;44616:6;44612:14;44605:58;44697:11;44692:2;44684:6;44680:15;44673:36;44488:228;:::o;44722:366::-;44864:3;44885:67;44949:2;44944:3;44885:67;:::i;:::-;44878:74;;44961:93;45050:3;44961:93;:::i;:::-;45079:2;45074:3;45070:12;45063:19;;44722:366;;;:::o;45094:419::-;45260:4;45298:2;45287:9;45283:18;45275:26;;45347:9;45341:4;45337:20;45333:1;45322:9;45318:17;45311:47;45375:131;45501:4;45375:131;:::i;:::-;45367:139;;45094:419;;;:::o;45519:225::-;45659:34;45655:1;45647:6;45643:14;45636:58;45728:8;45723:2;45715:6;45711:15;45704:33;45519:225;:::o;45750:366::-;45892:3;45913:67;45977:2;45972:3;45913:67;:::i;:::-;45906:74;;45989:93;46078:3;45989:93;:::i;:::-;46107:2;46102:3;46098:12;46091:19;;45750:366;;;:::o;46122:419::-;46288:4;46326:2;46315:9;46311:18;46303:26;;46375:9;46369:4;46365:20;46361:1;46350:9;46346:17;46339:47;46403:131;46529:4;46403:131;:::i;:::-;46395:139;;46122:419;;;:::o;46547:180::-;46595:77;46592:1;46585:88;46692:4;46689:1;46682:15;46716:4;46713:1;46706:15;46733:320;46777:6;46814:1;46808:4;46804:12;46794:22;;46861:1;46855:4;46851:12;46882:18;46872:81;;46938:4;46930:6;46926:17;46916:27;;46872:81;47000:2;46992:6;46989:14;46969:18;46966:38;46963:84;;47019:18;;:::i;:::-;46963:84;46784:269;46733:320;;;:::o;47059:180::-;47107:77;47104:1;47097:88;47204:4;47201:1;47194:15;47228:4;47225:1;47218:15;47245:185;47285:1;47302:20;47320:1;47302:20;:::i;:::-;47297:25;;47336:20;47354:1;47336:20;:::i;:::-;47331:25;;47375:1;47365:35;;47380:18;;:::i;:::-;47365:35;47422:1;47419;47415:9;47410:14;;47245:185;;;;:::o;47436:191::-;47476:4;47496:20;47514:1;47496:20;:::i;:::-;47491:25;;47530:20;47548:1;47530:20;:::i;:::-;47525:25;;47569:1;47566;47563:8;47560:34;;;47574:18;;:::i;:::-;47560:34;47619:1;47616;47612:9;47604:17;;47436:191;;;;:::o;47633:176::-;47665:1;47682:20;47700:1;47682:20;:::i;:::-;47677:25;;47716:20;47734:1;47716:20;:::i;:::-;47711:25;;47755:1;47745:35;;47760:18;;:::i;:::-;47745:35;47801:1;47798;47794:9;47789:14;;47633:176;;;;:::o;47815:227::-;47955:34;47951:1;47943:6;47939:14;47932:58;48024:10;48019:2;48011:6;48007:15;48000:35;47815:227;:::o;48048:366::-;48190:3;48211:67;48275:2;48270:3;48211:67;:::i;:::-;48204:74;;48287:93;48376:3;48287:93;:::i;:::-;48405:2;48400:3;48396:12;48389:19;;48048:366;;;:::o;48420:419::-;48586:4;48624:2;48613:9;48609:18;48601:26;;48673:9;48667:4;48663:20;48659:1;48648:9;48644:17;48637:47;48701:131;48827:4;48701:131;:::i;:::-;48693:139;;48420:419;;;:::o;48845:224::-;48985:34;48981:1;48973:6;48969:14;48962:58;49054:7;49049:2;49041:6;49037:15;49030:32;48845:224;:::o;49075:366::-;49217:3;49238:67;49302:2;49297:3;49238:67;:::i;:::-;49231:74;;49314:93;49403:3;49314:93;:::i;:::-;49432:2;49427:3;49423:12;49416:19;;49075:366;;;:::o;49447:419::-;49613:4;49651:2;49640:9;49636:18;49628:26;;49700:9;49694:4;49690:20;49686:1;49675:9;49671:17;49664:47;49728:131;49854:4;49728:131;:::i;:::-;49720:139;;49447:419;;;:::o;49872:229::-;50012:34;50008:1;50000:6;49996:14;49989:58;50081:12;50076:2;50068:6;50064:15;50057:37;49872:229;:::o;50107:366::-;50249:3;50270:67;50334:2;50329:3;50270:67;:::i;:::-;50263:74;;50346:93;50435:3;50346:93;:::i;:::-;50464:2;50459:3;50455:12;50448:19;;50107:366;;;:::o;50479:419::-;50645:4;50683:2;50672:9;50668:18;50660:26;;50732:9;50726:4;50722:20;50718:1;50707:9;50703:17;50696:47;50760:131;50886:4;50760:131;:::i;:::-;50752:139;;50479:419;;;:::o;50904:634::-;51125:4;51163:2;51152:9;51148:18;51140:26;;51212:9;51206:4;51202:20;51198:1;51187:9;51183:17;51176:47;51240:108;51343:4;51334:6;51240:108;:::i;:::-;51232:116;;51395:9;51389:4;51385:20;51380:2;51369:9;51365:18;51358:48;51423:108;51526:4;51517:6;51423:108;:::i;:::-;51415:116;;50904:634;;;;;:::o;51544:220::-;51684:34;51680:1;51672:6;51668:14;51661:58;51753:3;51748:2;51740:6;51736:15;51729:28;51544:220;:::o;51770:366::-;51912:3;51933:67;51997:2;51992:3;51933:67;:::i;:::-;51926:74;;52009:93;52098:3;52009:93;:::i;:::-;52127:2;52122:3;52118:12;52111:19;;51770:366;;;:::o;52142:419::-;52308:4;52346:2;52335:9;52331:18;52323:26;;52395:9;52389:4;52385:20;52381:1;52370:9;52366:17;52359:47;52423:131;52549:4;52423:131;:::i;:::-;52415:139;;52142:419;;;:::o;52567:166::-;52707:18;52703:1;52695:6;52691:14;52684:42;52567:166;:::o;52739:366::-;52881:3;52902:67;52966:2;52961:3;52902:67;:::i;:::-;52895:74;;52978:93;53067:3;52978:93;:::i;:::-;53096:2;53091:3;53087:12;53080:19;;52739:366;;;:::o;53111:419::-;53277:4;53315:2;53304:9;53300:18;53292:26;;53364:9;53358:4;53354:20;53350:1;53339:9;53335:17;53328:47;53392:131;53518:4;53392:131;:::i;:::-;53384:139;;53111:419;;;:::o;53536:228::-;53676:34;53672:1;53664:6;53660:14;53653:58;53745:11;53740:2;53732:6;53728:15;53721:36;53536:228;:::o;53770:366::-;53912:3;53933:67;53997:2;53992:3;53933:67;:::i;:::-;53926:74;;54009:93;54098:3;54009:93;:::i;:::-;54127:2;54122:3;54118:12;54111:19;;53770:366;;;:::o;54142:419::-;54308:4;54346:2;54335:9;54331:18;54323:26;;54395:9;54389:4;54385:20;54381:1;54370:9;54366:17;54359:47;54423:131;54549:4;54423:131;:::i;:::-;54415:139;;54142:419;;;:::o;54567:170::-;54707:22;54703:1;54695:6;54691:14;54684:46;54567:170;:::o;54743:366::-;54885:3;54906:67;54970:2;54965:3;54906:67;:::i;:::-;54899:74;;54982:93;55071:3;54982:93;:::i;:::-;55100:2;55095:3;55091:12;55084:19;;54743:366;;;:::o;55115:419::-;55281:4;55319:2;55308:9;55304:18;55296:26;;55368:9;55362:4;55358:20;55354:1;55343:9;55339:17;55332:47;55396:131;55522:4;55396:131;:::i;:::-;55388:139;;55115:419;;;:::o;55540:332::-;55661:4;55699:2;55688:9;55684:18;55676:26;;55712:71;55780:1;55769:9;55765:17;55756:6;55712:71;:::i;:::-;55793:72;55861:2;55850:9;55846:18;55837:6;55793:72;:::i;:::-;55540:332;;;;;:::o;55878:231::-;56018:34;56014:1;56006:6;56002:14;55995:58;56087:14;56082:2;56074:6;56070:15;56063:39;55878:231;:::o;56115:366::-;56257:3;56278:67;56342:2;56337:3;56278:67;:::i;:::-;56271:74;;56354:93;56443:3;56354:93;:::i;:::-;56472:2;56467:3;56463:12;56456:19;;56115:366;;;:::o;56487:419::-;56653:4;56691:2;56680:9;56676:18;56668:26;;56740:9;56734:4;56730:20;56726:1;56715:9;56711:17;56704:47;56768:131;56894:4;56768:131;:::i;:::-;56760:139;;56487:419;;;:::o;56912:98::-;56963:6;56997:5;56991:12;56981:22;;56912:98;;;:::o;57016:168::-;57099:11;57133:6;57128:3;57121:19;57173:4;57168:3;57164:14;57149:29;;57016:168;;;;:::o;57190:360::-;57276:3;57304:38;57336:5;57304:38;:::i;:::-;57358:70;57421:6;57416:3;57358:70;:::i;:::-;57351:77;;57437:52;57482:6;57477:3;57470:4;57463:5;57459:16;57437:52;:::i;:::-;57514:29;57536:6;57514:29;:::i;:::-;57509:3;57505:39;57498:46;;57280:270;57190:360;;;;:::o;57556:1053::-;57879:4;57917:3;57906:9;57902:19;57894:27;;57931:71;57999:1;57988:9;57984:17;57975:6;57931:71;:::i;:::-;58012:72;58080:2;58069:9;58065:18;58056:6;58012:72;:::i;:::-;58131:9;58125:4;58121:20;58116:2;58105:9;58101:18;58094:48;58159:108;58262:4;58253:6;58159:108;:::i;:::-;58151:116;;58314:9;58308:4;58304:20;58299:2;58288:9;58284:18;58277:48;58342:108;58445:4;58436:6;58342:108;:::i;:::-;58334:116;;58498:9;58492:4;58488:20;58482:3;58471:9;58467:19;58460:49;58526:76;58597:4;58588:6;58526:76;:::i;:::-;58518:84;;57556:1053;;;;;;;;:::o;58615:141::-;58671:5;58702:6;58696:13;58687:22;;58718:32;58744:5;58718:32;:::i;:::-;58615:141;;;;:::o;58762:349::-;58831:6;58880:2;58868:9;58859:7;58855:23;58851:32;58848:119;;;58886:79;;:::i;:::-;58848:119;59006:1;59031:63;59086:7;59077:6;59066:9;59062:22;59031:63;:::i;:::-;59021:73;;58977:127;58762:349;;;;:::o;59117:106::-;59161:8;59210:5;59205:3;59201:15;59180:36;;59117:106;;;:::o;59229:183::-;59264:3;59302:1;59284:16;59281:23;59278:128;;;59340:1;59337;59334;59319:23;59362:34;59393:1;59387:8;59362:34;:::i;:::-;59355:41;;59278:128;59229:183;:::o;59418:711::-;59457:3;59495:4;59477:16;59474:26;59503:5;59471:39;59532:20;;:::i;:::-;59607:1;59589:16;59585:24;59582:1;59576:4;59561:49;59640:4;59634:11;59739:16;59732:4;59724:6;59720:17;59717:39;59684:18;59676:6;59673:30;59657:113;59654:146;;;59785:5;;;;59654:146;59831:6;59825:4;59821:17;59867:3;59861:10;59894:18;59886:6;59883:30;59880:43;;;59916:5;;;;;;59880:43;59964:6;59957:4;59952:3;59948:14;59944:27;60023:1;60005:16;60001:24;59995:4;59991:35;59986:3;59983:44;59980:57;;;60030:5;;;;;;;59980:57;60047;60095:6;60089:4;60085:17;60077:6;60073:30;60067:4;60047:57;:::i;:::-;60120:3;60113:10;;59461:668;;;;;59418:711;;:::o;60135:239::-;60275:34;60271:1;60263:6;60259:14;60252:58;60344:22;60339:2;60331:6;60327:15;60320:47;60135:239;:::o;60380:366::-;60522:3;60543:67;60607:2;60602:3;60543:67;:::i;:::-;60536:74;;60619:93;60708:3;60619:93;:::i;:::-;60737:2;60732:3;60728:12;60721:19;;60380:366;;;:::o;60752:419::-;60918:4;60956:2;60945:9;60941:18;60933:26;;61005:9;60999:4;60995:20;60991:1;60980:9;60976:17;60969:47;61033:131;61159:4;61033:131;:::i;:::-;61025:139;;60752:419;;;:::o;61177:227::-;61317:34;61313:1;61305:6;61301:14;61294:58;61386:10;61381:2;61373:6;61369:15;61362:35;61177:227;:::o;61410:366::-;61552:3;61573:67;61637:2;61632:3;61573:67;:::i;:::-;61566:74;;61649:93;61738:3;61649:93;:::i;:::-;61767:2;61762:3;61758:12;61751:19;;61410:366;;;:::o;61782:419::-;61948:4;61986:2;61975:9;61971:18;61963:26;;62035:9;62029:4;62025:20;62021:1;62010:9;62006:17;61999:47;62063:131;62189:4;62063:131;:::i;:::-;62055:139;;61782:419;;;:::o;62207:751::-;62430:4;62468:3;62457:9;62453:19;62445:27;;62482:71;62550:1;62539:9;62535:17;62526:6;62482:71;:::i;:::-;62563:72;62631:2;62620:9;62616:18;62607:6;62563:72;:::i;:::-;62645;62713:2;62702:9;62698:18;62689:6;62645:72;:::i;:::-;62727;62795:2;62784:9;62780:18;62771:6;62727:72;:::i;:::-;62847:9;62841:4;62837:20;62831:3;62820:9;62816:19;62809:49;62875:76;62946:4;62937:6;62875:76;:::i;:::-;62867:84;;62207:751;;;;;;;;:::o;62964:171::-;63104:23;63100:1;63092:6;63088:14;63081:47;62964:171;:::o;63141:366::-;63283:3;63304:67;63368:2;63363:3;63304:67;:::i;:::-;63297:74;;63380:93;63469:3;63380:93;:::i;:::-;63498:2;63493:3;63489:12;63482:19;;63141:366;;;:::o;63513:419::-;63679:4;63717:2;63706:9;63702:18;63694:26;;63766:9;63760:4;63756:20;63752:1;63741:9;63737:17;63730:47;63794:131;63920:4;63794:131;:::i;:::-;63786:139;;63513:419;;;:::o;63938:231::-;64078:34;64074:1;64066:6;64062:14;64055:58;64147:14;64142:2;64134:6;64130:15;64123:39;63938:231;:::o;64175:366::-;64317:3;64338:67;64402:2;64397:3;64338:67;:::i;:::-;64331:74;;64414:93;64503:3;64414:93;:::i;:::-;64532:2;64527:3;64523:12;64516:19;;64175:366;;;:::o;64547:419::-;64713:4;64751:2;64740:9;64736:18;64728:26;;64800:9;64794:4;64790:20;64786:1;64775:9;64771:17;64764:47;64828:131;64954:4;64828:131;:::i;:::-;64820:139;;64547:419;;;:::o

Swarm Source

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