ETH Price: $3,308.22 (-3.80%)

Token

LINE (LINE)
 

Overview

Max Total Supply

619 LINE

Holders

288

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
karmawav.eth
Balance
1 LINE
0xde0cbd5df89bb67ab804db21e9b931bad4200392
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:
LINE

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 18: Line.sol
//                            @                                                   
//                           @                                                    
//                          @                                                     
//                         @                                                      
//                        @                                                       
//                       @                                                        
//                      @                                                         
//                     @                                                          
//                    @                                                           
//                   @                                                            
//                  @                                                             
//                 @        

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./Ownable.sol";
import "./AccessControl.sol";
import "./PaymentSplitter.sol";

contract LINE is ERC721, ERC721Enumerable, ERC721Burnable, Ownable, AccessControl, PaymentSplitter {
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    uint256 public constant PRICE = 11000000000000000; // 0.011 ETH
    uint256 public constant MAX_SUPPLY = 11111;
    
    uint256 private constant MAX_ADMIN_TOKENS = 111;
    uint256 private constant MAX_PER_MINT = 11;

    bool public publicSaleActive = false;
    
    string private _baseURIextended;
    uint256 private _adminTokenCounter = 0;
    uint256 private _publicTokenCounter = 111;

    constructor(address[] memory _payees, uint256[] memory _shares) ERC721("LINE", "LINE") PaymentSplitter(_payees, _shares) payable {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(ADMIN_ROLE, _msgSender());
    }
    
    // Modifiers
    
    modifier requireMint(uint256 numberOfTokens) {
        require(numberOfTokens > 0, "Must be greater than 0");
        require(numberOfTokens <= MAX_PER_MINT, "Cannot mint more than max");
        require(
            (_publicTokenCounter + numberOfTokens) <= MAX_SUPPLY,
            "Exceeded max supply"
        );
        require(
            calculateMintCost(numberOfTokens) == msg.value,
            "Value is not correct"
        );
        _;
    }
    
    // Admin

    function togglePublicSale() public onlyRole(ADMIN_ROLE) {
        publicSaleActive = !publicSaleActive;
    }

    function setBaseURI(string memory baseURI)
        public
        onlyRole(ADMIN_ROLE)
    {
        _baseURIextended = baseURI;
    }

    function reserveTokens(uint256 numberOfTokens, address recipient)
        public
        onlyRole(ADMIN_ROLE)
    {
        require(numberOfTokens > 0, "Must be greater than 0");
        require(
            (_adminTokenCounter + numberOfTokens) <= MAX_ADMIN_TOKENS,
            "Exceeds admin max"
        );
        
        uint256 startIndex = _adminTokenCounter;
        _adminTokenCounter += numberOfTokens;
        
        _mint(numberOfTokens, recipient, startIndex);
    }

    // Public Sale
    
    function mint(uint256 numberOfTokens)
        public
        payable
        requireMint(numberOfTokens)
    {
        require(publicSaleActive == true, "Sale must be active");

        uint256 startIndex = _publicTokenCounter;
        _publicTokenCounter += numberOfTokens;
        
        _mint(numberOfTokens, _msgSender(), startIndex);
    }
    
    function _mint(uint256 numberOfTokens, address sender, uint256 startIndex) internal {
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(sender, startIndex + i);
        }
    }

    // Utility

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function calculateMintCost(uint numberOfTokens) internal pure returns(uint) {
        return numberOfTokens * PRICE;
    }

    // The following functions are overrides required by Solidity.
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

File 1 of 18: AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 2 of 18: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 18: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 18: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 18: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 6 of 18: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 7 of 18: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 18: IAccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 9 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 10 of 18: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 18: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 12 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 13 of 18: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 15 of 18: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 16 of 18: PaymentSplitter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Address.sol";
import "./Context.sol";
import "./SafeMath.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

File 17 of 18: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 18 of 18: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000601160006101000a81548160ff0219169083151502179055506000601355606f6014556040516200647b3803806200647b83398181016040528101906200004e919062000932565b81816040518060400160405280600481526020017f4c494e45000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c494e45000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d4929190620006f8565b508060019080519060200190620000ed929190620006f8565b50505062000110620001046200027d60201b60201c565b6200028560201b60201c565b805182511462000157576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014e9062000aeb565b60405180910390fd5b60008251116200019e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001959062000b2f565b60405180910390fd5b60005b82518110156200020d57620001f7838281518110620001c557620001c462000dbe565b5b6020026020010151838381518110620001e357620001e262000dbe565b5b60200260200101516200034b60201b60201c565b8080620002049062000d12565b915050620001a1565b505050620002346000801b620002286200027d60201b60201c565b6200058560201b60201c565b620002757fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775620002696200027d60201b60201c565b6200058560201b60201c565b505062000fb4565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b59062000ac9565b60405180910390fd5b6000811162000404576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fb9062000b51565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004809062000b0d565b60405180910390fd5b6010829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c5462000540919062000c0b565b600c819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200057992919062000a9c565b60405180910390a15050565b6200059782826200059b60201b60201c565b5050565b620005ad82826200068d60201b60201c565b62000689576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200062e6200027d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620007069062000ca6565b90600052602060002090601f0160209004810192826200072a576000855562000776565b82601f106200074557805160ff191683800117855562000776565b8280016001018555821562000776579182015b828111156200077557825182559160200191906001019062000758565b5b50905062000785919062000789565b5090565b5b80821115620007a45760008160009055506001016200078a565b5090565b6000620007bf620007b98462000b9c565b62000b73565b90508083825260208201905082856020860282011115620007e557620007e462000e21565b5b60005b85811015620008195781620007fe88826200089e565b845260208401935060208301925050600181019050620007e8565b5050509392505050565b60006200083a620008348462000bcb565b62000b73565b9050808382526020820190508285602086028201111562000860576200085f62000e21565b5b60005b858110156200089457816200087988826200091b565b84526020840193506020830192505060018101905062000863565b5050509392505050565b600081519050620008af8162000f80565b92915050565b600082601f830112620008cd57620008cc62000e1c565b5b8151620008df848260208601620007a8565b91505092915050565b600082601f8301126200090057620008ff62000e1c565b5b81516200091284826020860162000823565b91505092915050565b6000815190506200092c8162000f9a565b92915050565b600080604083850312156200094c576200094b62000e2b565b5b600083015167ffffffffffffffff8111156200096d576200096c62000e26565b5b6200097b85828601620008b5565b925050602083015167ffffffffffffffff8111156200099f576200099e62000e26565b5b620009ad85828601620008e8565b9150509250929050565b620009c28162000c68565b82525050565b6000620009d7602c8362000bfa565b9150620009e48262000e41565b604082019050919050565b6000620009fe60328362000bfa565b915062000a0b8262000e90565b604082019050919050565b600062000a25602b8362000bfa565b915062000a328262000edf565b604082019050919050565b600062000a4c601a8362000bfa565b915062000a598262000f2e565b602082019050919050565b600062000a73601d8362000bfa565b915062000a808262000f57565b602082019050919050565b62000a968162000c9c565b82525050565b600060408201905062000ab36000830185620009b7565b62000ac2602083018462000a8b565b9392505050565b6000602082019050818103600083015262000ae481620009c8565b9050919050565b6000602082019050818103600083015262000b0681620009ef565b9050919050565b6000602082019050818103600083015262000b288162000a16565b9050919050565b6000602082019050818103600083015262000b4a8162000a3d565b9050919050565b6000602082019050818103600083015262000b6c8162000a64565b9050919050565b600062000b7f62000b92565b905062000b8d828262000cdc565b919050565b6000604051905090565b600067ffffffffffffffff82111562000bba5762000bb962000ded565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000be95762000be862000ded565b5b602082029050602081019050919050565b600082825260208201905092915050565b600062000c188262000c9c565b915062000c258362000c9c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c5d5762000c5c62000d60565b5b828201905092915050565b600062000c758262000c7c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000cbf57607f821691505b6020821081141562000cd65762000cd562000d8f565b5b50919050565b62000ce78262000e30565b810181811067ffffffffffffffff8211171562000d095762000d0862000ded565b5b80604052505050565b600062000d1f8262000c9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d555762000d5462000d60565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000f8b8162000c68565b811462000f9757600080fd5b50565b62000fa58162000c9c565b811462000fb157600080fd5b50565b6154b78062000fc46000396000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063a22cb465116100ab578063d547741f1161006f578063d547741f1461090b578063e222c7f914610934578063e33b7de31461094b578063e985e9c514610976578063f2fde38b146109b357610286565b8063a22cb46514610814578063b88d4fde1461083d578063bc8893b414610866578063c87b56dd14610891578063ce7c2ac2146108ce57610286565b806391d14854116100f257806391d148541461072857806395d89b41146107655780639852595c14610790578063a0712d68146107cd578063a217fddf146107e957610286565b8063715018a61461065357806375b238fc1461066a5780638b83209b146106955780638d859f3e146106d25780638da5cb5b146106fd57610286565b806332cb6b0c116101bc5780634f6ccce7116101805780634f6ccce71461054a57806353d4c7751461058757806355f804b3146105b05780636352211e146105d957806370a082311461061657610286565b806332cb6b0c1461047957806336568abe146104a45780633a98ef39146104cd57806342842e0e146104f857806342966c681461052157610286565b80631916558711610203578063191655871461038457806323b872dd146103ad578063248a9ca3146103d65780632f2ff15d146104135780632f745c591461043c57610286565b806301ffc9a71461028b57806306fdde03146102c8578063081812fc146102f3578063095ea7b31461033057806318160ddd1461035957610286565b36610286577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061026d6109dc565b3460405161027c929190614225565b60405180910390a1005b600080fd5b34801561029757600080fd5b506102b260048036038101906102ad9190613a7e565b6109e4565b6040516102bf919061424e565b60405180910390f35b3480156102d457600080fd5b506102dd6109f6565b6040516102ea9190614284565b60405180910390f35b3480156102ff57600080fd5b5061031a60048036038101906103159190613b21565b610a88565b6040516103279190614195565b60405180910390f35b34801561033c57600080fd5b50610357600480360381019061035291906139d1565b610b0d565b005b34801561036557600080fd5b5061036e610c25565b60405161037b9190614686565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a6919061384e565b610c32565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906138bb565b610e9a565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613a11565b610efa565b60405161040a9190614269565b60405180910390f35b34801561041f57600080fd5b5061043a60048036038101906104359190613a3e565b610f1a565b005b34801561044857600080fd5b50610463600480360381019061045e91906139d1565b610f43565b6040516104709190614686565b60405180910390f35b34801561048557600080fd5b5061048e610fe8565b60405161049b9190614686565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613a3e565b610fee565b005b3480156104d957600080fd5b506104e2611071565b6040516104ef9190614686565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a91906138bb565b61107b565b005b34801561052d57600080fd5b5061054860048036038101906105439190613b21565b61109b565b005b34801561055657600080fd5b50610571600480360381019061056c9190613b21565b6110f7565b60405161057e9190614686565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a99190613b4e565b611168565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190613ad8565b61125f565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190613b21565b6112ac565b60405161060d9190614195565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613821565b61135e565b60405161064a9190614686565b60405180910390f35b34801561065f57600080fd5b50610668611416565b005b34801561067657600080fd5b5061067f61149e565b60405161068c9190614269565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613b21565b6114c2565b6040516106c99190614195565b60405180910390f35b3480156106de57600080fd5b506106e761150a565b6040516106f49190614686565b60405180910390f35b34801561070957600080fd5b50610712611515565b60405161071f9190614195565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190613a3e565b61153f565b60405161075c919061424e565b60405180910390f35b34801561077157600080fd5b5061077a6115aa565b6040516107879190614284565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613821565b61163c565b6040516107c49190614686565b60405180910390f35b6107e760048036038101906107e29190613b21565b611685565b005b3480156107f557600080fd5b506107fe611836565b60405161080b9190614269565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613991565b61183d565b005b34801561084957600080fd5b50610864600480360381019061085f919061390e565b6119be565b005b34801561087257600080fd5b5061087b611a20565b604051610888919061424e565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190613b21565b611a33565b6040516108c59190614284565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190613821565b611ada565b6040516109029190614686565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190613a3e565b611b23565b005b34801561094057600080fd5b50610949611b4c565b005b34801561095757600080fd5b50610960611bab565b60405161096d9190614686565b60405180910390f35b34801561098257600080fd5b5061099d6004803603810190610998919061387b565b611bb5565b6040516109aa919061424e565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613821565b611c49565b005b600033905090565b60006109ef82611d41565b9050919050565b606060008054610a05906149bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a31906149bd565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b5050505050905090565b6000610a9382611dbb565b610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990614526565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b18826112ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906145c6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba86109dc565b73ffffffffffffffffffffffffffffffffffffffff161480610bd75750610bd681610bd16109dc565b611bb5565b5b610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90614466565b60405180910390fd5b610c208383611e27565b505050565b6000600880549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90614366565b60405180910390fd5b6000600d5447610cc49190614776565b90506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c54600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610d5691906147fd565b610d6091906147cc565b610d6a9190614857565b90506000811415610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790614426565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dfb9190614776565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610e4c9190614776565b600d81905550610e5c8382611ee0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610e8d9291906141b0565b60405180910390a1505050565b610eab610ea56109dc565b82611fd4565b610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190614606565b60405180910390fd5b610ef58383836120b2565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b610f2382610efa565b610f3481610f2f6109dc565b61230e565b610f3e83836123ab565b505050565b6000610f4e8361135e565b8210610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f86906142e6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b612b6781565b610ff66109dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a90614666565b60405180910390fd5b61106d828261248c565b5050565b6000600c54905090565b611096838383604051806020016040528060008152506119be565b505050565b6110ac6110a66109dc565b82611fd4565b6110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290614646565b60405180910390fd5b6110f48161256e565b50565b6000611101610c25565b8210611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990614626565b60405180910390fd5b6008828154811061115657611155614b56565b5b90600052602060002001549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561119a816111956109dc565b61230e565b600083116111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490614446565b60405180910390fd5b606f836013546111ed9190614776565b111561122e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611225906145e6565b60405180910390fd5b6000601354905083601360008282546112479190614776565b9250508190555061125984848361267f565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756112918161128c6109dc565b61230e565b81601290805190602001906112a792919061360b565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c906144a6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c690614486565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61141e6109dc565b73ffffffffffffffffffffffffffffffffffffffff1661143c611515565b73ffffffffffffffffffffffffffffffffffffffff1614611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614546565b60405180910390fd5b61149c60006126b8565b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000601082815481106114d8576114d7614b56565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b662714711487800081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546115b9906149bd565b80601f01602080910402602001604051908101604052809291908181526020018280546115e5906149bd565b80156116325780601f1061160757610100808354040283529160200191611632565b820191906000526020600020905b81548152906001019060200180831161161557829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600081116116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c090614446565b60405180910390fd5b600b81111561170d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611704906144e6565b60405180910390fd5b612b678160145461171e9190614776565b111561175f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611756906145a6565b60405180910390fd5b346117698261277e565b146117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a0906144c6565b60405180910390fd5b60011515601160009054906101000a900460ff161515146117ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f6906142c6565b60405180910390fd5b6000601454905082601460008282546118189190614776565b925050819055506118318361182b6109dc565b8361267f565b505050565b6000801b81565b6118456109dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa906143a6565b60405180910390fd5b80600560006118c06109dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661196d6109dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119b2919061424e565b60405180910390a35050565b6119cf6119c96109dc565b83611fd4565b611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590614606565b60405180910390fd5b611a1a8484848461279a565b50505050565b601160009054906101000a900460ff1681565b6060611a3e82611dbb565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614586565b60405180910390fd5b6000611a876127f6565b90506000815111611aa75760405180602001604052806000815250611ad2565b80611ab184612888565b604051602001611ac2929190614122565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b2c82610efa565b611b3d81611b386109dc565b61230e565b611b47838361248c565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611b7e81611b796109dc565b61230e565b601160009054906101000a900460ff1615601160006101000a81548160ff02191690831515021790555050565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c516109dc565b73ffffffffffffffffffffffffffffffffffffffff16611c6f611515565b73ffffffffffffffffffffffffffffffffffffffff1614611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90614546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c90614326565b60405180910390fd5b611d3e816126b8565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611db45750611db3826129e9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e9a836112ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a906143e6565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611f4990614146565b60006040518083038185875af1925050503d8060008114611f86576040519150601f19603f3d011682016040523d82523d6000602084013e611f8b565b606091505b5050905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906143c6565b60405180910390fd5b505050565b6000611fdf82611dbb565b61201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590614406565b60405180910390fd5b6000612029836112ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061209857508373ffffffffffffffffffffffffffffffffffffffff1661208084610a88565b73ffffffffffffffffffffffffffffffffffffffff16145b806120a957506120a88185611bb5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120d2826112ac565b73ffffffffffffffffffffffffffffffffffffffff1614612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614566565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90614386565b60405180910390fd5b6121a3838383612a63565b6121ae600082611e27565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121fe9190614857565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122559190614776565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612318828261153f565b6123a75761233d8173ffffffffffffffffffffffffffffffffffffffff166014612a73565b61234b8360001c6020612a73565b60405160200161235c92919061415b565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e9190614284565b60405180910390fd5b5050565b6123b5828261153f565b612488576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061242d6109dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612496828261153f565b1561256a576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061250f6109dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612579826112ac565b905061258781600084612a63565b612592600083611e27565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e29190614857565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60005b838110156126b25761269f83828461269a9190614776565b612caf565b80806126aa90614a20565b915050612682565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600066271471148780008261279391906147fd565b9050919050565b6127a58484846120b2565b6127b184848484612ccd565b6127f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e790614306565b60405180910390fd5b50505050565b606060128054612805906149bd565b80601f0160208091040260200160405190810160405280929190818152602001828054612831906149bd565b801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b5050505050905090565b606060008214156128d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e4565b600082905060005b600082146129025780806128eb90614a20565b915050600a826128fb91906147cc565b91506128d8565b60008167ffffffffffffffff81111561291e5761291d614b85565b5b6040519080825280601f01601f1916602001820160405280156129505781602001600182028036833780820191505090505b5090505b600085146129dd576001826129699190614857565b9150600a856129789190614a69565b60306129849190614776565b60f81b81838151811061299a57612999614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d691906147cc565b9450612954565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a5c5750612a5b82612e64565b5b9050919050565b612a6e838383612f46565b505050565b606060006002836002612a8691906147fd565b612a909190614776565b67ffffffffffffffff811115612aa957612aa8614b85565b5b6040519080825280601f01601f191660200182016040528015612adb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612b1357612b12614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b7757612b76614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612bb791906147fd565b612bc19190614776565b90505b6001811115612c61577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612c0357612c02614b56565b5b1a60f81b828281518110612c1a57612c19614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612c5a90614993565b9050612bc4565b5060008414612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c906142a6565b60405180910390fd5b8091505092915050565b612cc982826040518060200160405280600081525061305a565b5050565b6000612cee8473ffffffffffffffffffffffffffffffffffffffff166130b5565b15612e57578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d176109dc565b8786866040518563ffffffff1660e01b8152600401612d3994939291906141d9565b602060405180830381600087803b158015612d5357600080fd5b505af1925050508015612d8457506040513d601f19601f82011682018060405250810190612d819190613aab565b60015b612e07573d8060008114612db4576040519150601f19603f3d011682016040523d82523d6000602084013e612db9565b606091505b50600081511415612dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df690614306565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e5c565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f2f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f3f5750612f3e826130c8565b5b9050919050565b612f51838383613132565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f9457612f8f81613137565b612fd3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fd257612fd18382613180565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561301657613011816132ed565b613055565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130545761305382826133be565b5b5b505050565b613064838361343d565b6130716000848484612ccd565b6130b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a790614306565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161318d8461135e565b6131979190614857565b905060006007600084815260200190815260200160002054905081811461327c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133019190614857565b905060006009600084815260200190815260200160002054905060006008838154811061333157613330614b56565b5b90600052602060002001549050806008838154811061335357613352614b56565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133a2576133a1614b27565b5b6001900381819060005260206000200160009055905550505050565b60006133c98361135e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a490614506565b60405180910390fd5b6134b681611dbb565b156134f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ed90614346565b60405180910390fd5b61350260008383612a63565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135529190614776565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613617906149bd565b90600052602060002090601f0160209004810192826136395760008555613680565b82601f1061365257805160ff1916838001178555613680565b82800160010185558215613680579182015b8281111561367f578251825591602001919060010190613664565b5b50905061368d9190613691565b5090565b5b808211156136aa576000816000905550600101613692565b5090565b60006136c16136bc846146c6565b6146a1565b9050828152602081018484840111156136dd576136dc614bb9565b5b6136e8848285614951565b509392505050565b60006137036136fe846146f7565b6146a1565b90508281526020810184848401111561371f5761371e614bb9565b5b61372a848285614951565b509392505050565b600081359050613741816153f7565b92915050565b6000813590506137568161540e565b92915050565b60008135905061376b81615425565b92915050565b6000813590506137808161543c565b92915050565b60008135905061379581615453565b92915050565b6000815190506137aa81615453565b92915050565b600082601f8301126137c5576137c4614bb4565b5b81356137d58482602086016136ae565b91505092915050565b600082601f8301126137f3576137f2614bb4565b5b81356138038482602086016136f0565b91505092915050565b60008135905061381b8161546a565b92915050565b60006020828403121561383757613836614bc3565b5b600061384584828501613732565b91505092915050565b60006020828403121561386457613863614bc3565b5b600061387284828501613747565b91505092915050565b6000806040838503121561389257613891614bc3565b5b60006138a085828601613732565b92505060206138b185828601613732565b9150509250929050565b6000806000606084860312156138d4576138d3614bc3565b5b60006138e286828701613732565b93505060206138f386828701613732565b92505060406139048682870161380c565b9150509250925092565b6000806000806080858703121561392857613927614bc3565b5b600061393687828801613732565b945050602061394787828801613732565b93505060406139588782880161380c565b925050606085013567ffffffffffffffff81111561397957613978614bbe565b5b613985878288016137b0565b91505092959194509250565b600080604083850312156139a8576139a7614bc3565b5b60006139b685828601613732565b92505060206139c78582860161375c565b9150509250929050565b600080604083850312156139e8576139e7614bc3565b5b60006139f685828601613732565b9250506020613a078582860161380c565b9150509250929050565b600060208284031215613a2757613a26614bc3565b5b6000613a3584828501613771565b91505092915050565b60008060408385031215613a5557613a54614bc3565b5b6000613a6385828601613771565b9250506020613a7485828601613732565b9150509250929050565b600060208284031215613a9457613a93614bc3565b5b6000613aa284828501613786565b91505092915050565b600060208284031215613ac157613ac0614bc3565b5b6000613acf8482850161379b565b91505092915050565b600060208284031215613aee57613aed614bc3565b5b600082013567ffffffffffffffff811115613b0c57613b0b614bbe565b5b613b18848285016137de565b91505092915050565b600060208284031215613b3757613b36614bc3565b5b6000613b458482850161380c565b91505092915050565b60008060408385031215613b6557613b64614bc3565b5b6000613b738582860161380c565b9250506020613b8485828601613732565b9150509250929050565b613b978161491b565b82525050565b613ba68161488b565b82525050565b613bb5816148af565b82525050565b613bc4816148bb565b82525050565b6000613bd582614728565b613bdf818561473e565b9350613bef818560208601614960565b613bf881614bc8565b840191505092915050565b6000613c0e82614733565b613c18818561475a565b9350613c28818560208601614960565b613c3181614bc8565b840191505092915050565b6000613c4782614733565b613c51818561476b565b9350613c61818560208601614960565b80840191505092915050565b6000613c7a60208361475a565b9150613c8582614bd9565b602082019050919050565b6000613c9d60138361475a565b9150613ca882614c02565b602082019050919050565b6000613cc0602b8361475a565b9150613ccb82614c2b565b604082019050919050565b6000613ce360328361475a565b9150613cee82614c7a565b604082019050919050565b6000613d0660268361475a565b9150613d1182614cc9565b604082019050919050565b6000613d29601c8361475a565b9150613d3482614d18565b602082019050919050565b6000613d4c60268361475a565b9150613d5782614d41565b604082019050919050565b6000613d6f60248361475a565b9150613d7a82614d90565b604082019050919050565b6000613d9260198361475a565b9150613d9d82614ddf565b602082019050919050565b6000613db5603a8361475a565b9150613dc082614e08565b604082019050919050565b6000613dd8601d8361475a565b9150613de382614e57565b602082019050919050565b6000613dfb602c8361475a565b9150613e0682614e80565b604082019050919050565b6000613e1e602b8361475a565b9150613e2982614ecf565b604082019050919050565b6000613e4160168361475a565b9150613e4c82614f1e565b602082019050919050565b6000613e6460388361475a565b9150613e6f82614f47565b604082019050919050565b6000613e87602a8361475a565b9150613e9282614f96565b604082019050919050565b6000613eaa60298361475a565b9150613eb582614fe5565b604082019050919050565b6000613ecd60148361475a565b9150613ed882615034565b602082019050919050565b6000613ef060198361475a565b9150613efb8261505d565b602082019050919050565b6000613f1360208361475a565b9150613f1e82615086565b602082019050919050565b6000613f36602c8361475a565b9150613f41826150af565b604082019050919050565b6000613f5960208361475a565b9150613f64826150fe565b602082019050919050565b6000613f7c60298361475a565b9150613f8782615127565b604082019050919050565b6000613f9f602f8361475a565b9150613faa82615176565b604082019050919050565b6000613fc260138361475a565b9150613fcd826151c5565b602082019050919050565b6000613fe560218361475a565b9150613ff0826151ee565b604082019050919050565b600061400860118361475a565b91506140138261523d565b602082019050919050565b600061402b60008361474f565b915061403682615266565b600082019050919050565b600061404e60318361475a565b915061405982615269565b604082019050919050565b6000614071602c8361475a565b915061407c826152b8565b604082019050919050565b600061409460178361476b565b915061409f82615307565b601782019050919050565b60006140b760308361475a565b91506140c282615330565b604082019050919050565b60006140da60118361476b565b91506140e58261537f565b601182019050919050565b60006140fd602f8361475a565b9150614108826153a8565b604082019050919050565b61411c81614911565b82525050565b600061412e8285613c3c565b915061413a8284613c3c565b91508190509392505050565b60006141518261401e565b9150819050919050565b600061416682614087565b91506141728285613c3c565b915061417d826140cd565b91506141898284613c3c565b91508190509392505050565b60006020820190506141aa6000830184613b9d565b92915050565b60006040820190506141c56000830185613b8e565b6141d26020830184614113565b9392505050565b60006080820190506141ee6000830187613b9d565b6141fb6020830186613b9d565b6142086040830185614113565b818103606083015261421a8184613bca565b905095945050505050565b600060408201905061423a6000830185613b9d565b6142476020830184614113565b9392505050565b60006020820190506142636000830184613bac565b92915050565b600060208201905061427e6000830184613bbb565b92915050565b6000602082019050818103600083015261429e8184613c03565b905092915050565b600060208201905081810360008301526142bf81613c6d565b9050919050565b600060208201905081810360008301526142df81613c90565b9050919050565b600060208201905081810360008301526142ff81613cb3565b9050919050565b6000602082019050818103600083015261431f81613cd6565b9050919050565b6000602082019050818103600083015261433f81613cf9565b9050919050565b6000602082019050818103600083015261435f81613d1c565b9050919050565b6000602082019050818103600083015261437f81613d3f565b9050919050565b6000602082019050818103600083015261439f81613d62565b9050919050565b600060208201905081810360008301526143bf81613d85565b9050919050565b600060208201905081810360008301526143df81613da8565b9050919050565b600060208201905081810360008301526143ff81613dcb565b9050919050565b6000602082019050818103600083015261441f81613dee565b9050919050565b6000602082019050818103600083015261443f81613e11565b9050919050565b6000602082019050818103600083015261445f81613e34565b9050919050565b6000602082019050818103600083015261447f81613e57565b9050919050565b6000602082019050818103600083015261449f81613e7a565b9050919050565b600060208201905081810360008301526144bf81613e9d565b9050919050565b600060208201905081810360008301526144df81613ec0565b9050919050565b600060208201905081810360008301526144ff81613ee3565b9050919050565b6000602082019050818103600083015261451f81613f06565b9050919050565b6000602082019050818103600083015261453f81613f29565b9050919050565b6000602082019050818103600083015261455f81613f4c565b9050919050565b6000602082019050818103600083015261457f81613f6f565b9050919050565b6000602082019050818103600083015261459f81613f92565b9050919050565b600060208201905081810360008301526145bf81613fb5565b9050919050565b600060208201905081810360008301526145df81613fd8565b9050919050565b600060208201905081810360008301526145ff81613ffb565b9050919050565b6000602082019050818103600083015261461f81614041565b9050919050565b6000602082019050818103600083015261463f81614064565b9050919050565b6000602082019050818103600083015261465f816140aa565b9050919050565b6000602082019050818103600083015261467f816140f0565b9050919050565b600060208201905061469b6000830184614113565b92915050565b60006146ab6146bc565b90506146b782826149ef565b919050565b6000604051905090565b600067ffffffffffffffff8211156146e1576146e0614b85565b5b6146ea82614bc8565b9050602081019050919050565b600067ffffffffffffffff82111561471257614711614b85565b5b61471b82614bc8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061478182614911565b915061478c83614911565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147c1576147c0614a9a565b5b828201905092915050565b60006147d782614911565b91506147e283614911565b9250826147f2576147f1614ac9565b5b828204905092915050565b600061480882614911565b915061481383614911565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561484c5761484b614a9a565b5b828202905092915050565b600061486282614911565b915061486d83614911565b9250828210156148805761487f614a9a565b5b828203905092915050565b6000614896826148f1565b9050919050565b60006148a8826148f1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149268261492d565b9050919050565b60006149388261493f565b9050919050565b600061494a826148f1565b9050919050565b82818337600083830152505050565b60005b8381101561497e578082015181840152602081019050614963565b8381111561498d576000848401525b50505050565b600061499e82614911565b915060008214156149b2576149b1614a9a565b5b600182039050919050565b600060028204905060018216806149d557607f821691505b602082108114156149e9576149e8614af8565b5b50919050565b6149f882614bc8565b810181811067ffffffffffffffff82111715614a1757614a16614b85565b5b80604052505050565b6000614a2b82614911565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a5e57614a5d614a9a565b5b600182019050919050565b6000614a7482614911565b9150614a7f83614911565b925082614a8f57614a8e614ac9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4d7573742062652067726561746572207468616e203000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f56616c7565206973206e6f7420636f7272656374000000000000000000000000600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e206d617800000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732061646d696e206d6178000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6154008161488b565b811461540b57600080fd5b50565b6154178161489d565b811461542257600080fd5b50565b61542e816148af565b811461543957600080fd5b50565b615445816148bb565b811461545057600080fd5b50565b61545c816148c5565b811461546757600080fd5b50565b61547381614911565b811461547e57600080fd5b5056fea264697066735822122037ac090e5401c7ea48608c6dd29ccc8788abacea7ebc51d82e7451dfe0ddd84d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f9f6ed9ee9b263fc6ce7578bdde7c261d0a6a34000000000000000000000000d06d855652a73e61bfe26a3427dfe51f3b827fe30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000005

Deployed Bytecode

0x60806040526004361061023f5760003560e01c8063715018a61161012e578063a22cb465116100ab578063d547741f1161006f578063d547741f1461090b578063e222c7f914610934578063e33b7de31461094b578063e985e9c514610976578063f2fde38b146109b357610286565b8063a22cb46514610814578063b88d4fde1461083d578063bc8893b414610866578063c87b56dd14610891578063ce7c2ac2146108ce57610286565b806391d14854116100f257806391d148541461072857806395d89b41146107655780639852595c14610790578063a0712d68146107cd578063a217fddf146107e957610286565b8063715018a61461065357806375b238fc1461066a5780638b83209b146106955780638d859f3e146106d25780638da5cb5b146106fd57610286565b806332cb6b0c116101bc5780634f6ccce7116101805780634f6ccce71461054a57806353d4c7751461058757806355f804b3146105b05780636352211e146105d957806370a082311461061657610286565b806332cb6b0c1461047957806336568abe146104a45780633a98ef39146104cd57806342842e0e146104f857806342966c681461052157610286565b80631916558711610203578063191655871461038457806323b872dd146103ad578063248a9ca3146103d65780632f2ff15d146104135780632f745c591461043c57610286565b806301ffc9a71461028b57806306fdde03146102c8578063081812fc146102f3578063095ea7b31461033057806318160ddd1461035957610286565b36610286577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061026d6109dc565b3460405161027c929190614225565b60405180910390a1005b600080fd5b34801561029757600080fd5b506102b260048036038101906102ad9190613a7e565b6109e4565b6040516102bf919061424e565b60405180910390f35b3480156102d457600080fd5b506102dd6109f6565b6040516102ea9190614284565b60405180910390f35b3480156102ff57600080fd5b5061031a60048036038101906103159190613b21565b610a88565b6040516103279190614195565b60405180910390f35b34801561033c57600080fd5b50610357600480360381019061035291906139d1565b610b0d565b005b34801561036557600080fd5b5061036e610c25565b60405161037b9190614686565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a6919061384e565b610c32565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906138bb565b610e9a565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190613a11565b610efa565b60405161040a9190614269565b60405180910390f35b34801561041f57600080fd5b5061043a60048036038101906104359190613a3e565b610f1a565b005b34801561044857600080fd5b50610463600480360381019061045e91906139d1565b610f43565b6040516104709190614686565b60405180910390f35b34801561048557600080fd5b5061048e610fe8565b60405161049b9190614686565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613a3e565b610fee565b005b3480156104d957600080fd5b506104e2611071565b6040516104ef9190614686565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a91906138bb565b61107b565b005b34801561052d57600080fd5b5061054860048036038101906105439190613b21565b61109b565b005b34801561055657600080fd5b50610571600480360381019061056c9190613b21565b6110f7565b60405161057e9190614686565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a99190613b4e565b611168565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190613ad8565b61125f565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190613b21565b6112ac565b60405161060d9190614195565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190613821565b61135e565b60405161064a9190614686565b60405180910390f35b34801561065f57600080fd5b50610668611416565b005b34801561067657600080fd5b5061067f61149e565b60405161068c9190614269565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613b21565b6114c2565b6040516106c99190614195565b60405180910390f35b3480156106de57600080fd5b506106e761150a565b6040516106f49190614686565b60405180910390f35b34801561070957600080fd5b50610712611515565b60405161071f9190614195565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190613a3e565b61153f565b60405161075c919061424e565b60405180910390f35b34801561077157600080fd5b5061077a6115aa565b6040516107879190614284565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613821565b61163c565b6040516107c49190614686565b60405180910390f35b6107e760048036038101906107e29190613b21565b611685565b005b3480156107f557600080fd5b506107fe611836565b60405161080b9190614269565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613991565b61183d565b005b34801561084957600080fd5b50610864600480360381019061085f919061390e565b6119be565b005b34801561087257600080fd5b5061087b611a20565b604051610888919061424e565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b39190613b21565b611a33565b6040516108c59190614284565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190613821565b611ada565b6040516109029190614686565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190613a3e565b611b23565b005b34801561094057600080fd5b50610949611b4c565b005b34801561095757600080fd5b50610960611bab565b60405161096d9190614686565b60405180910390f35b34801561098257600080fd5b5061099d6004803603810190610998919061387b565b611bb5565b6040516109aa919061424e565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613821565b611c49565b005b600033905090565b60006109ef82611d41565b9050919050565b606060008054610a05906149bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a31906149bd565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b5050505050905090565b6000610a9382611dbb565b610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac990614526565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b18826112ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906145c6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba86109dc565b73ffffffffffffffffffffffffffffffffffffffff161480610bd75750610bd681610bd16109dc565b611bb5565b5b610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90614466565b60405180910390fd5b610c208383611e27565b505050565b6000600880549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90614366565b60405180910390fd5b6000600d5447610cc49190614776565b90506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c54600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610d5691906147fd565b610d6091906147cc565b610d6a9190614857565b90506000811415610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790614426565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dfb9190614776565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610e4c9190614776565b600d81905550610e5c8382611ee0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610e8d9291906141b0565b60405180910390a1505050565b610eab610ea56109dc565b82611fd4565b610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190614606565b60405180910390fd5b610ef58383836120b2565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b610f2382610efa565b610f3481610f2f6109dc565b61230e565b610f3e83836123ab565b505050565b6000610f4e8361135e565b8210610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f86906142e6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b612b6781565b610ff66109dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a90614666565b60405180910390fd5b61106d828261248c565b5050565b6000600c54905090565b611096838383604051806020016040528060008152506119be565b505050565b6110ac6110a66109dc565b82611fd4565b6110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290614646565b60405180910390fd5b6110f48161256e565b50565b6000611101610c25565b8210611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990614626565b60405180910390fd5b6008828154811061115657611155614b56565b5b90600052602060002001549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561119a816111956109dc565b61230e565b600083116111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490614446565b60405180910390fd5b606f836013546111ed9190614776565b111561122e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611225906145e6565b60405180910390fd5b6000601354905083601360008282546112479190614776565b9250508190555061125984848361267f565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756112918161128c6109dc565b61230e565b81601290805190602001906112a792919061360b565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c906144a6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c690614486565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61141e6109dc565b73ffffffffffffffffffffffffffffffffffffffff1661143c611515565b73ffffffffffffffffffffffffffffffffffffffff1614611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614546565b60405180910390fd5b61149c60006126b8565b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000601082815481106114d8576114d7614b56565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b662714711487800081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546115b9906149bd565b80601f01602080910402602001604051908101604052809291908181526020018280546115e5906149bd565b80156116325780601f1061160757610100808354040283529160200191611632565b820191906000526020600020905b81548152906001019060200180831161161557829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600081116116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c090614446565b60405180910390fd5b600b81111561170d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611704906144e6565b60405180910390fd5b612b678160145461171e9190614776565b111561175f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611756906145a6565b60405180910390fd5b346117698261277e565b146117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a0906144c6565b60405180910390fd5b60011515601160009054906101000a900460ff161515146117ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f6906142c6565b60405180910390fd5b6000601454905082601460008282546118189190614776565b925050819055506118318361182b6109dc565b8361267f565b505050565b6000801b81565b6118456109dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa906143a6565b60405180910390fd5b80600560006118c06109dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661196d6109dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119b2919061424e565b60405180910390a35050565b6119cf6119c96109dc565b83611fd4565b611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590614606565b60405180910390fd5b611a1a8484848461279a565b50505050565b601160009054906101000a900460ff1681565b6060611a3e82611dbb565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614586565b60405180910390fd5b6000611a876127f6565b90506000815111611aa75760405180602001604052806000815250611ad2565b80611ab184612888565b604051602001611ac2929190614122565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b2c82610efa565b611b3d81611b386109dc565b61230e565b611b47838361248c565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775611b7e81611b796109dc565b61230e565b601160009054906101000a900460ff1615601160006101000a81548160ff02191690831515021790555050565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c516109dc565b73ffffffffffffffffffffffffffffffffffffffff16611c6f611515565b73ffffffffffffffffffffffffffffffffffffffff1614611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90614546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c90614326565b60405180910390fd5b611d3e816126b8565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611db45750611db3826129e9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e9a836112ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a906143e6565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611f4990614146565b60006040518083038185875af1925050503d8060008114611f86576040519150601f19603f3d011682016040523d82523d6000602084013e611f8b565b606091505b5050905080611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906143c6565b60405180910390fd5b505050565b6000611fdf82611dbb565b61201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590614406565b60405180910390fd5b6000612029836112ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061209857508373ffffffffffffffffffffffffffffffffffffffff1661208084610a88565b73ffffffffffffffffffffffffffffffffffffffff16145b806120a957506120a88185611bb5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120d2826112ac565b73ffffffffffffffffffffffffffffffffffffffff1614612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614566565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90614386565b60405180910390fd5b6121a3838383612a63565b6121ae600082611e27565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121fe9190614857565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122559190614776565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612318828261153f565b6123a75761233d8173ffffffffffffffffffffffffffffffffffffffff166014612a73565b61234b8360001c6020612a73565b60405160200161235c92919061415b565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e9190614284565b60405180910390fd5b5050565b6123b5828261153f565b612488576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061242d6109dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612496828261153f565b1561256a576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061250f6109dc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612579826112ac565b905061258781600084612a63565b612592600083611e27565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125e29190614857565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60005b838110156126b25761269f83828461269a9190614776565b612caf565b80806126aa90614a20565b915050612682565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600066271471148780008261279391906147fd565b9050919050565b6127a58484846120b2565b6127b184848484612ccd565b6127f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e790614306565b60405180910390fd5b50505050565b606060128054612805906149bd565b80601f0160208091040260200160405190810160405280929190818152602001828054612831906149bd565b801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b5050505050905090565b606060008214156128d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e4565b600082905060005b600082146129025780806128eb90614a20565b915050600a826128fb91906147cc565b91506128d8565b60008167ffffffffffffffff81111561291e5761291d614b85565b5b6040519080825280601f01601f1916602001820160405280156129505781602001600182028036833780820191505090505b5090505b600085146129dd576001826129699190614857565b9150600a856129789190614a69565b60306129849190614776565b60f81b81838151811061299a57612999614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d691906147cc565b9450612954565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a5c5750612a5b82612e64565b5b9050919050565b612a6e838383612f46565b505050565b606060006002836002612a8691906147fd565b612a909190614776565b67ffffffffffffffff811115612aa957612aa8614b85565b5b6040519080825280601f01601f191660200182016040528015612adb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612b1357612b12614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b7757612b76614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612bb791906147fd565b612bc19190614776565b90505b6001811115612c61577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612c0357612c02614b56565b5b1a60f81b828281518110612c1a57612c19614b56565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612c5a90614993565b9050612bc4565b5060008414612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c906142a6565b60405180910390fd5b8091505092915050565b612cc982826040518060200160405280600081525061305a565b5050565b6000612cee8473ffffffffffffffffffffffffffffffffffffffff166130b5565b15612e57578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d176109dc565b8786866040518563ffffffff1660e01b8152600401612d3994939291906141d9565b602060405180830381600087803b158015612d5357600080fd5b505af1925050508015612d8457506040513d601f19601f82011682018060405250810190612d819190613aab565b60015b612e07573d8060008114612db4576040519150601f19603f3d011682016040523d82523d6000602084013e612db9565b606091505b50600081511415612dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df690614306565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e5c565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f2f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f3f5750612f3e826130c8565b5b9050919050565b612f51838383613132565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f9457612f8f81613137565b612fd3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fd257612fd18382613180565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561301657613011816132ed565b613055565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130545761305382826133be565b5b5b505050565b613064838361343d565b6130716000848484612ccd565b6130b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a790614306565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161318d8461135e565b6131979190614857565b905060006007600084815260200190815260200160002054905081811461327c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133019190614857565b905060006009600084815260200190815260200160002054905060006008838154811061333157613330614b56565b5b90600052602060002001549050806008838154811061335357613352614b56565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133a2576133a1614b27565b5b6001900381819060005260206000200160009055905550505050565b60006133c98361135e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a490614506565b60405180910390fd5b6134b681611dbb565b156134f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ed90614346565b60405180910390fd5b61350260008383612a63565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135529190614776565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613617906149bd565b90600052602060002090601f0160209004810192826136395760008555613680565b82601f1061365257805160ff1916838001178555613680565b82800160010185558215613680579182015b8281111561367f578251825591602001919060010190613664565b5b50905061368d9190613691565b5090565b5b808211156136aa576000816000905550600101613692565b5090565b60006136c16136bc846146c6565b6146a1565b9050828152602081018484840111156136dd576136dc614bb9565b5b6136e8848285614951565b509392505050565b60006137036136fe846146f7565b6146a1565b90508281526020810184848401111561371f5761371e614bb9565b5b61372a848285614951565b509392505050565b600081359050613741816153f7565b92915050565b6000813590506137568161540e565b92915050565b60008135905061376b81615425565b92915050565b6000813590506137808161543c565b92915050565b60008135905061379581615453565b92915050565b6000815190506137aa81615453565b92915050565b600082601f8301126137c5576137c4614bb4565b5b81356137d58482602086016136ae565b91505092915050565b600082601f8301126137f3576137f2614bb4565b5b81356138038482602086016136f0565b91505092915050565b60008135905061381b8161546a565b92915050565b60006020828403121561383757613836614bc3565b5b600061384584828501613732565b91505092915050565b60006020828403121561386457613863614bc3565b5b600061387284828501613747565b91505092915050565b6000806040838503121561389257613891614bc3565b5b60006138a085828601613732565b92505060206138b185828601613732565b9150509250929050565b6000806000606084860312156138d4576138d3614bc3565b5b60006138e286828701613732565b93505060206138f386828701613732565b92505060406139048682870161380c565b9150509250925092565b6000806000806080858703121561392857613927614bc3565b5b600061393687828801613732565b945050602061394787828801613732565b93505060406139588782880161380c565b925050606085013567ffffffffffffffff81111561397957613978614bbe565b5b613985878288016137b0565b91505092959194509250565b600080604083850312156139a8576139a7614bc3565b5b60006139b685828601613732565b92505060206139c78582860161375c565b9150509250929050565b600080604083850312156139e8576139e7614bc3565b5b60006139f685828601613732565b9250506020613a078582860161380c565b9150509250929050565b600060208284031215613a2757613a26614bc3565b5b6000613a3584828501613771565b91505092915050565b60008060408385031215613a5557613a54614bc3565b5b6000613a6385828601613771565b9250506020613a7485828601613732565b9150509250929050565b600060208284031215613a9457613a93614bc3565b5b6000613aa284828501613786565b91505092915050565b600060208284031215613ac157613ac0614bc3565b5b6000613acf8482850161379b565b91505092915050565b600060208284031215613aee57613aed614bc3565b5b600082013567ffffffffffffffff811115613b0c57613b0b614bbe565b5b613b18848285016137de565b91505092915050565b600060208284031215613b3757613b36614bc3565b5b6000613b458482850161380c565b91505092915050565b60008060408385031215613b6557613b64614bc3565b5b6000613b738582860161380c565b9250506020613b8485828601613732565b9150509250929050565b613b978161491b565b82525050565b613ba68161488b565b82525050565b613bb5816148af565b82525050565b613bc4816148bb565b82525050565b6000613bd582614728565b613bdf818561473e565b9350613bef818560208601614960565b613bf881614bc8565b840191505092915050565b6000613c0e82614733565b613c18818561475a565b9350613c28818560208601614960565b613c3181614bc8565b840191505092915050565b6000613c4782614733565b613c51818561476b565b9350613c61818560208601614960565b80840191505092915050565b6000613c7a60208361475a565b9150613c8582614bd9565b602082019050919050565b6000613c9d60138361475a565b9150613ca882614c02565b602082019050919050565b6000613cc0602b8361475a565b9150613ccb82614c2b565b604082019050919050565b6000613ce360328361475a565b9150613cee82614c7a565b604082019050919050565b6000613d0660268361475a565b9150613d1182614cc9565b604082019050919050565b6000613d29601c8361475a565b9150613d3482614d18565b602082019050919050565b6000613d4c60268361475a565b9150613d5782614d41565b604082019050919050565b6000613d6f60248361475a565b9150613d7a82614d90565b604082019050919050565b6000613d9260198361475a565b9150613d9d82614ddf565b602082019050919050565b6000613db5603a8361475a565b9150613dc082614e08565b604082019050919050565b6000613dd8601d8361475a565b9150613de382614e57565b602082019050919050565b6000613dfb602c8361475a565b9150613e0682614e80565b604082019050919050565b6000613e1e602b8361475a565b9150613e2982614ecf565b604082019050919050565b6000613e4160168361475a565b9150613e4c82614f1e565b602082019050919050565b6000613e6460388361475a565b9150613e6f82614f47565b604082019050919050565b6000613e87602a8361475a565b9150613e9282614f96565b604082019050919050565b6000613eaa60298361475a565b9150613eb582614fe5565b604082019050919050565b6000613ecd60148361475a565b9150613ed882615034565b602082019050919050565b6000613ef060198361475a565b9150613efb8261505d565b602082019050919050565b6000613f1360208361475a565b9150613f1e82615086565b602082019050919050565b6000613f36602c8361475a565b9150613f41826150af565b604082019050919050565b6000613f5960208361475a565b9150613f64826150fe565b602082019050919050565b6000613f7c60298361475a565b9150613f8782615127565b604082019050919050565b6000613f9f602f8361475a565b9150613faa82615176565b604082019050919050565b6000613fc260138361475a565b9150613fcd826151c5565b602082019050919050565b6000613fe560218361475a565b9150613ff0826151ee565b604082019050919050565b600061400860118361475a565b91506140138261523d565b602082019050919050565b600061402b60008361474f565b915061403682615266565b600082019050919050565b600061404e60318361475a565b915061405982615269565b604082019050919050565b6000614071602c8361475a565b915061407c826152b8565b604082019050919050565b600061409460178361476b565b915061409f82615307565b601782019050919050565b60006140b760308361475a565b91506140c282615330565b604082019050919050565b60006140da60118361476b565b91506140e58261537f565b601182019050919050565b60006140fd602f8361475a565b9150614108826153a8565b604082019050919050565b61411c81614911565b82525050565b600061412e8285613c3c565b915061413a8284613c3c565b91508190509392505050565b60006141518261401e565b9150819050919050565b600061416682614087565b91506141728285613c3c565b915061417d826140cd565b91506141898284613c3c565b91508190509392505050565b60006020820190506141aa6000830184613b9d565b92915050565b60006040820190506141c56000830185613b8e565b6141d26020830184614113565b9392505050565b60006080820190506141ee6000830187613b9d565b6141fb6020830186613b9d565b6142086040830185614113565b818103606083015261421a8184613bca565b905095945050505050565b600060408201905061423a6000830185613b9d565b6142476020830184614113565b9392505050565b60006020820190506142636000830184613bac565b92915050565b600060208201905061427e6000830184613bbb565b92915050565b6000602082019050818103600083015261429e8184613c03565b905092915050565b600060208201905081810360008301526142bf81613c6d565b9050919050565b600060208201905081810360008301526142df81613c90565b9050919050565b600060208201905081810360008301526142ff81613cb3565b9050919050565b6000602082019050818103600083015261431f81613cd6565b9050919050565b6000602082019050818103600083015261433f81613cf9565b9050919050565b6000602082019050818103600083015261435f81613d1c565b9050919050565b6000602082019050818103600083015261437f81613d3f565b9050919050565b6000602082019050818103600083015261439f81613d62565b9050919050565b600060208201905081810360008301526143bf81613d85565b9050919050565b600060208201905081810360008301526143df81613da8565b9050919050565b600060208201905081810360008301526143ff81613dcb565b9050919050565b6000602082019050818103600083015261441f81613dee565b9050919050565b6000602082019050818103600083015261443f81613e11565b9050919050565b6000602082019050818103600083015261445f81613e34565b9050919050565b6000602082019050818103600083015261447f81613e57565b9050919050565b6000602082019050818103600083015261449f81613e7a565b9050919050565b600060208201905081810360008301526144bf81613e9d565b9050919050565b600060208201905081810360008301526144df81613ec0565b9050919050565b600060208201905081810360008301526144ff81613ee3565b9050919050565b6000602082019050818103600083015261451f81613f06565b9050919050565b6000602082019050818103600083015261453f81613f29565b9050919050565b6000602082019050818103600083015261455f81613f4c565b9050919050565b6000602082019050818103600083015261457f81613f6f565b9050919050565b6000602082019050818103600083015261459f81613f92565b9050919050565b600060208201905081810360008301526145bf81613fb5565b9050919050565b600060208201905081810360008301526145df81613fd8565b9050919050565b600060208201905081810360008301526145ff81613ffb565b9050919050565b6000602082019050818103600083015261461f81614041565b9050919050565b6000602082019050818103600083015261463f81614064565b9050919050565b6000602082019050818103600083015261465f816140aa565b9050919050565b6000602082019050818103600083015261467f816140f0565b9050919050565b600060208201905061469b6000830184614113565b92915050565b60006146ab6146bc565b90506146b782826149ef565b919050565b6000604051905090565b600067ffffffffffffffff8211156146e1576146e0614b85565b5b6146ea82614bc8565b9050602081019050919050565b600067ffffffffffffffff82111561471257614711614b85565b5b61471b82614bc8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061478182614911565b915061478c83614911565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147c1576147c0614a9a565b5b828201905092915050565b60006147d782614911565b91506147e283614911565b9250826147f2576147f1614ac9565b5b828204905092915050565b600061480882614911565b915061481383614911565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561484c5761484b614a9a565b5b828202905092915050565b600061486282614911565b915061486d83614911565b9250828210156148805761487f614a9a565b5b828203905092915050565b6000614896826148f1565b9050919050565b60006148a8826148f1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149268261492d565b9050919050565b60006149388261493f565b9050919050565b600061494a826148f1565b9050919050565b82818337600083830152505050565b60005b8381101561497e578082015181840152602081019050614963565b8381111561498d576000848401525b50505050565b600061499e82614911565b915060008214156149b2576149b1614a9a565b5b600182039050919050565b600060028204905060018216806149d557607f821691505b602082108114156149e9576149e8614af8565b5b50919050565b6149f882614bc8565b810181811067ffffffffffffffff82111715614a1757614a16614b85565b5b80604052505050565b6000614a2b82614911565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a5e57614a5d614a9a565b5b600182019050919050565b6000614a7482614911565b9150614a7f83614911565b925082614a8f57614a8e614ac9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4d7573742062652067726561746572207468616e203000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f56616c7565206973206e6f7420636f7272656374000000000000000000000000600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e206d617800000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732061646d696e206d6178000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6154008161488b565b811461540b57600080fd5b50565b6154178161489d565b811461542257600080fd5b50565b61542e816148af565b811461543957600080fd5b50565b615445816148bb565b811461545057600080fd5b50565b61545c816148c5565b811461546757600080fd5b50565b61547381614911565b811461547e57600080fd5b5056fea264697066735822122037ac090e5401c7ea48608c6dd29ccc8788abacea7ebc51d82e7451dfe0ddd84d64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f9f6ed9ee9b263fc6ce7578bdde7c261d0a6a34000000000000000000000000d06d855652a73e61bfe26a3427dfe51f3b827fe30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000005

-----Decoded View---------------
Arg [0] : _payees (address[]): 0x0F9f6ed9EE9B263Fc6Ce7578bdde7c261D0A6a34,0xD06D855652A73E61Bfe26A3427Dfe51f3b827fe3
Arg [1] : _shares (uint256[]): 95,5

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000000f9f6ed9ee9b263fc6ce7578bdde7c261d0a6a34
Arg [4] : 000000000000000000000000d06d855652a73e61bfe26a3427dfe51f3b827fe3
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 000000000000000000000000000000000000000000000000000000000000005f
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005


Deployed Bytecode Sourcemap

1174:3427:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2635:40:15;2651:12;:10;:12::i;:::-;2665:9;2635:40;;;;;;;:::i;:::-;;;;;;;;1174:3427:13;;;;;4379:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1534:111:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3799:600:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4724:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3882:121:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4253:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1210:253:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1413:42:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5270:214:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2760:89:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5120:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;437:241:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1717:230:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2746:482:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2606:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2052:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1790:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:14;;;;;;;;;;;;;:::i;:::-;;1279:60:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3507:98:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1345:49:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;966:85:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2799:137:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3314:107:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3258:346:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1917:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4144:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5365:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1568:36:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2679:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3117:103:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4632:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2491:109:13;;;;;;;;;;;;;:::i;:::-;;2938:93:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;587:96:2;640:7;666:10;659:17;;587:96;:::o;4379:220:13:-;4529:4;4556:36;4580:11;4556:23;:36::i;:::-;4549:43;;4379:220;;;:::o;2349:98:4:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;1534:111:6:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;3799:600:15:-;3893:1;3874:7;:16;3882:7;3874:16;;;;;;;;;;;;;;;;:20;3866:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3948:21;3996:14;;3972:21;:38;;;;:::i;:::-;3948:62;;4020:15;4090:9;:18;4100:7;4090:18;;;;;;;;;;;;;;;;4075:12;;4055:7;:16;4063:7;4055:16;;;;;;;;;;;;;;;;4039:13;:32;;;;:::i;:::-;4038:49;;;;:::i;:::-;:70;;;;:::i;:::-;4020:88;;4138:1;4127:7;:12;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4240:7;4219:9;:18;4229:7;4219:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;4198:9;:18;4208:7;4198:18;;;;;;;;;;;;;;;:49;;;;4291:7;4274:14;;:24;;;;:::i;:::-;4257:14;:41;;;;4309:35;4327:7;4336;4309:17;:35::i;:::-;4359:33;4375:7;4384;4359:33;;;;;;;:::i;:::-;;;;;;;;3856:543;;3799:600;:::o;4724:330:4:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;3882:121:0:-;3948:7;3974:6;:12;3981:4;3974:12;;;;;;;;;;;:22;;;3967:29;;3882:121;;;:::o;4253:145::-;4336:18;4349:4;4336:12;:18::i;:::-;2395:30;2406:4;2412:12;:10;:12::i;:::-;2395:10;:30::i;:::-;4366:25:::1;4377:4;4383:7;4366:10;:25::i;:::-;4253:145:::0;;;:::o;1210:253:6:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;1413:42:13:-;1450:5;1413:42;:::o;5270:214:0:-;5376:12;:10;:12::i;:::-;5365:23;;:7;:23;;;5357:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5451:26;5463:4;5469:7;5451:11;:26::i;:::-;5270:214;;:::o;2760:89:15:-;2804:7;2830:12;;2823:19;;2760:89;:::o;5120:179:4:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;437:241:5:-;553:41;572:12;:10;:12::i;:::-;586:7;553:18;:41::i;:::-;545:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;657:14;663:7;657:5;:14::i;:::-;437:241;:::o;1717:230:6:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;;1916:24;;1717:230;;;:::o;2746:482:13:-;1316:23;2395:30:0;2406:4;2412:12;:10;:12::i;:::-;2395:10;:30::i;:::-;2895:1:13::1;2878:14;:18;2870:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:3;2976:14;2955:18;;:35;;;;:::i;:::-;2954:57;;2933:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;3073:18;3094;;3073:39;;3144:14;3122:18;;:36;;;;;;;:::i;:::-;;;;;;;;3177:44;3183:14;3199:9;3210:10;3177:5;:44::i;:::-;2860:368;2746:482:::0;;;:::o;2606:134::-;1316:23;2395:30:0;2406:4;2412:12;:10;:12::i;:::-;2395:10;:30::i;:::-;2726:7:13::1;2707:16;:26;;;;;;;;;;;;:::i;:::-;;2606:134:::0;;:::o;2052:235:4:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;1790:205::-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:14:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;1279:60:13:-;1316:23;1279:60;:::o;3507:98:15:-;3558:7;3584;3592:5;3584:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3577:21;;3507:98;;;:::o;1345:49:13:-;1377:17;1345:49;:::o;966:85:14:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;2799:137:0:-;2877:4;2900:6;:12;2907:4;2900:12;;;;;;;;;;;:20;;:29;2921:7;2900:29;;;;;;;;;;;;;;;;;;;;;;;;;2893:36;;2799:137;;;;:::o;2511:102:4:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;3314:107:15:-;3370:7;3396:9;:18;3406:7;3396:18;;;;;;;;;;;;;;;;3389:25;;3314:107;;;:::o;3258:346:13:-;3347:14;2092:1;2075:14;:18;2067:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1559:2;2138:14;:30;;2130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1450:5;2252:14;2230:19;;:36;;;;:::i;:::-;2229:52;;2208:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;2394:9;2357:33;2375:14;2357:17;:33::i;:::-;:46;2336:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;3405:4:::1;3385:24;;:16;;;;;;;;;;;:24;;;3377:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3444:18;3465:19;;3444:40;;3517:14;3494:19;;:37;;;;;;;:::i;:::-;;;;;;;;3550:47;3556:14;3572:12;:10;:12::i;:::-;3586:10;3550:5;:47::i;:::-;3367:237;3258:346:::0;;:::o;1917:49:0:-;1962:4;1917:49;;;:::o;4144:290:4:-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;5365:320::-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;1568:36:13:-;;;;;;;;;;;;;:::o;2679:329:4:-;2752:13;2785:16;2793:7;2785;:16::i;:::-;2777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:86;;;;;;;;;;;;;;;;;2967:7;2976:18;:7;:16;:18::i;:::-;2950:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:86;2908:93;;;2679:329;;;:::o;3117:103:15:-;3171:7;3197;:16;3205:7;3197:16;;;;;;;;;;;;;;;;3190:23;;3117:103;;;:::o;4632:147:0:-;4716:18;4729:4;4716:12;:18::i;:::-;2395:30;2406:4;2412:12;:10;:12::i;:::-;2395:10;:30::i;:::-;4746:26:::1;4758:4;4764:7;4746:11;:26::i;:::-;4632:147:::0;;;:::o;2491:109:13:-;1316:23;2395:30:0;2406:4;2412:12;:10;:12::i;:::-;2395:10;:30::i;:::-;2577:16:13::1;;;;;;;;;;;2576:17;2557:16;;:36;;;;;;;;;;;;;;;;;;2491:109:::0;:::o;2938:93:15:-;2984:7;3010:14;;3003:21;;2938:93;:::o;4500:162:4:-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;1839:189:14:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;2510:202:0:-;2595:4;2633:32;2618:47;;;:11;:47;;;;:87;;;;2669:36;2693:11;2669:23;:36::i;:::-;2618:87;2611:94;;2510:202;;;:::o;7157:125:4:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;11008:171::-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;2012:312:1:-;2126:6;2101:21;:31;;2093:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2178:12;2196:9;:14;;2218:6;2196:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2177:52;;;2247:7;2239:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2083:241;2012:312;;:::o;7440:344:4:-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;3217:484:0:-;3297:22;3305:4;3311:7;3297;:22::i;:::-;3292:403;;3480:41;3508:7;3480:41;;3518:2;3480:19;:41::i;:::-;3592:38;3620:4;3612:13;;3627:2;3592:19;:38::i;:::-;3387:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3335:349;;;;;;;;;;;:::i;:::-;;;;;;;;3292:403;3217:484;;:::o;6537:224::-;6611:22;6619:4;6625:7;6611;:22::i;:::-;6606:149;;6681:4;6649:6;:12;6656:4;6649:12;;;;;;;;;;;:20;;:29;6670:7;6649:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;6731:12;:10;:12::i;:::-;6704:40;;6722:7;6704:40;;6716:4;6704:40;;;;;;;;;;6606:149;6537:224;;:::o;6767:225::-;6841:22;6849:4;6855:7;6841;:22::i;:::-;6837:149;;;6911:5;6879:6;:12;6886:4;6879:12;;;;;;;;;;;:20;;:29;6900:7;6879:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;6962:12;:10;:12::i;:::-;6935:40;;6953:7;6935:40;;6947:4;6935:40;;;;;;;;;;6837:149;6767:225;;:::o;9665:348:4:-;9724:13;9740:23;9755:7;9740:14;:23::i;:::-;9724:39;;9774:48;9795:5;9810:1;9814:7;9774:20;:48::i;:::-;9860:29;9877:1;9881:7;9860:8;:29::i;:::-;9920:1;9900:9;:16;9910:5;9900:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9938:7;:16;9946:7;9938:16;;;;;;;;;;;;9931:23;;;;;;;;;;;9998:7;9994:1;9970:36;;9979:5;9970:36;;;;;;;;;;;;9714:299;9665:348;:::o;3614:203:13:-;3713:9;3708:103;3732:14;3728:1;:18;3708:103;;;3767:33;3777:6;3798:1;3785:10;:14;;;;:::i;:::-;3767:9;:33::i;:::-;3748:3;;;;;:::i;:::-;;;;3708:103;;;;3614:203;;;:::o;2034:169:14:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;3964:122:13:-;4034:4;1377:17;4057:14;:22;;;;:::i;:::-;4050:29;;3964:122;;;:::o;6547:307:4:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;3839:115:13:-;3899:13;3931:16;3924:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3839:115;:::o;275:703:17:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;909:222:6:-;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;4164:209:13:-;4321:45;4348:4;4354:2;4358:7;4321:26;:45::i;:::-;4164:209;;;:::o;1535:441:17:-;1610:13;1635:19;1680:1;1671:6;1667:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1657:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1635:47;;1692:15;:6;1699:1;1692:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1717;:6;1724:1;1717:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1747:9;1772:1;1763:6;1759:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;1813:12;1834:3;1826:5;:11;1813:25;;;;;;;:::i;:::-;;;;;1801:6;1808:1;1801:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1862:1;1852:11;;;;;1782:3;;;;:::i;:::-;;;1742:132;;;;1900:1;1891:5;:10;1883:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1962:6;1948:21;;;1535:441;;;;:::o;8114:108:4:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;:::-;8114:108;;:::o;11732:778::-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:606;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12193:1;12176:6;:13;:18;12172:266;;;12218:60;;;;;;;;;;:::i;:::-;;;;;;;;12172:266;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;12069:41;;;12059:51;;;:6;:51;;;;12052:58;;;;;11898:606;12489:4;12482:11;;11732:778;;;;;;;:::o;1431:300::-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;2543:572:6:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;8443:311:4:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8443:311;;;:::o;718:377:1:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;13066:122:4:-;;;;:::o;3821:161:6:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5103:289;5069:323;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4680:889;;4599:970;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;:::i;:::-;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3483:143;3409:217;;:::o;9076:372:4:-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:18:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:139::-;1332:5;1370:6;1357:20;1348:29;;1386:33;1413:5;1386:33;:::i;:::-;1286:139;;;;:::o;1431:137::-;1476:5;1514:6;1501:20;1492:29;;1530:32;1556:5;1530:32;:::i;:::-;1431:137;;;;:::o;1574:141::-;1630:5;1661:6;1655:13;1646:22;;1677:32;1703:5;1677:32;:::i;:::-;1574:141;;;;:::o;1734:338::-;1789:5;1838:3;1831:4;1823:6;1819:17;1815:27;1805:122;;1846:79;;:::i;:::-;1805:122;1963:6;1950:20;1988:78;2062:3;2054:6;2047:4;2039:6;2035:17;1988:78;:::i;:::-;1979:87;;1795:277;1734:338;;;;:::o;2092:340::-;2148:5;2197:3;2190:4;2182:6;2178:17;2174:27;2164:122;;2205:79;;:::i;:::-;2164:122;2322:6;2309:20;2347:79;2422:3;2414:6;2407:4;2399:6;2395:17;2347:79;:::i;:::-;2338:88;;2154:278;2092:340;;;;:::o;2438:139::-;2484:5;2522:6;2509:20;2500:29;;2538:33;2565:5;2538:33;:::i;:::-;2438:139;;;;:::o;2583:329::-;2642:6;2691:2;2679:9;2670:7;2666:23;2662:32;2659:119;;;2697:79;;:::i;:::-;2659:119;2817:1;2842:53;2887:7;2878:6;2867:9;2863:22;2842:53;:::i;:::-;2832:63;;2788:117;2583:329;;;;:::o;2918:345::-;2985:6;3034:2;3022:9;3013:7;3009:23;3005:32;3002:119;;;3040:79;;:::i;:::-;3002:119;3160:1;3185:61;3238:7;3229:6;3218:9;3214:22;3185:61;:::i;:::-;3175:71;;3131:125;2918:345;;;;:::o;3269:474::-;3337:6;3345;3394:2;3382:9;3373:7;3369:23;3365:32;3362:119;;;3400:79;;:::i;:::-;3362:119;3520:1;3545:53;3590:7;3581:6;3570:9;3566:22;3545:53;:::i;:::-;3535:63;;3491:117;3647:2;3673:53;3718:7;3709:6;3698:9;3694:22;3673:53;:::i;:::-;3663:63;;3618:118;3269:474;;;;;:::o;3749:619::-;3826:6;3834;3842;3891:2;3879:9;3870:7;3866:23;3862:32;3859:119;;;3897:79;;:::i;:::-;3859:119;4017:1;4042:53;4087:7;4078:6;4067:9;4063:22;4042:53;:::i;:::-;4032:63;;3988:117;4144:2;4170:53;4215:7;4206:6;4195:9;4191:22;4170:53;:::i;:::-;4160:63;;4115:118;4272:2;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;:::i;:::-;4288:63;;4243:118;3749:619;;;;;:::o;4374:943::-;4469:6;4477;4485;4493;4542:3;4530:9;4521:7;4517:23;4513:33;4510:120;;;4549:79;;:::i;:::-;4510:120;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;5080:2;5069:9;5065:18;5052:32;5111:18;5103:6;5100:30;5097:117;;;5133:79;;:::i;:::-;5097:117;5238:62;5292:7;5283:6;5272:9;5268:22;5238:62;:::i;:::-;5228:72;;5023:287;4374:943;;;;;;;:::o;5323:468::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:50;5766:7;5757:6;5746:9;5742:22;5724:50;:::i;:::-;5714:60;;5669:115;5323:468;;;;;:::o;5797:474::-;5865:6;5873;5922:2;5910:9;5901:7;5897:23;5893:32;5890:119;;;5928:79;;:::i;:::-;5890:119;6048:1;6073:53;6118:7;6109:6;6098:9;6094:22;6073:53;:::i;:::-;6063:63;;6019:117;6175:2;6201:53;6246:7;6237:6;6226:9;6222:22;6201:53;:::i;:::-;6191:63;;6146:118;5797:474;;;;;:::o;6277:329::-;6336:6;6385:2;6373:9;6364:7;6360:23;6356:32;6353:119;;;6391:79;;:::i;:::-;6353:119;6511:1;6536:53;6581:7;6572:6;6561:9;6557:22;6536:53;:::i;:::-;6526:63;;6482:117;6277:329;;;;:::o;6612:474::-;6680:6;6688;6737:2;6725:9;6716:7;6712:23;6708:32;6705:119;;;6743:79;;:::i;:::-;6705:119;6863:1;6888:53;6933:7;6924:6;6913:9;6909:22;6888:53;:::i;:::-;6878:63;;6834:117;6990:2;7016:53;7061:7;7052:6;7041:9;7037:22;7016:53;:::i;:::-;7006:63;;6961:118;6612:474;;;;;:::o;7092:327::-;7150:6;7199:2;7187:9;7178:7;7174:23;7170:32;7167:119;;;7205:79;;:::i;:::-;7167:119;7325:1;7350:52;7394:7;7385:6;7374:9;7370:22;7350:52;:::i;:::-;7340:62;;7296:116;7092:327;;;;:::o;7425:349::-;7494:6;7543:2;7531:9;7522:7;7518:23;7514:32;7511:119;;;7549:79;;:::i;:::-;7511:119;7669:1;7694:63;7749:7;7740:6;7729:9;7725:22;7694:63;:::i;:::-;7684:73;;7640:127;7425:349;;;;:::o;7780:509::-;7849:6;7898:2;7886:9;7877:7;7873:23;7869:32;7866:119;;;7904:79;;:::i;:::-;7866:119;8052:1;8041:9;8037:17;8024:31;8082:18;8074:6;8071:30;8068:117;;;8104:79;;:::i;:::-;8068:117;8209:63;8264:7;8255:6;8244:9;8240:22;8209:63;:::i;:::-;8199:73;;7995:287;7780:509;;;;:::o;8295:329::-;8354:6;8403:2;8391:9;8382:7;8378:23;8374:32;8371:119;;;8409:79;;:::i;:::-;8371:119;8529:1;8554:53;8599:7;8590:6;8579:9;8575:22;8554:53;:::i;:::-;8544:63;;8500:117;8295:329;;;;:::o;8630:474::-;8698:6;8706;8755:2;8743:9;8734:7;8730:23;8726:32;8723:119;;;8761:79;;:::i;:::-;8723:119;8881:1;8906:53;8951:7;8942:6;8931:9;8927:22;8906:53;:::i;:::-;8896:63;;8852:117;9008:2;9034:53;9079:7;9070:6;9059:9;9055:22;9034:53;:::i;:::-;9024:63;;8979:118;8630:474;;;;;:::o;9110:147::-;9205:45;9244:5;9205:45;:::i;:::-;9200:3;9193:58;9110:147;;:::o;9263:118::-;9350:24;9368:5;9350:24;:::i;:::-;9345:3;9338:37;9263:118;;:::o;9387:109::-;9468:21;9483:5;9468:21;:::i;:::-;9463:3;9456:34;9387:109;;:::o;9502:118::-;9589:24;9607:5;9589:24;:::i;:::-;9584:3;9577:37;9502:118;;:::o;9626:360::-;9712:3;9740:38;9772:5;9740:38;:::i;:::-;9794:70;9857:6;9852:3;9794:70;:::i;:::-;9787:77;;9873:52;9918:6;9913:3;9906:4;9899:5;9895:16;9873:52;:::i;:::-;9950:29;9972:6;9950:29;:::i;:::-;9945:3;9941:39;9934:46;;9716:270;9626:360;;;;:::o;9992:364::-;10080:3;10108:39;10141:5;10108:39;:::i;:::-;10163:71;10227:6;10222:3;10163:71;:::i;:::-;10156:78;;10243:52;10288:6;10283:3;10276:4;10269:5;10265:16;10243:52;:::i;:::-;10320:29;10342:6;10320:29;:::i;:::-;10315:3;10311:39;10304:46;;10084:272;9992:364;;;;:::o;10362:377::-;10468:3;10496:39;10529:5;10496:39;:::i;:::-;10551:89;10633:6;10628:3;10551:89;:::i;:::-;10544:96;;10649:52;10694:6;10689:3;10682:4;10675:5;10671:16;10649:52;:::i;:::-;10726:6;10721:3;10717:16;10710:23;;10472:267;10362:377;;;;:::o;10745:366::-;10887:3;10908:67;10972:2;10967:3;10908:67;:::i;:::-;10901:74;;10984:93;11073:3;10984:93;:::i;:::-;11102:2;11097:3;11093:12;11086:19;;10745:366;;;:::o;11117:::-;11259:3;11280:67;11344:2;11339:3;11280:67;:::i;:::-;11273:74;;11356:93;11445:3;11356:93;:::i;:::-;11474:2;11469:3;11465:12;11458:19;;11117:366;;;:::o;11489:::-;11631:3;11652:67;11716:2;11711:3;11652:67;:::i;:::-;11645:74;;11728:93;11817:3;11728:93;:::i;:::-;11846:2;11841:3;11837:12;11830:19;;11489:366;;;:::o;11861:::-;12003:3;12024:67;12088:2;12083:3;12024:67;:::i;:::-;12017:74;;12100:93;12189:3;12100:93;:::i;:::-;12218:2;12213:3;12209:12;12202:19;;11861:366;;;:::o;12233:::-;12375:3;12396:67;12460:2;12455:3;12396:67;:::i;:::-;12389:74;;12472:93;12561:3;12472:93;:::i;:::-;12590:2;12585:3;12581:12;12574:19;;12233:366;;;:::o;12605:::-;12747:3;12768:67;12832:2;12827:3;12768:67;:::i;:::-;12761:74;;12844:93;12933:3;12844:93;:::i;:::-;12962:2;12957:3;12953:12;12946:19;;12605:366;;;:::o;12977:::-;13119:3;13140:67;13204:2;13199:3;13140:67;:::i;:::-;13133:74;;13216:93;13305:3;13216:93;:::i;:::-;13334:2;13329:3;13325:12;13318:19;;12977:366;;;:::o;13349:::-;13491:3;13512:67;13576:2;13571:3;13512:67;:::i;:::-;13505:74;;13588:93;13677:3;13588:93;:::i;:::-;13706:2;13701:3;13697:12;13690:19;;13349:366;;;:::o;13721:::-;13863:3;13884:67;13948:2;13943:3;13884:67;:::i;:::-;13877:74;;13960:93;14049:3;13960:93;:::i;:::-;14078:2;14073:3;14069:12;14062:19;;13721:366;;;:::o;14093:::-;14235:3;14256:67;14320:2;14315:3;14256:67;:::i;:::-;14249:74;;14332:93;14421:3;14332:93;:::i;:::-;14450:2;14445:3;14441:12;14434:19;;14093:366;;;:::o;14465:::-;14607:3;14628:67;14692:2;14687:3;14628:67;:::i;:::-;14621:74;;14704:93;14793:3;14704:93;:::i;:::-;14822:2;14817:3;14813:12;14806:19;;14465:366;;;:::o;14837:::-;14979:3;15000:67;15064:2;15059:3;15000:67;:::i;:::-;14993:74;;15076:93;15165:3;15076:93;:::i;:::-;15194:2;15189:3;15185:12;15178:19;;14837:366;;;:::o;15209:::-;15351:3;15372:67;15436:2;15431:3;15372:67;:::i;:::-;15365:74;;15448:93;15537:3;15448:93;:::i;:::-;15566:2;15561:3;15557:12;15550:19;;15209:366;;;:::o;15581:::-;15723:3;15744:67;15808:2;15803:3;15744:67;:::i;:::-;15737:74;;15820:93;15909:3;15820:93;:::i;:::-;15938:2;15933:3;15929:12;15922:19;;15581:366;;;:::o;15953:::-;16095:3;16116:67;16180:2;16175:3;16116:67;:::i;:::-;16109:74;;16192:93;16281:3;16192:93;:::i;:::-;16310:2;16305:3;16301:12;16294:19;;15953:366;;;:::o;16325:::-;16467:3;16488:67;16552:2;16547:3;16488:67;:::i;:::-;16481:74;;16564:93;16653:3;16564:93;:::i;:::-;16682:2;16677:3;16673:12;16666:19;;16325:366;;;:::o;16697:::-;16839:3;16860:67;16924:2;16919:3;16860:67;:::i;:::-;16853:74;;16936:93;17025:3;16936:93;:::i;:::-;17054:2;17049:3;17045:12;17038:19;;16697:366;;;:::o;17069:::-;17211:3;17232:67;17296:2;17291:3;17232:67;:::i;:::-;17225:74;;17308:93;17397:3;17308:93;:::i;:::-;17426:2;17421:3;17417:12;17410:19;;17069:366;;;:::o;17441:::-;17583:3;17604:67;17668:2;17663:3;17604:67;:::i;:::-;17597:74;;17680:93;17769:3;17680:93;:::i;:::-;17798:2;17793:3;17789:12;17782:19;;17441:366;;;:::o;17813:::-;17955:3;17976:67;18040:2;18035:3;17976:67;:::i;:::-;17969:74;;18052:93;18141:3;18052:93;:::i;:::-;18170:2;18165:3;18161:12;18154:19;;17813:366;;;:::o;18185:::-;18327:3;18348:67;18412:2;18407:3;18348:67;:::i;:::-;18341:74;;18424:93;18513:3;18424:93;:::i;:::-;18542:2;18537:3;18533:12;18526:19;;18185:366;;;:::o;18557:::-;18699:3;18720:67;18784:2;18779:3;18720:67;:::i;:::-;18713:74;;18796:93;18885:3;18796:93;:::i;:::-;18914:2;18909:3;18905:12;18898:19;;18557:366;;;:::o;18929:::-;19071:3;19092:67;19156:2;19151:3;19092:67;:::i;:::-;19085:74;;19168:93;19257:3;19168:93;:::i;:::-;19286:2;19281:3;19277:12;19270:19;;18929:366;;;:::o;19301:::-;19443:3;19464:67;19528:2;19523:3;19464:67;:::i;:::-;19457:74;;19540:93;19629:3;19540:93;:::i;:::-;19658:2;19653:3;19649:12;19642:19;;19301:366;;;:::o;19673:::-;19815:3;19836:67;19900:2;19895:3;19836:67;:::i;:::-;19829:74;;19912:93;20001:3;19912:93;:::i;:::-;20030:2;20025:3;20021:12;20014:19;;19673:366;;;:::o;20045:::-;20187:3;20208:67;20272:2;20267:3;20208:67;:::i;:::-;20201:74;;20284:93;20373:3;20284:93;:::i;:::-;20402:2;20397:3;20393:12;20386:19;;20045:366;;;:::o;20417:::-;20559:3;20580:67;20644:2;20639:3;20580:67;:::i;:::-;20573:74;;20656:93;20745:3;20656:93;:::i;:::-;20774:2;20769:3;20765:12;20758:19;;20417:366;;;:::o;20789:398::-;20948:3;20969:83;21050:1;21045:3;20969:83;:::i;:::-;20962:90;;21061:93;21150:3;21061:93;:::i;:::-;21179:1;21174:3;21170:11;21163:18;;20789:398;;;:::o;21193:366::-;21335:3;21356:67;21420:2;21415:3;21356:67;:::i;:::-;21349:74;;21432:93;21521:3;21432:93;:::i;:::-;21550:2;21545:3;21541:12;21534:19;;21193:366;;;:::o;21565:::-;21707:3;21728:67;21792:2;21787:3;21728:67;:::i;:::-;21721:74;;21804:93;21893:3;21804:93;:::i;:::-;21922:2;21917:3;21913:12;21906:19;;21565:366;;;:::o;21937:402::-;22097:3;22118:85;22200:2;22195:3;22118:85;:::i;:::-;22111:92;;22212:93;22301:3;22212:93;:::i;:::-;22330:2;22325:3;22321:12;22314:19;;21937:402;;;:::o;22345:366::-;22487:3;22508:67;22572:2;22567:3;22508:67;:::i;:::-;22501:74;;22584:93;22673:3;22584:93;:::i;:::-;22702:2;22697:3;22693:12;22686:19;;22345:366;;;:::o;22717:402::-;22877:3;22898:85;22980:2;22975:3;22898:85;:::i;:::-;22891:92;;22992:93;23081:3;22992:93;:::i;:::-;23110:2;23105:3;23101:12;23094:19;;22717:402;;;:::o;23125:366::-;23267:3;23288:67;23352:2;23347:3;23288:67;:::i;:::-;23281:74;;23364:93;23453:3;23364:93;:::i;:::-;23482:2;23477:3;23473:12;23466:19;;23125:366;;;:::o;23497:118::-;23584:24;23602:5;23584:24;:::i;:::-;23579:3;23572:37;23497:118;;:::o;23621:435::-;23801:3;23823:95;23914:3;23905:6;23823:95;:::i;:::-;23816:102;;23935:95;24026:3;24017:6;23935:95;:::i;:::-;23928:102;;24047:3;24040:10;;23621:435;;;;;:::o;24062:379::-;24246:3;24268:147;24411:3;24268:147;:::i;:::-;24261:154;;24432:3;24425:10;;24062:379;;;:::o;24447:967::-;24829:3;24851:148;24995:3;24851:148;:::i;:::-;24844:155;;25016:95;25107:3;25098:6;25016:95;:::i;:::-;25009:102;;25128:148;25272:3;25128:148;:::i;:::-;25121:155;;25293:95;25384:3;25375:6;25293:95;:::i;:::-;25286:102;;25405:3;25398:10;;24447:967;;;;;:::o;25420:222::-;25513:4;25551:2;25540:9;25536:18;25528:26;;25564:71;25632:1;25621:9;25617:17;25608:6;25564:71;:::i;:::-;25420:222;;;;:::o;25648:348::-;25777:4;25815:2;25804:9;25800:18;25792:26;;25828:79;25904:1;25893:9;25889:17;25880:6;25828:79;:::i;:::-;25917:72;25985:2;25974:9;25970:18;25961:6;25917:72;:::i;:::-;25648:348;;;;;:::o;26002:640::-;26197:4;26235:3;26224:9;26220:19;26212:27;;26249:71;26317:1;26306:9;26302:17;26293:6;26249:71;:::i;:::-;26330:72;26398:2;26387:9;26383:18;26374:6;26330:72;:::i;:::-;26412;26480:2;26469:9;26465:18;26456:6;26412:72;:::i;:::-;26531:9;26525:4;26521:20;26516:2;26505:9;26501:18;26494:48;26559:76;26630:4;26621:6;26559:76;:::i;:::-;26551:84;;26002:640;;;;;;;:::o;26648:332::-;26769:4;26807:2;26796:9;26792:18;26784:26;;26820:71;26888:1;26877:9;26873:17;26864:6;26820:71;:::i;:::-;26901:72;26969:2;26958:9;26954:18;26945:6;26901:72;:::i;:::-;26648:332;;;;;:::o;26986:210::-;27073:4;27111:2;27100:9;27096:18;27088:26;;27124:65;27186:1;27175:9;27171:17;27162:6;27124:65;:::i;:::-;26986:210;;;;:::o;27202:222::-;27295:4;27333:2;27322:9;27318:18;27310:26;;27346:71;27414:1;27403:9;27399:17;27390:6;27346:71;:::i;:::-;27202:222;;;;:::o;27430:313::-;27543:4;27581:2;27570:9;27566:18;27558:26;;27630:9;27624:4;27620:20;27616:1;27605:9;27601:17;27594:47;27658:78;27731:4;27722:6;27658:78;:::i;:::-;27650:86;;27430:313;;;;:::o;27749:419::-;27915:4;27953:2;27942:9;27938:18;27930:26;;28002:9;27996:4;27992:20;27988:1;27977:9;27973:17;27966:47;28030:131;28156:4;28030:131;:::i;:::-;28022:139;;27749:419;;;:::o;28174:::-;28340:4;28378:2;28367:9;28363:18;28355:26;;28427:9;28421:4;28417:20;28413:1;28402:9;28398:17;28391:47;28455:131;28581:4;28455:131;:::i;:::-;28447:139;;28174:419;;;:::o;28599:::-;28765:4;28803:2;28792:9;28788:18;28780:26;;28852:9;28846:4;28842:20;28838:1;28827:9;28823:17;28816:47;28880:131;29006:4;28880:131;:::i;:::-;28872:139;;28599:419;;;:::o;29024:::-;29190:4;29228:2;29217:9;29213:18;29205:26;;29277:9;29271:4;29267:20;29263:1;29252:9;29248:17;29241:47;29305:131;29431:4;29305:131;:::i;:::-;29297:139;;29024:419;;;:::o;29449:::-;29615:4;29653:2;29642:9;29638:18;29630:26;;29702:9;29696:4;29692:20;29688:1;29677:9;29673:17;29666:47;29730:131;29856:4;29730:131;:::i;:::-;29722:139;;29449:419;;;:::o;29874:::-;30040:4;30078:2;30067:9;30063:18;30055:26;;30127:9;30121:4;30117:20;30113:1;30102:9;30098:17;30091:47;30155:131;30281:4;30155:131;:::i;:::-;30147:139;;29874:419;;;:::o;30299:::-;30465:4;30503:2;30492:9;30488:18;30480:26;;30552:9;30546:4;30542:20;30538:1;30527:9;30523:17;30516:47;30580:131;30706:4;30580:131;:::i;:::-;30572:139;;30299:419;;;:::o;30724:::-;30890:4;30928:2;30917:9;30913:18;30905:26;;30977:9;30971:4;30967:20;30963:1;30952:9;30948:17;30941:47;31005:131;31131:4;31005:131;:::i;:::-;30997:139;;30724:419;;;:::o;31149:::-;31315:4;31353:2;31342:9;31338:18;31330:26;;31402:9;31396:4;31392:20;31388:1;31377:9;31373:17;31366:47;31430:131;31556:4;31430:131;:::i;:::-;31422:139;;31149:419;;;:::o;31574:::-;31740:4;31778:2;31767:9;31763:18;31755:26;;31827:9;31821:4;31817:20;31813:1;31802:9;31798:17;31791:47;31855:131;31981:4;31855:131;:::i;:::-;31847:139;;31574:419;;;:::o;31999:::-;32165:4;32203:2;32192:9;32188:18;32180:26;;32252:9;32246:4;32242:20;32238:1;32227:9;32223:17;32216:47;32280:131;32406:4;32280:131;:::i;:::-;32272:139;;31999:419;;;:::o;32424:::-;32590:4;32628:2;32617:9;32613:18;32605:26;;32677:9;32671:4;32667:20;32663:1;32652:9;32648:17;32641:47;32705:131;32831:4;32705:131;:::i;:::-;32697:139;;32424:419;;;:::o;32849:::-;33015:4;33053:2;33042:9;33038:18;33030:26;;33102:9;33096:4;33092:20;33088:1;33077:9;33073:17;33066:47;33130:131;33256:4;33130:131;:::i;:::-;33122:139;;32849:419;;;:::o;33274:::-;33440:4;33478:2;33467:9;33463:18;33455:26;;33527:9;33521:4;33517:20;33513:1;33502:9;33498:17;33491:47;33555:131;33681:4;33555:131;:::i;:::-;33547:139;;33274:419;;;:::o;33699:::-;33865:4;33903:2;33892:9;33888:18;33880:26;;33952:9;33946:4;33942:20;33938:1;33927:9;33923:17;33916:47;33980:131;34106:4;33980:131;:::i;:::-;33972:139;;33699:419;;;:::o;34124:::-;34290:4;34328:2;34317:9;34313:18;34305:26;;34377:9;34371:4;34367:20;34363:1;34352:9;34348:17;34341:47;34405:131;34531:4;34405:131;:::i;:::-;34397:139;;34124:419;;;:::o;34549:::-;34715:4;34753:2;34742:9;34738:18;34730:26;;34802:9;34796:4;34792:20;34788:1;34777:9;34773:17;34766:47;34830:131;34956:4;34830:131;:::i;:::-;34822:139;;34549:419;;;:::o;34974:::-;35140:4;35178:2;35167:9;35163:18;35155:26;;35227:9;35221:4;35217:20;35213:1;35202:9;35198:17;35191:47;35255:131;35381:4;35255:131;:::i;:::-;35247:139;;34974:419;;;:::o;35399:::-;35565:4;35603:2;35592:9;35588:18;35580:26;;35652:9;35646:4;35642:20;35638:1;35627:9;35623:17;35616:47;35680:131;35806:4;35680:131;:::i;:::-;35672:139;;35399:419;;;:::o;35824:::-;35990:4;36028:2;36017:9;36013:18;36005:26;;36077:9;36071:4;36067:20;36063:1;36052:9;36048:17;36041:47;36105:131;36231:4;36105:131;:::i;:::-;36097:139;;35824:419;;;:::o;36249:::-;36415:4;36453:2;36442:9;36438:18;36430:26;;36502:9;36496:4;36492:20;36488:1;36477:9;36473:17;36466:47;36530:131;36656:4;36530:131;:::i;:::-;36522:139;;36249:419;;;:::o;36674:::-;36840:4;36878:2;36867:9;36863:18;36855:26;;36927:9;36921:4;36917:20;36913:1;36902:9;36898:17;36891:47;36955:131;37081:4;36955:131;:::i;:::-;36947:139;;36674:419;;;:::o;37099:::-;37265:4;37303:2;37292:9;37288:18;37280:26;;37352:9;37346:4;37342:20;37338:1;37327:9;37323:17;37316:47;37380:131;37506:4;37380:131;:::i;:::-;37372:139;;37099:419;;;:::o;37524:::-;37690:4;37728:2;37717:9;37713:18;37705:26;;37777:9;37771:4;37767:20;37763:1;37752:9;37748:17;37741:47;37805:131;37931:4;37805:131;:::i;:::-;37797:139;;37524:419;;;:::o;37949:::-;38115:4;38153:2;38142:9;38138:18;38130:26;;38202:9;38196:4;38192:20;38188:1;38177:9;38173:17;38166:47;38230:131;38356:4;38230:131;:::i;:::-;38222:139;;37949:419;;;:::o;38374:::-;38540:4;38578:2;38567:9;38563:18;38555:26;;38627:9;38621:4;38617:20;38613:1;38602:9;38598:17;38591:47;38655:131;38781:4;38655:131;:::i;:::-;38647:139;;38374:419;;;:::o;38799:::-;38965:4;39003:2;38992:9;38988:18;38980:26;;39052:9;39046:4;39042:20;39038:1;39027:9;39023:17;39016:47;39080:131;39206:4;39080:131;:::i;:::-;39072:139;;38799:419;;;:::o;39224:::-;39390:4;39428:2;39417:9;39413:18;39405:26;;39477:9;39471:4;39467:20;39463:1;39452:9;39448:17;39441:47;39505:131;39631:4;39505:131;:::i;:::-;39497:139;;39224:419;;;:::o;39649:::-;39815:4;39853:2;39842:9;39838:18;39830:26;;39902:9;39896:4;39892:20;39888:1;39877:9;39873:17;39866:47;39930:131;40056:4;39930:131;:::i;:::-;39922:139;;39649:419;;;:::o;40074:::-;40240:4;40278:2;40267:9;40263:18;40255:26;;40327:9;40321:4;40317:20;40313:1;40302:9;40298:17;40291:47;40355:131;40481:4;40355:131;:::i;:::-;40347:139;;40074:419;;;:::o;40499:::-;40665:4;40703:2;40692:9;40688:18;40680:26;;40752:9;40746:4;40742:20;40738:1;40727:9;40723:17;40716:47;40780:131;40906:4;40780:131;:::i;:::-;40772:139;;40499:419;;;:::o;40924:222::-;41017:4;41055:2;41044:9;41040:18;41032:26;;41068:71;41136:1;41125:9;41121:17;41112:6;41068:71;:::i;:::-;40924:222;;;;:::o;41152:129::-;41186:6;41213:20;;:::i;:::-;41203:30;;41242:33;41270:4;41262:6;41242:33;:::i;:::-;41152:129;;;:::o;41287:75::-;41320:6;41353:2;41347:9;41337:19;;41287:75;:::o;41368:307::-;41429:4;41519:18;41511:6;41508:30;41505:56;;;41541:18;;:::i;:::-;41505:56;41579:29;41601:6;41579:29;:::i;:::-;41571:37;;41663:4;41657;41653:15;41645:23;;41368:307;;;:::o;41681:308::-;41743:4;41833:18;41825:6;41822:30;41819:56;;;41855:18;;:::i;:::-;41819:56;41893:29;41915:6;41893:29;:::i;:::-;41885:37;;41977:4;41971;41967:15;41959:23;;41681:308;;;:::o;41995:98::-;42046:6;42080:5;42074:12;42064:22;;41995:98;;;:::o;42099:99::-;42151:6;42185:5;42179:12;42169:22;;42099:99;;;:::o;42204:168::-;42287:11;42321:6;42316:3;42309:19;42361:4;42356:3;42352:14;42337:29;;42204:168;;;;:::o;42378:147::-;42479:11;42516:3;42501:18;;42378:147;;;;:::o;42531:169::-;42615:11;42649:6;42644:3;42637:19;42689:4;42684:3;42680:14;42665:29;;42531:169;;;;:::o;42706:148::-;42808:11;42845:3;42830:18;;42706:148;;;;:::o;42860:305::-;42900:3;42919:20;42937:1;42919:20;:::i;:::-;42914:25;;42953:20;42971:1;42953:20;:::i;:::-;42948:25;;43107:1;43039:66;43035:74;43032:1;43029:81;43026:107;;;43113:18;;:::i;:::-;43026:107;43157:1;43154;43150:9;43143:16;;42860:305;;;;:::o;43171:185::-;43211:1;43228:20;43246:1;43228:20;:::i;:::-;43223:25;;43262:20;43280:1;43262:20;:::i;:::-;43257:25;;43301:1;43291:35;;43306:18;;:::i;:::-;43291:35;43348:1;43345;43341:9;43336:14;;43171:185;;;;:::o;43362:348::-;43402:7;43425:20;43443:1;43425:20;:::i;:::-;43420:25;;43459:20;43477:1;43459:20;:::i;:::-;43454:25;;43647:1;43579:66;43575:74;43572:1;43569:81;43564:1;43557:9;43550:17;43546:105;43543:131;;;43654:18;;:::i;:::-;43543:131;43702:1;43699;43695:9;43684:20;;43362:348;;;;:::o;43716:191::-;43756:4;43776:20;43794:1;43776:20;:::i;:::-;43771:25;;43810:20;43828:1;43810:20;:::i;:::-;43805:25;;43849:1;43846;43843:8;43840:34;;;43854:18;;:::i;:::-;43840:34;43899:1;43896;43892:9;43884:17;;43716:191;;;;:::o;43913:96::-;43950:7;43979:24;43997:5;43979:24;:::i;:::-;43968:35;;43913:96;;;:::o;44015:104::-;44060:7;44089:24;44107:5;44089:24;:::i;:::-;44078:35;;44015:104;;;:::o;44125:90::-;44159:7;44202:5;44195:13;44188:21;44177:32;;44125:90;;;:::o;44221:77::-;44258:7;44287:5;44276:16;;44221:77;;;:::o;44304:149::-;44340:7;44380:66;44373:5;44369:78;44358:89;;44304:149;;;:::o;44459:126::-;44496:7;44536:42;44529:5;44525:54;44514:65;;44459:126;;;:::o;44591:77::-;44628:7;44657:5;44646:16;;44591:77;;;:::o;44674:134::-;44732:9;44765:37;44796:5;44765:37;:::i;:::-;44752:50;;44674:134;;;:::o;44814:126::-;44864:9;44897:37;44928:5;44897:37;:::i;:::-;44884:50;;44814:126;;;:::o;44946:113::-;44996:9;45029:24;45047:5;45029:24;:::i;:::-;45016:37;;44946:113;;;:::o;45065:154::-;45149:6;45144:3;45139;45126:30;45211:1;45202:6;45197:3;45193:16;45186:27;45065:154;;;:::o;45225:307::-;45293:1;45303:113;45317:6;45314:1;45311:13;45303:113;;;45402:1;45397:3;45393:11;45387:18;45383:1;45378:3;45374:11;45367:39;45339:2;45336:1;45332:10;45327:15;;45303:113;;;45434:6;45431:1;45428:13;45425:101;;;45514:1;45505:6;45500:3;45496:16;45489:27;45425:101;45274:258;45225:307;;;:::o;45538:171::-;45577:3;45600:24;45618:5;45600:24;:::i;:::-;45591:33;;45646:4;45639:5;45636:15;45633:41;;;45654:18;;:::i;:::-;45633:41;45701:1;45694:5;45690:13;45683:20;;45538:171;;;:::o;45715:320::-;45759:6;45796:1;45790:4;45786:12;45776:22;;45843:1;45837:4;45833:12;45864:18;45854:81;;45920:4;45912:6;45908:17;45898:27;;45854:81;45982:2;45974:6;45971:14;45951:18;45948:38;45945:84;;;46001:18;;:::i;:::-;45945:84;45766:269;45715:320;;;:::o;46041:281::-;46124:27;46146:4;46124:27;:::i;:::-;46116:6;46112:40;46254:6;46242:10;46239:22;46218:18;46206:10;46203:34;46200:62;46197:88;;;46265:18;;:::i;:::-;46197:88;46305:10;46301:2;46294:22;46084:238;46041:281;;:::o;46328:233::-;46367:3;46390:24;46408:5;46390:24;:::i;:::-;46381:33;;46436:66;46429:5;46426:77;46423:103;;;46506:18;;:::i;:::-;46423:103;46553:1;46546:5;46542:13;46535:20;;46328:233;;;:::o;46567:176::-;46599:1;46616:20;46634:1;46616:20;:::i;:::-;46611:25;;46650:20;46668:1;46650:20;:::i;:::-;46645:25;;46689:1;46679:35;;46694:18;;:::i;:::-;46679:35;46735:1;46732;46728:9;46723:14;;46567:176;;;;:::o;46749:180::-;46797:77;46794:1;46787:88;46894:4;46891:1;46884:15;46918:4;46915:1;46908:15;46935:180;46983:77;46980:1;46973:88;47080:4;47077:1;47070:15;47104:4;47101:1;47094:15;47121:180;47169:77;47166:1;47159:88;47266:4;47263:1;47256:15;47290:4;47287:1;47280:15;47307:180;47355:77;47352:1;47345:88;47452:4;47449:1;47442:15;47476:4;47473:1;47466:15;47493:180;47541:77;47538:1;47531:88;47638:4;47635:1;47628:15;47662:4;47659:1;47652:15;47679:180;47727:77;47724:1;47717:88;47824:4;47821:1;47814:15;47848:4;47845:1;47838:15;47865:117;47974:1;47971;47964:12;47988:117;48097:1;48094;48087:12;48111:117;48220:1;48217;48210:12;48234:117;48343:1;48340;48333:12;48357:102;48398:6;48449:2;48445:7;48440:2;48433:5;48429:14;48425:28;48415:38;;48357:102;;;:::o;48465:182::-;48605:34;48601:1;48593:6;48589:14;48582:58;48465:182;:::o;48653:169::-;48793:21;48789:1;48781:6;48777:14;48770:45;48653:169;:::o;48828:230::-;48968:34;48964:1;48956:6;48952:14;48945:58;49037:13;49032:2;49024:6;49020:15;49013:38;48828:230;:::o;49064:237::-;49204:34;49200:1;49192:6;49188:14;49181:58;49273:20;49268:2;49260:6;49256:15;49249:45;49064:237;:::o;49307:225::-;49447:34;49443:1;49435:6;49431:14;49424:58;49516:8;49511:2;49503:6;49499:15;49492:33;49307:225;:::o;49538:178::-;49678:30;49674:1;49666:6;49662:14;49655:54;49538:178;:::o;49722:225::-;49862:34;49858:1;49850:6;49846:14;49839:58;49931:8;49926:2;49918:6;49914:15;49907:33;49722:225;:::o;49953:223::-;50093:34;50089:1;50081:6;50077:14;50070:58;50162:6;50157:2;50149:6;50145:15;50138:31;49953:223;:::o;50182:175::-;50322:27;50318:1;50310:6;50306:14;50299:51;50182:175;:::o;50363:245::-;50503:34;50499:1;50491:6;50487:14;50480:58;50572:28;50567:2;50559:6;50555:15;50548:53;50363:245;:::o;50614:179::-;50754:31;50750:1;50742:6;50738:14;50731:55;50614:179;:::o;50799:231::-;50939:34;50935:1;50927:6;50923:14;50916:58;51008:14;51003:2;50995:6;50991:15;50984:39;50799:231;:::o;51036:230::-;51176:34;51172:1;51164:6;51160:14;51153:58;51245:13;51240:2;51232:6;51228:15;51221:38;51036:230;:::o;51272:172::-;51412:24;51408:1;51400:6;51396:14;51389:48;51272:172;:::o;51450:243::-;51590:34;51586:1;51578:6;51574:14;51567:58;51659:26;51654:2;51646:6;51642:15;51635:51;51450:243;:::o;51699:229::-;51839:34;51835:1;51827:6;51823:14;51816:58;51908:12;51903:2;51895:6;51891:15;51884:37;51699:229;:::o;51934:228::-;52074:34;52070:1;52062:6;52058:14;52051:58;52143:11;52138:2;52130:6;52126:15;52119:36;51934:228;:::o;52168:170::-;52308:22;52304:1;52296:6;52292:14;52285:46;52168:170;:::o;52344:175::-;52484:27;52480:1;52472:6;52468:14;52461:51;52344:175;:::o;52525:182::-;52665:34;52661:1;52653:6;52649:14;52642:58;52525:182;:::o;52713:231::-;52853:34;52849:1;52841:6;52837:14;52830:58;52922:14;52917:2;52909:6;52905:15;52898:39;52713:231;:::o;52950:182::-;53090:34;53086:1;53078:6;53074:14;53067:58;52950:182;:::o;53138:228::-;53278:34;53274:1;53266:6;53262:14;53255:58;53347:11;53342:2;53334:6;53330:15;53323:36;53138:228;:::o;53372:234::-;53512:34;53508:1;53500:6;53496:14;53489:58;53581:17;53576:2;53568:6;53564:15;53557:42;53372:234;:::o;53612:169::-;53752:21;53748:1;53740:6;53736:14;53729:45;53612:169;:::o;53787:220::-;53927:34;53923:1;53915:6;53911:14;53904:58;53996:3;53991:2;53983:6;53979:15;53972:28;53787:220;:::o;54013:167::-;54153:19;54149:1;54141:6;54137:14;54130:43;54013:167;:::o;54186:114::-;;:::o;54306:236::-;54446:34;54442:1;54434:6;54430:14;54423:58;54515:19;54510:2;54502:6;54498:15;54491:44;54306:236;:::o;54548:231::-;54688:34;54684:1;54676:6;54672:14;54665:58;54757:14;54752:2;54744:6;54740:15;54733:39;54548:231;:::o;54785:173::-;54925:25;54921:1;54913:6;54909:14;54902:49;54785:173;:::o;54964:235::-;55104:34;55100:1;55092:6;55088:14;55081:58;55173:18;55168:2;55160:6;55156:15;55149:43;54964:235;:::o;55205:167::-;55345:19;55341:1;55333:6;55329:14;55322:43;55205:167;:::o;55378:234::-;55518:34;55514:1;55506:6;55502:14;55495:58;55587:17;55582:2;55574:6;55570:15;55563:42;55378:234;:::o;55618:122::-;55691:24;55709:5;55691:24;:::i;:::-;55684:5;55681:35;55671:63;;55730:1;55727;55720:12;55671:63;55618:122;:::o;55746:138::-;55827:32;55853:5;55827:32;:::i;:::-;55820:5;55817:43;55807:71;;55874:1;55871;55864:12;55807:71;55746:138;:::o;55890:116::-;55960:21;55975:5;55960:21;:::i;:::-;55953:5;55950:32;55940:60;;55996:1;55993;55986:12;55940:60;55890:116;:::o;56012:122::-;56085:24;56103:5;56085:24;:::i;:::-;56078:5;56075:35;56065:63;;56124:1;56121;56114:12;56065:63;56012:122;:::o;56140:120::-;56212:23;56229:5;56212:23;:::i;:::-;56205:5;56202:34;56192:62;;56250:1;56247;56240:12;56192:62;56140:120;:::o;56266:122::-;56339:24;56357:5;56339:24;:::i;:::-;56332:5;56329:35;56319:63;;56378:1;56375;56368:12;56319:63;56266:122;:::o

Swarm Source

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