ETH Price: $2,518.35 (+2.62%)

Token

Sweepers (SWEEPER)
 

Overview

Max Total Supply

2,373 SWEEPER

Holders

200

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SWEEPER
0x9e635293c11f5f30a5c581d334449c024099ae35
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:
SweepersToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license
File 1 of 18 : SweepersToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol';
import { ERC721Checkpointable } from './base/ERC721Checkpointable.sol';
import { ISweepersDescriptor } from './interfaces/ISweepersDescriptor.sol';
import { ISweepersSeeder } from './interfaces/ISweepersSeeder.sol';
import { ISweepersToken } from './interfaces/ISweepersToken.sol';
import { ERC721 } from './base/ERC721.sol';
import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import { IProxyRegistry } from './external/opensea/IProxyRegistry.sol';

contract SweepersToken is ISweepersToken, Ownable, ERC721Checkpointable {
    // The sweepersTreasury address
    address public sweepersTreasury;

    // An address who has permissions to mint Sweepers
    address public minter;

    // An address who has permissions to lock and unlock Sweepers
    mapping(address => bool) public garage;

    // The Sweepers token URI descriptor
    ISweepersDescriptor public descriptor;

    // The Sweepers token seeder
    ISweepersSeeder public seeder;

    // Whether the minter can be updated
    bool public isMinterLocked;

    // Whether the descriptor can be updated
    bool public isDescriptorLocked;

    // Whether the seeder can be updated
    bool public isSeederLocked;

    // The sweeper seeds
    mapping(uint256 => ISweepersSeeder.Seed) public seeds;

    // The internal sweeper ID tracker
    uint256 private _currentSweeperId = 1;

    // IPFS content hash of contract-level metadata
    string private _contractURIHash = 'QmeaKx7er3tEgmc4vfCAu9Jus9yVWV8KMydpmbupSKSuJ1';

    // OpenSea's Proxy Registry
    IProxyRegistry public immutable proxyRegistry;

    /**
     * @notice Require that the minter has not been locked.
     */
    modifier whenMinterNotLocked() {
        require(!isMinterLocked, 'Minter is locked');
        _;
    }

    /**
     * @notice Require that the descriptor has not been locked.
     */
    modifier whenDescriptorNotLocked() {
        require(!isDescriptorLocked, 'Descriptor is locked');
        _;
    }

    /**
     * @notice Require that the seeder has not been locked.
     */
    modifier whenSeederNotLocked() {
        require(!isSeederLocked, 'Seeder is locked');
        _;
    }

    /**
     * @notice Require that the sender is the sweepers Treasury.
     */
    modifier onlySweepersTreasury() {
        require(msg.sender == sweepersTreasury, 'Sender is not the sweepers Treasury');
        _;
    }

    /**
     * @notice Require that the sender is the minter.
     */
    modifier onlyMinter() {
        require(msg.sender == minter, 'Sender is not the minter');
        _;
    }

    /**
     * @notice Require that the sender is the garage.
     */
    modifier onlyGarage() {
        require(garage[msg.sender], 'Sender is not the garage');
        _;
    }

    constructor(
        address _sweepersTreasury,
        address _minter,
        ISweepersDescriptor _descriptor,
        ISweepersSeeder _seeder,
        IProxyRegistry _proxyRegistry
    ) ERC721("Sweepers", "SWEEPER") {
        sweepersTreasury = _sweepersTreasury;
        minter = _minter;
        descriptor = _descriptor;
        seeder = _seeder;
        proxyRegistry = _proxyRegistry;
    }

    /**
     * @notice The IPFS URI of contract-level metadata.
     */
    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked('ipfs://', _contractURIHash));
    }

    /**
     * @notice Set the _contractURIHash.
     * @dev Only callable by the owner.
     */
    function setContractURIHash(string memory newContractURIHash) external onlyOwner {
        _contractURIHash = newContractURIHash;
    }

    /**
     * @notice Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator) public view override(IERC721, ERC721) returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        if (proxyRegistry.proxies(owner) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    function stakeAndLock(uint256 tokenId) external override onlyGarage returns (uint8) {
        require(tx.origin == ownerOf(tokenId), 'Not owner of Sweeper');

        isStakedAndLocked[tokenId] = true;

        emit SweeperStakedAndLocked(tokenId, block.timestamp);
        return uint8(seeds[tokenId].background);
    }

    function unstakeAndUnlock(uint256 tokenId) external override onlyGarage {
        require(tx.origin == ownerOf(tokenId), 'Not owner of Sweeper');
        
        isStakedAndLocked[tokenId] = false;

        emit SweeperUnstakedAndUnlocked(tokenId, block.timestamp);
    }

    /**
     * @notice Mint a Sweeper to the minter.
     * @dev Call _mintTo with the to address(es).
     */
    function mint() public override onlyMinter returns (uint256) {
        return _mintTo(minter, _currentSweeperId++);
    }

    /**
     * @notice Burn a sweeper.
     */
    function burn(uint256 sweeperId) public override onlyMinter {
        _burn(sweeperId);
        emit SweeperBurned(sweeperId);
    }

    /**
     * @notice A distinct Uniform Resource Identifier (URI) for a given asset.
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), 'SweepersToken: URI query for nonexistent token');
        return descriptor.tokenURI(tokenId, seeds[tokenId]);
    }

    /**
     * @notice Similar to `tokenURI`, but always serves a base64 encoded data URI
     * with the JSON contents directly inlined.
     */
    function dataURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), 'SweepersToken: URI query for nonexistent token');
        return descriptor.dataURI(tokenId, seeds[tokenId]);
    }

    /**
     * @notice Set the sweepers Treasury.
     * @dev Only callable by the sweepers Treasury when not locked.
     */
    function setSweepersTreasury(address _sweepersTreasury) external override onlySweepersTreasury {
        sweepersTreasury = _sweepersTreasury;

        emit SweepersTreasuryUpdated(_sweepersTreasury);
    }

    /**
     * @notice Set the token minter.
     * @dev Only callable by the owner when not locked.
     */
    function setMinter(address _minter) external override onlyOwner whenMinterNotLocked {
        minter = _minter;

        emit MinterUpdated(_minter);
    }

    function setGarage(address _garage, bool _flag) external override onlyOwner {
        garage[_garage] = _flag;

        emit GarageUpdated(_garage);
    }

    /**
     * @notice Lock the minter.
     * @dev This cannot be reversed and is only callable by the owner when not locked.
     */
    function lockMinter() external override onlyOwner whenMinterNotLocked {
        isMinterLocked = true;

        emit MinterLocked();
    }

    /**
     * @notice Set the token URI descriptor.
     * @dev Only callable by the owner when not locked.
     */
    function setDescriptor(ISweepersDescriptor _descriptor) external override onlyOwner whenDescriptorNotLocked {
        descriptor = _descriptor;

        emit DescriptorUpdated(_descriptor);
    }

    /**
     * @notice Lock the descriptor.
     * @dev This cannot be reversed and is only callable by the owner when not locked.
     */
    function lockDescriptor() external override onlyOwner whenDescriptorNotLocked {
        isDescriptorLocked = true;

        emit DescriptorLocked();
    }

    /**
     * @notice Set the token seeder.
     * @dev Only callable by the owner when not locked.
     */
    function setSeeder(ISweepersSeeder _seeder) external override onlyOwner whenSeederNotLocked {
        seeder = _seeder;

        emit SeederUpdated(_seeder);
    }

    /**
     * @notice Lock the seeder.
     * @dev This cannot be reversed and is only callable by the owner when not locked.
     */
    function lockSeeder() external override onlyOwner whenSeederNotLocked {
        isSeederLocked = true;

        emit SeederLocked();
    }

    /**
     * @notice Mint a Sweeper with `sweeperId` to the provided `to` address.
     */
    function _mintTo(address to, uint256 sweeperId) internal returns (uint256) {
        ISweepersSeeder.Seed memory seed = seeds[sweeperId] = seeder.generateSeed(sweeperId, descriptor);

        _mint(owner(), to, sweeperId);
        emit SweeperCreated(sweeperId, seed);

        return sweeperId;
    }
}

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

pragma solidity ^0.8.6;

interface IProxyRegistry {
    function proxies(address) external view returns (address);
}

File 3 of 18 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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

/// @title ERC721 Token Implementation



// LICENSE
// ERC721.sol modifies OpenZeppelin's ERC721.sol:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/6618f9f18424ade44116d0221719f4c93be6a078/contracts/token/ERC721/ERC721.sol
//
// ERC721.sol source code copyright OpenZeppelin licensed under the MIT License.
// With modifications by Sweeperders Treasury.
//
//
// MODIFICATIONS:
// `_safeMint` and `_mint` contain an additional `creator` argument and
// emit two `Transfer` logs, rather than one. The first log displays the
// transfer (mint) from `address(0)` to the `creator`. The second displays the
// transfer from the `creator` to the `to` address. This enables correct
// attribution on various NFT marketplaces.

pragma solidity ^0.8.6;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/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;

    mapping(uint256 => bool) public isStakedAndLocked;

    /**
     * @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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721: transfer caller is not owner nor approved');
        require(!isStakedAndLocked[tokenId], 'Token is Staked and Locked');

        _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');
        require(!isStakedAndLocked[tokenId], 'Token is Staked and Locked');
        _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`, transfers it to `to`, and emits two log events -
     * 1. Credits the `minter` with the mint.
     * 2. Shows transfer from the `minter` 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 creator,
        address to,
        uint256 tokenId
    ) internal virtual {
        _safeMint(creator, 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 creator,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(creator, to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            'ERC721: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Mints `tokenId`, transfers it to `to`, and emits two log events -
     * 1. Credits the `creator` with the mint.
     * 2. Shows transfer from the `creator` 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 creator,
        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), creator, tokenId);
        emit Transfer(creator, to, tokenId);
    }

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

/// @title Interface for SweepersToken



pragma solidity ^0.8.6;

import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import { ISweepersDescriptor } from './ISweepersDescriptor.sol';
import { ISweepersSeeder } from './ISweepersSeeder.sol';

interface ISweepersToken is IERC721 {
    event SweeperCreated(uint256 indexed tokenId, ISweepersSeeder.Seed seed);

    event SweeperBurned(uint256 indexed tokenId);

    event SweeperStakedAndLocked(uint256 indexed tokenId, uint256 timestamp);

    event SweeperUnstakedAndUnlocked(uint256 indexed tokenId, uint256 timestamp);

    event SweepersTreasuryUpdated(address sweepersTreasury);

    event MinterUpdated(address minter);

    event MinterLocked();

    event GarageUpdated(address garage);

    event DescriptorUpdated(ISweepersDescriptor descriptor);

    event DescriptorLocked();

    event SeederUpdated(ISweepersSeeder seeder);

    event SeederLocked();

    function mint() external returns (uint256);

    function burn(uint256 tokenId) external;

    function dataURI(uint256 tokenId) external returns (string memory);

    function setSweepersTreasury(address sweepersTreasury) external;

    function setMinter(address minter) external;

    function lockMinter() external;

    function setDescriptor(ISweepersDescriptor descriptor) external;

    function lockDescriptor() external;

    function setSeeder(ISweepersSeeder seeder) external;

    function lockSeeder() external;

    function stakeAndLock(uint256 tokenId) external returns (uint8);

    function unstakeAndUnlock(uint256 tokenId) external;

    function setGarage(address _garage, bool _flag) external;
}

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

pragma solidity ^0.8.6;

import { ISweepersDescriptor } from './ISweepersDescriptor.sol';

interface ISweepersSeeder {
    struct Seed {
        uint48 background;
        uint48 body;
        uint48 accessory;
        uint48 head;
        uint48 eyes;
        uint48 mouth;
    }

    function generateSeed(uint256 sweeperId, ISweepersDescriptor descriptor) external view returns (Seed memory);
}

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

/// @title Interface for SweepersDescriptor



pragma solidity ^0.8.6;

import { ISweepersSeeder } from './ISweepersSeeder.sol';

interface ISweepersDescriptor {
    event PartsLocked();

    event DataURIToggled(bool enabled);

    event BaseURIUpdated(string baseURI);

    function arePartsLocked() external returns (bool);

    function isDataURIEnabled() external returns (bool);

    function baseURI() external returns (string memory);

    function palettes(uint8 paletteIndex, uint256 colorIndex) external view returns (string memory);

    function bgColors(uint256 index) external view returns (string memory);

    function backgrounds(uint256 index) external view returns (bytes memory);

    function bodies(uint256 index) external view returns (bytes memory);

    function accessories(uint256 index) external view returns (bytes memory);

    function heads(uint256 index) external view returns (bytes memory);

    function eyes(uint256 index) external view returns (bytes memory);

    function mouths(uint256 index) external view returns (bytes memory);

    function backgroundNames(uint256 index) external view returns (string memory);

    function bodyNames(uint256 index) external view returns (string memory);

    function accessoryNames(uint256 index) external view returns (string memory);

    function headNames(uint256 index) external view returns (string memory);

    function eyesNames(uint256 index) external view returns (string memory);

    function mouthNames(uint256 index) external view returns (string memory);

    function bgColorsCount() external view returns (uint256);

    function backgroundCount() external view returns (uint256);

    function bodyCount() external view returns (uint256);

    function accessoryCount() external view returns (uint256);

    function headCount() external view returns (uint256);

    function eyesCount() external view returns (uint256);

    function mouthCount() external view returns (uint256);

    function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external;

    function addManyBgColors(string[] calldata bgColors) external;

    function addManyBackgrounds(bytes[] calldata backgrounds) external;

    function addManyBodies(bytes[] calldata bodies) external;

    function addManyAccessories(bytes[] calldata accessories) external;

    function addManyHeads(bytes[] calldata heads) external;

    function addManyEyes(bytes[] calldata eyes) external;

    function addManyMouths(bytes[] calldata mouths) external;

    function addManyBackgroundNames(string[] calldata backgroundNames) external;

    function addManyBodyNames(string[] calldata bodyNames) external;

    function addManyAccessoryNames(string[] calldata accessoryNames) external;

    function addManyHeadNames(string[] calldata headNames) external;

    function addManyEyesNames(string[] calldata eyesNames) external;

    function addManyMouthNames(string[] calldata mouthNames) external;

    function addColorToPalette(uint8 paletteIndex, string calldata color) external;

    function addBgColor(string calldata bgColor) external;

    function addBackground(bytes calldata background) external;

    function addBody(bytes calldata body) external;

    function addAccessory(bytes calldata accessory) external;

    function addHead(bytes calldata head) external;

    function addEyes(bytes calldata eyes) external;

    function addMouth(bytes calldata mouth) external;

    function addBackgroundName(string calldata backgroundName) external;

    function addBodyName(string calldata bodyName) external;

    function addAccessoryName(string calldata accessoryName) external;

    function addHeadName(string calldata headName) external;

    function addEyesName(string calldata eyesName) external;

    function addMouthName(string calldata mouthName) external;

    function lockParts() external;

    function toggleDataURIEnabled() external;

    function setBaseURI(string calldata baseURI) external;

    function tokenURI(uint256 tokenId, ISweepersSeeder.Seed memory seed) external view returns (string memory);

    function dataURI(uint256 tokenId, ISweepersSeeder.Seed memory seed) external view returns (string memory);

    function genericDataURI(
        string calldata name,
        string calldata description,
        ISweepersSeeder.Seed memory seed
    ) external view returns (string memory);

    function generateSVGImage(ISweepersSeeder.Seed memory seed) external view returns (string memory);
}

File 8 of 18 : ERC721Checkpointable.sol
// SPDX-License-Identifier: BSD-3-Clause

/// @title Vote checkpointing for an ERC-721 token



// LICENSE
// ERC721Checkpointable.sol uses and modifies part of Compound Lab's Comp.sol:
// https://github.com/compound-finance/compound-protocol/blob/ae4388e780a8d596d97619d9704a931a2752c2bc/contracts/Governance/Comp.sol
//
// Comp.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
// With modifications by Sweeperders Treasury.
//
// Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
//
// MODIFICATIONS
// Checkpointing logic from Comp.sol has been used with the following modifications:
// - `delegates` is renamed to `_delegates` and is set to private
// - `delegates` is a public function that uses the `_delegates` mapping look-up, but unlike
//   Comp.sol, returns the delegator's own address if there is no delegate.
//   This avoids the delegator needing to "delegate to self" with an additional transaction
// - `_transferTokens()` is renamed `_beforeTokenTransfer()` and adapted to hook into OpenZeppelin's ERC721 hooks.

pragma solidity ^0.8.6;

import './ERC721Enumerable.sol';

abstract contract ERC721Checkpointable is ERC721Enumerable {
    /// @notice Defines decimals as per ERC-20 convention to make integrations with 3rd party governance platforms easier
    uint8 public constant decimals = 0;

    /// @notice A record of each accounts delegate
    mapping(address => address) private _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /**
     * @notice The votes a delegator can delegate, which is the current balance of the delegator.
     * @dev Used when calling `_delegate()`
     */
    function votesToDelegate(address delegator) public view returns (uint96) {
        return safe96(balanceOf(delegator), 'ERC721Checkpointable::votesToDelegate: amount exceeds 96 bits');
    }

    /**
     * @notice Overrides the standard `Comp.sol` delegates mapping to return
     * the delegator's own address if they haven't delegated.
     * This avoids having to delegate to oneself.
     */
    function delegates(address delegator) public view returns (address) {
        address current = _delegates[delegator];
        return current == address(0) ? delegator : current;
    }

    /**
     * @notice Adapted from `_transferTokens()` in `Comp.sol` to update delegate votes.
     * @dev hooks into OpenZeppelin's `ERC721._transfer`
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        super._beforeTokenTransfer(from, to, tokenId);

        /// @notice Differs from `_transferTokens()` to use `delegates` override method to simulate auto-delegation
        _moveDelegates(delegates(from), delegates(to), 1);
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        if (delegatee == address(0)) delegatee = msg.sender;
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this))
        );
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), 'ERC721Checkpointable::delegateBySig: invalid signature');
        require(nonce == nonces[signatory]++, 'ERC721Checkpointable::delegateBySig: invalid nonce');
        require(block.timestamp <= expiry, 'ERC721Checkpointable::delegateBySig: signature expired');
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber) public view returns (uint96) {
        require(blockNumber < block.number, 'ERC721Checkpointable::getPriorVotes: not yet determined');

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        /// @notice differs from `_delegate()` in `Comp.sol` to use `delegates` override method to simulate auto-delegation
        address currentDelegate = delegates(delegator);

        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        uint96 amount = votesToDelegate(delegator);

        _moveDelegates(currentDelegate, delegatee, amount);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, 'ERC721Checkpointable::_moveDelegates: amount underflows');
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, 'ERC721Checkpointable::_moveDelegates: amount overflows');
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(
            block.number,
            'ERC721Checkpointable::_writeCheckpoint: block number exceeds 32 bits'
        );

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

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

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

/// @title ERC721 Enumerable Extension



// LICENSE
// ERC721.sol modifies OpenZeppelin's ERC721Enumerable.sol:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/6618f9f18424ade44116d0221719f4c93be6a078/contracts/token/ERC721/extensions/ERC721Enumerable.sol
//
// ERC721Enumerable.sol source code copyright OpenZeppelin licensed under the MIT License.
// With modifications by Sweeperders Treasury.
//
// MODIFICATIONS:
// Consumes modified `ERC721` contract. See notes in `ERC721.sol`.

pragma solidity ^0.8.0;

import './ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/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 11 of 18 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // 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);
    }

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

File 13 of 18 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 14 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 15 of 18 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 16 of 18 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 17 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 18 of 18 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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);

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_sweepersTreasury","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"contract ISweepersDescriptor","name":"_descriptor","type":"address"},{"internalType":"contract ISweepersSeeder","name":"_seeder","type":"address"},{"internalType":"contract IProxyRegistry","name":"_proxyRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"DescriptorLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISweepersDescriptor","name":"descriptor","type":"address"}],"name":"DescriptorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"garage","type":"address"}],"name":"GarageUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"MinterLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"MinterUpdated","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":[],"name":"SeederLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISweepersSeeder","name":"seeder","type":"address"}],"name":"SeederUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SweeperBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"}],"indexed":false,"internalType":"struct ISweepersSeeder.Seed","name":"seed","type":"tuple"}],"name":"SweeperCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SweeperStakedAndLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SweeperUnstakedAndUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sweepersTreasury","type":"address"}],"name":"SweepersTreasuryUpdated","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":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"sweeperId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract ISweepersDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"garage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDescriptorLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMinterLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSeederLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isStakedAndLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockSeeder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistry","outputs":[{"internalType":"contract IProxyRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seeder","outputs":[{"internalType":"contract ISweepersSeeder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seeds","outputs":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURIHash","type":"string"}],"name":"setContractURIHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISweepersDescriptor","name":"_descriptor","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_garage","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setGarage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISweepersSeeder","name":"_seeder","type":"address"}],"name":"setSeeder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sweepersTreasury","type":"address"}],"name":"setSweepersTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeAndLock","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepersTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeAndUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"votesToDelegate","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"}]

6001601655610100604052602e60a0818152906200551860c03960179062000028908262000224565b503480156200003657600080fd5b506040516200554638038062005546833981016040819052620000599162000309565b60405180604001604052806008815260200167537765657065727360c01b8152506040518060400160405280600781526020016629aba2a2a822a960c91b815250620000b4620000ae6200012b60201b60201c565b6200012f565b6001620000c2838262000224565b506002620000d1828262000224565b5050601080546001600160a01b03199081166001600160a01b039889161790915560118054821696881696909617909555506013805485169386169390931790925560148054909316908416179091551660805262000389565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001aa57607f821691505b602082108103620001cb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021f57600081815260208120601f850160051c81016020861015620001fa5750805b601f850160051c820191505b818110156200021b5782815560010162000206565b5050505b505050565b81516001600160401b038111156200024057620002406200017f565b620002588162000251845462000195565b84620001d1565b602080601f831160018114620002905760008415620002775750858301515b600019600386901b1c1916600185901b1785556200021b565b600085815260208120601f198616915b82811015620002c157888601518255948401946001909101908401620002a0565b5085821015620002e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03811681146200030657600080fd5b50565b600080600080600060a086880312156200032257600080fd5b85516200032f81620002f0565b60208701519095506200034281620002f0565b60408701519094506200035581620002f0565b60608701519093506200036881620002f0565b60808701519092506200037b81620002f0565b809150509295509295909350565b60805161516c620003ac600039600081816107520152612b25015261516c6000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80636fcfff45116101de578063baedc1c41161010f578063e7a324dc116100ad578063f0503e801161007c578063f0503e8014610898578063f1127ed814610964578063f2fde38b146109d6578063fca3b5aa146109e957600080fd5b8063e7a324dc14610843578063e8a3d4851461086a578063e9580e9114610872578063e985e9c51461088557600080fd5b8063c3cda520116100e9578063c3cda520146107e3578063c87b56dd146107f6578063c8fc0c2314610809578063d50b31eb1461083057600080fd5b8063baedc1c414610787578063c1b8e4e11461079a578063c2263cc7146107c057600080fd5b80638da5cb5b1161017c578063a22cb46511610156578063a22cb46514610727578063b4b5ea571461073a578063b50cbd9f1461074d578063b88d4fde1461077457600080fd5b80638da5cb5b146106ee57806395d89b411461070c5780639a1ea01b1461071457600080fd5b8063728c18de116101b8578063728c18de1461068357806376daebe114610696578063782d6fe11461069e5780637ecebe00146106ce57600080fd5b80636fcfff451461062d57806370a0823114610668578063715018a61461067b57600080fd5b80633b7cb633116102b8578063587cde1e116102565780635f295a67116102305780635f295a67146105df57806361b8a689146105e75780636352211e146105fa578063684931ed1461060d57600080fd5b8063587cde1e146105a65780635ac1e3bb146105b95780635c19a95c146105cc57600080fd5b806342842e0e1161029257806342842e0e1461054a57806342966c681461055d578063472d5008146105705780634f6ccce71461059357600080fd5b80633b7cb6331461050f57806340fbddff1461052f57806341b5d0de1461054257600080fd5b806318160ddd1161032557806323b872dd116102ff57806323b872dd146104af5780632f745c59146104c2578063303e74df146104d5578063313ce567146104f557600080fd5b806318160ddd1461045b5780631e688e101461046357806320606b701461048857600080fd5b8063075461721161036157806307546172146103da578063081812fc1461041f578063095ea7b3146104325780631249c58b1461044557600080fd5b806301b9a3971461038857806301ffc9a71461039d57806306fdde03146103c5575b600080fd5b61039b610396366004614624565b6109fc565b005b6103b06103ab36600461466f565b610b09565b60405190151581526020015b60405180910390f35b6103cd610b65565b6040516103bc91906146fa565b6011546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103bc565b6103fa61042d36600461470d565b610bf7565b61039b610440366004614726565b610cd1565b61044d610e5d565b6040519081526020016103bc565b600a5461044d565b6014546103b09074010000000000000000000000000000000000000000900460ff1681565b61044d7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61039b6104bd366004614752565b610f1c565b61044d6104d0366004614726565b611036565b6013546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b6104fd600081565b60405160ff90911681526020016103bc565b6010546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b6104fd61053d36600461470d565b611105565b61039b6112ac565b61039b610558366004614752565b6113a5565b61039b61056b36600461470d565b6113c0565b6103b061057e366004614624565b60126020526000908152604090205460ff1681565b61044d6105a136600461470d565b611478565b6103fa6105b4366004614624565b611536565b6103cd6105c736600461470d565b611575565b61039b6105da366004614624565b61173e565b61039b611769565b61039b6105f536600461470d565b611864565b6103fa61060836600461470d565b6119ed565b6014546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b61065361063b366004614624565b600e6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016103bc565b61044d610676366004614624565b611a9f565b61039b611b6d565b61039b610691366004614624565b611b81565b61039b611c9b565b6106b16106ac366004614726565b611d92565b6040516bffffffffffffffffffffffff90911681526020016103bc565b61044d6106dc366004614624565b600f6020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff166103fa565b6103cd6120ac565b61039b610722366004614793565b6120bb565b61039b610735366004614793565b61214a565b6106b1610748366004614624565b612260565b6103fa7f000000000000000000000000000000000000000000000000000000000000000081565b61039b6107823660046148d3565b6122fd565b61039b610795366004614953565b61241e565b6014546103b0907501000000000000000000000000000000000000000000900460ff1681565b6103b06107ce36600461470d565b60076020526000908152604090205460ff1681565b61039b6107f136600461499c565b612436565b6103cd61080436600461470d565b612819565b6014546103b090760100000000000000000000000000000000000000000000900460ff1681565b61039b61083e366004614624565b612983565b61044d7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6103cd612a85565b6106b1610880366004614624565b612aad565b6103b06108933660046149fe565b612ad9565b6109236108a636600461470d565b6015602052600090815260409020805460019091015465ffffffffffff80831692660100000000000081048216926c01000000000000000000000000820483169272010000000000000000000000000000000000008304811692780100000000000000000000000000000000000000000000000090048116911686565b6040805165ffffffffffff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016103bc565b6109ad610972366004614a2c565b600d60209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff9091166020830152016103bc565b61039b6109e4366004614624565b612bee565b61039b6109f7366004614624565b612ca2565b610a04612da2565b6014547501000000000000000000000000000000000000000000900460ff1615610a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f44657363726970746f72206973206c6f636b656400000000000000000000000060448201526064015b60405180910390fd5b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f6e66ab22238a5471005895947c8f57db923c2a9c9c73180eff80864c21295c1b906020015b60405180910390a150565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b5f5750610b5f82612e23565b92915050565b606060018054610b7490614a63565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba090614a63565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a86565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610cdc826119ed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a86565b3373ffffffffffffffffffffffffffffffffffffffff82161480610dc25750610dc28133612ad9565b610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a86565b610e588383612f06565b505050565b60115460009073ffffffffffffffffffffffffffffffffffffffff163314610ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f7420746865206d696e74657200000000000000006044820152606401610a86565b60115460168054610f179273ffffffffffffffffffffffffffffffffffffffff16916000610f0e83614ae5565b91905055612fa6565b905090565b610f2633826132a1565b610fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a86565b60008181526007602052604090205460ff161561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546f6b656e206973205374616b656420616e64204c6f636b65640000000000006044820152606401610a86565b610e588383836133e4565b600061104183611a9f565b82106110cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a86565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b3360009081526012602052604081205460ff1661117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f74207468652067617261676500000000000000006044820152606401610a86565b611187826119ed565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f6620537765657065720000000000000000000000006044820152606401610a86565b6000828152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182907f7d36527e1690deb87a193610cc1f0afb9d56ea423406c96a315ba67117f766ed906112869042815260200190565b60405180910390a25060008181526015602052604090205465ffffffffffff165b919050565b6112b4612da2565b6014547501000000000000000000000000000000000000000000900460ff161561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f44657363726970746f72206973206c6f636b65640000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040517f593e31e306c198bef259d839f7c6dc4ff7fc10c07f76fab193a210b03704105f90600090a1565b610e58838383604051806020016040528060008152506122fd565b60115473ffffffffffffffffffffffffffffffffffffffff163314611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f7420746865206d696e74657200000000000000006044820152606401610a86565b61144a81613656565b60405181907f1bbce8ecee5dc0a3e78c8f538fed8a0018e9efd5eec8348f696b0dbe29a743e290600090a250565b6000611483600a5490565b8210611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a86565b600a828154811061152457611524614b1d565b90600052602060002001549050919050565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600c6020526040812054909116801561156c578061156e565b825b9392505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f5377656570657273546f6b656e3a2055524920717565727920666f72206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610a86565b6013546000838152601560205260409081902090517fa18f671000000000000000000000000000000000000000000000000000000000815260048101859052815465ffffffffffff8082166024840152603082901c81166044840152606082901c81166064840152609082901c8116608484015260c09190911c811660a483015260019092015490911660c482015273ffffffffffffffffffffffffffffffffffffffff9091169063a18f67109060e4015b600060405180830381865afa1580156116f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b5f9190810190614b4c565b73ffffffffffffffffffffffffffffffffffffffff811661175c5750335b611766338261372f565b50565b611771612da2565b601454760100000000000000000000000000000000000000000000900460ff16156117f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f536565646572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000001790556040517ff59561f22794afcfb1e6be5c4733f5449fd167252a96b74bb06d341fb0dac7ed90600090a1565b3360009081526012602052604090205460ff166118dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f74207468652067617261676500000000000000006044820152606401610a86565b6118e6816119ed565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461197a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f6620537765657065720000000000000000000000006044820152606401610a86565b6000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555181907fd9743dba3f1e52a74f005eaaf491be482ac1fe4653975f0d7ef2d8382cc0d727906119e29042815260200190565b60405180910390a250565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a86565b600073ffffffffffffffffffffffffffffffffffffffff8216611b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a86565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b611b75612da2565b611b7f60006137d4565b565b60105473ffffffffffffffffffffffffffffffffffffffff163314611c28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f53656e646572206973206e6f742074686520737765657065727320547265617360448201527f75727900000000000000000000000000000000000000000000000000000000006064820152608401610a86565b601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f922c2392f081081ce632aa0e69aec5bec8ac0deb638f309b416a4694863ffec290602001610afe565b611ca3612da2565b60145474010000000000000000000000000000000000000000900460ff1615611d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d696e746572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f192417b3f16b1ce69e0c59b0376549666650245ffc05e4b2569089dda8589b6690600090a1565b6000438210611e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610a86565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081205463ffffffff1690819003611e61576000915050610b5f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604081208491611e93600185614bc3565b63ffffffff90811682526020820192909252604001600020541611611f195773ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020526040812090611ee3600184614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169150610b5f9050565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020908152604080832083805290915290205463ffffffff16831015611f61576000915050610b5f565b600080611f6f600184614bc3565b90505b8163ffffffff168163ffffffff1611156120545760006002611f948484614bc3565b611f9e9190614be7565b611fa89083614bc3565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600d6020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff169181019190915291925087900361202857602001519450610b5f9350505050565b805163ffffffff1687111561203f5781935061204d565b61204a600183614bc3565b92505b5050611f72565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b606060028054610b7490614a63565b6120c3612da2565b73ffffffffffffffffffffffffffffffffffffffff821660008181526012602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151517905590519182527f440c68d98a5ca8d9d97e0853f090cc3d8c9657e4a69247fb7151f977a55d61be910160405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff8316036121c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a86565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600e602052604081205463ffffffff168061229857600061156e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d60205260408120906122c9600184614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169392505050565b61230733836132a1565b612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a86565b60008281526007602052604090205460ff161561240c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546f6b656e206973205374616b656420616e64204c6f636b65640000000000006044820152606401610a86565b61241884848484613849565b50505050565b612426612da2565b60176124328282614c77565b5050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612461610b65565b8051906020012061246f4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c084015273ffffffffffffffffffffffffffffffffffffffff8b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401909252815191909301207f1901000000000000000000000000000000000000000000000000000000000000610160830152610162820183905261018282018190529192506000906101a201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156125e1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610a86565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604081208054916126e083614ae5565b919050558914612772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610a86565b87421115612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610a86565b61280c818b61372f565b505050505b505050505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff166128cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f5377656570657273546f6b656e3a2055524920717565727920666f72206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610a86565b6013546000838152601560205260409081902090517f4263812100000000000000000000000000000000000000000000000000000000815260048101859052815465ffffffffffff8082166024840152603082901c81166044840152606082901c81166064840152609082901c8116608484015260c09190911c811660a483015260019092015490911660c482015273ffffffffffffffffffffffffffffffffffffffff9091169063426381219060e4016116db565b61298b612da2565b601454760100000000000000000000000000000000000000000000900460ff1615612a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f536565646572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fb3025222d01ce9a26c7f9d52bc3bfd0352366bd90a793c273fbfe1c81e0e288e90602001610afe565b60606017604051602001612a999190614d91565b604051602081830303815290604052905090565b6000610b5f612abb83611a9f565b6040518060600160405280603d81526020016150c3603d91396138ec565b6040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600091818416917f0000000000000000000000000000000000000000000000000000000000000000169063c455279190602401602060405180830381865afa158015612b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b909190614e54565b73ffffffffffffffffffffffffffffffffffffffff1603612bb357506001610b5f565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526006602090815260408083209386168352929052205460ff1661156e565b612bf6612da2565b73ffffffffffffffffffffffffffffffffffffffff8116612c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a86565b611766816137d4565b612caa612da2565b60145474010000000000000000000000000000000000000000900460ff1615612d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d696e746572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a90602001610afe565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a86565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612eb657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b5f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b5f565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612f60826119ed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6014546013546040517f422e2e990000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff91821660248201526000928392169063422e2e999060440160c060405180830381865afa158015613023573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130479190614e87565b60008481526015602090815260408083208451815486850151878501516060808a01516080808c015165ffffffffffff9788167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009097169690961766010000000000009588168602177fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c0100000000000000000000000094881685027fffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff161772010000000000000000000000000000000000009288168302177fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff811678010000000000000000000000000000000000000000000000009789168802908117808b5560a09e8f01516001909b0180547fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000169b8b169b8c1790558b5160c081018d52928a16918a1691909117825295860488169a81019a909a52928404861697890197909752958204841695870195909552041691830191909152928101929092525490915061320e9073ffffffffffffffffffffffffffffffffffffffff16858561393e565b827f72668fc19363598fc595447cb58bcd4c0d2d2ff22fef57d2b62cc397fb1298de826040516132919190600060c08201905065ffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401525092915050565b60405180910390a2509092915050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a86565b600061335d836119ed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806133cc57508373ffffffffffffffffffffffffffffffffffffffff166133b484610bf7565b73ffffffffffffffffffffffffffffffffffffffff16145b806133dc57506133dc8185612ad9565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16613404826119ed565b73ffffffffffffffffffffffffffffffffffffffff16146134a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a86565b73ffffffffffffffffffffffffffffffffffffffff8216613549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a86565b613554838383613b6e565b61355f600082612f06565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290613595908490614f26565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906135d0908490614f39565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613661826119ed565b905061366f81600084613b6e565b61367a600083612f06565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604081208054600192906136b0908490614f26565b909155505060008281526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061373a83611536565b73ffffffffffffffffffffffffffffffffffffffff8481166000818152600c602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a460006137c784612aad565b9050612418828483613b91565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6138548484846133e4565b61386084848484613db6565b612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a86565b6000816c010000000000000000000000008410613936576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b509192915050565b73ffffffffffffffffffffffffffffffffffffffff82166139bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a86565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a86565b613a5360008383613b6e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260408120805460019290613a89908490614f39565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff868116919091179091559051839291861691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b613b79838383613fa9565b610e58613b8584611536565b613b8e84611536565b60015b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613bdb57506000816bffffffffffffffffffffffff16115b15610e585773ffffffffffffffffffffffffffffffffffffffff831615613ccd5773ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081205463ffffffff169081613c35576000613c94565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040812090613c66600185614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000613cbb8285604051806060016040528060378152602001615100603791396140af565b9050613cc986848484614115565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615610e585773ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604081205463ffffffff169081613d22576000613d81565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020526040812090613d53600185614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000613da8828560405180606001604052806036815260200161504960369139614398565b905061281185848484614115565b600073ffffffffffffffffffffffffffffffffffffffff84163b15613f9e576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613e2d903390899088908890600401614f4c565b6020604051808303816000875af1925050508015613e86575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613e8391810190614f95565b60015b613f53573d808015613eb4576040519150601f19603f3d011682016040523d82523d6000602084013e613eb9565b606091505b508051600003613f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a86565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506133dc565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166140115761400c81600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61404e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461404e5761404e8382614409565b73ffffffffffffffffffffffffffffffffffffffff821661407257610e58816144c0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e5857610e58828261456f565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff161115829061410a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b506133dc8385614fb2565b60006141394360405180608001604052806044815260200161507f604491396145c0565b905060008463ffffffff161180156141a0575073ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040812063ffffffff831691614184600188614bc3565b63ffffffff908116825260208201929092526040016000205416145b156142365773ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040812083916141d7600188614bc3565b63ffffffff168152602081019190915260400160002080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055614331565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000908152600d82528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169116179190911790556142d8846001614fd7565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516bffffffffffffffffffffffff80861682528416602082015273ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000806143a58486614ff4565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff1610158390614400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b50949350505050565b6000600161441684611a9f565b6144209190614f26565b6000838152600960205260409020549091508082146144805773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a546000906144d290600190614f26565b6000838152600b6020526040812054600a80549394509092849081106144fa576144fa614b1d565b9060005260206000200154905080600a838154811061451b5761451b614b1d565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061455357614553615019565b6001900381819060005260206000200160009055905550505050565b600061457a83611a9f565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6000816401000000008410613936576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b73ffffffffffffffffffffffffffffffffffffffff8116811461176657600080fd5b60006020828403121561463657600080fd5b813561156e81614602565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461176657600080fd5b60006020828403121561468157600080fd5b813561156e81614641565b60005b838110156146a757818101518382015260200161468f565b50506000910152565b600081518084526146c881602086016020860161468c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061156e60208301846146b0565b60006020828403121561471f57600080fd5b5035919050565b6000806040838503121561473957600080fd5b823561474481614602565b946020939093013593505050565b60008060006060848603121561476757600080fd5b833561477281614602565b9250602084013561478281614602565b929592945050506040919091013590565b600080604083850312156147a657600080fd5b82356147b181614602565b9150602083013580151581146147c657600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614847576148476147d1565b604052919050565b600067ffffffffffffffff821115614869576148696147d1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006148a86148a38461484f565b614800565b90508281528383830111156148bc57600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156148e957600080fd5b84356148f481614602565b9350602085013561490481614602565b925060408501359150606085013567ffffffffffffffff81111561492757600080fd5b8501601f8101871361493857600080fd5b61494787823560208401614895565b91505092959194509250565b60006020828403121561496557600080fd5b813567ffffffffffffffff81111561497c57600080fd5b8201601f8101841361498d57600080fd5b6133dc84823560208401614895565b60008060008060008060c087890312156149b557600080fd5b86356149c081614602565b95506020870135945060408701359350606087013560ff811681146149e457600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215614a1157600080fd5b8235614a1c81614602565b915060208301356147c681614602565b60008060408385031215614a3f57600080fd5b8235614a4a81614602565b9150602083013563ffffffff811681146147c657600080fd5b600181811c90821680614a7757607f821691505b602082108103614ab0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b1657614b16614ab6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215614b5e57600080fd5b815167ffffffffffffffff811115614b7557600080fd5b8201601f81018413614b8657600080fd5b8051614b946148a38261484f565b818152856020838501011115614ba957600080fd5b614bba82602083016020860161468c565b95945050505050565b63ffffffff828116828216039080821115614be057614be0614ab6565b5092915050565b600063ffffffff80841680614c25577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b601f821115610e5857600081815260208120601f850160051c81016020861015614c585750805b601f850160051c820191505b8181101561281157828155600101614c64565b815167ffffffffffffffff811115614c9157614c916147d1565b614ca581614c9f8454614a63565b84614c31565b602080601f831160018114614cf85760008415614cc25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612811565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614d4557888601518255948401946001909101908401614d26565b5085821015614d8157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000600760008454614dc581614a63565b60018281168015614ddd5760018114614e1457614e47565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416868901528583151584028901019450614e47565b8860005260208060002060005b85811015614e3c5781548b82018a0152908401908201614e21565b505050858389010194505b5092979650505050505050565b600060208284031215614e6657600080fd5b815161156e81614602565b805165ffffffffffff811681146112a757600080fd5b600060c08284031215614e9957600080fd5b60405160c0810181811067ffffffffffffffff82111715614ebc57614ebc6147d1565b604052614ec883614e71565b8152614ed660208401614e71565b6020820152614ee760408401614e71565b6040820152614ef860608401614e71565b6060820152614f0960808401614e71565b6080820152614f1a60a08401614e71565b60a08201529392505050565b81810381811115610b5f57610b5f614ab6565b80820180821115610b5f57610b5f614ab6565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614f8b60808301846146b0565b9695505050505050565b600060208284031215614fa757600080fd5b815161156e81614641565b6bffffffffffffffffffffffff828116828216039080821115614be057614be0614ab6565b63ffffffff818116838216019080821115614be057614be0614ab6565b6bffffffffffffffffffffffff818116838216019080821115614be057614be0614ab6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a26469706673582212205f2b0968467afd04295fffb8b1655b68906ff458a2a5366d02ead067bd99fa6364736f6c63430008110033516d65614b78376572337445676d63347666434175394a75733979565756384b4d7964706d627570534b53754a31000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd00000000000000000000000016c3b8ce1a7d7e2c26dd2cccf29e8fc54513f02000000000000000000000000068f41ad5f12fe9002e537dda35ecf2cac6b0dd37000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103835760003560e01c80636fcfff45116101de578063baedc1c41161010f578063e7a324dc116100ad578063f0503e801161007c578063f0503e8014610898578063f1127ed814610964578063f2fde38b146109d6578063fca3b5aa146109e957600080fd5b8063e7a324dc14610843578063e8a3d4851461086a578063e9580e9114610872578063e985e9c51461088557600080fd5b8063c3cda520116100e9578063c3cda520146107e3578063c87b56dd146107f6578063c8fc0c2314610809578063d50b31eb1461083057600080fd5b8063baedc1c414610787578063c1b8e4e11461079a578063c2263cc7146107c057600080fd5b80638da5cb5b1161017c578063a22cb46511610156578063a22cb46514610727578063b4b5ea571461073a578063b50cbd9f1461074d578063b88d4fde1461077457600080fd5b80638da5cb5b146106ee57806395d89b411461070c5780639a1ea01b1461071457600080fd5b8063728c18de116101b8578063728c18de1461068357806376daebe114610696578063782d6fe11461069e5780637ecebe00146106ce57600080fd5b80636fcfff451461062d57806370a0823114610668578063715018a61461067b57600080fd5b80633b7cb633116102b8578063587cde1e116102565780635f295a67116102305780635f295a67146105df57806361b8a689146105e75780636352211e146105fa578063684931ed1461060d57600080fd5b8063587cde1e146105a65780635ac1e3bb146105b95780635c19a95c146105cc57600080fd5b806342842e0e1161029257806342842e0e1461054a57806342966c681461055d578063472d5008146105705780634f6ccce71461059357600080fd5b80633b7cb6331461050f57806340fbddff1461052f57806341b5d0de1461054257600080fd5b806318160ddd1161032557806323b872dd116102ff57806323b872dd146104af5780632f745c59146104c2578063303e74df146104d5578063313ce567146104f557600080fd5b806318160ddd1461045b5780631e688e101461046357806320606b701461048857600080fd5b8063075461721161036157806307546172146103da578063081812fc1461041f578063095ea7b3146104325780631249c58b1461044557600080fd5b806301b9a3971461038857806301ffc9a71461039d57806306fdde03146103c5575b600080fd5b61039b610396366004614624565b6109fc565b005b6103b06103ab36600461466f565b610b09565b60405190151581526020015b60405180910390f35b6103cd610b65565b6040516103bc91906146fa565b6011546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103bc565b6103fa61042d36600461470d565b610bf7565b61039b610440366004614726565b610cd1565b61044d610e5d565b6040519081526020016103bc565b600a5461044d565b6014546103b09074010000000000000000000000000000000000000000900460ff1681565b61044d7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61039b6104bd366004614752565b610f1c565b61044d6104d0366004614726565b611036565b6013546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b6104fd600081565b60405160ff90911681526020016103bc565b6010546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b6104fd61053d36600461470d565b611105565b61039b6112ac565b61039b610558366004614752565b6113a5565b61039b61056b36600461470d565b6113c0565b6103b061057e366004614624565b60126020526000908152604090205460ff1681565b61044d6105a136600461470d565b611478565b6103fa6105b4366004614624565b611536565b6103cd6105c736600461470d565b611575565b61039b6105da366004614624565b61173e565b61039b611769565b61039b6105f536600461470d565b611864565b6103fa61060836600461470d565b6119ed565b6014546103fa9073ffffffffffffffffffffffffffffffffffffffff1681565b61065361063b366004614624565b600e6020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016103bc565b61044d610676366004614624565b611a9f565b61039b611b6d565b61039b610691366004614624565b611b81565b61039b611c9b565b6106b16106ac366004614726565b611d92565b6040516bffffffffffffffffffffffff90911681526020016103bc565b61044d6106dc366004614624565b600f6020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff166103fa565b6103cd6120ac565b61039b610722366004614793565b6120bb565b61039b610735366004614793565b61214a565b6106b1610748366004614624565b612260565b6103fa7f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c181565b61039b6107823660046148d3565b6122fd565b61039b610795366004614953565b61241e565b6014546103b0907501000000000000000000000000000000000000000000900460ff1681565b6103b06107ce36600461470d565b60076020526000908152604090205460ff1681565b61039b6107f136600461499c565b612436565b6103cd61080436600461470d565b612819565b6014546103b090760100000000000000000000000000000000000000000000900460ff1681565b61039b61083e366004614624565b612983565b61044d7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6103cd612a85565b6106b1610880366004614624565b612aad565b6103b06108933660046149fe565b612ad9565b6109236108a636600461470d565b6015602052600090815260409020805460019091015465ffffffffffff80831692660100000000000081048216926c01000000000000000000000000820483169272010000000000000000000000000000000000008304811692780100000000000000000000000000000000000000000000000090048116911686565b6040805165ffffffffffff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016103bc565b6109ad610972366004614a2c565b600d60209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff9091166020830152016103bc565b61039b6109e4366004614624565b612bee565b61039b6109f7366004614624565b612ca2565b610a04612da2565b6014547501000000000000000000000000000000000000000000900460ff1615610a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f44657363726970746f72206973206c6f636b656400000000000000000000000060448201526064015b60405180910390fd5b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f6e66ab22238a5471005895947c8f57db923c2a9c9c73180eff80864c21295c1b906020015b60405180910390a150565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b5f5750610b5f82612e23565b92915050565b606060018054610b7490614a63565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba090614a63565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a86565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610cdc826119ed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a86565b3373ffffffffffffffffffffffffffffffffffffffff82161480610dc25750610dc28133612ad9565b610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a86565b610e588383612f06565b505050565b60115460009073ffffffffffffffffffffffffffffffffffffffff163314610ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f7420746865206d696e74657200000000000000006044820152606401610a86565b60115460168054610f179273ffffffffffffffffffffffffffffffffffffffff16916000610f0e83614ae5565b91905055612fa6565b905090565b610f2633826132a1565b610fb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a86565b60008181526007602052604090205460ff161561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546f6b656e206973205374616b656420616e64204c6f636b65640000000000006044820152606401610a86565b610e588383836133e4565b600061104183611a9f565b82106110cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a86565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b3360009081526012602052604081205460ff1661117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f74207468652067617261676500000000000000006044820152606401610a86565b611187826119ed565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f6620537765657065720000000000000000000000006044820152606401610a86565b6000828152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182907f7d36527e1690deb87a193610cc1f0afb9d56ea423406c96a315ba67117f766ed906112869042815260200190565b60405180910390a25060008181526015602052604090205465ffffffffffff165b919050565b6112b4612da2565b6014547501000000000000000000000000000000000000000000900460ff161561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f44657363726970746f72206973206c6f636b65640000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040517f593e31e306c198bef259d839f7c6dc4ff7fc10c07f76fab193a210b03704105f90600090a1565b610e58838383604051806020016040528060008152506122fd565b60115473ffffffffffffffffffffffffffffffffffffffff163314611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f7420746865206d696e74657200000000000000006044820152606401610a86565b61144a81613656565b60405181907f1bbce8ecee5dc0a3e78c8f538fed8a0018e9efd5eec8348f696b0dbe29a743e290600090a250565b6000611483600a5490565b8210611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a86565b600a828154811061152457611524614b1d565b90600052602060002001549050919050565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600c6020526040812054909116801561156c578061156e565b825b9392505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f5377656570657273546f6b656e3a2055524920717565727920666f72206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610a86565b6013546000838152601560205260409081902090517fa18f671000000000000000000000000000000000000000000000000000000000815260048101859052815465ffffffffffff8082166024840152603082901c81166044840152606082901c81166064840152609082901c8116608484015260c09190911c811660a483015260019092015490911660c482015273ffffffffffffffffffffffffffffffffffffffff9091169063a18f67109060e4015b600060405180830381865afa1580156116f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b5f9190810190614b4c565b73ffffffffffffffffffffffffffffffffffffffff811661175c5750335b611766338261372f565b50565b611771612da2565b601454760100000000000000000000000000000000000000000000900460ff16156117f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f536565646572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000001790556040517ff59561f22794afcfb1e6be5c4733f5449fd167252a96b74bb06d341fb0dac7ed90600090a1565b3360009081526012602052604090205460ff166118dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53656e646572206973206e6f74207468652067617261676500000000000000006044820152606401610a86565b6118e6816119ed565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461197a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f6620537765657065720000000000000000000000006044820152606401610a86565b6000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555181907fd9743dba3f1e52a74f005eaaf491be482ac1fe4653975f0d7ef2d8382cc0d727906119e29042815260200190565b60405180910390a250565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a86565b600073ffffffffffffffffffffffffffffffffffffffff8216611b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a86565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b611b75612da2565b611b7f60006137d4565b565b60105473ffffffffffffffffffffffffffffffffffffffff163314611c28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f53656e646572206973206e6f742074686520737765657065727320547265617360448201527f75727900000000000000000000000000000000000000000000000000000000006064820152608401610a86565b601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f922c2392f081081ce632aa0e69aec5bec8ac0deb638f309b416a4694863ffec290602001610afe565b611ca3612da2565b60145474010000000000000000000000000000000000000000900460ff1615611d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d696e746572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f192417b3f16b1ce69e0c59b0376549666650245ffc05e4b2569089dda8589b6690600090a1565b6000438210611e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f455243373231436865636b706f696e7461626c653a3a6765745072696f72566f60448201527f7465733a206e6f74207965742064657465726d696e65640000000000000000006064820152608401610a86565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081205463ffffffff1690819003611e61576000915050610b5f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604081208491611e93600185614bc3565b63ffffffff90811682526020820192909252604001600020541611611f195773ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020526040812090611ee3600184614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169150610b5f9050565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020908152604080832083805290915290205463ffffffff16831015611f61576000915050610b5f565b600080611f6f600184614bc3565b90505b8163ffffffff168163ffffffff1611156120545760006002611f948484614bc3565b611f9e9190614be7565b611fa89083614bc3565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600d6020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff169181019190915291925087900361202857602001519450610b5f9350505050565b805163ffffffff1687111561203f5781935061204d565b61204a600183614bc3565b92505b5050611f72565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b606060028054610b7490614a63565b6120c3612da2565b73ffffffffffffffffffffffffffffffffffffffff821660008181526012602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151517905590519182527f440c68d98a5ca8d9d97e0853f090cc3d8c9657e4a69247fb7151f977a55d61be910160405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff8316036121c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a86565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600e602052604081205463ffffffff168061229857600061156e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d60205260408120906122c9600184614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff169392505050565b61230733836132a1565b612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a86565b60008281526007602052604090205460ff161561240c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546f6b656e206973205374616b656420616e64204c6f636b65640000000000006044820152606401610a86565b61241884848484613849565b50505050565b612426612da2565b60176124328282614c77565b5050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612461610b65565b8051906020012061246f4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c084015273ffffffffffffffffffffffffffffffffffffffff8b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401909252815191909301207f1901000000000000000000000000000000000000000000000000000000000000610160830152610162820183905261018282018190529192506000906101a201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156125e1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964207369676e6174757265000000000000000000006064820152608401610a86565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604081208054916126e083614ae5565b919050558914612772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a20696e76616c6964206e6f6e636500000000000000000000000000006064820152608401610a86565b87421115612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f455243373231436865636b706f696e7461626c653a3a64656c6567617465427960448201527f5369673a207369676e61747572652065787069726564000000000000000000006064820152608401610a86565b61280c818b61372f565b505050505b505050505050565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff166128cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f5377656570657273546f6b656e3a2055524920717565727920666f72206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610a86565b6013546000838152601560205260409081902090517f4263812100000000000000000000000000000000000000000000000000000000815260048101859052815465ffffffffffff8082166024840152603082901c81166044840152606082901c81166064840152609082901c8116608484015260c09190911c811660a483015260019092015490911660c482015273ffffffffffffffffffffffffffffffffffffffff9091169063426381219060e4016116db565b61298b612da2565b601454760100000000000000000000000000000000000000000000900460ff1615612a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f536565646572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fb3025222d01ce9a26c7f9d52bc3bfd0352366bd90a793c273fbfe1c81e0e288e90602001610afe565b60606017604051602001612a999190614d91565b604051602081830303815290604052905090565b6000610b5f612abb83611a9f565b6040518060600160405280603d81526020016150c3603d91396138ec565b6040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600091818416917f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1169063c455279190602401602060405180830381865afa158015612b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b909190614e54565b73ffffffffffffffffffffffffffffffffffffffff1603612bb357506001610b5f565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526006602090815260408083209386168352929052205460ff1661156e565b612bf6612da2565b73ffffffffffffffffffffffffffffffffffffffff8116612c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a86565b611766816137d4565b612caa612da2565b60145474010000000000000000000000000000000000000000900460ff1615612d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d696e746572206973206c6f636b6564000000000000000000000000000000006044820152606401610a86565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a90602001610afe565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a86565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612eb657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b5f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b5f565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612f60826119ed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6014546013546040517f422e2e990000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff91821660248201526000928392169063422e2e999060440160c060405180830381865afa158015613023573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130479190614e87565b60008481526015602090815260408083208451815486850151878501516060808a01516080808c015165ffffffffffff9788167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009097169690961766010000000000009588168602177fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c0100000000000000000000000094881685027fffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff161772010000000000000000000000000000000000009288168302177fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff811678010000000000000000000000000000000000000000000000009789168802908117808b5560a09e8f01516001909b0180547fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000169b8b169b8c1790558b5160c081018d52928a16918a1691909117825295860488169a81019a909a52928404861697890197909752958204841695870195909552041691830191909152928101929092525490915061320e9073ffffffffffffffffffffffffffffffffffffffff16858561393e565b827f72668fc19363598fc595447cb58bcd4c0d2d2ff22fef57d2b62cc397fb1298de826040516132919190600060c08201905065ffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401525092915050565b60405180910390a2509092915050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a86565b600061335d836119ed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806133cc57508373ffffffffffffffffffffffffffffffffffffffff166133b484610bf7565b73ffffffffffffffffffffffffffffffffffffffff16145b806133dc57506133dc8185612ad9565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16613404826119ed565b73ffffffffffffffffffffffffffffffffffffffff16146134a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a86565b73ffffffffffffffffffffffffffffffffffffffff8216613549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a86565b613554838383613b6e565b61355f600082612f06565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290613595908490614f26565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906135d0908490614f39565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613661826119ed565b905061366f81600084613b6e565b61367a600083612f06565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604081208054600192906136b0908490614f26565b909155505060008281526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061373a83611536565b73ffffffffffffffffffffffffffffffffffffffff8481166000818152600c602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a460006137c784612aad565b9050612418828483613b91565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6138548484846133e4565b61386084848484613db6565b612418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a86565b6000816c010000000000000000000000008410613936576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b509192915050565b73ffffffffffffffffffffffffffffffffffffffff82166139bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a86565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a86565b613a5360008383613b6e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260408120805460019290613a89908490614f39565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff868116919091179091559051839291861691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b613b79838383613fa9565b610e58613b8584611536565b613b8e84611536565b60015b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613bdb57506000816bffffffffffffffffffffffff16115b15610e585773ffffffffffffffffffffffffffffffffffffffff831615613ccd5773ffffffffffffffffffffffffffffffffffffffff83166000908152600e602052604081205463ffffffff169081613c35576000613c94565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040812090613c66600185614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000613cbb8285604051806060016040528060378152602001615100603791396140af565b9050613cc986848484614115565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615610e585773ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604081205463ffffffff169081613d22576000613d81565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020526040812090613d53600185614bc3565b63ffffffff16815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b90506000613da8828560405180606001604052806036815260200161504960369139614398565b905061281185848484614115565b600073ffffffffffffffffffffffffffffffffffffffff84163b15613f9e576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613e2d903390899088908890600401614f4c565b6020604051808303816000875af1925050508015613e86575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613e8391810190614f95565b60015b613f53573d808015613eb4576040519150601f19603f3d011682016040523d82523d6000602084013e613eb9565b606091505b508051600003613f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a86565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506133dc565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166140115761400c81600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61404e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461404e5761404e8382614409565b73ffffffffffffffffffffffffffffffffffffffff821661407257610e58816144c0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e5857610e58828261456f565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff161115829061410a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b506133dc8385614fb2565b60006141394360405180608001604052806044815260200161507f604491396145c0565b905060008463ffffffff161180156141a0575073ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040812063ffffffff831691614184600188614bc3565b63ffffffff908116825260208201929092526040016000205416145b156142365773ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040812083916141d7600188614bc3565b63ffffffff168152602081019190915260400160002080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055614331565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000908152600d82528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169116179190911790556142d8846001614fd7565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516bffffffffffffffffffffffff80861682528416602082015273ffffffffffffffffffffffffffffffffffffffff8716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000806143a58486614ff4565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff1610158390614400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b50949350505050565b6000600161441684611a9f565b6144209190614f26565b6000838152600960205260409020549091508082146144805773ffffffffffffffffffffffffffffffffffffffff841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b50600091825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a546000906144d290600190614f26565b6000838152600b6020526040812054600a80549394509092849081106144fa576144fa614b1d565b9060005260206000200154905080600a838154811061451b5761451b614b1d565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061455357614553615019565b6001900381819060005260206000200160009055905550505050565b600061457a83611a9f565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6000816401000000008410613936576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8691906146fa565b73ffffffffffffffffffffffffffffffffffffffff8116811461176657600080fd5b60006020828403121561463657600080fd5b813561156e81614602565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461176657600080fd5b60006020828403121561468157600080fd5b813561156e81614641565b60005b838110156146a757818101518382015260200161468f565b50506000910152565b600081518084526146c881602086016020860161468c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061156e60208301846146b0565b60006020828403121561471f57600080fd5b5035919050565b6000806040838503121561473957600080fd5b823561474481614602565b946020939093013593505050565b60008060006060848603121561476757600080fd5b833561477281614602565b9250602084013561478281614602565b929592945050506040919091013590565b600080604083850312156147a657600080fd5b82356147b181614602565b9150602083013580151581146147c657600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614847576148476147d1565b604052919050565b600067ffffffffffffffff821115614869576148696147d1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006148a86148a38461484f565b614800565b90508281528383830111156148bc57600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156148e957600080fd5b84356148f481614602565b9350602085013561490481614602565b925060408501359150606085013567ffffffffffffffff81111561492757600080fd5b8501601f8101871361493857600080fd5b61494787823560208401614895565b91505092959194509250565b60006020828403121561496557600080fd5b813567ffffffffffffffff81111561497c57600080fd5b8201601f8101841361498d57600080fd5b6133dc84823560208401614895565b60008060008060008060c087890312156149b557600080fd5b86356149c081614602565b95506020870135945060408701359350606087013560ff811681146149e457600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215614a1157600080fd5b8235614a1c81614602565b915060208301356147c681614602565b60008060408385031215614a3f57600080fd5b8235614a4a81614602565b9150602083013563ffffffff811681146147c657600080fd5b600181811c90821680614a7757607f821691505b602082108103614ab0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b1657614b16614ab6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215614b5e57600080fd5b815167ffffffffffffffff811115614b7557600080fd5b8201601f81018413614b8657600080fd5b8051614b946148a38261484f565b818152856020838501011115614ba957600080fd5b614bba82602083016020860161468c565b95945050505050565b63ffffffff828116828216039080821115614be057614be0614ab6565b5092915050565b600063ffffffff80841680614c25577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b601f821115610e5857600081815260208120601f850160051c81016020861015614c585750805b601f850160051c820191505b8181101561281157828155600101614c64565b815167ffffffffffffffff811115614c9157614c916147d1565b614ca581614c9f8454614a63565b84614c31565b602080601f831160018114614cf85760008415614cc25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612811565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614d4557888601518255948401946001909101908401614d26565b5085821015614d8157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000600760008454614dc581614a63565b60018281168015614ddd5760018114614e1457614e47565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416868901528583151584028901019450614e47565b8860005260208060002060005b85811015614e3c5781548b82018a0152908401908201614e21565b505050858389010194505b5092979650505050505050565b600060208284031215614e6657600080fd5b815161156e81614602565b805165ffffffffffff811681146112a757600080fd5b600060c08284031215614e9957600080fd5b60405160c0810181811067ffffffffffffffff82111715614ebc57614ebc6147d1565b604052614ec883614e71565b8152614ed660208401614e71565b6020820152614ee760408401614e71565b6040820152614ef860608401614e71565b6060820152614f0960808401614e71565b6080820152614f1a60a08401614e71565b60a08201529392505050565b81810381811115610b5f57610b5f614ab6565b80820180821115610b5f57610b5f614ab6565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614f8b60808301846146b0565b9695505050505050565b600060208284031215614fa757600080fd5b815161156e81614641565b6bffffffffffffffffffffffff828116828216039080821115614be057614be0614ab6565b63ffffffff818116838216019080821115614be057614be0614ab6565b6bffffffffffffffffffffffff818116838216019080821115614be057614be0614ab6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f7773455243373231436865636b706f696e7461626c653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473455243373231436865636b706f696e7461626c653a3a766f746573546f44656c65676174653a20616d6f756e7420657863656564732039362062697473455243373231436865636b706f696e7461626c653a3a5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f7773a26469706673582212205f2b0968467afd04295fffb8b1655b68906ff458a2a5366d02ead067bd99fa6364736f6c63430008110033

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

000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd00000000000000000000000016c3b8ce1a7d7e2c26dd2cccf29e8fc54513f02000000000000000000000000068f41ad5f12fe9002e537dda35ecf2cac6b0dd37000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _sweepersTreasury (address): 0xF803B11bcfF23D9Ed1dF84ee897beEF26DF9ACdd
Arg [1] : _minter (address): 0xF803B11bcfF23D9Ed1dF84ee897beEF26DF9ACdd
Arg [2] : _descriptor (address): 0x16C3b8ce1a7d7E2C26DD2CCCf29e8Fc54513F020
Arg [3] : _seeder (address): 0x68f41ad5f12fe9002e537DdA35ecf2cAc6b0DD37
Arg [4] : _proxyRegistry (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd
Arg [1] : 000000000000000000000000f803b11bcff23d9ed1df84ee897beef26df9acdd
Arg [2] : 00000000000000000000000016c3b8ce1a7d7e2c26dd2cccf29e8fc54513f020
Arg [3] : 00000000000000000000000068f41ad5f12fe9002e537dda35ecf2cac6b0dd37
Arg [4] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

603:8009:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7159:195;;;;;;:::i;:::-;;:::i;:::-;;1457:222:13;;;;;;:::i;:::-;;:::i;:::-;;;1092:14:18;;1085:22;1067:41;;1055:2;1040:18;1457:222:13;;;;;;;;3385:98:11;;;:::i;:::-;;;;;;;:::i;810:21:10:-;;;;;;;;;;;;2110:42:18;2098:55;;;2080:74;;2068:2;2053:18;810:21:10;1934:226:18;4896:217:11;;;;;;:::i;:::-;;:::i;4434:401::-;;;;;;:::i;:::-;;:::i;4922:121:10:-;;;:::i;:::-;;;2837:25:18;;;2825:2;2810:18;4922:121:10;2691:177:18;2082:111:13;2169:10;:17;2082:111;;1144:26:10;;;;;;;;;;;;1996:130:12;;2046:80;1996:130;;5760:354:11;;;;;;:::i;:::-;;:::i;1758:253:13:-;;;;;;:::i;:::-;;:::i;990:37:10:-;;;;;;;;;1371:34:12;;1404:1;1371:34;;;;;3989:4:18;3977:17;;;3959:36;;3947:2;3932:18;1371:34:12;3817:184:18;717:31:10;;;;;;;;;4207:320;;;;;;:::i;:::-;;:::i;7499:154::-;;;:::i;6180:179:11:-;;;;;;:::i;:::-;;:::i;5096:132:10:-;;;;;;:::i;:::-;;:::i;904:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2265:230:13;;;;;;:::i;:::-;;:::i;3406:184:12:-;;;;;;:::i;:::-;;:::i;5758:231:10:-;;;;;;:::i;:::-;;:::i;4258:161:12:-;;;;;;:::i;:::-;;:::i;8072:138:10:-;;;:::i;4533:272::-;;;;;;:::i;:::-;;:::i;3088:235:11:-;;;;;;:::i;:::-;;:::i;1067:29:10:-;;;;;;;;;1878:48:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4708:10:18;4696:23;;;4678:42;;4666:2;4651:18;1878:48:12;4534:192:18;2826:205:11;;;;;;:::i;:::-;;:::i;1831:101:0:-;;;:::i;6121:206:10:-;;;;;;:::i;:::-;;:::i;6898:138::-;;;:::i;6601:1205:12:-;;;;;;:::i;:::-;;:::i;:::-;;;4905:26:18;4893:39;;;4875:58;;4863:2;4848:18;6601:1205:12;4731:208:18;2420:41:12;;;;;;:::i;:::-;;;;;;;;;;;;;;1201:85:0;1247:7;1273:6;;;1201:85;;3547:102:11;;;:::i;6603:154:10:-;;;;;;:::i;:::-;;:::i;5180:290:11:-;;;;;;:::i;:::-;;:::i;5960:219:12:-;;;;;;:::i;:::-;;:::i;1674:45:10:-;;;;;6425:396:11;;;;;;:::i;:::-;;:::i;3603:135:10:-;;;;;;:::i;:::-;;:::i;1222:30::-;;;;;;;;;;;;2118:49:11;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4842:924:12;;;;;;:::i;:::-;;:::i;5373:233:10:-;;;;;;:::i;:::-;;:::i;1300:26::-;;;;;;;;;;;;7768:163;;;;;;:::i;:::-;;:::i;2217:125:12:-;;2271:71;2217:125;;3364:136:10;;;:::i;3005:190:12:-;;;;;;:::i;:::-;;:::i;3873:328:10:-;;;;;;:::i;:::-;;:::i;1358:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9785:14:18;9826:15;;;9808:34;;9878:15;;;9873:2;9858:18;;9851:43;9930:15;;;9910:18;;;9903:43;;;;9982:15;;;9977:2;9962:18;;9955:43;10035:15;;10029:3;10014:19;;10007:44;10088:15;;;10082:3;10067:19;;10060:44;9762:3;9747:19;1358:53:10;9500:610:18;1744:68:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10760:10:18;10748:23;;;10730:42;;10820:26;10808:39;;;10803:2;10788:18;;10781:67;10703:18;1744:68:12;10560:294:18;2081:198:0;;;;;;:::i;:::-;;:::i;6442:155:10:-;;;;;;:::i;:::-;;:::i;7159:195::-;1094:13:0;:11;:13::i;:::-;2045:18:10::1;::::0;;;::::1;;;2044:19;2036:52;;;::::0;::::1;::::0;;11061:2:18;2036:52:10::1;::::0;::::1;11043:21:18::0;11100:2;11080:18;;;11073:30;11139:22;11119:18;;;11112:50;11179:18;;2036:52:10::1;;;;;;;;;7277:10:::2;:24:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;7317:30:::2;::::0;2080:74:18;;;7317:30:10::2;::::0;2068:2:18;2053:18;7317:30:10::2;;;;;;;;7159:195:::0;:::o;1457:222:13:-;1559:4;1582:50;;;1597:35;1582:50;;:90;;;1636:36;1660:11;1636:23;:36::i;:::-;1575:97;1457:222;-1:-1:-1;;1457:222:13:o;3385:98:11:-;3439:13;3471:5;3464:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3385:98;:::o;4896:217::-;4972:7;8381:16;;;:7;:16;;;;;;:30;:16;4991:73;;;;;;;11852:2:18;4991:73:11;;;11834:21:18;11891:2;11871:18;;;11864:30;11930:34;11910:18;;;11903:62;12001:14;11981:18;;;11974:42;12033:19;;4991:73:11;11650:408:18;4991:73:11;-1:-1:-1;5082:24:11;;;;:15;:24;;;;;;;;;4896:217::o;4434:401::-;4514:13;4530:23;4545:7;4530:14;:23::i;:::-;4514:39;;4577:5;4571:11;;:2;:11;;;4563:57;;;;;;;12265:2:18;4563:57:11;;;12247:21:18;12304:2;12284:18;;;12277:30;12343:34;12323:18;;;12316:62;12414:3;12394:18;;;12387:31;12435:19;;4563:57:11;12063:397:18;4563:57:11;719:10:6;4652:21:11;;;;;:62;;-1:-1:-1;4677:37:11;4694:5;719:10:6;3873:328:10;:::i;4677:37:11:-;4631:165;;;;;;;12667:2:18;4631:165:11;;;12649:21:18;12706:2;12686:18;;;12679:30;12745:34;12725:18;;;12718:62;12816:26;12796:18;;;12789:54;12860:19;;4631:165:11;12465:420:18;4631:165:11;4807:21;4816:2;4820:7;4807:8;:21::i;:::-;4504:331;4434:401;;:::o;4922:121:10:-;2646:6;;4974:7;;2646:6;;2632:10;:20;2624:57;;;;;;;13092:2:18;2624:57:10;;;13074:21:18;13131:2;13111:18;;;13104:30;13170:26;13150:18;;;13143:54;13214:18;;2624:57:10;12890:348:18;2624:57:10;5008:6:::1;::::0;5016:17:::1;:19:::0;;5000:36:::1;::::0;5008:6:::1;;::::0;::::1;5016:19;::::0;::::1;:::i;:::-;;;;;5000:7;:36::i;:::-;4993:43;;4922:121:::0;:::o;5760:354:11:-;5897:41;719:10:6;5930:7:11;5897:18;:41::i;:::-;5889:103;;;;;;;13834:2:18;5889:103:11;;;13816:21:18;13873:2;13853:18;;;13846:30;13912:34;13892:18;;;13885:62;13983:19;13963:18;;;13956:47;14020:19;;5889:103:11;13632:413:18;5889:103:11;6011:26;;;;:17;:26;;;;;;;;6010:27;6002:66;;;;;;;14252:2:18;6002:66:11;;;14234:21:18;14291:2;14271:18;;;14264:30;14330:28;14310:18;;;14303:56;14376:18;;6002:66:11;14050:350:18;6002:66:11;6079:28;6089:4;6095:2;6099:7;6079:9;:28::i;1758:253:13:-;1855:7;1890:23;1907:5;1890:16;:23::i;:::-;1882:5;:31;1874:87;;;;;;;14607:2:18;1874:87:13;;;14589:21:18;14646:2;14626:18;;;14619:30;14685:34;14665:18;;;14658:62;14756:13;14736:18;;;14729:41;14787:19;;1874:87:13;14405:407:18;1874:87:13;-1:-1:-1;1978:19:13;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1758:253::o;4207:320:10:-;2822:10;4284:5;2815:18;;;:6;:18;;;;;;;;2807:55;;;;;;;15019:2:18;2807:55:10;;;15001:21:18;15058:2;15038:18;;;15031:30;15097:26;15077:18;;;15070:54;15141:18;;2807:55:10;14817:348:18;2807:55:10;4322:16:::1;4330:7;4322;:16::i;:::-;4309:29;;:9;:29;;;4301:62;;;::::0;::::1;::::0;;15372:2:18;4301:62:10::1;::::0;::::1;15354:21:18::0;15411:2;15391:18;;;15384:30;15450:22;15430:18;;;15423:50;15490:18;;4301:62:10::1;15170:344:18::0;4301:62:10::1;4374:26;::::0;;;:17:::1;:26;::::0;;;;;;:33;;;::::1;4403:4;4374:33;::::0;;4423:48;4392:7;;4423:48:::1;::::0;::::1;::::0;4455:15:::1;2837:25:18::0;;2825:2;2810:18;;2691:177;4423:48:10::1;;;;;;;;-1:-1:-1::0;4494:14:10::1;::::0;;;:5:::1;:14;::::0;;;;:25;::::1;;2872:1;4207:320:::0;;;:::o;7499:154::-;1094:13:0;:11;:13::i;:::-;2045:18:10::1;::::0;;;::::1;;;2044:19;2036:52;;;::::0;::::1;::::0;;11061:2:18;2036:52:10::1;::::0;::::1;11043:21:18::0;11100:2;11080:18;;;11073:30;11139:22;11119:18;;;11112:50;11179:18;;2036:52:10::1;10859:344:18::0;2036:52:10::1;7587:18:::2;:25:::0;;;::::2;::::0;::::2;::::0;;7628:18:::2;::::0;::::2;::::0;7587:25;;7628:18:::2;7499:154::o:0;6180:179:11:-;6313:39;6330:4;6336:2;6340:7;6313:39;;;;;;;;;;;;:16;:39::i;5096:132:10:-;2646:6;;;;2632:10;:20;2624:57;;;;;;;13092:2:18;2624:57:10;;;13074:21:18;13131:2;13111:18;;;13104:30;13170:26;13150:18;;;13143:54;13214:18;;2624:57:10;12890:348:18;2624:57:10;5166:16:::1;5172:9;5166:5;:16::i;:::-;5197:24;::::0;5211:9;;5197:24:::1;::::0;;;::::1;5096:132:::0;:::o;2265:230:13:-;2340:7;2375:30;2169:10;:17;;2082:111;2375:30;2367:5;:38;2359:95;;;;;;;15721:2:18;2359:95:13;;;15703:21:18;15760:2;15740:18;;;15733:30;15799:34;15779:18;;;15772:62;15870:14;15850:18;;;15843:42;15902:19;;2359:95:13;15519:408:18;2359:95:13;2471:10;2482:5;2471:17;;;;;;;;:::i;:::-;;;;;;;;;2464:24;;2265:230;;;:::o;3406:184:12:-;3502:21;;;;3465:7;3502:21;;;:10;:21;;;;;;3465:7;;3502:21;3540;;:43;;3576:7;3540:43;;;3564:9;3540:43;3533:50;3406:184;-1:-1:-1;;;3406:184:12:o;5758:231:10:-;8358:4:11;8381:16;;;:7;:16;;;;;;5822:13:10;;8381:30:11;:16;5847:75:10;;;;;;;16323:2:18;5847:75:10;;;16305:21:18;16362:2;16342:18;;;16335:30;16401:34;16381:18;;;16374:62;16472:16;16452:18;;;16445:44;16506:19;;5847:75:10;16121:410:18;5847:75:10;5939:10;;;5967:14;;;:5;:14;;;;;;;5939:43;;;;;;;;16752:25:18;;;16803:13;;16835:14;16885:18;;;16865;;;16858:46;16948:2;16944:18;;;16940:27;;16920:18;;;16913:55;17012:2;17008:18;;;17004:27;;16984:18;;;16977:55;17077:3;17073:19;;;17069:28;;17048:19;;;17041:57;17143:3;17139:19;;;;17135:28;;17114:19;;;17107:57;17223:4;17211:17;;;17205:24;17201:33;;;17180:19;;;17173:62;5939:10:10;;;;;:18;;16724:19:18;;5939:43:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4258:161:12:-;4316:23;;;4312:51;;-1:-1:-1;4353:10:12;4312:51;4380:32;4390:10;4402:9;4380;:32::i;:::-;4258:161;:::o;8072:138:10:-;1094:13:0;:11;:13::i;:::-;2238:14:10::1;::::0;;;::::1;;;2237:15;2229:44;;;::::0;::::1;::::0;;18101:2:18;2229:44:10::1;::::0;::::1;18083:21:18::0;18140:2;18120:18;;;18113:30;18179:18;18159;;;18152:46;18215:18;;2229:44:10::1;17899:340:18::0;2229:44:10::1;8152:14:::2;:21:::0;;;::::2;::::0;::::2;::::0;;8189:14:::2;::::0;::::2;::::0;8152:21;;8189:14:::2;8072:138::o:0;4533:272::-;2822:10;2815:18;;;;:6;:18;;;;;;;;2807:55;;;;;;;15019:2:18;2807:55:10;;;15001:21:18;15058:2;15038:18;;;15031:30;15097:26;15077:18;;;15070:54;15141:18;;2807:55:10;14817:348:18;2807:55:10;4636:16:::1;4644:7;4636;:16::i;:::-;4623:29;;:9;:29;;;4615:62;;;::::0;::::1;::::0;;15372:2:18;4615:62:10::1;::::0;::::1;15354:21:18::0;15411:2;15391:18;;;15384:30;15450:22;15430:18;;;15423:50;15490:18;;4615:62:10::1;15170:344:18::0;4615:62:10::1;4725:5;4696:26:::0;;;:17:::1;:26;::::0;;;;;;:34;;;::::1;::::0;;4746:52;4714:7;;4746:52:::1;::::0;::::1;::::0;4782:15:::1;2837:25:18::0;;2825:2;2810:18;;2691:177;4746:52:10::1;;;;;;;;4533:272:::0;:::o;3088:235:11:-;3160:7;3195:16;;;:7;:16;;;;;;;;;3221:73;;;;;;;18446:2:18;3221:73:11;;;18428:21:18;18485:2;18465:18;;;18458:30;18524:34;18504:18;;;18497:62;18595:11;18575:18;;;18568:39;18624:19;;3221:73:11;18244:405:18;2826:205:11;2898:7;2925:19;;;2917:74;;;;;;;18856:2:18;2917:74:11;;;18838:21:18;18895:2;18875:18;;;18868:30;18934:34;18914:18;;;18907:62;19005:12;18985:18;;;18978:40;19035:19;;2917:74:11;18654:406:18;2917:74:11;-1:-1:-1;3008:16:11;;;;;;:9;:16;;;;;;;2826:205::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;6121:206:10:-;2442:16;;;;2428:10;:30;2420:78;;;;;;;19267:2:18;2420:78:10;;;19249:21:18;19306:2;19286:18;;;19279:30;19345:34;19325:18;;;19318:62;19416:5;19396:18;;;19389:33;19439:19;;2420:78:10;19065:399:18;2420:78:10;6226:16:::1;:36:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;6278:42:::1;::::0;2080:74:18;;;6278:42:10::1;::::0;2068:2:18;2053:18;6278:42:10::1;1934:226:18::0;6898:138:10;1094:13:0;:11;:13::i;:::-;1852:14:10::1;::::0;;;::::1;;;1851:15;1843:44;;;::::0;::::1;::::0;;19671:2:18;1843:44:10::1;::::0;::::1;19653:21:18::0;19710:2;19690:18;;;19683:30;19749:18;19729;;;19722:46;19785:18;;1843:44:10::1;19469:340:18::0;1843:44:10::1;6978:14:::2;:21:::0;;;::::2;::::0;::::2;::::0;;7015:14:::2;::::0;::::2;::::0;6978:21;;7015:14:::2;6898:138::o:0;6601:1205:12:-;6683:6;6723:12;6709:11;:26;6701:94;;;;;;;20016:2:18;6701:94:12;;;19998:21:18;20055:2;20035:18;;;20028:30;20094:34;20074:18;;;20067:62;20165:25;20145:18;;;20138:53;20208:19;;6701:94:12;19814:419:18;6701:94:12;6828:23;;;6806:19;6828:23;;;:14;:23;;;;;;;;;6865:17;;;6861:56;;6905:1;6898:8;;;;;6861:56;6974:20;;;;;;;:11;:20;;;;;7026:11;;6995:16;7010:1;6995:12;:16;:::i;:::-;6974:38;;;;;;;;;;;;;;;-1:-1:-1;6974:38:12;:48;;:63;6970:145;;7060:20;;;;;;;:11;:20;;;;;;7081:16;7096:1;7081:12;:16;:::i;:::-;7060:38;;;;;;;;;;;;;-1:-1:-1;7060:38:12;:44;;;;;;;-1:-1:-1;7053:51:12;;-1:-1:-1;7053:51:12;6970:145;7173:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;7169:86:12;;;7243:1;7236:8;;;;;7169:86;7265:12;;7306:16;7321:1;7306:12;:16;:::i;:::-;7291:31;;7332:418;7347:5;7339:13;;:5;:13;;;7332:418;;;7368:13;7410:1;7393:13;7401:5;7393;:13;:::i;:::-;7392:19;;;;:::i;:::-;7384:27;;:5;:27;:::i;:::-;7475:20;;;7452;7475;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;7452:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;7475:28;;-1:-1:-1;7521:27:12;;;7517:223;;7575:8;;;;-1:-1:-1;7568:15:12;;-1:-1:-1;;;;7568:15:12;7517:223;7608:12;;:26;;;-1:-1:-1;7604:136:12;;;7662:6;7654:14;;7604:136;;;7715:10;7724:1;7715:6;:10;:::i;:::-;7707:18;;7604:136;7354:396;;7332:418;;;-1:-1:-1;7766:20:12;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;;;;;-1:-1:-1;;6601:1205:12;;;;:::o;3547:102:11:-;3603:13;3635:7;3628:14;;;;;:::i;6603:154:10:-;1094:13:0;:11;:13::i;:::-;6689:15:10::1;::::0;::::1;;::::0;;;:6:::1;:15;::::0;;;;;;;;:23;;;::::1;::::0;::::1;;;::::0;;6728:22;;2080:74:18;;;6728:22:10::1;::::0;2053:18:18;6728:22:10::1;;;;;;;6603:154:::0;;:::o;5180:290:11:-;719:10:6;5282:24:11;;;;5274:62;;;;;;;20970:2:18;5274:62:11;;;20952:21:18;21009:2;20989:18;;;20982:30;21048:27;21028:18;;;21021:55;21093:18;;5274:62:11;20768:349:18;5274:62:11;719:10:6;5347:32:11;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;5415:48;;1067:41:18;;;5347:42:11;;719:10:6;5415:48:11;;1040:18:18;5415:48:11;;;;;;;5180:290;;:::o;5960:219:12:-;6065:23;;;6025:6;6065:23;;;:14;:23;;;;;;;;6105:16;:67;;6171:1;6105:67;;;6124:20;;;;;;;:11;:20;;;;;;6145:16;6160:1;6145:12;:16;:::i;:::-;6124:38;;;;;;;;;;;;;-1:-1:-1;6124:38:12;:44;;;;;;;6098:74;-1:-1:-1;;;5960:219:12:o;6425:396:11:-;6594:41;719:10:6;6627:7:11;6594:18;:41::i;:::-;6586:103;;;;;;;13834:2:18;6586:103:11;;;13816:21:18;13873:2;13853:18;;;13846:30;13912:34;13892:18;;;13885:62;13983:19;13963:18;;;13956:47;14020:19;;6586:103:11;13632:413:18;6586:103:11;6708:26;;;;:17;:26;;;;;;;;6707:27;6699:66;;;;;;;14252:2:18;6699:66:11;;;14234:21:18;14291:2;14271:18;;;14264:30;14330:28;14310:18;;;14303:56;14376:18;;6699:66:11;14050:350:18;6699:66:11;6775:39;6789:4;6795:2;6799:7;6808:5;6775:13;:39::i;:::-;6425:396;;;;:::o;3603:135:10:-;1094:13:0;:11;:13::i;:::-;3694:16:10::1;:37;3713:18:::0;3694:16;:37:::1;:::i;:::-;;3603:135:::0;:::o;4842:924:12:-;5017:23;2046:80;5110:6;:4;:6::i;:::-;5094:24;;;;;;5120:12;10891:9;;10768:172;5120:12;5066:82;;;;;;;23736:25:18;;;;23777:18;;;23770:34;;;;23820:18;;;23813:34;;;;5142:4:12;23863:18:18;;;;23856:83;;;;5066:82:12;;;;;;;;;;23708:19:18;;;5066:82:12;;5043:115;;;;;;2271:71;5199:57;;;24181:25:18;24254:42;24242:55;;24222:18;;;24215:83;24314:18;;;24307:34;;;24357:18;;;;24350:34;;;5199:57:12;;;;;;;;;;24153:19:18;;;5199:57:12;;;5189:68;;;;;;;24665:66:18;5294:57:12;;;24653:79:18;24748:11;;;24741:27;;;24784:12;;;24777:28;;;5043:115:12;;-1:-1:-1;;;24821:12:18;;5294:57:12;;;;;;;;;;;;;5284:68;;5294:57;5284:68;;;;5362:17;5382:26;;;;;;;;;25071:25:18;;;25144:4;25132:17;;25112:18;;;25105:45;;;;25166:18;;;25159:34;;;25209:18;;;25202:34;;;5284:68:12;;-1:-1:-1;5362:17:12;5382:26;;25043:19:18;;5382:26:12;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5382:26:12;;;;;;-1:-1:-1;;5426:23:12;;;5418:90;;;;;;;25449:2:18;5418:90:12;;;25431:21:18;25488:2;25468:18;;;25461:30;25527:34;25507:18;;;25500:62;25598:24;25578:18;;;25571:52;25640:19;;5418:90:12;25247:418:18;5418:90:12;5535:17;;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;5526:5;:28;5518:91;;;;;;;25872:2:18;5518:91:12;;;25854:21:18;25911:2;25891:18;;;25884:30;25950:34;25930:18;;;25923:62;26021:20;26001:18;;;25994:48;26059:19;;5518:91:12;25670:414:18;5518:91:12;5646:6;5627:15;:25;;5619:92;;;;;;;26291:2:18;5619:92:12;;;26273:21:18;26330:2;26310:18;;;26303:30;26369:34;26349:18;;;26342:62;26440:24;26420:18;;;26413:52;26482:19;;5619:92:12;26089:418:18;5619:92:12;5728:31;5738:9;5749;5728;:31::i;:::-;5721:38;;;;4842:924;;;;;;;:::o;5373:233:10:-;8358:4:11;8381:16;;;:7;:16;;;;;;5438:13:10;;8381:30:11;:16;5463:75:10;;;;;;;16323:2:18;5463:75:10;;;16305:21:18;16362:2;16342:18;;;16335:30;16401:34;16381:18;;;16374:62;16472:16;16452:18;;;16445:44;16506:19;;5463:75:10;16121:410:18;5463:75:10;5555:10;;;5584:14;;;:5;:14;;;;;;;5555:44;;;;;;;;16752:25:18;;;16803:13;;16835:14;16885:18;;;16865;;;16858:46;16948:2;16944:18;;;16940:27;;16920:18;;;16913:55;17012:2;17008:18;;;17004:27;;16984:18;;;16977:55;17077:3;17073:19;;;17069:28;;17048:19;;;17041:57;17143:3;17139:19;;;;17135:28;;17114:19;;;17107:57;17223:4;17211:17;;;17205:24;17201:33;;;17180:19;;;17173:62;5555:10:10;;;;;:19;;16724::18;;5555:44:10;16536:705:18;7768:163:10;1094:13:0;:11;:13::i;:::-;2238:14:10::1;::::0;;;::::1;;;2237:15;2229:44;;;::::0;::::1;::::0;;18101:2:18;2229:44:10::1;::::0;::::1;18083:21:18::0;18140:2;18120:18;;;18113:30;18179:18;18159;;;18152:46;18215:18;;2229:44:10::1;17899:340:18::0;2229:44:10::1;7870:6:::2;:16:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;7902:22:::2;::::0;2080:74:18;;;7902:22:10::2;::::0;2068:2:18;2053:18;7902:22:10::2;1934:226:18::0;3364:136:10;3408:13;3475:16;3447:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;3433:60;;3364:136;:::o;3005:190:12:-;3070:6;3095:93;3102:20;3112:9;3102;:20::i;:::-;3095:93;;;;;;;;;;;;;;;;;:6;:93::i;3873:328:10:-;4061:28;;;;;:40;2098:55:18;;;4061:28:10;;;2080:74:18;3979:4:10;;4061:40;;;;:13;:21;;;;2053:18:18;;4061:28:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;4057:82;;-1:-1:-1;4124:4:10;4117:11;;4057:82;5656:25:11;;;;5633:4;5656:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;4155:39:10;5536:162:11;2081:198:0;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;28084:2:18;2161:73:0::1;::::0;::::1;28066:21:18::0;28123:2;28103:18;;;28096:30;28162:34;28142:18;;;28135:62;28233:8;28213:18;;;28206:36;28259:19;;2161:73:0::1;27882:402:18::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;6442:155:10:-:0;1094:13:0;:11;:13::i;:::-;1852:14:10::1;::::0;;;::::1;;;1851:15;1843:44;;;::::0;::::1;::::0;;19671:2:18;1843:44:10::1;::::0;::::1;19653:21:18::0;19710:2;19690:18;;;19683:30;19749:18;19729;;;19722:46;19785:18;;1843:44:10::1;19469:340:18::0;1843:44:10::1;6536:6:::2;:16:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;6568:22:::2;::::0;2080:74:18;;;6568:22:10::2;::::0;2068:2:18;2053:18;6568:22:10::2;1934:226:18::0;1359:130:0;1247:7;1273:6;1422:23;1273:6;719:10:6;1422:23:0;1414:68;;;;;;;28491:2:18;1414:68:0;;;28473:21:18;;;28510:18;;;28503:30;28569:34;28549:18;;;28542:62;28621:18;;1414:68:0;28289:356:18;2467:300:11;2569:4;2604:40;;;2619:25;2604:40;;:104;;-1:-1:-1;2660:48:11;;;2675:33;2660:48;2604:104;:156;;;-1:-1:-1;952:25:8;937:40;;;;2724:36:11;829:155:8;12577:171:11;12651:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;12704:23;12651:24;12704:14;:23::i;:::-;12695:46;;;;;;;;;;;;12577:171;;:::o;8309:301:10:-;8448:6;;8479:10;;8448:42;;;;;;;;28852:25:18;;;8448:6:10;8479:10;;;28893:18:18;;;28886:83;8375:7:10;;;;8448:6;;:19;;28825:18:18;;8448:42:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8429:16;;;;:5;:16;;;;;;;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8429:61:10;;;;;;;;;;;;;;;8394:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1273:6:0;8394:96:10;;-1:-1:-1;8501:29:10;;1273:6:0;;8516:2:10;8520:9;8501:5;:29::i;:::-;8560:9;8545:31;8571:4;8545:31;;;;;30175:4:18;30217:3;30206:9;30202:19;30194:27;;30240:14;30300:2;30291:6;30285:13;30281:22;30270:9;30263:41;30372:2;30364:4;30356:6;30352:17;30346:24;30342:33;30335:4;30324:9;30320:20;30313:63;30444:2;30436:4;30428:6;30424:17;30418:24;30414:33;30407:4;30396:9;30392:20;30385:63;30516:2;30508:4;30500:6;30496:17;30490:24;30486:33;30479:4;30468:9;30464:20;30457:63;30588:2;30580:4;30572:6;30568:17;30562:24;30558:33;30551:4;30540:9;30536:20;30529:63;30660:2;30652:4;30644:6;30640:17;30634:24;30630:33;30623:4;30612:9;30608:20;30601:63;;30039:631;;;;;8545:31:10;;;;;;;;-1:-1:-1;8594:9:10;;8309:301;-1:-1:-1;;8309:301:10:o;8576:344:11:-;8669:4;8381:16;;;:7;:16;;;;;;:30;:16;8685:73;;;;;;;30877:2:18;8685:73:11;;;30859:21:18;30916:2;30896:18;;;30889:30;30955:34;30935:18;;;30928:62;31026:14;31006:18;;;30999:42;31058:19;;8685:73:11;30675:408:18;8685:73:11;8768:13;8784:23;8799:7;8784:14;:23::i;:::-;8768:39;;8836:5;8825:16;;:7;:16;;;:51;;;;8869:7;8845:31;;:20;8857:7;8845:11;:20::i;:::-;:31;;;8825:51;:87;;;;8880:32;8897:5;8904:7;8880:16;:32::i;:::-;8817:96;8576:344;-1:-1:-1;;;;8576:344:11:o;11906:560::-;12060:4;12033:31;;:23;12048:7;12033:14;:23::i;:::-;:31;;;12025:85;;;;;;;31290:2:18;12025:85:11;;;31272:21:18;31329:2;31309:18;;;31302:30;31368:34;31348:18;;;31341:62;31439:11;31419:18;;;31412:39;31468:19;;12025:85:11;31088:405:18;12025:85:11;12128:16;;;12120:65;;;;;;;31700:2:18;12120:65:11;;;31682:21:18;31739:2;31719:18;;;31712:30;31778:34;31758:18;;;31751:62;31849:6;31829:18;;;31822:34;31873:19;;12120:65:11;31498:400:18;12120:65:11;12196:39;12217:4;12223:2;12227:7;12196:20;:39::i;:::-;12297:29;12314:1;12318:7;12297:8;:29::i;:::-;12337:15;;;;;;;:9;:15;;;;;:20;;12356:1;;12337:15;:20;;12356:1;;12337:20;:::i;:::-;;;;-1:-1:-1;;12367:13:11;;;;;;;:9;:13;;;;;:18;;12384:1;;12367:13;:18;;12384:1;;12367:18;:::i;:::-;;;;-1:-1:-1;;12395:16:11;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;12432:27;;12395:16;;12432:27;;;;;;;11906:560;;;:::o;11234:348::-;11293:13;11309:23;11324:7;11309:14;:23::i;:::-;11293:39;;11343:48;11364:5;11379:1;11383:7;11343:20;:48::i;:::-;11429:29;11446:1;11450:7;11429:8;:29::i;:::-;11469:16;;;;;;;:9;:16;;;;;:21;;11489:1;;11469:16;:21;;11489:1;;11469:21;:::i;:::-;;;;-1:-1:-1;;11507:16:11;;;;:7;:16;;;;;;11500:23;;;;;;11539:36;11515:7;;11507:16;11500:23;11539:36;;;;;11507:16;;11539:36;11283:299;11234:348;:::o;7812:481:12:-;8012:23;8038:20;8048:9;8038;:20::i;:::-;8069:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;8118:54;;8012:46;;-1:-1:-1;8069:33:12;8118:54;;;;;;8069:21;8118:54;8183:13;8199:26;8215:9;8199:15;:26::i;:::-;8183:42;;8236:50;8251:15;8268:9;8279:6;8236:14;:50::i;2433:187:0:-;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;7683:307:11:-;7834:28;7844:4;7850:2;7854:7;7834:9;:28::i;:::-;7880:48;7903:4;7909:2;7913:7;7922:5;7880:22;:48::i;:::-;7872:111;;;;;;;32368:2:18;7872:111:11;;;32350:21:18;32407:2;32387:18;;;32380:30;32446:34;32426:18;;;32419:62;32517:20;32497:18;;;32490:48;32555:19;;7872:111:11;32166:414:18;10183:161:12;10261:6;10298:12;10291:5;10287:9;;10279:32;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10335:1:12;;10183:161;-1:-1:-1;;10183:161:12:o;10548:469:11:-;10674:16;;;10666:61;;;;;;;32787:2:18;10666:61:11;;;32769:21:18;;;32806:18;;;32799:30;32865:34;32845:18;;;32838:62;32917:18;;10666:61:11;32585:356:18;10666:61:11;8358:4;8381:16;;;:7;:16;;;;;;:30;:16;:30;10737:58;;;;;;;33148:2:18;10737:58:11;;;33130:21:18;33187:2;33167:18;;;33160:30;33226;33206:18;;;33199:58;33274:18;;10737:58:11;32946:352:18;10737:58:11;10806:45;10835:1;10839:2;10843:7;10806:20;:45::i;:::-;10862:13;;;;;;;:9;:13;;;;;:18;;10879:1;;10862:13;:18;;10879:1;;10862:18;:::i;:::-;;;;-1:-1:-1;;10890:16:11;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;;10927:38;;10890:16;;10927:38;;;;10890:16;10927:38;;10890:16;;10927:38;11002:7;10998:2;10980:30;;10989:7;10980:30;;;;;;;;;;;;10548:469;;;:::o;3757:359:12:-;3888:45;3915:4;3921:2;3925:7;3888:26;:45::i;:::-;4060:49;4075:15;4085:4;4075:9;:15::i;:::-;4092:13;4102:2;4092:9;:13::i;:::-;4107:1;8299:983;8433:6;8423:16;;:6;:16;;;;:30;;;;;8452:1;8443:6;:10;;;8423:30;8419:857;;;8473:20;;;;8469:392;;8532:22;;;8513:16;8532:22;;;:14;:22;;;;;;;;;8591:13;:60;;8650:1;8591:60;;;8607:19;;;;;;;:11;:19;;;;;;8627:13;8639:1;8627:9;:13;:::i;:::-;8607:34;;;;;;;;;;;;;-1:-1:-1;8607:34:12;:40;;;;;;8591:60;8572:79;;8669:16;8688:83;8694:9;8705:6;8688:83;;;;;;;;;;;;;;;;;:5;:83::i;:::-;8669:102;;8789:57;8806:6;8814:9;8825;8836;8789:16;:57::i;:::-;8495:366;;;8469:392;8879:20;;;;8875:391;;8938:22;;;8919:16;8938:22;;;:14;:22;;;;;;;;;8997:13;:60;;9056:1;8997:60;;;9013:19;;;;;;;:11;:19;;;;;;9033:13;9045:1;9033:9;:13;:::i;:::-;9013:34;;;;;;;;;;;;;-1:-1:-1;9013:34:12;:40;;;;;;8997:60;8978:79;;9075:16;9094:82;9100:9;9111:6;9094:82;;;;;;;;;;;;;;;;;:5;:82::i;:::-;9075:101;;9194:57;9211:6;9219:9;9230;9241;9194:16;:57::i;13301:782:11:-;13451:4;13471:13;;;1465:19:5;:23;13467:610:11;;13506:72;;;;;:36;;;;;;:72;;719:10:6;;13557:4:11;;13563:7;;13572:5;;13506:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13506:72:11;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13502:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13749:6;:13;13766:1;13749:18;13745:266;;13791:60;;;;;32368:2:18;13791:60:11;;;32350:21:18;32407:2;32387:18;;;32380:30;32446:34;32426:18;;;32419:62;32517:20;32497:18;;;32490:48;32555:19;;13791:60:11;32166:414:18;13745:266:11;13963:6;13957:13;13948:6;13944:2;13940:15;13933:38;13502:523;13628:55;;13638:45;13628:55;;-1:-1:-1;13621:62:11;;13467:610;-1:-1:-1;14062:4:11;13301:782;;;;;;:::o;3091:572:13:-;3290:18;;;3286:183;;3324:40;3356:7;4472:10;:17;;4445:24;;;;:15;:24;;;;;:44;;;4499:24;;;;;;;;;;;;4369:161;3324:40;3286:183;;;3393:2;3385:10;;:4;:10;;;3381:88;;3411:47;3444:4;3450:7;3411:32;:47::i;:::-;3482:16;;;3478:179;;3514:45;3551:7;3514:36;:45::i;3478:179::-;3586:4;3580:10;;:2;:10;;;3576:81;;3606:40;3634:2;3638:7;3606:27;:40::i;10570:192:12:-;10686:6;10717:1;10712:6;;:1;:6;;;;10720:12;10704:29;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10750:5:12;10754:1;10750;:5;:::i;9288:722::-;9445:18;9466:126;9486:12;9466:126;;;;;;;;;;;;;;;;;:6;:126::i;:::-;9445:147;;9622:1;9607:12;:16;;;:85;;;;-1:-1:-1;9627:22:12;;;;;;;:11;:22;;;;;:65;;;;9650:16;9665:1;9650:12;:16;:::i;:::-;9627:40;;;;;;;;;;;;;;;-1:-1:-1;9627:40:12;:50;;:65;9607:85;9603:334;;;9708:22;;;;;;;:11;:22;;;;;9757:8;;9731:16;9746:1;9731:12;:16;:::i;:::-;9708:40;;;;;;;;;;;;;-1:-1:-1;9708:40:12;:57;;;;;;;;;;;;;;;;;;;9603:334;;;9835:33;;;;;;;;;;;;;;;;;;;;;;;;;9796:22;;;-1:-1:-1;9796:22:12;;;:11;:22;;;;;:36;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;9910:16;9819:12;9796:72;9910:16;:::i;:::-;9882:25;;;;;;;:14;:25;;;;;:44;;;;;;;;;;;;;;;9603:334;9952:51;;;34629:26:18;34682:15;;;34664:34;;34734:15;;34729:2;34714:18;;34707:43;9952:51:12;;;;;;34592:18:18;9952:51:12;;;;;;;9435:575;9288:722;;;;:::o;10350:214::-;10466:6;;10495:5;10499:1;10495;:5;:::i;:::-;10484:16;;10523:1;10518:6;;:1;:6;;;;10526:12;10510:29;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10556:1:12;10350:214;-1:-1:-1;;;;10350:214:12:o;5147:970:13:-;5409:22;5459:1;5434:22;5451:4;5434:16;:22::i;:::-;:26;;;;:::i;:::-;5470:18;5491:26;;;:17;:26;;;;;;5409:51;;-1:-1:-1;5621:28:13;;;5617:323;;5687:18;;;5665:19;5687:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5736:30;;;;;;:44;;;5852:30;;:17;:30;;;;;:43;;;5617:323;-1:-1:-1;6033:26:13;;;;:17;:26;;;;;;;;6026:33;;;6076:18;;;;;;:12;:18;;;;;:34;;;;;;;6069:41;5147:970::o;6405:1061::-;6679:10;:17;6654:22;;6679:21;;6699:1;;6679:21;:::i;:::-;6710:18;6731:24;;;:15;:24;;;;;;7099:10;:26;;6654:46;;-1:-1:-1;6731:24:13;;6654:46;;7099:26;;;;;;:::i;:::-;;;;;;;;;7077:48;;7161:11;7136:10;7147;7136:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;7240:28;;;:15;:28;;;;;;;:41;;;7409:24;;;;;7402:31;7443:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6476:990;;;6405:1061;:::o;3957:217::-;4041:14;4058:20;4075:2;4058:16;:20::i;:::-;4088:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;4132:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3957:217:13:o;10016:161:12:-;10094:6;10131:12;10124:5;10120:9;;10112:32;;;;;;;;;;;;;:::i;14:175:18:-;121:42;114:5;110:54;103:5;100:65;90:93;;179:1;176;169:12;194:296;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;389:9;376:23;408:52;454:5;408:52;:::i;495:177::-;580:66;573:5;569:78;562:5;559:89;549:117;;662:1;659;652:12;677:245;735:6;788:2;776:9;767:7;763:23;759:32;756:52;;;804:1;801;794:12;756:52;843:9;830:23;862:30;886:5;862:30;:::i;1119:250::-;1204:1;1214:113;1228:6;1225:1;1222:13;1214:113;;;1304:11;;;1298:18;1285:11;;;1278:39;1250:2;1243:10;1214:113;;;-1:-1:-1;;1361:1:18;1343:16;;1336:27;1119:250::o;1374:330::-;1416:3;1454:5;1448:12;1481:6;1476:3;1469:19;1497:76;1566:6;1559:4;1554:3;1550:14;1543:4;1536:5;1532:16;1497:76;:::i;:::-;1618:2;1606:15;1623:66;1602:88;1593:98;;;;1693:4;1589:109;;1374:330;-1:-1:-1;;1374:330:18:o;1709:220::-;1858:2;1847:9;1840:21;1821:4;1878:45;1919:2;1908:9;1904:18;1896:6;1878:45;:::i;2165:180::-;2224:6;2277:2;2265:9;2256:7;2252:23;2248:32;2245:52;;;2293:1;2290;2283:12;2245:52;-1:-1:-1;2316:23:18;;2165:180;-1:-1:-1;2165:180:18:o;2350:336::-;2418:6;2426;2479:2;2467:9;2458:7;2454:23;2450:32;2447:52;;;2495:1;2492;2485:12;2447:52;2534:9;2521:23;2553:52;2599:5;2553:52;:::i;:::-;2624:5;2676:2;2661:18;;;;2648:32;;-1:-1:-1;;;2350:336:18:o;3055:498::-;3132:6;3140;3148;3201:2;3189:9;3180:7;3176:23;3172:32;3169:52;;;3217:1;3214;3207:12;3169:52;3256:9;3243:23;3275:52;3321:5;3275:52;:::i;:::-;3346:5;-1:-1:-1;3403:2:18;3388:18;;3375:32;3416:54;3375:32;3416:54;:::i;:::-;3055:498;;3489:7;;-1:-1:-1;;;3543:2:18;3528:18;;;;3515:32;;3055:498::o;4944:437::-;5009:6;5017;5070:2;5058:9;5049:7;5045:23;5041:32;5038:52;;;5086:1;5083;5076:12;5038:52;5125:9;5112:23;5144:52;5190:5;5144:52;:::i;:::-;5215:5;-1:-1:-1;5272:2:18;5257:18;;5244:32;5314:15;;5307:23;5295:36;;5285:64;;5345:1;5342;5335:12;5285:64;5368:7;5358:17;;;4944:437;;;;;:::o;5640:184::-;5692:77;5689:1;5682:88;5789:4;5786:1;5779:15;5813:4;5810:1;5803:15;5829:334;5900:2;5894:9;5956:2;5946:13;;5961:66;5942:86;5930:99;;6059:18;6044:34;;6080:22;;;6041:62;6038:88;;;6106:18;;:::i;:::-;6142:2;6135:22;5829:334;;-1:-1:-1;5829:334:18:o;6168:245::-;6216:4;6249:18;6241:6;6238:30;6235:56;;;6271:18;;:::i;:::-;-1:-1:-1;6328:2:18;6316:15;6333:66;6312:88;6402:4;6308:99;;6168:245::o;6418:336::-;6482:5;6511:52;6527:35;6555:6;6527:35;:::i;:::-;6511:52;:::i;:::-;6502:61;;6586:6;6579:5;6572:21;6626:3;6617:6;6612:3;6608:16;6605:25;6602:45;;;6643:1;6640;6633:12;6602:45;6692:6;6687:3;6680:4;6673:5;6669:16;6656:43;6746:1;6739:4;6730:6;6723:5;6719:18;6715:29;6708:40;6418:336;;;;;:::o;6759:836::-;6854:6;6862;6870;6878;6931:3;6919:9;6910:7;6906:23;6902:33;6899:53;;;6948:1;6945;6938:12;6899:53;6987:9;6974:23;7006:52;7052:5;7006:52;:::i;:::-;7077:5;-1:-1:-1;7134:2:18;7119:18;;7106:32;7147:54;7106:32;7147:54;:::i;:::-;7220:7;-1:-1:-1;7274:2:18;7259:18;;7246:32;;-1:-1:-1;7329:2:18;7314:18;;7301:32;7356:18;7345:30;;7342:50;;;7388:1;7385;7378:12;7342:50;7411:22;;7464:4;7456:13;;7452:27;-1:-1:-1;7442:55:18;;7493:1;7490;7483:12;7442:55;7516:73;7581:7;7576:2;7563:16;7558:2;7554;7550:11;7516:73;:::i;:::-;7506:83;;;6759:836;;;;;;;:::o;7600:450::-;7669:6;7722:2;7710:9;7701:7;7697:23;7693:32;7690:52;;;7738:1;7735;7728:12;7690:52;7778:9;7765:23;7811:18;7803:6;7800:30;7797:50;;;7843:1;7840;7833:12;7797:50;7866:22;;7919:4;7911:13;;7907:27;-1:-1:-1;7897:55:18;;7948:1;7945;7938:12;7897:55;7971:73;8036:7;8031:2;8018:16;8013:2;8009;8005:11;7971:73;:::i;8055:708::-;8157:6;8165;8173;8181;8189;8197;8250:3;8238:9;8229:7;8225:23;8221:33;8218:53;;;8267:1;8264;8257:12;8218:53;8306:9;8293:23;8325:52;8371:5;8325:52;:::i;:::-;8396:5;-1:-1:-1;8448:2:18;8433:18;;8420:32;;-1:-1:-1;8499:2:18;8484:18;;8471:32;;-1:-1:-1;8555:2:18;8540:18;;8527:32;8603:4;8590:18;;8578:31;;8568:59;;8623:1;8620;8613:12;8568:59;8055:708;;;;-1:-1:-1;8055:708:18;;8700:3;8685:19;;8672:33;;8752:3;8737:19;;;8724:33;;-1:-1:-1;8055:708:18;-1:-1:-1;;8055:708:18:o;9065:430::-;9133:6;9141;9194:2;9182:9;9173:7;9169:23;9165:32;9162:52;;;9210:1;9207;9200:12;9162:52;9249:9;9236:23;9268:52;9314:5;9268:52;:::i;:::-;9339:5;-1:-1:-1;9396:2:18;9381:18;;9368:32;9409:54;9368:32;9409:54;:::i;10115:440::-;10182:6;10190;10243:2;10231:9;10222:7;10218:23;10214:32;10211:52;;;10259:1;10256;10249:12;10211:52;10298:9;10285:23;10317:52;10363:5;10317:52;:::i;:::-;10388:5;-1:-1:-1;10445:2:18;10430:18;;10417:32;10493:10;10480:24;;10468:37;;10458:65;;10519:1;10516;10509:12;11208:437;11287:1;11283:12;;;;11330;;;11351:61;;11405:4;11397:6;11393:17;11383:27;;11351:61;11458:2;11450:6;11447:14;11427:18;11424:38;11421:218;;11495:77;11492:1;11485:88;11596:4;11593:1;11586:15;11624:4;11621:1;11614:15;11421:218;;11208:437;;;:::o;13243:184::-;13295:77;13292:1;13285:88;13392:4;13389:1;13382:15;13416:4;13413:1;13406:15;13432:195;13471:3;13502:66;13495:5;13492:77;13489:103;;13572:18;;:::i;:::-;-1:-1:-1;13619:1:18;13608:13;;13432:195::o;15932:184::-;15984:77;15981:1;15974:88;16081:4;16078:1;16071:15;16105:4;16102:1;16095:15;17246:648;17326:6;17379:2;17367:9;17358:7;17354:23;17350:32;17347:52;;;17395:1;17392;17385:12;17347:52;17428:9;17422:16;17461:18;17453:6;17450:30;17447:50;;;17493:1;17490;17483:12;17447:50;17516:22;;17569:4;17561:13;;17557:27;-1:-1:-1;17547:55:18;;17598:1;17595;17588:12;17547:55;17627:2;17621:9;17652:48;17668:31;17696:2;17668:31;:::i;17652:48::-;17723:2;17716:5;17709:17;17763:7;17758:2;17753;17749;17745:11;17741:20;17738:33;17735:53;;;17784:1;17781;17774:12;17735:53;17797:67;17861:2;17856;17849:5;17845:14;17840:2;17836;17832:11;17797:67;:::i;:::-;17883:5;17246:648;-1:-1:-1;;;;;17246:648:18:o;20238:175::-;20306:10;20349;;;20337;;;20333:27;;20372:12;;;20369:38;;;20387:18;;:::i;:::-;20369:38;20238:175;;;;:::o;20418:345::-;20457:1;20483:10;20520:2;20517:1;20513:10;20542:3;20532:191;;20579:77;20576:1;20569:88;20680:4;20677:1;20670:15;20708:4;20705:1;20698:15;20532:191;20741:10;;20737:20;;;;;20418:345;-1:-1:-1;;20418:345:18:o;21248:545::-;21350:2;21345:3;21342:11;21339:448;;;21386:1;21411:5;21407:2;21400:17;21456:4;21452:2;21442:19;21526:2;21514:10;21510:19;21507:1;21503:27;21497:4;21493:38;21562:4;21550:10;21547:20;21544:47;;;-1:-1:-1;21585:4:18;21544:47;21640:2;21635:3;21631:12;21628:1;21624:20;21618:4;21614:31;21604:41;;21695:82;21713:2;21706:5;21703:13;21695:82;;;21758:17;;;21739:1;21728:13;21695:82;;22029:1471;22155:3;22149:10;22182:18;22174:6;22171:30;22168:56;;;22204:18;;:::i;:::-;22233:97;22323:6;22283:38;22315:4;22309:11;22283:38;:::i;:::-;22277:4;22233:97;:::i;:::-;22385:4;;22449:2;22438:14;;22466:1;22461:782;;;;23287:1;23304:6;23301:89;;;-1:-1:-1;23356:19:18;;;23350:26;23301:89;21935:66;21926:1;21922:11;;;21918:84;21914:89;21904:100;22010:1;22006:11;;;21901:117;23403:81;;22431:1063;;22461:782;21195:1;21188:14;;;21232:4;21219:18;;22509:66;22497:79;;;22674:236;22688:7;22685:1;22682:14;22674:236;;;22777:19;;;22771:26;22756:42;;22869:27;;;;22837:1;22825:14;;;;22704:19;;22674:236;;;22678:3;22938:6;22929:7;22926:19;22923:261;;;22999:19;;;22993:26;23100:66;23082:1;23078:14;;;23094:3;23074:24;23070:97;23066:102;23051:118;23036:134;;22923:261;-1:-1:-1;;;;;23230:1:18;23214:14;;;23210:22;23197:36;;-1:-1:-1;22029:1471:18:o;26512:1088::-;26771:9;26766:3;26759:22;26741:3;26800:1;26821;26854:6;26848:13;26884:36;26910:9;26884:36;:::i;:::-;26939:1;26956:18;;;26983:209;;;;27206:1;27201:374;;;;26949:626;;26983:209;27040:66;27029:9;27025:82;27020:2;27015:3;27011:12;27004:104;27179:2;27167:6;27160:14;27153:22;27145:6;27141:35;27136:3;27132:45;27128:54;27121:61;;26983:209;;27201:374;27232:6;27229:1;27222:17;27262:4;27307:2;27304:1;27294:16;27332:1;27346:174;27360:6;27357:1;27354:13;27346:174;;;27447:14;;27429:11;;;27425:20;;27418:44;27490:16;;;;27375:10;;27346:174;;;27350:3;;;27562:2;27553:6;27548:3;27544:16;27540:25;27533:32;;26949:626;-1:-1:-1;27591:3:18;;26512:1088;-1:-1:-1;;;;;;;26512:1088:18:o;27605:272::-;27675:6;27728:2;27716:9;27707:7;27703:23;27699:32;27696:52;;;27744:1;27741;27734:12;27696:52;27776:9;27770:16;27795:52;27841:5;27795:52;:::i;28980:171::-;29058:13;;29111:14;29100:26;;29090:37;;29080:65;;29141:1;29138;29131:12;29156:878;29248:6;29301:3;29289:9;29280:7;29276:23;29272:33;29269:53;;;29318:1;29315;29308:12;29269:53;29351:2;29345:9;29393:3;29385:6;29381:16;29463:6;29451:10;29448:22;29427:18;29415:10;29412:34;29409:62;29406:88;;;29474:18;;:::i;:::-;29510:2;29503:22;29549:39;29578:9;29549:39;:::i;:::-;29541:6;29534:55;29622:48;29666:2;29655:9;29651:18;29622:48;:::i;:::-;29617:2;29609:6;29605:15;29598:73;29704:48;29748:2;29737:9;29733:18;29704:48;:::i;:::-;29699:2;29691:6;29687:15;29680:73;29786:48;29830:2;29819:9;29815:18;29786:48;:::i;:::-;29781:2;29773:6;29769:15;29762:73;29869:49;29913:3;29902:9;29898:19;29869:49;:::i;:::-;29863:3;29855:6;29851:16;29844:75;29953:49;29997:3;29986:9;29982:19;29953:49;:::i;:::-;29947:3;29935:16;;29928:75;29939:6;29156:878;-1:-1:-1;;;29156:878:18:o;31903:128::-;31970:9;;;31991:11;;;31988:37;;;32005:18;;:::i;32036:125::-;32101:9;;;32122:10;;;32119:36;;;32135:18;;:::i;33303:512::-;33497:4;33526:42;33607:2;33599:6;33595:15;33584:9;33577:34;33659:2;33651:6;33647:15;33642:2;33631:9;33627:18;33620:43;;33699:6;33694:2;33683:9;33679:18;33672:34;33742:3;33737:2;33726:9;33722:18;33715:31;33763:46;33804:3;33793:9;33789:19;33781:6;33763:46;:::i;:::-;33755:54;33303:512;-1:-1:-1;;;;;;33303:512:18:o;33820:249::-;33889:6;33942:2;33930:9;33921:7;33917:23;33913:32;33910:52;;;33958:1;33955;33948:12;33910:52;33990:9;33984:16;34009:30;34033:5;34009:30;:::i;34074:191::-;34142:26;34201:10;;;34189;;;34185:27;;34224:12;;;34221:38;;;34239:18;;:::i;34270:172::-;34337:10;34367;;;34379;;;34363:27;;34402:11;;;34399:37;;;34416:18;;:::i;34761:188::-;34828:26;34874:10;;;34886;;;34870:27;;34909:11;;;34906:37;;;34923:18;;:::i;34954:184::-;35006:77;35003:1;34996:88;35103:4;35100:1;35093:15;35127:4;35124:1;35117:15

Swarm Source

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