ETH Price: $2,468.36 (+1.11%)
 

Overview

Max Total Supply

339 UNICG

Holders

338

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 UNICG
0x7290bf7488af285e5ae095dbc5234dd2eac9b61b
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:
NextGenCore

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

/**
 *
 *  @title: NextGen 6529 - Core Contract
 *  @date: 23-December-2023
 *  @version: 10.30
 *  @author: 6529 team
 */

pragma solidity ^0.8.19;

import "./ERC721Enumerable.sol";
import "./Strings.sol";
import "./Base64.sol";
import "./IRandomizer.sol";
import "./INextGenAdmins.sol";
import "./IMinterContract.sol";
import "./ERC2981.sol";
import "./Ownable.sol"; 

contract NextGenCore is ERC721Enumerable, ERC2981, Ownable {
    using Strings for uint256;

    // declare variables
    uint256 public newCollectionIndex;

    // struct that holds a collection's info
    struct collectionInfoStructure {
        string collectionName;
        string collectionArtist;
        string collectionDescription;
        string collectionWebsite;
        string collectionLicense;
        string collectionBaseURI;
        string collectionLibrary;
        string[] collectionScript;
    }

    // mapping of collectionInfo struct
    mapping (uint256 => collectionInfoStructure) private collectionInfo;

    // struct that holds a collection's additional data
    struct collectionAdditonalDataStructure {
        address collectionArtistAddress;
        uint256 maxCollectionPurchases;
        uint256 collectionCirculationSupply;
        uint256 collectionTotalSupply;
        uint256 reservedMinTokensIndex;
        uint256 reservedMaxTokensIndex;
        uint setFinalSupplyTimeAfterMint;
        address randomizerContract;
        IRandomizer randomizer;
    }

    // mapping of collectionAdditionalData struct
    mapping (uint256 => collectionAdditonalDataStructure) private collectionAdditionalData;

    // checks if a collection was created
    mapping (uint256 => bool) private isCollectionCreated; 

    // checks if data on a collection were added
    mapping (uint256 => bool) private wereDataAdded;

    // maps tokends ids with collectionsids
    mapping (uint256 => uint256) private tokenIdsToCollectionIds;

    // stores the token hash generated by randomizer contracts
    mapping(uint256 => bytes32) private tokenToHash;

    // amount of minted tokens per address per collection during public sale
    mapping (uint256 => mapping (address => uint256)) private tokensMintedPerAddress;

    // amount of minted tokens per address per collection during allowlist
    mapping (uint256 => mapping (address => uint256)) private tokensMintedAllowlistAddress;

    // amount of tokens airdropped per address per collection 
    mapping (uint256 => mapping (address => uint256)) private tokensAirdropPerAddress;

    // amount of burnt tokens per collection
    mapping (uint256 => uint256) public burnAmount;

    // metadata view (offchain/onchain)
    mapping (uint256 => bool) public onchainMetadata; 

    // artist signature per collection
    mapping (uint256 => string) public artistsSignatures;

    // additional metadata per token
    mapping (uint256 => string) public tokenData;

    // on-chain image URI and attributes per token
    mapping (uint256 => string[2]) private tokenImageAndAttributes;

    // collection lock status (status cannot revert) 
    mapping (uint256 => bool) private collectionFreeze;

    // checks if an artist signed its collection
    mapping (uint256 => bool) public artistSigned; 

    // external contracts declaration
    INextGenAdmins private adminsContract;
    address public minterContract;

    // constructor
    constructor(string memory name, string memory symbol, address _adminsContract) ERC721(name, symbol) {
        adminsContract = INextGenAdmins(_adminsContract);
        newCollectionIndex = newCollectionIndex + 1;
        _setDefaultRoyalty(0xc016777B30fb04025EDC1BC4DE11F7C027be12D6, 0);
    }

    // certain functions can only be called by a global or function admin

    modifier FunctionAdminRequired(bytes4 _selector) {
      require(adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true , "Not allowed");
      _;
    }

    // certain functions can only be called by a collection, global or function admin

    modifier CollectionAdminRequired(uint256 _collectionID, bytes4 _selector) {
      require(adminsContract.retrieveCollectionAdmin(msg.sender,_collectionID) == true || adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true, "Not allowed");
      _;
    }

    // function to create a Collection

    function createCollection(string memory _collectionName, string memory _collectionArtist, string memory _collectionDescription, string memory _collectionWebsite, string memory _collectionLicense, string memory _collectionBaseURI, string memory _collectionLibrary, string[] memory _collectionScript) public FunctionAdminRequired(this.createCollection.selector) {
        collectionInfo[newCollectionIndex].collectionName = _collectionName;
        collectionInfo[newCollectionIndex].collectionArtist = _collectionArtist;
        collectionInfo[newCollectionIndex].collectionDescription = _collectionDescription;
        collectionInfo[newCollectionIndex].collectionWebsite = _collectionWebsite;
        collectionInfo[newCollectionIndex].collectionLicense = _collectionLicense;
        collectionInfo[newCollectionIndex].collectionBaseURI = _collectionBaseURI;
        collectionInfo[newCollectionIndex].collectionLibrary = _collectionLibrary;
        collectionInfo[newCollectionIndex].collectionScript = _collectionScript;
        isCollectionCreated[newCollectionIndex] = true;
        newCollectionIndex = newCollectionIndex + 1;
    }

    // function to add/modify the additional data of a collection
    // once a collection is created and total supply is set it cannot change

    function setCollectionData(uint256 _collectionID, address _collectionArtistAddress, uint256 _maxCollectionPurchases, uint256 _collectionTotalSupply, uint _setFinalSupplyTimeAfterMint) public CollectionAdminRequired(_collectionID, this.setCollectionData.selector) {
        require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false) && (_collectionTotalSupply <= 10000000000), "err/freezed");
        if (collectionAdditionalData[_collectionID].collectionTotalSupply == 0) {
            collectionAdditionalData[_collectionID].collectionArtistAddress = _collectionArtistAddress;
            collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases;
            collectionAdditionalData[_collectionID].collectionCirculationSupply = 0;
            collectionAdditionalData[_collectionID].collectionTotalSupply = _collectionTotalSupply;
            collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint;
            collectionAdditionalData[_collectionID].reservedMinTokensIndex = (_collectionID * 10000000000);
            collectionAdditionalData[_collectionID].reservedMaxTokensIndex = (_collectionID * 10000000000) + _collectionTotalSupply - 1;
            wereDataAdded[_collectionID] = true;
        } else if (artistSigned[_collectionID] == false) {
            collectionAdditionalData[_collectionID].collectionArtistAddress = _collectionArtistAddress;
            collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases;
            collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint;
        } else {
            collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases;
            collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint;
        }
    }

    // set a randomizer contract on a collection

    function addRandomizer(uint256 _collectionID, address _randomizerContract) public FunctionAdminRequired(this.addRandomizer.selector) {
        require(IRandomizer(_randomizerContract).isRandomizerContract() == true, "Contract is not Randomizer");
        collectionAdditionalData[_collectionID].randomizerContract = _randomizerContract;
        collectionAdditionalData[_collectionID].randomizer = IRandomizer(_randomizerContract);
    }

    // airdrop (function is called from minter contract)
    
    function airDropTokens(uint256 mintIndex, address _recipient, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID) external {
        require(msg.sender == minterContract, "Caller is not the Minter Contract");
        collectionAdditionalData[_collectionID].collectionCirculationSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply + 1;
        if (collectionAdditionalData[_collectionID].collectionTotalSupply >= collectionAdditionalData[_collectionID].collectionCirculationSupply) {
            tokensAirdropPerAddress[_collectionID][_recipient] = tokensAirdropPerAddress[_collectionID][_recipient] + 1;
            _mintProcessing(mintIndex, _recipient, _tokenData, _collectionID, _saltfun_o);
        } else {
            revert("Supply reached");
        }
    }

    // mint (function is called from minter contract)

    function mint(uint256 mintIndex, address _mintingAddress , address _mintTo, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID, uint256 phase) external {
        require(msg.sender == minterContract, "Caller is not the Minter Contract");
        collectionAdditionalData[_collectionID].collectionCirculationSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply + 1;
        if (collectionAdditionalData[_collectionID].collectionTotalSupply >= collectionAdditionalData[_collectionID].collectionCirculationSupply) {
            if (phase == 1) {
                tokensMintedAllowlistAddress[_collectionID][_mintingAddress] = tokensMintedAllowlistAddress[_collectionID][_mintingAddress] + 1;
            } else {
                tokensMintedPerAddress[_collectionID][_mintingAddress] = tokensMintedPerAddress[_collectionID][_mintingAddress] + 1;
            }
            _mintProcessing(mintIndex, _mintTo, _tokenData, _collectionID, _saltfun_o);
        } else {
            revert("Supply reached");
        }
    }

    // burn function

    function burn(uint256 _collectionID, uint256 _tokenId) public {
        require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721: caller is not token owner or approved");
        require ((_tokenId >= collectionAdditionalData[_collectionID].reservedMinTokensIndex) && (_tokenId <= collectionAdditionalData[_collectionID].reservedMaxTokensIndex), "id err");
        _burn(_tokenId);
        burnAmount[_collectionID] = burnAmount[_collectionID] + 1;
    }

    // burn to mint (function is called from minter contract)

    function burnToMint(uint256 mintIndex, uint256 _burnCollectionID, uint256 _tokenId, uint256 _mintCollectionID, uint256 _saltfun_o, address burner) external {
        require(msg.sender == minterContract, "Caller is not the Minter Contract");
        require(_isApprovedOrOwner(burner, _tokenId), "ERC721: caller is not token owner or approved");
        collectionAdditionalData[_mintCollectionID].collectionCirculationSupply = collectionAdditionalData[_mintCollectionID].collectionCirculationSupply + 1;
        if (collectionAdditionalData[_mintCollectionID].collectionTotalSupply >= collectionAdditionalData[_mintCollectionID].collectionCirculationSupply) {
            address owner = ownerOf(_tokenId);
            _burn(_tokenId);
            burnAmount[_burnCollectionID] = burnAmount[_burnCollectionID] + 1;
            tokensMintedPerAddress[_mintCollectionID][owner] = tokensMintedPerAddress[_mintCollectionID][owner] + 1;
            _mintProcessing(mintIndex, owner, tokenData[_tokenId], _mintCollectionID, _saltfun_o);
        } else {
            revert("Supply reached");
        }
    }

    // mint processing

    function _mintProcessing(uint256 _mintIndex, address _recipient, string memory _tokenData, uint256 _collectionID, uint256 _saltfun_o) internal {
        tokenData[_mintIndex] = _tokenData;
        tokenIdsToCollectionIds[_mintIndex] = _collectionID;
        _safeMint(_recipient, _mintIndex);
        collectionAdditionalData[_collectionID].randomizer.calculateTokenHash(_collectionID, _mintIndex, _saltfun_o);
    }

    // Additional setter functions

    // function to update a collection's info

    function updateCollectionInfo(uint256 _collectionID, string memory _newCollectionName, string memory _newCollectionArtist, string memory _newCollectionDescription, string memory _newCollectionWebsite, string memory _newCollectionLicense, string memory _newCollectionBaseURI, string memory _newCollectionLibrary, uint256 _index, string[] memory _newCollectionScript) public CollectionAdminRequired(_collectionID, this.updateCollectionInfo.selector) {
        require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false), "Not allowed");
         if (_index == 1000000) {
            collectionInfo[_collectionID].collectionName = _newCollectionName;
            collectionInfo[_collectionID].collectionArtist = _newCollectionArtist;
            collectionInfo[_collectionID].collectionDescription = _newCollectionDescription;
            collectionInfo[_collectionID].collectionWebsite = _newCollectionWebsite;
            collectionInfo[_collectionID].collectionLicense = _newCollectionLicense;
            collectionInfo[_collectionID].collectionLibrary = _newCollectionLibrary;
            collectionInfo[_collectionID].collectionScript = _newCollectionScript;
        } else if (_index == 999999) {
            collectionInfo[_collectionID].collectionBaseURI = _newCollectionBaseURI;
        } else {
            collectionInfo[_collectionID].collectionScript[_index] = _newCollectionScript[0];
        }
    }

    // function that is used by artists for signing

    function artistSignature(uint256 _collectionID, string memory _signature) public {
        require(msg.sender == collectionAdditionalData[_collectionID].collectionArtistAddress, "Not artist");
        require(artistSigned[_collectionID] == false, "Signed");
        require(bytes(_signature).length > 0);
        artistsSignatures[_collectionID] = _signature;
        artistSigned[_collectionID] = true;
    }

    // function to change the metadata view of a collection

    function changeMetadataView(uint256 _collectionID, bool _status) public CollectionAdminRequired(_collectionID, this.changeMetadataView.selector) { 
        require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false), "Not allowed");
        onchainMetadata[_collectionID] = _status;
    }

    // function to change the token data of a token

    function changeTokenData(uint256 _tokenId, string memory newData) public FunctionAdminRequired(this.changeTokenData.selector) {
        require(collectionFreeze[tokenIdsToCollectionIds[_tokenId]] == false, "Data frozen");
        _requireMinted(_tokenId);
        tokenData[_tokenId] = newData;
    }

    // function to store onchain an imageURI and attributes for a token

    function updateImagesAndAttributes(uint256[] memory _tokenId, string[] memory _images, string[] memory _attributes) public FunctionAdminRequired(this.updateImagesAndAttributes.selector) {
        require((_tokenId.length == _images.length) && (_images.length == _attributes.length) , "inv len");
        for (uint256 x; x < _tokenId.length; x++) {
            require(collectionFreeze[tokenIdsToCollectionIds[_tokenId[x]]] == false, "Data frozen");
            _requireMinted(_tokenId[x]);
            tokenImageAndAttributes[_tokenId[x]][0] = _images[x];
            tokenImageAndAttributes[_tokenId[x]][1] = _attributes[x];
        }
    }

    // function to lock collection, this action connot be reverted

    function freezeCollection(uint256 _collectionID) public FunctionAdminRequired(this.freezeCollection.selector) {
        require(block.timestamp > IMinterContract(minterContract).getEndTime(_collectionID) && IMinterContract(minterContract).getEndTime(_collectionID) != 0);
        require(wereDataAdded[_collectionID] == true, "No Data");
        collectionFreeze[_collectionID] = true;
    }

    // function to set the tokenHash (this function is called only from randomizer contracts)

    function setTokenHash(uint256 _collectionID, uint256 _mintIndex, bytes32 _hash) external {
        require(msg.sender == collectionAdditionalData[_collectionID].randomizerContract);
        require(tokenToHash[_mintIndex] == 0x0000000000000000000000000000000000000000000000000000000000000000);
        tokenToHash[_mintIndex] = _hash;
    }

    // function to set final supply, this applies only for unminted collections and will adjust totalSupply = circulatingSupply

    function setFinalSupply(uint256 _collectionID) public FunctionAdminRequired(this.setFinalSupply.selector) {
        require (block.timestamp > IMinterContract(minterContract).getEndTime(_collectionID) + collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint, "Time has not passed");
        collectionAdditionalData[_collectionID].collectionTotalSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply;
        collectionAdditionalData[_collectionID].reservedMaxTokensIndex = (_collectionID * 10000000000) + collectionAdditionalData[_collectionID].collectionTotalSupply - 1;
    }

    // function to add a minter contract

    function addMinterContract(address _minterContract) public FunctionAdminRequired(this.addMinterContract.selector) { 
        require(IMinterContract(_minterContract).isMinterContract() == true, "Contract is not Minter");
        minterContract = _minterContract;
    }

    // function to update the admin contract

    function updateAdminContract(address _newadminsContract) public FunctionAdminRequired(this.updateAdminContract.selector) {
        require(INextGenAdmins(_newadminsContract).isAdminContract() == true, "Contract is not Admin");
        adminsContract = INextGenAdmins(_newadminsContract);
    }

    // Retrieve Functions

    // function that overrides supportInterface

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

    // function that return the tokenURI

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);
        if (onchainMetadata[tokenIdsToCollectionIds[tokenId]] == false && tokenToHash[tokenId] != 0x0000000000000000000000000000000000000000000000000000000000000000) {
            string memory baseURI = collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionBaseURI;
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
        } else if (onchainMetadata[tokenIdsToCollectionIds[tokenId]] == false && tokenToHash[tokenId] == 0x0000000000000000000000000000000000000000000000000000000000000000) {
            string memory baseURI = collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionBaseURI;
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "pending")) : "";
        }
        else {
            string memory b64 = Base64.encode(abi.encodePacked("<html><head></head><body><script src=\"",collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionLibrary,"\"></script><script>",retrieveGenerativeScript(tokenId),"</script></body></html>"));
            string memory _uri = string(abi.encodePacked("data:application/json;utf8,{\"name\":\"",getTokenName(tokenId),"\",\"description\":\"",collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionDescription,"\",\"image\":\"",tokenImageAndAttributes[tokenId][0],"\",\"attributes\":[",tokenImageAndAttributes[tokenId][1],"],\"animation_url\":\"data:text/html;base64,",b64,"\"}"));
            return _uri;
        }
    }

    // function to retrieve the name attribute

    function getTokenName(uint256 tokenId) private view returns(string memory)  {
        uint256 tok = tokenId - collectionAdditionalData[tokenIdsToCollectionIds[tokenId]].reservedMinTokensIndex;
        return string(abi.encodePacked(collectionInfo[viewColIDforTokenID(tokenId)].collectionName, " #" ,tok.toString()));
    }

    // function to retrieve the collection freeze status
    function collectionFreezeStatus(uint256 _collectionID) public view returns(bool){
        return collectionFreeze[_collectionID];
    }

    // function to return the collection id given a token id
    function viewColIDforTokenID(uint256 _tokenid) public view returns (uint256) {
        return(tokenIdsToCollectionIds[_tokenid]);
    }

    // function to retrieve if data were added on a collection
    function retrievewereDataAdded(uint256 _collectionID) external view returns(bool){
        return wereDataAdded[_collectionID];
    }

    // function to return the min index id of a collection
    function viewTokensIndexMin(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].reservedMinTokensIndex);
    }

    // function to return the max index id of a collection
    function viewTokensIndexMax(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].reservedMaxTokensIndex);
    }

    // function to return the circ supply of a collection
    function viewCirSupply(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].collectionCirculationSupply);
    }

    // function to return max allowance per address during public sale
    function viewMaxAllowance(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].maxCollectionPurchases);
    }

    // function to return tokens minted per address during allowlist
    function retrieveTokensMintedALPerAddress(uint256 _collectionID, address _address) external view returns(uint256) {
        return (tokensMintedAllowlistAddress[_collectionID][_address]);
    }

    // function to return tokens minted per address during public
    function retrieveTokensMintedPublicPerAddress(uint256 _collectionID, address _address) external view returns(uint256) {
        return (tokensMintedPerAddress[_collectionID][_address]);
    }

    // function to retrieve the airdropped tokens per address 
    function retrieveTokensAirdroppedPerAddress(uint256 _collectionID, address _address) public view returns(uint256) {
        return (tokensAirdropPerAddress[_collectionID][_address]);
    }

    // function to return the artist's address
    function retrieveArtistAddress(uint256 _collectionID) external view returns(address) {
        return (collectionAdditionalData[_collectionID].collectionArtistAddress);
    }

    // function to retrieve a collection's info

    function retrieveCollectionInfo(uint256 _collectionID) public view returns(string memory, string memory, string memory, string memory, string memory, string memory){
        return (collectionInfo[_collectionID].collectionName, collectionInfo[_collectionID].collectionArtist, collectionInfo[_collectionID].collectionDescription, collectionInfo[_collectionID].collectionWebsite, collectionInfo[_collectionID].collectionLicense, collectionInfo[_collectionID].collectionBaseURI);
    }

    // function to retrieve the library and script of a collection

    function retrieveCollectionLibraryAndScript(uint256 _collectionID) public view returns(string memory, string[] memory){
        return (collectionInfo[_collectionID].collectionLibrary, collectionInfo[_collectionID].collectionScript);
    }

    // function to retrieve the additional data of a Collection

    function retrieveCollectionAdditionalData(uint256 _collectionID) public view returns(address, uint256, uint256, uint256, uint, address){
        return (collectionAdditionalData[_collectionID].collectionArtistAddress, collectionAdditionalData[_collectionID].maxCollectionPurchases, collectionAdditionalData[_collectionID].collectionCirculationSupply, collectionAdditionalData[_collectionID].collectionTotalSupply, collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint, collectionAdditionalData[_collectionID].randomizerContract);
    }

    // function to retrieve the token hash

    function retrieveTokenHash(uint256 _tokenid) public view returns(bytes32){
        return (tokenToHash[_tokenid]);
    }

    // function to retrieve the generative script of a token

    function retrieveGenerativeScript(uint256 tokenId) public view returns(string memory) {
        _requireMinted(tokenId);
        string memory scripttext;
        for (uint256 i=0; i < collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionScript.length; i++) {
            scripttext = string(abi.encodePacked(scripttext, collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionScript[i])); 
        }
        return string(abi.encodePacked("let hash='",Strings.toHexString(uint256(tokenToHash[tokenId]), 32),"';let tokenId=",tokenId.toString(),";let tokenData=[",tokenData[tokenId],"];", scripttext));
    }

    // function to retrieve the supply of a collection

    function totalSupplyOfCollection(uint256 _collectionID) public view returns (uint256) {
        return (collectionAdditionalData[_collectionID].collectionCirculationSupply - burnAmount[_collectionID]);
    }

    // function to retrieve the token image uri and the attributes stored on-chain for a token id.

    function retrievetokenImageAndAttributes(uint256 _tokenId) public view returns(string memory, string memory) {
        return (tokenImageAndAttributes[_tokenId][0],tokenImageAndAttributes[_tokenId][1]);
    }

}

File 1 of 21: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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 2 of 21: Base64.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.19;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

File 3 of 21: 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 4 of 21: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

import "./IERC165.sol";

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 21: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.19;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);

    /**
     * @dev The default royalty receiver is invalid.
     */
    error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);

    /**
     * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);

    /**
     * @dev The royalty receiver for `tokenId` is invalid.
     */
    error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
        }

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
        }

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 6 of 21: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */

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

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

File 7 of 21: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @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.
 */

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

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 See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 21: 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 9 of 21: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.19;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

File 10 of 21: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */

import "./IERC721.sol";

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */

import "./IERC721.sol";

interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

File 13 of 21: 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 14 of 21: IMinterContract.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IMinterContract {

    // retrieve if the contract is minter contract
    function isMinterContract() external view returns (bool);

    // retrieve the public end time of a sale
    function getEndTime(uint256 _collectionID) external view returns (uint);

    // retrieve auction end time
    function getAuctionEndTime(uint256 _tokenId) external view returns (uint);

    // retrieve auction status
    function getAuctionStatus(uint256 _tokenId) external view  returns (bool);

    // retrieve primary addresses
    function retrievePrimaryAddressesAndPercentages(uint256 _collectionID) external view returns(address, address, address, uint256, uint256, uint256, bool);
    
    // retrieve secondary addresses
    function retrieveSecondaryAddressesAndPercentages(uint256 _collectionID) external view returns(address, address, address, uint256, uint256, uint256, bool);
}

File 15 of 21: INextGenAdmins.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface INextGenAdmins {

    // retrieve global admin
    function retrieveGlobalAdmin(address _address) external view returns(bool);

    // retrieve function admin
    function retrieveFunctionAdmin(address _address, bytes4 _selector) external view returns(bool);

    // retrieve collection admin
    function retrieveCollectionAdmin(address _address, uint256 _collectionID) external view returns(bool);

    // retrieve if the contract is admin contract
    function isAdminContract() external view returns (bool);

    // retrieve owner
    function owner() external view returns (address);

}

File 16 of 21: IRandomizer.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IRandomizer {

    // function that calculates the random hash and returns it to the gencore contract
    function calculateTokenHash(uint256 _collectionID, uint256 _mintIndex, uint256 _saltfun_o) external;

    // get randomizer contract status
    function isRandomizerContract() external view returns (bool);
    
}

File 17 of 21: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

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

pragma solidity ^0.8.0;

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

import "./Context.sol";

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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 20 of 21: SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */

import "./Math.sol";
import "./SignedMath.sol";

library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_adminsContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_minterContract","type":"address"}],"name":"addMinterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_randomizerContract","type":"address"}],"name":"addRandomizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"string","name":"_signature","type":"string"}],"name":"artistSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistsSignatures","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"address","name":"burner","type":"address"}],"name":"burnToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"changeMetadataView","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"newData","type":"string"}],"name":"changeTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"collectionFreezeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionName","type":"string"},{"internalType":"string","name":"_collectionArtist","type":"string"},{"internalType":"string","name":"_collectionDescription","type":"string"},{"internalType":"string","name":"_collectionWebsite","type":"string"},{"internalType":"string","name":"_collectionLicense","type":"string"},{"internalType":"string","name":"_collectionBaseURI","type":"string"},{"internalType":"string","name":"_collectionLibrary","type":"string"},{"internalType":"string[]","name":"_collectionScript","type":"string[]"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"freezeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"address","name":"_mintingAddress","type":"address"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"phase","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newCollectionIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"onchainMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveArtistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionAdditionalData","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionInfo","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionLibraryAndScript","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"retrieveGenerativeScript","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"retrieveTokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensAirdroppedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensMintedALPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensMintedPublicPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"retrievetokenImageAndAttributes","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrievewereDataAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_collectionArtistAddress","type":"address"},{"internalType":"uint256","name":"_maxCollectionPurchases","type":"uint256"},{"internalType":"uint256","name":"_collectionTotalSupply","type":"uint256"},{"internalType":"uint256","name":"_setFinalSupplyTimeAfterMint","type":"uint256"}],"name":"setCollectionData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"setFinalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_mintIndex","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setTokenHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"_collectionID","type":"uint256"}],"name":"totalSupplyOfCollection","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":"address","name":"_newadminsContract","type":"address"}],"name":"updateAdminContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"string","name":"_newCollectionName","type":"string"},{"internalType":"string","name":"_newCollectionArtist","type":"string"},{"internalType":"string","name":"_newCollectionDescription","type":"string"},{"internalType":"string","name":"_newCollectionWebsite","type":"string"},{"internalType":"string","name":"_newCollectionLicense","type":"string"},{"internalType":"string","name":"_newCollectionBaseURI","type":"string"},{"internalType":"string","name":"_newCollectionLibrary","type":"string"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string[]","name":"_newCollectionScript","type":"string[]"}],"name":"updateCollectionInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"string[]","name":"_images","type":"string[]"},{"internalType":"string[]","name":"_attributes","type":"string[]"}],"name":"updateImagesAndAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewCirSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"viewColIDforTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewMaxAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewTokensIndexMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewTokensIndexMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620063333803806200633383398101604081905262000034916200028e565b82826000620000448382620003aa565b506001620000538282620003aa565b505050620000706200006a620000c860201b60201c565b620000cc565b601e80546001600160a01b0319166001600160a01b038316179055600d546200009b90600162000476565b600d55620000bf73c016777b30fb04025edc1bc4de11f7c027be12d660006200011e565b5050506200049e565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382168110156200016357604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044015b60405180910390fd5b6001600160a01b0383166200018f57604051635b6cc80560e11b8152600060048201526024016200015a565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f157600080fd5b81516001600160401b03808211156200020e576200020e620001c9565b604051601f8301601f19908116603f01168101908282118183101715620002395762000239620001c9565b816040528381526020925086838588010111156200025657600080fd5b600091505b838210156200027a57858201830151818301840152908201906200025b565b600093810190920192909252949350505050565b600080600060608486031215620002a457600080fd5b83516001600160401b0380821115620002bc57600080fd5b620002ca87838801620001df565b94506020860151915080821115620002e157600080fd5b50620002f086828701620001df565b604086015190935090506001600160a01b03811681146200031057600080fd5b809150509250925092565b600181811c908216806200033057607f821691505b6020821081036200035157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a557600081815260208120601f850160051c81016020861015620003805750805b601f850160051c820191505b81811015620003a1578281556001016200038c565b5050505b505050565b81516001600160401b03811115620003c657620003c6620001c9565b620003de81620003d784546200031b565b8462000357565b602080601f831160018114620004165760008415620003fd5750858301515b600019600386901b1c1916600185901b178555620003a1565b600085815260208120601f198616915b82811015620004475788860151825594840194600190910190840162000426565b5085821015620004665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200049857634e487b7160e01b600052601160045260246000fd5b92915050565b615e8580620004ae6000396000f3fe608060405234801561001057600080fd5b506004361061033a5760003560e01c80638da5cb5b116101b4578063c87b56dd116100fa578063e943a2c71161009d578063e943a2c7146108de578063e985e9c514610914578063e9b7a86014610927578063f18332dd1461094a578063f2fde38b1461095d578063f35c145214610970578063f6a85dd014610983578063fa92668a1461099657600080fd5b8063c87b56dd146107f1578063cb6d67e014610804578063d09502711461083a578063d3322d531461085f578063d374100014610872578063d3d5492814610895578063d9a03e38146108b8578063de00e1f7146108cb57600080fd5b8063a22cb46511610162578063a22cb46514610733578063ad24102014610746578063af569fd414610759578063b390c0ab1461077c578063b4b5b48f1461078f578063b88d4fde146107a2578063b9902968146107b5578063bcc405d0146107de57600080fd5b80638da5cb5b1461068857806392f0023314610699578063945e549b146106ac57806394c14957146106cf57806395d89b41146107055780639a8490f31461070d5780639cac0f1f1461072057600080fd5b806339143a1d116102845780636799a46a116102275780636799a46a146105d05780636c6aab16146105e35780636fa13531146106065780636fafdf831461061957806370a0823114610639578063715018a61461064c5780637b5dbac51461065457806380f8c8ab1461066757600080fd5b806339143a1d146104af5780633d2bed8d146104c257806342842e0e146104e35780634ab6897c146104f65780634f6ccce7146105165780635c91d74a146105295780636352211e146105b4578063663a3c00146105c757600080fd5b806318160ddd116102ec57806318160ddd146103fa5780631aab8d691461040c57806323b872dd1461041f5780632a55205a146104325780632ed330f7146104535780632f745c5914610476578063366b0ab214610489578063388d2c241461049c57600080fd5b806301ffc9a71461033f57806302de55d01461036757806306fdde031461037c578063074b553914610391578063081812fc146103b4578063095ea7b3146103d457806316e7c899146103e7575b600080fd5b61035261034d366004614b25565b6109b6565b60405190151581526020015b60405180910390f35b61037a610375366004614cb1565b6109c7565b005b610384610c1f565b60405161035e9190614e40565b61035261039f366004614e53565b60186020526000908152604090205460ff1681565b6103c76103c2366004614e53565b610cb1565b60405161035e9190614e6c565b61037a6103e2366004614e97565b610cd8565b61037a6103f5366004614ec1565b610ded565b6008545b60405190815260200161035e565b61037a61041a366004615015565b61113d565b61037a61042d366004615041565b611349565b61044561044036600461507d565b61137b565b60405161035e92919061509f565b610352610461366004614e53565b6000908152601c602052604090205460ff1690565b6103fe610484366004614e97565b611427565b61037a610497366004614e53565b6114bd565b61037a6104aa3660046150b8565b6116fd565b61037a6104bd3660046150d3565b6118e3565b6104d56104d0366004614e53565b611ae6565b60405161035e929190615124565b61037a6104f1366004615041565b611c6d565b6103fe610504366004614e53565b60009081526013602052604090205490565b6103fe610524366004614e53565b611c88565b610578610537366004614e53565b6000908152600f60205260409020805460018201546002830154600384015460068501546007909501546001600160a01b0394851696939592949193911690565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c00161035e565b6103c76105c2366004614e53565b611d1b565b6103fe600d5481565b61037a6105de366004615196565b611d50565b6103fe6105f1366004614e53565b6000908152600f602052604090206005015490565b610384610614366004614e53565b611e2e565b6103fe610627366004614e53565b60176020526000908152604090205481565b6103fe6106473660046150b8565b611f35565b61037a611fbb565b61037a6106623660046151dc565b611fcf565b61067a610675366004614e53565b61232e565b60405161035e929190615222565b600c546001600160a01b03166103c7565b601f546103c7906001600160a01b031681565b6103fe6106ba366004614e53565b6000908152600f602052604090206001015490565b6103fe6106dd366004615015565b60009182526016602090815260408084206001600160a01b0393909316845291905290205490565b610384612468565b61037a61071b366004615196565b612477565b61037a61072e366004615250565b6125f2565b61037a61074136600461528a565b612644565b61037a6107543660046152c1565b612653565b6103fe610767366004614e53565b6000908152600f602052604090206002015490565b61037a61078a36600461507d565b612934565b61038461079d366004614e53565b6129f9565b61037a6107b036600461539d565b612a93565b6103c76107c3366004614e53565b6000908152600f60205260409020546001600160a01b031690565b61037a6107ec366004614e53565b612ac5565b6103846107ff366004614e53565b612d35565b6103fe610812366004615015565b60009182526015602090815260408084206001600160a01b0393909316845291905290205490565b61084d610848366004614e53565b613034565b60405161035e96959493929190615418565b61037a61086d36600461549a565b6133c6565b610352610880366004614e53565b60009081526011602052604090205460ff1690565b6103526108a3366004614e53565b601d6020526000908152604090205460ff1681565b6103846108c6366004614e53565b6134ed565b61037a6108d93660046150b8565b613506565b6103fe6108ec366004615015565b60009182526014602090815260408084206001600160a01b0393909316845291905290205490565b61035261092236600461551c565b6136ed565b6103fe610935366004614e53565b6000908152600f602052604090206004015490565b6103fe610958366004614e53565b61371b565b61037a61096b3660046150b8565b613742565b61037a61097e366004615546565b6137bb565b61037a6109913660046155ae565b613883565b6103fe6109a4366004614e53565b60009081526012602052604090205490565b60006109c182613a8e565b92915050565b601e5460405163feb2e23360e01b8152622de55d60e41b916001600160a01b03169063feb2e233906109ff90339085906004016155d3565b602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4091906155f6565b151560011480610ac25750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610a7b903390600401614e6c565b602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc91906155f6565b15156001145b610ae75760405162461bcd60e51b8152600401610ade90615613565b60405180910390fd5b600d546000908152600e60205260409020610b028a826156b8565b50600d546000908152600e60205260409020600101610b2189826156b8565b50600d546000908152600e60205260409020600201610b4088826156b8565b50600d546000908152600e60205260409020600301610b5f87826156b8565b50600d546000908152600e60205260409020600401610b7e86826156b8565b50600d546000908152600e60205260409020600501610b9d85826156b8565b50600d546000908152600e60205260409020600601610bbc84826156b8565b50600d546000908152600e602090815260409091208351610be592600790920191850190614a52565b50600d80546000908152601060205260409020805460ff191660019081179091559054610c119161578d565b600d55505050505050505050565b606060008054610c2e90615638565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5a90615638565b8015610ca75780601f10610c7c57610100808354040283529160200191610ca7565b820191906000526020600020905b815481529060010190602001808311610c8a57829003601f168201915b5050505050905090565b6000610cbc82613ab3565b506000908152600460205260409020546001600160a01b031690565b6000610ce382611d1b565b9050806001600160a01b0316836001600160a01b031603610d505760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ade565b336001600160a01b0382161480610d6c5750610d6c81336136ed565b610dde5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610ade565b610de88383613ad8565b505050565b601e54604051630cab15dd60e31b81528b916316e7c89960e01b916001600160a01b0390911690636558aee890610e2a903390869060040161509f565b602060405180830381865afa158015610e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6b91906155f6565b151560011480610eef5750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390610ea890339085906004016155d3565b602060405180830381865afa158015610ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee991906155f6565b15156001145b80610f6c5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610f25903390600401614e6c565b602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6691906155f6565b15156001145b610f885760405162461bcd60e51b8152600401610ade90615613565b60008c81526010602052604090205460ff1615156001148015610fba575060008c8152601c602052604090205460ff16155b610fd65760405162461bcd60e51b8152600401610ade90615613565b83620f4240036110b05760008c8152600e60205260409020610ff88c826156b8565b5060008c8152600e602052604090206001016110148b826156b8565b5060008c8152600e602052604090206002016110308a826156b8565b5060008c8152600e6020526040902060030161104c89826156b8565b5060008c8152600e6020526040902060040161106888826156b8565b5060008c8152600e6020526040902060060161108486826156b8565b5060008c8152600e6020908152604090912084516110aa92600790920191860190614a52565b5061112f565b83620f423f036110d55760008c8152600e602052604090206005016110aa87826156b8565b826000815181106110e8576110e86157a0565b6020026020010151600e60008e81526020019081526020016000206007018581548110611117576111176157a0565b90600052602060002001908161112d91906156b8565b505b505050505050505050505050565b601e5460405163feb2e23360e01b8152631aab8d6960e01b916001600160a01b03169063feb2e2339061117690339085906004016155d3565b602060405180830381865afa158015611193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b791906155f6565b1515600114806112395750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906111f2903390600401614e6c565b602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123391906155f6565b15156001145b6112555760405162461bcd60e51b8152600401610ade90615613565b816001600160a01b0316634cf0c6976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b791906155f6565b15156001146113085760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206973206e6f742052616e646f6d697a65720000000000006044820152606401610ade565b506000918252600f60205260409091206007810180546001600160a01b039093166001600160a01b0319938416811790915560089091018054909216179055565b611354335b82613b46565b6113705760405162461bcd60e51b8152600401610ade906157b6565b610de8838383613ba5565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916113f0575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061140f906001600160601b031687615803565b611419919061581a565b915196919550909350505050565b600061143283611f35565b82106114945760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ade565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b601e5460405163feb2e23360e01b8152631b35855960e11b916001600160a01b03169063feb2e233906114f690339085906004016155d3565b602060405180830381865afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153791906155f6565b1515600114806115b95750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611572903390600401614e6c565b602060405180830381865afa15801561158f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b391906155f6565b15156001145b6115d55760405162461bcd60e51b8152600401610ade90615613565b6000828152600f60205260409081902060060154601f549151639067b67760e01b81526004810185905290916001600160a01b031690639067b67790602401602060405180830381865afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611655919061583c565b61165f919061578d565b42116116a35760405162461bcd60e51b8152602060048201526013602482015272151a5b59481a185cc81b9bdd081c185cdcd959606a1b6044820152606401610ade565b6000828152600f60205260409020600281015460039091018190556001906116d0846402540be400615803565b6116da919061578d565b6116e49190615855565b6000928352600f60205260409092206005019190915550565b601e5460405163feb2e23360e01b8152630e234b0960e21b916001600160a01b03169063feb2e2339061173690339085906004016155d3565b602060405180830381865afa158015611753573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177791906155f6565b1515600114806117f95750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906117b2903390600401614e6c565b602060405180830381865afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f391906155f6565b15156001145b6118155760405162461bcd60e51b8152600401610ade90615613565b816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611853573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187791906155f6565b15156001146118c05760405162461bcd60e51b815260206004820152601560248201527421b7b73a3930b1ba1034b9903737ba1020b236b4b760591b6044820152606401610ade565b50601e80546001600160a01b0319166001600160a01b0392909216919091179055565b601f546001600160a01b0316331461190d5760405162461bcd60e51b8152600401610ade90615868565b6119178185613b46565b6119335760405162461bcd60e51b8152600401610ade906157b6565b6000838152600f602052604090206002015461195090600161578d565b6000848152600f60205260409020600281018290556003015410611aa557600061197985611d1b565b905061198485613d04565b60008681526017602052604090205461199e90600161578d565b600087815260176020908152604080832093909355868252601481528282206001600160a01b0385168352905220546119d890600161578d565b60008581526014602090815260408083206001600160a01b0386168452825280832093909355878252601a9052208054611a9f918991849190611a1a90615638565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4690615638565b8015611a935780601f10611a6857610100808354040283529160200191611a93565b820191906000526020600020905b815481529060010190602001808311611a7657829003601f168201915b50505050508787613d95565b50611ade565b60405162461bcd60e51b815260206004820152600e60248201526d14dd5c1c1b1e481c995858da195960921b6044820152606401610ade565b505050505050565b6000818152600e602052604090206006810180546060928392916007909101908290611b1190615638565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3d90615638565b8015611b8a5780601f10611b5f57610100808354040283529160200191611b8a565b820191906000526020600020905b815481529060010190602001808311611b6d57829003601f168201915b5050505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611c5e578382906000526020600020018054611bd190615638565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd90615638565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b505050505081526020019060010190611bb2565b50505050905091509150915091565b610de883838360405180602001604052806000815250612a93565b6000611c9360085490565b8210611cf65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ade565b60088281548110611d0957611d096157a0565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109c15760405162461bcd60e51b8152600401610ade906158a9565b6000828152600f60205260409020546001600160a01b03163314611da35760405162461bcd60e51b815260206004820152600a602482015269139bdd08185c9d1a5cdd60b21b6044820152606401610ade565b6000828152601d602052604090205460ff1615611deb5760405162461bcd60e51b815260206004820152600660248201526514da59db995960d21b6044820152606401610ade565b6000815111611df957600080fd5b6000828152601960205260409020611e1182826156b8565b50506000908152601d60205260409020805460ff19166001179055565b6060611e3982613ab3565b606060005b6000848152601260209081526040808320548352600e909152902060070154811015611ed6576000848152601260209081526040808320548352600e9091529020600701805483919083908110611e9757611e976157a0565b90600052602060002001604051602001611eb292919061594e565b60405160208183030381529060405291508080611ece9061596c565b915050611e3e565b50600083815260136020908152604090912054611ef291613e4c565b611efb84613fe7565b6000858152601a60209081526040918290209151611f1e94939291869101615985565b604051602081830303815290604052915050919050565b60006001600160a01b038216611f9f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610ade565b506001600160a01b031660009081526003602052604090205490565b611fc3614079565b611fcd60006140d3565b565b601e54604051630cab15dd60e31b81528691637b5dbac560e01b916001600160a01b0390911690636558aee89061200c903390869060040161509f565b602060405180830381865afa158015612029573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204d91906155f6565b1515600114806120d15750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061208a90339085906004016155d3565b602060405180830381865afa1580156120a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cb91906155f6565b15156001145b8061214e5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612107903390600401614e6c565b602060405180830381865afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214891906155f6565b15156001145b61216a5760405162461bcd60e51b8152600401610ade90615613565b60008781526010602052604090205460ff161515600114801561219c57506000878152601c602052604090205460ff16155b80156121ad57506402540be4008411155b6121e75760405162461bcd60e51b815260206004820152600b60248201526a195c9c8bd99c99595e995960aa1b6044820152606401610ade565b6000878152600f602052604081206003015490036122b6576000878152600f6020526040812080546001600160a01b0319166001600160a01b03891617815560018101879055600281019190915560038101859055600601839055612251876402540be400615803565b6000888152600f6020526040902060040155600184612275896402540be400615803565b61227f919061578d565b6122899190615855565b6000888152600f60209081526040808320600501939093556011905220805460ff19166001179055612325565b6000878152601d602052604081205460ff1615159003612309576000878152600f6020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600601839055612325565b6000878152600f60205260409020600181018690556006018390555b50505050505050565b6000818152601b60205260409020805460609182916001820190829061235390615638565b80601f016020809104026020016040519081016040528092919081815260200182805461237f90615638565b80156123cc5780601f106123a1576101008083540402835291602001916123cc565b820191906000526020600020905b8154815290600101906020018083116123af57829003601f168201915b505050505091508080546123df90615638565b80601f016020809104026020016040519081016040528092919081815260200182805461240b90615638565b80156124585780601f1061242d57610100808354040283529160200191612458565b820191906000526020600020905b81548152906001019060200180831161243b57829003601f168201915b5050505050905091509150915091565b606060018054610c2e90615638565b601e5460405163feb2e23360e01b8152639a8490f360e01b916001600160a01b03169063feb2e233906124b090339085906004016155d3565b602060405180830381865afa1580156124cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f191906155f6565b1515600114806125735750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061252c903390600401614e6c565b602060405180830381865afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d91906155f6565b15156001145b61258f5760405162461bcd60e51b8152600401610ade90615613565b6000838152601260209081526040808320548352601c90915290205460ff16156125cb5760405162461bcd60e51b8152600401610ade90615a2e565b6125d483613ab3565b6000838152601a602052604090206125ec83826156b8565b50505050565b6000838152600f60205260409020600701546001600160a01b0316331461261857600080fd5b6000828152601360205260409020541561263157600080fd5b6000918252601360205260409091205550565b61264f338383614125565b5050565b601e5460405163feb2e23360e01b8152630569208160e51b916001600160a01b03169063feb2e2339061268c90339085906004016155d3565b602060405180830381865afa1580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd91906155f6565b15156001148061274f5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612708903390600401614e6c565b602060405180830381865afa158015612725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274991906155f6565b15156001145b61276b5760405162461bcd60e51b8152600401610ade90615613565b8251845114801561277d575081518351145b6127b35760405162461bcd60e51b815260206004820152600760248201526634b73b103632b760c91b6044820152606401610ade565b60005b845181101561292d57601c6000601260008885815181106127d9576127d96157a0565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff161515600015151461282f5760405162461bcd60e51b8152600401610ade90615a2e565b612851858281518110612844576128446157a0565b6020026020010151613ab3565b838181518110612863576128636157a0565b6020026020010151601b6000878481518110612881576128816157a0565b602002602001015181526020019081526020016000206000600281106128a9576128a96157a0565b01906128b590826156b8565b508281815181106128c8576128c86157a0565b6020026020010151601b60008784815181106128e6576128e66157a0565b6020026020010151815260200190815260200160002060016002811061290e5761290e6157a0565b019061291a90826156b8565b50806129258161596c565b9150506127b6565b5050505050565b61293d3361134e565b6129595760405162461bcd60e51b8152600401610ade906157b6565b6000828152600f6020526040902060040154811080159061298b57506000828152600f60205260409020600501548111155b6129c05760405162461bcd60e51b815260206004820152600660248201526534b21032b93960d11b6044820152606401610ade565b6129c981613d04565b6000828152601760205260409020546129e390600161578d565b6000928352601760205260409092209190915550565b601a6020526000908152604090208054612a1290615638565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3e90615638565b8015612a8b5780601f10612a6057610100808354040283529160200191612a8b565b820191906000526020600020905b815481529060010190602001808311612a6e57829003601f168201915b505050505081565b612a9d3383613b46565b612ab95760405162461bcd60e51b8152600401610ade906157b6565b6125ec848484846141ef565b601e5460405163feb2e23360e01b8152630bcc405d60e41b916001600160a01b03169063feb2e23390612afe90339085906004016155d3565b602060405180830381865afa158015612b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3f91906155f6565b151560011480612bc15750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612b7a903390600401614e6c565b602060405180830381865afa158015612b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbb91906155f6565b15156001145b612bdd5760405162461bcd60e51b8152600401610ade90615613565b601f54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612c26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4a919061583c565b42118015612cc35750601f54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc0919061583c565b15155b612ccc57600080fd5b60008281526011602052604090205460ff161515600114612d195760405162461bcd60e51b81526020600482015260076024820152664e6f204461746160c81b6044820152606401610ade565b506000908152601c60205260409020805460ff19166001179055565b6060612d4082613ab3565b6000828152601260209081526040808320548352601890915290205460ff16158015612d79575060008281526013602052604090205415155b15612e67576000828152601260209081526040808320548352600e90915281206005018054612da790615638565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd390615638565b8015612e205780601f10612df557610100808354040283529160200191612e20565b820191906000526020600020905b815481529060010190602001808311612e0357829003601f168201915b505050505090506000815111612e455760405180602001604052806000815250612e60565b80612e4f84613fe7565b604051602001611f1e929190615a53565b9392505050565b6000828152601260209081526040808320548352601890915290205460ff16158015612e9f5750600082815260136020526040902054155b15612f7c576000828152601260209081526040808320548352600e90915281206005018054612ecd90615638565b80601f0160208091040260200160405190810160405280929190818152602001828054612ef990615638565b8015612f465780601f10612f1b57610100808354040283529160200191612f46565b820191906000526020600020905b815481529060010190602001808311612f2957829003601f168201915b505050505090506000815111612f6b5760405180602001604052806000815250612e60565b80604051602001611f1e9190615a82565b6000828152601260209081526040808320548352600e9091528120612fcc90600601612fa785611e2e565b604051602001612fb8929190615aad565b604051602081830303815290604052614222565b90506000612fd984614374565b6000858152601260209081526040808320548352600e8252808320888452601b83529281902090516130179493600201926001830191889101615b4a565b60408051601f19818403018152919052949350505050565b919050565b6000818152600e6020526040902080546060918291829182918291829160018201906002830190600384019060048501906005860190869061307590615638565b80601f01602080910402602001604051908101604052809291908181526020018280546130a190615638565b80156130ee5780601f106130c3576101008083540402835291602001916130ee565b820191906000526020600020905b8154815290600101906020018083116130d157829003601f168201915b5050505050955084805461310190615638565b80601f016020809104026020016040519081016040528092919081815260200182805461312d90615638565b801561317a5780601f1061314f5761010080835404028352916020019161317a565b820191906000526020600020905b81548152906001019060200180831161315d57829003601f168201915b5050505050945083805461318d90615638565b80601f01602080910402602001604051908101604052809291908181526020018280546131b990615638565b80156132065780601f106131db57610100808354040283529160200191613206565b820191906000526020600020905b8154815290600101906020018083116131e957829003601f168201915b5050505050935082805461321990615638565b80601f016020809104026020016040519081016040528092919081815260200182805461324590615638565b80156132925780601f1061326757610100808354040283529160200191613292565b820191906000526020600020905b81548152906001019060200180831161327557829003601f168201915b505050505092508180546132a590615638565b80601f01602080910402602001604051908101604052809291908181526020018280546132d190615638565b801561331e5780601f106132f35761010080835404028352916020019161331e565b820191906000526020600020905b81548152906001019060200180831161330157829003601f168201915b5050505050915080805461333190615638565b80601f016020809104026020016040519081016040528092919081815260200182805461335d90615638565b80156133aa5780601f1061337f576101008083540402835291602001916133aa565b820191906000526020600020905b81548152906001019060200180831161338d57829003601f168201915b5050505050905095509550955095509550955091939550919395565b601f546001600160a01b031633146133f05760405162461bcd60e51b8152600401610ade90615868565b6000828152600f602052604090206002015461340d90600161578d565b6000838152600f60205260409020600281018290556003015410611aa557806001036134895760008281526015602090815260408083206001600160a01b038a16845290915290205461346190600161578d565b60008381526015602090815260408083206001600160a01b038b1684529091529020556134db565b60008281526014602090815260408083206001600160a01b038a1684529091529020546134b790600161578d565b60008381526014602090815260408083206001600160a01b038b1684529091529020555b6134e88786868587613d95565b612325565b60196020526000908152604090208054612a1290615638565b601e5460405163feb2e23360e01b815263de00e1f760e01b916001600160a01b03169063feb2e2339061353f90339085906004016155d3565b602060405180830381865afa15801561355c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358091906155f6565b1515600114806136025750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906135bb903390600401614e6c565b602060405180830381865afa1580156135d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fc91906155f6565b15156001145b61361e5760405162461bcd60e51b8152600401610ade90615613565b816001600160a01b031663fb9422ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561365c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061368091906155f6565b15156001146136ca5760405162461bcd60e51b815260206004820152601660248201527521b7b73a3930b1ba1034b9903737ba1026b4b73a32b960511b6044820152606401610ade565b50601f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260176020908152604080832054600f9092528220600201546109c19190615855565b61374a614079565b6001600160a01b0381166137af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ade565b6137b8816140d3565b50565b601f546001600160a01b031633146137e55760405162461bcd60e51b8152600401610ade90615868565b6000818152600f602052604090206002015461380290600161578d565b6000828152600f60205260409020600281018290556003015410611aa55760008181526016602090815260408083206001600160a01b038816845290915290205461384e90600161578d565b60008281526016602090815260408083206001600160a01b038916845290915290205561387e8585858486613d95565b61292d565b601e54604051630cab15dd60e31b81528391630f6a85dd60e41b916001600160a01b0390911690636558aee8906138c0903390869060040161509f565b602060405180830381865afa1580156138dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390191906155f6565b1515600114806139855750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061393e90339085906004016155d3565b602060405180830381865afa15801561395b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397f91906155f6565b15156001145b80613a025750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906139bb903390600401614e6c565b602060405180830381865afa1580156139d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139fc91906155f6565b15156001145b613a1e5760405162461bcd60e51b8152600401610ade90615613565b60008481526010602052604090205460ff1615156001148015613a5057506000848152601c602052604090205460ff16155b613a6c5760405162461bcd60e51b8152600401610ade90615613565b5050600091825260186020526040909120805460ff1916911515919091179055565b60006001600160e01b0319821663152a902d60e11b14806109c157506109c1826143d9565b613abc816143fe565b6137b85760405162461bcd60e51b8152600401610ade906158a9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b0d82611d1b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080613b5283611d1b565b9050806001600160a01b0316846001600160a01b03161480613b795750613b7981856136ed565b80613b9d5750836001600160a01b0316613b9284610cb1565b6001600160a01b0316145b949350505050565b826001600160a01b0316613bb882611d1b565b6001600160a01b031614613bde5760405162461bcd60e51b8152600401610ade90615c67565b6001600160a01b038216613c405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ade565b613c4d838383600161441b565b826001600160a01b0316613c6082611d1b565b6001600160a01b031614613c865760405162461bcd60e51b8152600401610ade90615c67565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080546000190190559087168086528386208054600101905586865260029094528285208054909216841790915590518493600080516020615e3083398151915291a4505050565b6000613d0f82611d1b565b9050613d1f81600084600161441b565b613d2882611d1b565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552600384528285208054600019019055878552600290935281842080549091169055519293508492600080516020615e30833981519152908390a45050565b6000858152601a60205260409020613dad84826156b8565b506000858152601260205260409020829055613dc98486614543565b6000828152600f60205260409081902060080154905163bf1b89d360e01b81526004810184905260248101879052604481018390526001600160a01b039091169063bf1b89d390606401600060405180830381600087803b158015613e2d57600080fd5b505af1158015613e41573d6000803e3d6000fd5b505050505050505050565b60606000613e5b836002615803565b613e6690600261578d565b6001600160401b03811115613e7d57613e7d614b42565b6040519080825280601f01601f191660200182016040528015613ea7576020820181803683370190505b509050600360fc1b81600081518110613ec257613ec26157a0565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ef157613ef16157a0565b60200101906001600160f81b031916908160001a9053506000613f15846002615803565b613f2090600161578d565b90505b6001811115613f98576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613f5457613f546157a0565b1a60f81b828281518110613f6a57613f6a6157a0565b60200101906001600160f81b031916908160001a90535060049490941c93613f9181615cac565b9050613f23565b508315612e605760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ade565b60606000613ff48361455d565b60010190506000816001600160401b0381111561401357614013614b42565b6040519080825280601f01601f19166020018201604052801561403d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461404757509392505050565b600c546001600160a01b03163314611fcd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ade565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036141825760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610ade565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6141fa848484613ba5565b61420684848484614635565b6125ec5760405162461bcd60e51b8152600401610ade90615cc3565b6060815160000361424157505060408051602081019091526000815290565b6000604051806060016040528060408152602001615df06040913990506000600384516002614270919061578d565b61427a919061581a565b614285906004615803565b6001600160401b0381111561429c5761429c614b42565b6040519080825280601f01601f1916602001820160405280156142c6576020820181803683370190505b509050600182016020820185865187015b80821015614332576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506142d7565b505060038651066001811461434e576002811461436157614369565b603d6001830353603d6002830353614369565b603d60018303535b509195945050505050565b6000818152601260209081526040808320548352600f909152812060040154606091906143a19084615855565b6000848152601260209081526040808320548352600e90915290209091506143c882613fe7565b604051602001611f1e929190615d15565b60006001600160e01b0319821663780e9d6360e01b14806109c157506109c182614736565b6000908152600260205260409020546001600160a01b0316151590565b600181111561448a5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610ade565b816001600160a01b0385166144e6576144e181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614509565b836001600160a01b0316856001600160a01b031614614509576145098582614786565b6001600160a01b0384166145205761387e81614823565b846001600160a01b0316846001600160a01b03161461292d5761292d84826148d2565b61264f828260405180602001604052806000815250614916565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061459c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106145c8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106145e657662386f26fc10000830492506010015b6305f5e10083106145fe576305f5e100830492506008015b612710831061461257612710830492506004015b60648310614624576064830492506002015b600a83106109c15760010192915050565b60006001600160a01b0384163b1561472b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614679903390899088908890600401615d48565b6020604051808303816000875af19250505080156146b4575060408051601f3d908101601f191682019092526146b191810190615d85565b60015b614711573d8080156146e2576040519150601f19603f3d011682016040523d82523d6000602084013e6146e7565b606091505b5080516000036147095760405162461bcd60e51b8152600401610ade90615cc3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613b9d565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061476757506001600160e01b03198216635b5e139f60e01b145b806109c157506301ffc9a760e01b6001600160e01b03198316146109c1565b6000600161479384611f35565b61479d9190615855565b6000838152600760205260409020549091508082146147f0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061483590600190615855565b6000838152600960205260408120546008805493945090928490811061485d5761485d6157a0565b90600052602060002001549050806008838154811061487e5761487e6157a0565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806148b6576148b6615da2565b6001900381819060005260206000200160009055905550505050565b60006148dd83611f35565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6149208383614949565b61492d6000848484614635565b610de85760405162461bcd60e51b8152600401610ade90615cc3565b6001600160a01b03821661499f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ade565b6149a8816143fe565b156149c55760405162461bcd60e51b8152600401610ade90615db8565b6149d360008383600161441b565b6149dc816143fe565b156149f95760405162461bcd60e51b8152600401610ade90615db8565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020615e30833981519152908290a45050565b828054828255906000526020600020908101928215614a98579160200282015b82811115614a985782518290614a8890826156b8565b5091602001919060010190614a72565b50614aa4929150614aa8565b5090565b80821115614aa4576000614abc8282614ac5565b50600101614aa8565b508054614ad190615638565b6000825580601f10614ae1575050565b601f0160209004906000526020600020908101906137b891905b80821115614aa45760008155600101614afb565b6001600160e01b0319811681146137b857600080fd5b600060208284031215614b3757600080fd5b8135612e6081614b0f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614b8057614b80614b42565b604052919050565b60006001600160401b03831115614ba157614ba1614b42565b614bb4601f8401601f1916602001614b58565b9050828152838383011115614bc857600080fd5b828260208301376000602084830101529392505050565b600082601f830112614bf057600080fd5b612e6083833560208501614b88565b60006001600160401b03821115614c1857614c18614b42565b5060051b60200190565b600082601f830112614c3357600080fd5b81356020614c48614c4383614bff565b614b58565b82815260059290921b84018101918181019086841115614c6757600080fd5b8286015b84811015614ca65780356001600160401b03811115614c8a5760008081fd5b614c988986838b0101614bdf565b845250918301918301614c6b565b509695505050505050565b600080600080600080600080610100898b031215614cce57600080fd5b88356001600160401b0380821115614ce557600080fd5b614cf18c838d01614bdf565b995060208b0135915080821115614d0757600080fd5b614d138c838d01614bdf565b985060408b0135915080821115614d2957600080fd5b614d358c838d01614bdf565b975060608b0135915080821115614d4b57600080fd5b614d578c838d01614bdf565b965060808b0135915080821115614d6d57600080fd5b614d798c838d01614bdf565b955060a08b0135915080821115614d8f57600080fd5b614d9b8c838d01614bdf565b945060c08b0135915080821115614db157600080fd5b614dbd8c838d01614bdf565b935060e08b0135915080821115614dd357600080fd5b50614de08b828c01614c22565b9150509295985092959890939650565b60005b83811015614e0b578181015183820152602001614df3565b50506000910152565b60008151808452614e2c816020860160208601614df0565b601f01601f19169290920160200192915050565b602081526000612e606020830184614e14565b600060208284031215614e6557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461302f57600080fd5b60008060408385031215614eaa57600080fd5b614eb383614e80565b946020939093013593505050565b6000806000806000806000806000806101408b8d031215614ee157600080fd5b8a35995060208b01356001600160401b0380821115614eff57600080fd5b614f0b8e838f01614bdf565b9a5060408d0135915080821115614f2157600080fd5b614f2d8e838f01614bdf565b995060608d0135915080821115614f4357600080fd5b614f4f8e838f01614bdf565b985060808d0135915080821115614f6557600080fd5b614f718e838f01614bdf565b975060a08d0135915080821115614f8757600080fd5b614f938e838f01614bdf565b965060c08d0135915080821115614fa957600080fd5b614fb58e838f01614bdf565b955060e08d0135915080821115614fcb57600080fd5b614fd78e838f01614bdf565b94506101008d013593506101208d0135915080821115614ff657600080fd5b506150038d828e01614c22565b9150509295989b9194979a5092959850565b6000806040838503121561502857600080fd5b8235915061503860208401614e80565b90509250929050565b60008060006060848603121561505657600080fd5b61505f84614e80565b925061506d60208501614e80565b9150604084013590509250925092565b6000806040838503121561509057600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b6000602082840312156150ca57600080fd5b612e6082614e80565b60008060008060008060c087890312156150ec57600080fd5b863595506020870135945060408701359350606087013592506080870135915061511860a08801614e80565b90509295509295509295565b6040815260006151376040830185614e14565b6020838203818501528185518084528284019150828160051b85010183880160005b8381101561518757601f19878403018552615175838351614e14565b94860194925090850190600101615159565b50909998505050505050505050565b600080604083850312156151a957600080fd5b8235915060208301356001600160401b038111156151c657600080fd5b6151d285828601614bdf565b9150509250929050565b600080600080600060a086880312156151f457600080fd5b8535945061520460208701614e80565b94979496505050506040830135926060810135926080909101359150565b6040815260006152356040830185614e14565b82810360208401526152478185614e14565b95945050505050565b60008060006060848603121561526557600080fd5b505081359360208301359350604090920135919050565b80151581146137b857600080fd5b6000806040838503121561529d57600080fd5b6152a683614e80565b915060208301356152b68161527c565b809150509250929050565b6000806000606084860312156152d657600080fd5b83356001600160401b03808211156152ed57600080fd5b818601915086601f83011261530157600080fd5b81356020615311614c4383614bff565b82815260059290921b8401810191818101908a84111561533057600080fd5b948201945b8386101561534e57853582529482019490820190615335565b9750508701359250508082111561536457600080fd5b61537087838801614c22565b9350604086013591508082111561538657600080fd5b5061539386828701614c22565b9150509250925092565b600080600080608085870312156153b357600080fd5b6153bc85614e80565b93506153ca60208601614e80565b92506040850135915060608501356001600160401b038111156153ec57600080fd5b8501601f810187136153fd57600080fd5b61540c87823560208401614b88565b91505092959194509250565b60c08152600061542b60c0830189614e14565b828103602084015261543d8189614e14565b905082810360408401526154518188614e14565b905082810360608401526154658187614e14565b905082810360808401526154798186614e14565b905082810360a084015261548d8185614e14565b9998505050505050505050565b600080600080600080600060e0888a0312156154b557600080fd5b873596506154c560208901614e80565b95506154d360408901614e80565b945060608801356001600160401b038111156154ee57600080fd5b6154fa8a828b01614bdf565b979a969950949760808101359660a0820135965060c090910135945092505050565b6000806040838503121561552f57600080fd5b61553883614e80565b915061503860208401614e80565b600080600080600060a0868803121561555e57600080fd5b8535945061556e60208701614e80565b935060408601356001600160401b0381111561558957600080fd5b61559588828901614bdf565b9598949750949560608101359550608001359392505050565b600080604083850312156155c157600080fd5b8235915060208301356152b68161527c565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b60006020828403121561560857600080fd5b8151612e608161527c565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b600181811c9082168061564c57607f821691505b60208210810361566c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610de857600081815260208120601f850160051c810160208610156156995750805b601f850160051c820191505b81811015611ade578281556001016156a5565b81516001600160401b038111156156d1576156d1614b42565b6156e5816156df8454615638565b84615672565b602080601f83116001811461571a57600084156157025750858301515b600019600386901b1c1916600185901b178555611ade565b600085815260208120601f198616915b828110156157495788860151825594840194600190910190840161572a565b50858210156157675787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156109c1576109c1615777565b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b80820281158282048414176109c1576109c1615777565b60008261583757634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561584e57600080fd5b5051919050565b818103818111156109c1576109c1615777565b60208082526021908201527f43616c6c6572206973206e6f7420746865204d696e74657220436f6e747261636040820152601d60fa1b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b600081546158e881615638565b60018281168015615900576001811461591557615944565b60ff1984168752821515830287019450615944565b8560005260208060002060005b8581101561593b5781548a820152908401908201615922565b50505082870194505b5050505092915050565b60008351615960818460208801614df0565b615247818401856158db565b60006001820161597e5761597e615777565b5060010190565b696c657420686173683d2760b01b8152600085516159aa81600a850160208a01614df0565b6d273b6c657420746f6b656e49643d60901b600a9184019182015285516159d8816018840160208a01614df0565b6f3b6c657420746f6b656e446174613d5b60801b60189290910191820152615a0360288201866158db565b9050615d3b60f01b81528351615a20816002840160208801614df0565b016002019695505050505050565b6020808252600b908201526a2230ba3090333937bd32b760a91b604082015260600190565b60008351615a65818460208801614df0565b835190830190615a79818360208801614df0565b01949350505050565b60008251615a94818460208701614df0565b6670656e64696e6760c81b920191825250600701919050565b7f3c68746d6c3e3c686561643e3c2f686561643e3c626f64793e3c7363726970748152651039b9319e9160d11b60208201526000615aee60268301856158db565b72111f1e17b9b1b934b83a1f1e39b1b934b83a1f60691b81528351615b1a816013840160208801614df0565b761e17b9b1b934b83a1f1e17b137b23c9f1e17b43a36b61f60491b60139290910191820152602a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651615b8f816024850160208b01614df0565b701116113232b9b1b934b83a34b7b7111d1160791b602491840191820152615bba60358201886158db565b6a11161134b6b0b3b2911d1160a91b81529050615bda600b8201876158db565b6f222c2261747472696275746573223a5b60801b81529050615bff60108201866158db565b90507f5d2c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d8152681b0ed8985cd94d8d0b60ba1b60208201528351615c49816029840160208801614df0565b61227d60f01b60299290910191820152602b01979650505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b600081615cbb57615cbb615777565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000615d2182856158db565b61202360f01b81528351615d3c816002840160208801614df0565b01600201949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615d7b90830184614e14565b9695505050505050565b600060208284031215615d9757600080fd5b8151612e6081614b0f565b634e487b7160e01b600052603160045260246000fd5b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220321dc53376657c9056d34e96f31aa591e06015be89a0c0d6a00de6d8a31a1d8b64736f6c63430008130033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000047d0aa31c63479c2f8293c62f4d119ab78935fa8000000000000000000000000000000000000000000000000000000000000001c554e49432047656e6572617469766520436572746966696361746573000000000000000000000000000000000000000000000000000000000000000000000005554e494347000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061033a5760003560e01c80638da5cb5b116101b4578063c87b56dd116100fa578063e943a2c71161009d578063e943a2c7146108de578063e985e9c514610914578063e9b7a86014610927578063f18332dd1461094a578063f2fde38b1461095d578063f35c145214610970578063f6a85dd014610983578063fa92668a1461099657600080fd5b8063c87b56dd146107f1578063cb6d67e014610804578063d09502711461083a578063d3322d531461085f578063d374100014610872578063d3d5492814610895578063d9a03e38146108b8578063de00e1f7146108cb57600080fd5b8063a22cb46511610162578063a22cb46514610733578063ad24102014610746578063af569fd414610759578063b390c0ab1461077c578063b4b5b48f1461078f578063b88d4fde146107a2578063b9902968146107b5578063bcc405d0146107de57600080fd5b80638da5cb5b1461068857806392f0023314610699578063945e549b146106ac57806394c14957146106cf57806395d89b41146107055780639a8490f31461070d5780639cac0f1f1461072057600080fd5b806339143a1d116102845780636799a46a116102275780636799a46a146105d05780636c6aab16146105e35780636fa13531146106065780636fafdf831461061957806370a0823114610639578063715018a61461064c5780637b5dbac51461065457806380f8c8ab1461066757600080fd5b806339143a1d146104af5780633d2bed8d146104c257806342842e0e146104e35780634ab6897c146104f65780634f6ccce7146105165780635c91d74a146105295780636352211e146105b4578063663a3c00146105c757600080fd5b806318160ddd116102ec57806318160ddd146103fa5780631aab8d691461040c57806323b872dd1461041f5780632a55205a146104325780632ed330f7146104535780632f745c5914610476578063366b0ab214610489578063388d2c241461049c57600080fd5b806301ffc9a71461033f57806302de55d01461036757806306fdde031461037c578063074b553914610391578063081812fc146103b4578063095ea7b3146103d457806316e7c899146103e7575b600080fd5b61035261034d366004614b25565b6109b6565b60405190151581526020015b60405180910390f35b61037a610375366004614cb1565b6109c7565b005b610384610c1f565b60405161035e9190614e40565b61035261039f366004614e53565b60186020526000908152604090205460ff1681565b6103c76103c2366004614e53565b610cb1565b60405161035e9190614e6c565b61037a6103e2366004614e97565b610cd8565b61037a6103f5366004614ec1565b610ded565b6008545b60405190815260200161035e565b61037a61041a366004615015565b61113d565b61037a61042d366004615041565b611349565b61044561044036600461507d565b61137b565b60405161035e92919061509f565b610352610461366004614e53565b6000908152601c602052604090205460ff1690565b6103fe610484366004614e97565b611427565b61037a610497366004614e53565b6114bd565b61037a6104aa3660046150b8565b6116fd565b61037a6104bd3660046150d3565b6118e3565b6104d56104d0366004614e53565b611ae6565b60405161035e929190615124565b61037a6104f1366004615041565b611c6d565b6103fe610504366004614e53565b60009081526013602052604090205490565b6103fe610524366004614e53565b611c88565b610578610537366004614e53565b6000908152600f60205260409020805460018201546002830154600384015460068501546007909501546001600160a01b0394851696939592949193911690565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c00161035e565b6103c76105c2366004614e53565b611d1b565b6103fe600d5481565b61037a6105de366004615196565b611d50565b6103fe6105f1366004614e53565b6000908152600f602052604090206005015490565b610384610614366004614e53565b611e2e565b6103fe610627366004614e53565b60176020526000908152604090205481565b6103fe6106473660046150b8565b611f35565b61037a611fbb565b61037a6106623660046151dc565b611fcf565b61067a610675366004614e53565b61232e565b60405161035e929190615222565b600c546001600160a01b03166103c7565b601f546103c7906001600160a01b031681565b6103fe6106ba366004614e53565b6000908152600f602052604090206001015490565b6103fe6106dd366004615015565b60009182526016602090815260408084206001600160a01b0393909316845291905290205490565b610384612468565b61037a61071b366004615196565b612477565b61037a61072e366004615250565b6125f2565b61037a61074136600461528a565b612644565b61037a6107543660046152c1565b612653565b6103fe610767366004614e53565b6000908152600f602052604090206002015490565b61037a61078a36600461507d565b612934565b61038461079d366004614e53565b6129f9565b61037a6107b036600461539d565b612a93565b6103c76107c3366004614e53565b6000908152600f60205260409020546001600160a01b031690565b61037a6107ec366004614e53565b612ac5565b6103846107ff366004614e53565b612d35565b6103fe610812366004615015565b60009182526015602090815260408084206001600160a01b0393909316845291905290205490565b61084d610848366004614e53565b613034565b60405161035e96959493929190615418565b61037a61086d36600461549a565b6133c6565b610352610880366004614e53565b60009081526011602052604090205460ff1690565b6103526108a3366004614e53565b601d6020526000908152604090205460ff1681565b6103846108c6366004614e53565b6134ed565b61037a6108d93660046150b8565b613506565b6103fe6108ec366004615015565b60009182526014602090815260408084206001600160a01b0393909316845291905290205490565b61035261092236600461551c565b6136ed565b6103fe610935366004614e53565b6000908152600f602052604090206004015490565b6103fe610958366004614e53565b61371b565b61037a61096b3660046150b8565b613742565b61037a61097e366004615546565b6137bb565b61037a6109913660046155ae565b613883565b6103fe6109a4366004614e53565b60009081526012602052604090205490565b60006109c182613a8e565b92915050565b601e5460405163feb2e23360e01b8152622de55d60e41b916001600160a01b03169063feb2e233906109ff90339085906004016155d3565b602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4091906155f6565b151560011480610ac25750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610a7b903390600401614e6c565b602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc91906155f6565b15156001145b610ae75760405162461bcd60e51b8152600401610ade90615613565b60405180910390fd5b600d546000908152600e60205260409020610b028a826156b8565b50600d546000908152600e60205260409020600101610b2189826156b8565b50600d546000908152600e60205260409020600201610b4088826156b8565b50600d546000908152600e60205260409020600301610b5f87826156b8565b50600d546000908152600e60205260409020600401610b7e86826156b8565b50600d546000908152600e60205260409020600501610b9d85826156b8565b50600d546000908152600e60205260409020600601610bbc84826156b8565b50600d546000908152600e602090815260409091208351610be592600790920191850190614a52565b50600d80546000908152601060205260409020805460ff191660019081179091559054610c119161578d565b600d55505050505050505050565b606060008054610c2e90615638565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5a90615638565b8015610ca75780601f10610c7c57610100808354040283529160200191610ca7565b820191906000526020600020905b815481529060010190602001808311610c8a57829003601f168201915b5050505050905090565b6000610cbc82613ab3565b506000908152600460205260409020546001600160a01b031690565b6000610ce382611d1b565b9050806001600160a01b0316836001600160a01b031603610d505760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ade565b336001600160a01b0382161480610d6c5750610d6c81336136ed565b610dde5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610ade565b610de88383613ad8565b505050565b601e54604051630cab15dd60e31b81528b916316e7c89960e01b916001600160a01b0390911690636558aee890610e2a903390869060040161509f565b602060405180830381865afa158015610e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6b91906155f6565b151560011480610eef5750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390610ea890339085906004016155d3565b602060405180830381865afa158015610ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee991906155f6565b15156001145b80610f6c5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610f25903390600401614e6c565b602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6691906155f6565b15156001145b610f885760405162461bcd60e51b8152600401610ade90615613565b60008c81526010602052604090205460ff1615156001148015610fba575060008c8152601c602052604090205460ff16155b610fd65760405162461bcd60e51b8152600401610ade90615613565b83620f4240036110b05760008c8152600e60205260409020610ff88c826156b8565b5060008c8152600e602052604090206001016110148b826156b8565b5060008c8152600e602052604090206002016110308a826156b8565b5060008c8152600e6020526040902060030161104c89826156b8565b5060008c8152600e6020526040902060040161106888826156b8565b5060008c8152600e6020526040902060060161108486826156b8565b5060008c8152600e6020908152604090912084516110aa92600790920191860190614a52565b5061112f565b83620f423f036110d55760008c8152600e602052604090206005016110aa87826156b8565b826000815181106110e8576110e86157a0565b6020026020010151600e60008e81526020019081526020016000206007018581548110611117576111176157a0565b90600052602060002001908161112d91906156b8565b505b505050505050505050505050565b601e5460405163feb2e23360e01b8152631aab8d6960e01b916001600160a01b03169063feb2e2339061117690339085906004016155d3565b602060405180830381865afa158015611193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b791906155f6565b1515600114806112395750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906111f2903390600401614e6c565b602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123391906155f6565b15156001145b6112555760405162461bcd60e51b8152600401610ade90615613565b816001600160a01b0316634cf0c6976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b791906155f6565b15156001146113085760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206973206e6f742052616e646f6d697a65720000000000006044820152606401610ade565b506000918252600f60205260409091206007810180546001600160a01b039093166001600160a01b0319938416811790915560089091018054909216179055565b611354335b82613b46565b6113705760405162461bcd60e51b8152600401610ade906157b6565b610de8838383613ba5565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916113f0575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061140f906001600160601b031687615803565b611419919061581a565b915196919550909350505050565b600061143283611f35565b82106114945760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ade565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b601e5460405163feb2e23360e01b8152631b35855960e11b916001600160a01b03169063feb2e233906114f690339085906004016155d3565b602060405180830381865afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153791906155f6565b1515600114806115b95750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611572903390600401614e6c565b602060405180830381865afa15801561158f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b391906155f6565b15156001145b6115d55760405162461bcd60e51b8152600401610ade90615613565b6000828152600f60205260409081902060060154601f549151639067b67760e01b81526004810185905290916001600160a01b031690639067b67790602401602060405180830381865afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611655919061583c565b61165f919061578d565b42116116a35760405162461bcd60e51b8152602060048201526013602482015272151a5b59481a185cc81b9bdd081c185cdcd959606a1b6044820152606401610ade565b6000828152600f60205260409020600281015460039091018190556001906116d0846402540be400615803565b6116da919061578d565b6116e49190615855565b6000928352600f60205260409092206005019190915550565b601e5460405163feb2e23360e01b8152630e234b0960e21b916001600160a01b03169063feb2e2339061173690339085906004016155d3565b602060405180830381865afa158015611753573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177791906155f6565b1515600114806117f95750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906117b2903390600401614e6c565b602060405180830381865afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f391906155f6565b15156001145b6118155760405162461bcd60e51b8152600401610ade90615613565b816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611853573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187791906155f6565b15156001146118c05760405162461bcd60e51b815260206004820152601560248201527421b7b73a3930b1ba1034b9903737ba1020b236b4b760591b6044820152606401610ade565b50601e80546001600160a01b0319166001600160a01b0392909216919091179055565b601f546001600160a01b0316331461190d5760405162461bcd60e51b8152600401610ade90615868565b6119178185613b46565b6119335760405162461bcd60e51b8152600401610ade906157b6565b6000838152600f602052604090206002015461195090600161578d565b6000848152600f60205260409020600281018290556003015410611aa557600061197985611d1b565b905061198485613d04565b60008681526017602052604090205461199e90600161578d565b600087815260176020908152604080832093909355868252601481528282206001600160a01b0385168352905220546119d890600161578d565b60008581526014602090815260408083206001600160a01b0386168452825280832093909355878252601a9052208054611a9f918991849190611a1a90615638565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4690615638565b8015611a935780601f10611a6857610100808354040283529160200191611a93565b820191906000526020600020905b815481529060010190602001808311611a7657829003601f168201915b50505050508787613d95565b50611ade565b60405162461bcd60e51b815260206004820152600e60248201526d14dd5c1c1b1e481c995858da195960921b6044820152606401610ade565b505050505050565b6000818152600e602052604090206006810180546060928392916007909101908290611b1190615638565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3d90615638565b8015611b8a5780601f10611b5f57610100808354040283529160200191611b8a565b820191906000526020600020905b815481529060010190602001808311611b6d57829003601f168201915b5050505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611c5e578382906000526020600020018054611bd190615638565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd90615638565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b505050505081526020019060010190611bb2565b50505050905091509150915091565b610de883838360405180602001604052806000815250612a93565b6000611c9360085490565b8210611cf65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ade565b60088281548110611d0957611d096157a0565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109c15760405162461bcd60e51b8152600401610ade906158a9565b6000828152600f60205260409020546001600160a01b03163314611da35760405162461bcd60e51b815260206004820152600a602482015269139bdd08185c9d1a5cdd60b21b6044820152606401610ade565b6000828152601d602052604090205460ff1615611deb5760405162461bcd60e51b815260206004820152600660248201526514da59db995960d21b6044820152606401610ade565b6000815111611df957600080fd5b6000828152601960205260409020611e1182826156b8565b50506000908152601d60205260409020805460ff19166001179055565b6060611e3982613ab3565b606060005b6000848152601260209081526040808320548352600e909152902060070154811015611ed6576000848152601260209081526040808320548352600e9091529020600701805483919083908110611e9757611e976157a0565b90600052602060002001604051602001611eb292919061594e565b60405160208183030381529060405291508080611ece9061596c565b915050611e3e565b50600083815260136020908152604090912054611ef291613e4c565b611efb84613fe7565b6000858152601a60209081526040918290209151611f1e94939291869101615985565b604051602081830303815290604052915050919050565b60006001600160a01b038216611f9f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610ade565b506001600160a01b031660009081526003602052604090205490565b611fc3614079565b611fcd60006140d3565b565b601e54604051630cab15dd60e31b81528691637b5dbac560e01b916001600160a01b0390911690636558aee89061200c903390869060040161509f565b602060405180830381865afa158015612029573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204d91906155f6565b1515600114806120d15750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061208a90339085906004016155d3565b602060405180830381865afa1580156120a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cb91906155f6565b15156001145b8061214e5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612107903390600401614e6c565b602060405180830381865afa158015612124573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214891906155f6565b15156001145b61216a5760405162461bcd60e51b8152600401610ade90615613565b60008781526010602052604090205460ff161515600114801561219c57506000878152601c602052604090205460ff16155b80156121ad57506402540be4008411155b6121e75760405162461bcd60e51b815260206004820152600b60248201526a195c9c8bd99c99595e995960aa1b6044820152606401610ade565b6000878152600f602052604081206003015490036122b6576000878152600f6020526040812080546001600160a01b0319166001600160a01b03891617815560018101879055600281019190915560038101859055600601839055612251876402540be400615803565b6000888152600f6020526040902060040155600184612275896402540be400615803565b61227f919061578d565b6122899190615855565b6000888152600f60209081526040808320600501939093556011905220805460ff19166001179055612325565b6000878152601d602052604081205460ff1615159003612309576000878152600f6020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600601839055612325565b6000878152600f60205260409020600181018690556006018390555b50505050505050565b6000818152601b60205260409020805460609182916001820190829061235390615638565b80601f016020809104026020016040519081016040528092919081815260200182805461237f90615638565b80156123cc5780601f106123a1576101008083540402835291602001916123cc565b820191906000526020600020905b8154815290600101906020018083116123af57829003601f168201915b505050505091508080546123df90615638565b80601f016020809104026020016040519081016040528092919081815260200182805461240b90615638565b80156124585780601f1061242d57610100808354040283529160200191612458565b820191906000526020600020905b81548152906001019060200180831161243b57829003601f168201915b5050505050905091509150915091565b606060018054610c2e90615638565b601e5460405163feb2e23360e01b8152639a8490f360e01b916001600160a01b03169063feb2e233906124b090339085906004016155d3565b602060405180830381865afa1580156124cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f191906155f6565b1515600114806125735750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061252c903390600401614e6c565b602060405180830381865afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d91906155f6565b15156001145b61258f5760405162461bcd60e51b8152600401610ade90615613565b6000838152601260209081526040808320548352601c90915290205460ff16156125cb5760405162461bcd60e51b8152600401610ade90615a2e565b6125d483613ab3565b6000838152601a602052604090206125ec83826156b8565b50505050565b6000838152600f60205260409020600701546001600160a01b0316331461261857600080fd5b6000828152601360205260409020541561263157600080fd5b6000918252601360205260409091205550565b61264f338383614125565b5050565b601e5460405163feb2e23360e01b8152630569208160e51b916001600160a01b03169063feb2e2339061268c90339085906004016155d3565b602060405180830381865afa1580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd91906155f6565b15156001148061274f5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612708903390600401614e6c565b602060405180830381865afa158015612725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274991906155f6565b15156001145b61276b5760405162461bcd60e51b8152600401610ade90615613565b8251845114801561277d575081518351145b6127b35760405162461bcd60e51b815260206004820152600760248201526634b73b103632b760c91b6044820152606401610ade565b60005b845181101561292d57601c6000601260008885815181106127d9576127d96157a0565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff161515600015151461282f5760405162461bcd60e51b8152600401610ade90615a2e565b612851858281518110612844576128446157a0565b6020026020010151613ab3565b838181518110612863576128636157a0565b6020026020010151601b6000878481518110612881576128816157a0565b602002602001015181526020019081526020016000206000600281106128a9576128a96157a0565b01906128b590826156b8565b508281815181106128c8576128c86157a0565b6020026020010151601b60008784815181106128e6576128e66157a0565b6020026020010151815260200190815260200160002060016002811061290e5761290e6157a0565b019061291a90826156b8565b50806129258161596c565b9150506127b6565b5050505050565b61293d3361134e565b6129595760405162461bcd60e51b8152600401610ade906157b6565b6000828152600f6020526040902060040154811080159061298b57506000828152600f60205260409020600501548111155b6129c05760405162461bcd60e51b815260206004820152600660248201526534b21032b93960d11b6044820152606401610ade565b6129c981613d04565b6000828152601760205260409020546129e390600161578d565b6000928352601760205260409092209190915550565b601a6020526000908152604090208054612a1290615638565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3e90615638565b8015612a8b5780601f10612a6057610100808354040283529160200191612a8b565b820191906000526020600020905b815481529060010190602001808311612a6e57829003601f168201915b505050505081565b612a9d3383613b46565b612ab95760405162461bcd60e51b8152600401610ade906157b6565b6125ec848484846141ef565b601e5460405163feb2e23360e01b8152630bcc405d60e41b916001600160a01b03169063feb2e23390612afe90339085906004016155d3565b602060405180830381865afa158015612b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3f91906155f6565b151560011480612bc15750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612b7a903390600401614e6c565b602060405180830381865afa158015612b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbb91906155f6565b15156001145b612bdd5760405162461bcd60e51b8152600401610ade90615613565b601f54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612c26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4a919061583c565b42118015612cc35750601f54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc0919061583c565b15155b612ccc57600080fd5b60008281526011602052604090205460ff161515600114612d195760405162461bcd60e51b81526020600482015260076024820152664e6f204461746160c81b6044820152606401610ade565b506000908152601c60205260409020805460ff19166001179055565b6060612d4082613ab3565b6000828152601260209081526040808320548352601890915290205460ff16158015612d79575060008281526013602052604090205415155b15612e67576000828152601260209081526040808320548352600e90915281206005018054612da790615638565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd390615638565b8015612e205780601f10612df557610100808354040283529160200191612e20565b820191906000526020600020905b815481529060010190602001808311612e0357829003601f168201915b505050505090506000815111612e455760405180602001604052806000815250612e60565b80612e4f84613fe7565b604051602001611f1e929190615a53565b9392505050565b6000828152601260209081526040808320548352601890915290205460ff16158015612e9f5750600082815260136020526040902054155b15612f7c576000828152601260209081526040808320548352600e90915281206005018054612ecd90615638565b80601f0160208091040260200160405190810160405280929190818152602001828054612ef990615638565b8015612f465780601f10612f1b57610100808354040283529160200191612f46565b820191906000526020600020905b815481529060010190602001808311612f2957829003601f168201915b505050505090506000815111612f6b5760405180602001604052806000815250612e60565b80604051602001611f1e9190615a82565b6000828152601260209081526040808320548352600e9091528120612fcc90600601612fa785611e2e565b604051602001612fb8929190615aad565b604051602081830303815290604052614222565b90506000612fd984614374565b6000858152601260209081526040808320548352600e8252808320888452601b83529281902090516130179493600201926001830191889101615b4a565b60408051601f19818403018152919052949350505050565b919050565b6000818152600e6020526040902080546060918291829182918291829160018201906002830190600384019060048501906005860190869061307590615638565b80601f01602080910402602001604051908101604052809291908181526020018280546130a190615638565b80156130ee5780601f106130c3576101008083540402835291602001916130ee565b820191906000526020600020905b8154815290600101906020018083116130d157829003601f168201915b5050505050955084805461310190615638565b80601f016020809104026020016040519081016040528092919081815260200182805461312d90615638565b801561317a5780601f1061314f5761010080835404028352916020019161317a565b820191906000526020600020905b81548152906001019060200180831161315d57829003601f168201915b5050505050945083805461318d90615638565b80601f01602080910402602001604051908101604052809291908181526020018280546131b990615638565b80156132065780601f106131db57610100808354040283529160200191613206565b820191906000526020600020905b8154815290600101906020018083116131e957829003601f168201915b5050505050935082805461321990615638565b80601f016020809104026020016040519081016040528092919081815260200182805461324590615638565b80156132925780601f1061326757610100808354040283529160200191613292565b820191906000526020600020905b81548152906001019060200180831161327557829003601f168201915b505050505092508180546132a590615638565b80601f01602080910402602001604051908101604052809291908181526020018280546132d190615638565b801561331e5780601f106132f35761010080835404028352916020019161331e565b820191906000526020600020905b81548152906001019060200180831161330157829003601f168201915b5050505050915080805461333190615638565b80601f016020809104026020016040519081016040528092919081815260200182805461335d90615638565b80156133aa5780601f1061337f576101008083540402835291602001916133aa565b820191906000526020600020905b81548152906001019060200180831161338d57829003601f168201915b5050505050905095509550955095509550955091939550919395565b601f546001600160a01b031633146133f05760405162461bcd60e51b8152600401610ade90615868565b6000828152600f602052604090206002015461340d90600161578d565b6000838152600f60205260409020600281018290556003015410611aa557806001036134895760008281526015602090815260408083206001600160a01b038a16845290915290205461346190600161578d565b60008381526015602090815260408083206001600160a01b038b1684529091529020556134db565b60008281526014602090815260408083206001600160a01b038a1684529091529020546134b790600161578d565b60008381526014602090815260408083206001600160a01b038b1684529091529020555b6134e88786868587613d95565b612325565b60196020526000908152604090208054612a1290615638565b601e5460405163feb2e23360e01b815263de00e1f760e01b916001600160a01b03169063feb2e2339061353f90339085906004016155d3565b602060405180830381865afa15801561355c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358091906155f6565b1515600114806136025750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906135bb903390600401614e6c565b602060405180830381865afa1580156135d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fc91906155f6565b15156001145b61361e5760405162461bcd60e51b8152600401610ade90615613565b816001600160a01b031663fb9422ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561365c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061368091906155f6565b15156001146136ca5760405162461bcd60e51b815260206004820152601660248201527521b7b73a3930b1ba1034b9903737ba1026b4b73a32b960511b6044820152606401610ade565b50601f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260176020908152604080832054600f9092528220600201546109c19190615855565b61374a614079565b6001600160a01b0381166137af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ade565b6137b8816140d3565b50565b601f546001600160a01b031633146137e55760405162461bcd60e51b8152600401610ade90615868565b6000818152600f602052604090206002015461380290600161578d565b6000828152600f60205260409020600281018290556003015410611aa55760008181526016602090815260408083206001600160a01b038816845290915290205461384e90600161578d565b60008281526016602090815260408083206001600160a01b038916845290915290205561387e8585858486613d95565b61292d565b601e54604051630cab15dd60e31b81528391630f6a85dd60e41b916001600160a01b0390911690636558aee8906138c0903390869060040161509f565b602060405180830381865afa1580156138dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390191906155f6565b1515600114806139855750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061393e90339085906004016155d3565b602060405180830381865afa15801561395b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397f91906155f6565b15156001145b80613a025750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906139bb903390600401614e6c565b602060405180830381865afa1580156139d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139fc91906155f6565b15156001145b613a1e5760405162461bcd60e51b8152600401610ade90615613565b60008481526010602052604090205460ff1615156001148015613a5057506000848152601c602052604090205460ff16155b613a6c5760405162461bcd60e51b8152600401610ade90615613565b5050600091825260186020526040909120805460ff1916911515919091179055565b60006001600160e01b0319821663152a902d60e11b14806109c157506109c1826143d9565b613abc816143fe565b6137b85760405162461bcd60e51b8152600401610ade906158a9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b0d82611d1b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080613b5283611d1b565b9050806001600160a01b0316846001600160a01b03161480613b795750613b7981856136ed565b80613b9d5750836001600160a01b0316613b9284610cb1565b6001600160a01b0316145b949350505050565b826001600160a01b0316613bb882611d1b565b6001600160a01b031614613bde5760405162461bcd60e51b8152600401610ade90615c67565b6001600160a01b038216613c405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ade565b613c4d838383600161441b565b826001600160a01b0316613c6082611d1b565b6001600160a01b031614613c865760405162461bcd60e51b8152600401610ade90615c67565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080546000190190559087168086528386208054600101905586865260029094528285208054909216841790915590518493600080516020615e3083398151915291a4505050565b6000613d0f82611d1b565b9050613d1f81600084600161441b565b613d2882611d1b565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552600384528285208054600019019055878552600290935281842080549091169055519293508492600080516020615e30833981519152908390a45050565b6000858152601a60205260409020613dad84826156b8565b506000858152601260205260409020829055613dc98486614543565b6000828152600f60205260409081902060080154905163bf1b89d360e01b81526004810184905260248101879052604481018390526001600160a01b039091169063bf1b89d390606401600060405180830381600087803b158015613e2d57600080fd5b505af1158015613e41573d6000803e3d6000fd5b505050505050505050565b60606000613e5b836002615803565b613e6690600261578d565b6001600160401b03811115613e7d57613e7d614b42565b6040519080825280601f01601f191660200182016040528015613ea7576020820181803683370190505b509050600360fc1b81600081518110613ec257613ec26157a0565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ef157613ef16157a0565b60200101906001600160f81b031916908160001a9053506000613f15846002615803565b613f2090600161578d565b90505b6001811115613f98576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613f5457613f546157a0565b1a60f81b828281518110613f6a57613f6a6157a0565b60200101906001600160f81b031916908160001a90535060049490941c93613f9181615cac565b9050613f23565b508315612e605760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ade565b60606000613ff48361455d565b60010190506000816001600160401b0381111561401357614013614b42565b6040519080825280601f01601f19166020018201604052801561403d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461404757509392505050565b600c546001600160a01b03163314611fcd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ade565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036141825760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610ade565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6141fa848484613ba5565b61420684848484614635565b6125ec5760405162461bcd60e51b8152600401610ade90615cc3565b6060815160000361424157505060408051602081019091526000815290565b6000604051806060016040528060408152602001615df06040913990506000600384516002614270919061578d565b61427a919061581a565b614285906004615803565b6001600160401b0381111561429c5761429c614b42565b6040519080825280601f01601f1916602001820160405280156142c6576020820181803683370190505b509050600182016020820185865187015b80821015614332576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506142d7565b505060038651066001811461434e576002811461436157614369565b603d6001830353603d6002830353614369565b603d60018303535b509195945050505050565b6000818152601260209081526040808320548352600f909152812060040154606091906143a19084615855565b6000848152601260209081526040808320548352600e90915290209091506143c882613fe7565b604051602001611f1e929190615d15565b60006001600160e01b0319821663780e9d6360e01b14806109c157506109c182614736565b6000908152600260205260409020546001600160a01b0316151590565b600181111561448a5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610ade565b816001600160a01b0385166144e6576144e181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614509565b836001600160a01b0316856001600160a01b031614614509576145098582614786565b6001600160a01b0384166145205761387e81614823565b846001600160a01b0316846001600160a01b03161461292d5761292d84826148d2565b61264f828260405180602001604052806000815250614916565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061459c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106145c8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106145e657662386f26fc10000830492506010015b6305f5e10083106145fe576305f5e100830492506008015b612710831061461257612710830492506004015b60648310614624576064830492506002015b600a83106109c15760010192915050565b60006001600160a01b0384163b1561472b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614679903390899088908890600401615d48565b6020604051808303816000875af19250505080156146b4575060408051601f3d908101601f191682019092526146b191810190615d85565b60015b614711573d8080156146e2576040519150601f19603f3d011682016040523d82523d6000602084013e6146e7565b606091505b5080516000036147095760405162461bcd60e51b8152600401610ade90615cc3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613b9d565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061476757506001600160e01b03198216635b5e139f60e01b145b806109c157506301ffc9a760e01b6001600160e01b03198316146109c1565b6000600161479384611f35565b61479d9190615855565b6000838152600760205260409020549091508082146147f0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061483590600190615855565b6000838152600960205260408120546008805493945090928490811061485d5761485d6157a0565b90600052602060002001549050806008838154811061487e5761487e6157a0565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806148b6576148b6615da2565b6001900381819060005260206000200160009055905550505050565b60006148dd83611f35565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6149208383614949565b61492d6000848484614635565b610de85760405162461bcd60e51b8152600401610ade90615cc3565b6001600160a01b03821661499f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ade565b6149a8816143fe565b156149c55760405162461bcd60e51b8152600401610ade90615db8565b6149d360008383600161441b565b6149dc816143fe565b156149f95760405162461bcd60e51b8152600401610ade90615db8565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020615e30833981519152908290a45050565b828054828255906000526020600020908101928215614a98579160200282015b82811115614a985782518290614a8890826156b8565b5091602001919060010190614a72565b50614aa4929150614aa8565b5090565b80821115614aa4576000614abc8282614ac5565b50600101614aa8565b508054614ad190615638565b6000825580601f10614ae1575050565b601f0160209004906000526020600020908101906137b891905b80821115614aa45760008155600101614afb565b6001600160e01b0319811681146137b857600080fd5b600060208284031215614b3757600080fd5b8135612e6081614b0f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614b8057614b80614b42565b604052919050565b60006001600160401b03831115614ba157614ba1614b42565b614bb4601f8401601f1916602001614b58565b9050828152838383011115614bc857600080fd5b828260208301376000602084830101529392505050565b600082601f830112614bf057600080fd5b612e6083833560208501614b88565b60006001600160401b03821115614c1857614c18614b42565b5060051b60200190565b600082601f830112614c3357600080fd5b81356020614c48614c4383614bff565b614b58565b82815260059290921b84018101918181019086841115614c6757600080fd5b8286015b84811015614ca65780356001600160401b03811115614c8a5760008081fd5b614c988986838b0101614bdf565b845250918301918301614c6b565b509695505050505050565b600080600080600080600080610100898b031215614cce57600080fd5b88356001600160401b0380821115614ce557600080fd5b614cf18c838d01614bdf565b995060208b0135915080821115614d0757600080fd5b614d138c838d01614bdf565b985060408b0135915080821115614d2957600080fd5b614d358c838d01614bdf565b975060608b0135915080821115614d4b57600080fd5b614d578c838d01614bdf565b965060808b0135915080821115614d6d57600080fd5b614d798c838d01614bdf565b955060a08b0135915080821115614d8f57600080fd5b614d9b8c838d01614bdf565b945060c08b0135915080821115614db157600080fd5b614dbd8c838d01614bdf565b935060e08b0135915080821115614dd357600080fd5b50614de08b828c01614c22565b9150509295985092959890939650565b60005b83811015614e0b578181015183820152602001614df3565b50506000910152565b60008151808452614e2c816020860160208601614df0565b601f01601f19169290920160200192915050565b602081526000612e606020830184614e14565b600060208284031215614e6557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461302f57600080fd5b60008060408385031215614eaa57600080fd5b614eb383614e80565b946020939093013593505050565b6000806000806000806000806000806101408b8d031215614ee157600080fd5b8a35995060208b01356001600160401b0380821115614eff57600080fd5b614f0b8e838f01614bdf565b9a5060408d0135915080821115614f2157600080fd5b614f2d8e838f01614bdf565b995060608d0135915080821115614f4357600080fd5b614f4f8e838f01614bdf565b985060808d0135915080821115614f6557600080fd5b614f718e838f01614bdf565b975060a08d0135915080821115614f8757600080fd5b614f938e838f01614bdf565b965060c08d0135915080821115614fa957600080fd5b614fb58e838f01614bdf565b955060e08d0135915080821115614fcb57600080fd5b614fd78e838f01614bdf565b94506101008d013593506101208d0135915080821115614ff657600080fd5b506150038d828e01614c22565b9150509295989b9194979a5092959850565b6000806040838503121561502857600080fd5b8235915061503860208401614e80565b90509250929050565b60008060006060848603121561505657600080fd5b61505f84614e80565b925061506d60208501614e80565b9150604084013590509250925092565b6000806040838503121561509057600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b6000602082840312156150ca57600080fd5b612e6082614e80565b60008060008060008060c087890312156150ec57600080fd5b863595506020870135945060408701359350606087013592506080870135915061511860a08801614e80565b90509295509295509295565b6040815260006151376040830185614e14565b6020838203818501528185518084528284019150828160051b85010183880160005b8381101561518757601f19878403018552615175838351614e14565b94860194925090850190600101615159565b50909998505050505050505050565b600080604083850312156151a957600080fd5b8235915060208301356001600160401b038111156151c657600080fd5b6151d285828601614bdf565b9150509250929050565b600080600080600060a086880312156151f457600080fd5b8535945061520460208701614e80565b94979496505050506040830135926060810135926080909101359150565b6040815260006152356040830185614e14565b82810360208401526152478185614e14565b95945050505050565b60008060006060848603121561526557600080fd5b505081359360208301359350604090920135919050565b80151581146137b857600080fd5b6000806040838503121561529d57600080fd5b6152a683614e80565b915060208301356152b68161527c565b809150509250929050565b6000806000606084860312156152d657600080fd5b83356001600160401b03808211156152ed57600080fd5b818601915086601f83011261530157600080fd5b81356020615311614c4383614bff565b82815260059290921b8401810191818101908a84111561533057600080fd5b948201945b8386101561534e57853582529482019490820190615335565b9750508701359250508082111561536457600080fd5b61537087838801614c22565b9350604086013591508082111561538657600080fd5b5061539386828701614c22565b9150509250925092565b600080600080608085870312156153b357600080fd5b6153bc85614e80565b93506153ca60208601614e80565b92506040850135915060608501356001600160401b038111156153ec57600080fd5b8501601f810187136153fd57600080fd5b61540c87823560208401614b88565b91505092959194509250565b60c08152600061542b60c0830189614e14565b828103602084015261543d8189614e14565b905082810360408401526154518188614e14565b905082810360608401526154658187614e14565b905082810360808401526154798186614e14565b905082810360a084015261548d8185614e14565b9998505050505050505050565b600080600080600080600060e0888a0312156154b557600080fd5b873596506154c560208901614e80565b95506154d360408901614e80565b945060608801356001600160401b038111156154ee57600080fd5b6154fa8a828b01614bdf565b979a969950949760808101359660a0820135965060c090910135945092505050565b6000806040838503121561552f57600080fd5b61553883614e80565b915061503860208401614e80565b600080600080600060a0868803121561555e57600080fd5b8535945061556e60208701614e80565b935060408601356001600160401b0381111561558957600080fd5b61559588828901614bdf565b9598949750949560608101359550608001359392505050565b600080604083850312156155c157600080fd5b8235915060208301356152b68161527c565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b60006020828403121561560857600080fd5b8151612e608161527c565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b600181811c9082168061564c57607f821691505b60208210810361566c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610de857600081815260208120601f850160051c810160208610156156995750805b601f850160051c820191505b81811015611ade578281556001016156a5565b81516001600160401b038111156156d1576156d1614b42565b6156e5816156df8454615638565b84615672565b602080601f83116001811461571a57600084156157025750858301515b600019600386901b1c1916600185901b178555611ade565b600085815260208120601f198616915b828110156157495788860151825594840194600190910190840161572a565b50858210156157675787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156109c1576109c1615777565b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b80820281158282048414176109c1576109c1615777565b60008261583757634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561584e57600080fd5b5051919050565b818103818111156109c1576109c1615777565b60208082526021908201527f43616c6c6572206973206e6f7420746865204d696e74657220436f6e747261636040820152601d60fa1b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b600081546158e881615638565b60018281168015615900576001811461591557615944565b60ff1984168752821515830287019450615944565b8560005260208060002060005b8581101561593b5781548a820152908401908201615922565b50505082870194505b5050505092915050565b60008351615960818460208801614df0565b615247818401856158db565b60006001820161597e5761597e615777565b5060010190565b696c657420686173683d2760b01b8152600085516159aa81600a850160208a01614df0565b6d273b6c657420746f6b656e49643d60901b600a9184019182015285516159d8816018840160208a01614df0565b6f3b6c657420746f6b656e446174613d5b60801b60189290910191820152615a0360288201866158db565b9050615d3b60f01b81528351615a20816002840160208801614df0565b016002019695505050505050565b6020808252600b908201526a2230ba3090333937bd32b760a91b604082015260600190565b60008351615a65818460208801614df0565b835190830190615a79818360208801614df0565b01949350505050565b60008251615a94818460208701614df0565b6670656e64696e6760c81b920191825250600701919050565b7f3c68746d6c3e3c686561643e3c2f686561643e3c626f64793e3c7363726970748152651039b9319e9160d11b60208201526000615aee60268301856158db565b72111f1e17b9b1b934b83a1f1e39b1b934b83a1f60691b81528351615b1a816013840160208801614df0565b761e17b9b1b934b83a1f1e17b137b23c9f1e17b43a36b61f60491b60139290910191820152602a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651615b8f816024850160208b01614df0565b701116113232b9b1b934b83a34b7b7111d1160791b602491840191820152615bba60358201886158db565b6a11161134b6b0b3b2911d1160a91b81529050615bda600b8201876158db565b6f222c2261747472696275746573223a5b60801b81529050615bff60108201866158db565b90507f5d2c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d8152681b0ed8985cd94d8d0b60ba1b60208201528351615c49816029840160208801614df0565b61227d60f01b60299290910191820152602b01979650505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b600081615cbb57615cbb615777565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000615d2182856158db565b61202360f01b81528351615d3c816002840160208801614df0565b01600201949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615d7b90830184614e14565b9695505050505050565b600060208284031215615d9757600080fd5b8151612e6081614b0f565b634e487b7160e01b600052603160045260246000fd5b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220321dc53376657c9056d34e96f31aa591e06015be89a0c0d6a00de6d8a31a1d8b64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000047d0aa31c63479c2f8293c62f4d119ab78935fa8000000000000000000000000000000000000000000000000000000000000001c554e49432047656e6572617469766520436572746966696361746573000000000000000000000000000000000000000000000000000000000000000000000005554e494347000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): UNIC Generative Certificates
Arg [1] : symbol (string): UNICG
Arg [2] : _adminsContract (address): 0x47d0AA31c63479C2f8293c62f4d119aB78935fA8

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000047d0aa31c63479c2f8293c62f4d119ab78935fa8
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [4] : 554e49432047656e657261746976652043657274696669636174657300000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 554e494347000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

425:25874:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18498:182;;;;;;:::i;:::-;;:::i;:::-;;;565:14:21;;558:22;540:41;;528:2;513:18;18498:182:17;;;;;;;;4601:1149;;;;;;:::i;:::-;;:::i;:::-;;2407:98:5;;;:::i;:::-;;;;;;;:::i;2787:48:17:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3871:167:5;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3404:406::-;;;;;;:::i;:::-;;:::i;12612:1466:17:-;;;;;;:::i;:::-;;:::i;1630:111:6:-;1717:10;:17;1630:111;;;8168:25:21;;;8156:2;8141:18;1630:111:6;8022:177:21;7918:441:17;;;;;;:::i;:::-;;:::i;4548:296:5:-;;;;;;:::i;:::-;;:::i;2301:419:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;20785:137:17:-;;;;;;:::i;:::-;20860:4;20883:31;;;:16;:31;;;;;;;;;20785:137;1306:253:6;;;;;;:::i;:::-;;:::i;17117:618:17:-;;;;;;:::i;:::-;;:::i;18114:296::-;;;;;;:::i;:::-;;:::i;10947:1115::-;;;;;;:::i;:::-;;:::i;23961:241::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4910:149:5:-;;;;;;:::i;:::-;;:::i;24882:122:17:-;;;;;;:::i;:::-;24947:7;24974:21;;;:11;:21;;;;;;;24882:122;1813:230:6;;;;;;:::i;:::-;;:::i;24277:551:17:-;;;;;;:::i;:::-;24362:7;24431:39;;;:24;:39;;;;;:63;;;24496:62;;;24560:67;;;;24629:61;;;;24692:67;;;;24761:58;;;;;-1:-1:-1;;;;;24431:63:17;;;;24496:62;;24560:67;;24629:61;;24761:58;;;24277:551;;;;;-1:-1:-1;;;;;11511:15:21;;;11493:34;;11558:2;11543:18;;11536:34;;;;11586:18;;11579:34;;;;11644:2;11629:18;;11622:34;;;;11687:3;11672:19;;11665:35;11737:15;;;11473:3;11716:19;;11709:44;11442:3;11427:19;24277:551:17;11168:591:21;2126:219:5;;;;;;:::i;:::-;;:::i;551:33:17:-;;;;;;14141:415;;;;;;:::i;:::-;;:::i;21644:172::-;;;;;;:::i;:::-;21718:7;21745:39;;;:24;:39;;;;;:62;;;;21644:172;25076:623;;;;;;:::i;:::-;;:::i;2691:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1865:204:5;;;;;;:::i;:::-;;:::i;1818:101:18:-;;;:::i;5905:1953:17:-;;;;;;:::i;:::-;;:::i;26084:210::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1195:85:18:-;1267:6;;-1:-1:-1;;;;;1267:6:18;1195:85;;3462:29:17;;;;;-1:-1:-1;;;;;3462:29:17;;;22135:170;;;;;;:::i;:::-;22207:7;22234:39;;;:24;:39;;;;;:62;;;;22135:170;22918:190;;;;;;:::i;:::-;23023:7;23051:38;;;:23;:38;;;;;;;;-1:-1:-1;;;;;23051:48:17;;;;;;;;;;;;;22918:190;2569:102:5;;;:::i;15020:304:17:-;;;;;;:::i;:::-;;:::i;16634:344::-;;;;;;:::i;:::-;;:::i;4105:153:5:-;;;;;;:::i;:::-;;:::i;15407:649:17:-;;;;;;:::i;:::-;;:::i;21883:172::-;;;;;;:::i;:::-;21952:7;21979:39;;;:24;:39;;;;;:67;;;;21883:172;10412:462;;;;;;:::i;:::-;;:::i;2984:44::-;;;;;;:::i;:::-;;:::i;5125:276:5:-;;;;;;:::i;:::-;;:::i;23164:176:17:-;;;;;;:::i;:::-;23240:7;23268:39;;;:24;:39;;;;;:63;-1:-1:-1;;;;;23268:63:17;;23164:176;16134:395;;;;;;:::i;:::-;;:::i;18732:1604::-;;;;;;:::i;:::-;;:::i;22383:195::-;;;;;;:::i;:::-;22488:7;22516:43;;;:28;:43;;;;;;;;-1:-1:-1;;;;;22516:53:17;;;;;;;;;;;;;22383:195;23399:484;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;9312:1068::-;;;;;;:::i;:::-;;:::i;21201:135::-;;;;;;:::i;:::-;21277:4;21300:28;;;:13;:28;;;;;;;;;21201:135;3324:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2885:52;;;;;;:::i;:::-;;:::i;17787:271::-;;;;;;:::i;:::-;;:::i;22653:193::-;;;;;;:::i;:::-;22762:7;22790:37;;;:22;:37;;;;;;;;-1:-1:-1;;;;;22790:47:17;;;;;;;;;;;;;22653:193;4324:162:5;;;;;;:::i;:::-;;:::i;21404:172:17:-;;;;;;:::i;:::-;21478:7;21505:39;;;:24;:39;;;;;:62;;;;21404:172;25765:209;;;;;;:::i;:::-;;:::i;2068:198:18:-;;;;;;:::i;:::-;;:::i;8431:816:17:-;;;;;;:::i;:::-;;:::i;14627:330::-;;;;;;:::i;:::-;;:::i;20992:137::-;;;;;;:::i;:::-;21060:7;21087:33;;;:23;:33;;;;;;;20992:137;18498:182;18610:4;18635:36;18659:11;18635:23;:36::i;:::-;18628:43;18498:182;-1:-1:-1;;18498:182:17:o;4601:1149::-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;4929:30:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;4929:30;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;;;;;;;;;4987:18:::1;::::0;4972:34:::1;::::0;;;:14:::1;:34;::::0;;;;:67:::1;5024:15:::0;4972:34;:67:::1;:::i;:::-;-1:-1:-1::0;5065:18:17::1;::::0;5050:34:::1;::::0;;;:14:::1;:34;::::0;;;;:51:::1;;:71;5104:17:::0;5050:51;:71:::1;:::i;:::-;-1:-1:-1::0;5147:18:17::1;::::0;5132:34:::1;::::0;;;:14:::1;:34;::::0;;;;:56:::1;;:81;5191:22:::0;5132:56;:81:::1;:::i;:::-;-1:-1:-1::0;5239:18:17::1;::::0;5224:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5279:18:::0;5224:52;:73:::1;:::i;:::-;-1:-1:-1::0;5323:18:17::1;::::0;5308:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5363:18:::0;5308:52;:73:::1;:::i;:::-;-1:-1:-1::0;5407:18:17::1;::::0;5392:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5447:18:::0;5392:52;:73:::1;:::i;:::-;-1:-1:-1::0;5491:18:17::1;::::0;5476:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5531:18:::0;5476:52;:73:::1;:::i;:::-;-1:-1:-1::0;5575:18:17::1;::::0;5560:34:::1;::::0;;;:14:::1;:34;::::0;;;;;;;:71;;::::1;::::0;:51:::1;::::0;;::::1;::::0;:71;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;5662:18:17::1;::::0;;5642:39:::1;::::0;;;:19:::1;:39;::::0;;;;:46;;-1:-1:-1;;5642:46:17::1;5684:4;5642:46:::0;;::::1;::::0;;;5720:18;;:22:::1;::::0;::::1;:::i;:::-;5699:18;:43:::0;-1:-1:-1;;;;;;;;;4601:1149:17:o;2407:98:5:-;2461:13;2493:5;2486:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2407:98;:::o;3871:167::-;3947:7;3966:23;3981:7;3966:14;:23::i;:::-;-1:-1:-1;4007:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4007:24:5;;3871:167::o;3404:406::-;3484:13;3500:23;3515:7;3500:14;:23::i;:::-;3484:39;;3547:5;-1:-1:-1;;;;;3541:11:5;:2;-1:-1:-1;;;;;3541:11:5;;3533:57;;;;-1:-1:-1;;;3533:57:5;;22764:2:21;3533:57:5;;;22746:21:21;22803:2;22783:18;;;22776:30;22842:34;22822:18;;;22815:62;-1:-1:-1;;;22893:18:21;;;22886:31;22934:19;;3533:57:5;22562:397:21;3533:57:5;719:10:2;-1:-1:-1;;;;;3622:21:5;;;;:62;;-1:-1:-1;3647:37:5;3664:5;719:10:2;4324:162:5;:::i;3647:37::-;3601:170;;;;-1:-1:-1;;;3601:170:5;;23166:2:21;3601:170:5;;;23148:21:21;23205:2;23185:18;;;23178:30;23244:34;23224:18;;;23217:62;23315:31;23295:18;;;23288:59;23364:19;;3601:170:5;22964:425:21;3601:170:5;3782:21;3791:2;3795:7;3782:8;:21::i;:::-;3474:336;3404:406;;:::o;12612:1466:17:-;4316:14;;:64;;-1:-1:-1;;;4316:64:17;;13009:13;;-1:-1:-1;;;13024:34:17;-1:-1:-1;;;;;4316:14:17;;;;:38;;:64;;4355:10;;13009:13;;4316:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4384:4;4316:72;;:143;;-1:-1:-1;4392:14:17;;:59;;-1:-1:-1;;;4392:59:17;;-1:-1:-1;;;;;4392:14:17;;;;:36;;:59;;4429:10;;4441:9;;4392:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4455:4;4392:67;4316:143;:201;;;-1:-1:-1;4463:14:17;;:46;;-1:-1:-1;;;4463:46:17;;-1:-1:-1;;;;;4463:14:17;;;;:34;;:46;;4498:10;;4463:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4513:4;4463:54;4316:201;4308:225;;;;-1:-1:-1;;;4308:225:17;;;;;;;:::i;:::-;13080:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;13079:90:::0;::::1;;;-1:-1:-1::0;13128:31:17::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;13079:90;13071:114;;;;-1:-1:-1::0;;;13071:114:17::1;;;;;;;:::i;:::-;13201:6;13211:7;13201:17:::0;13197:874:::1;;13235:29;::::0;;;:14:::1;:29;::::0;;;;:65:::1;13282:18:::0;13235:29;:65:::1;:::i;:::-;-1:-1:-1::0;13315:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:46:::1;;:69;13364:20:::0;13315:46;:69:::1;:::i;:::-;-1:-1:-1::0;13399:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:51:::1;;:79;13453:25:::0;13399:51;:79:::1;:::i;:::-;-1:-1:-1::0;13493:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13543:21:::0;13493:47;:71:::1;:::i;:::-;-1:-1:-1::0;13579:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13629:21:::0;13579:47;:71:::1;:::i;:::-;-1:-1:-1::0;13665:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13715:21:::0;13665:47;:71:::1;:::i;:::-;-1:-1:-1::0;13751:29:17::1;::::0;;;:14:::1;:29;::::0;;;;;;;:69;;::::1;::::0;:46:::1;::::0;;::::1;::::0;:69;::::1;::::0;::::1;:::i;:::-;;13197:874;;;13842:6;13852;13842:16:::0;13838:233:::1;;13875:29;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13925:21:::0;13875:47;:71:::1;:::i;13838:233::-;14036:20;14057:1;14036:23;;;;;;;;:::i;:::-;;;;;;;13979:14;:29;13994:13;13979:29;;;;;;;;;;;:46;;14026:6;13979:54;;;;;;;;:::i;:::-;;;;;;;;:80;;;;;;:::i;:::-;;13838:233;12612:1466:::0;;;;;;;;;;;;:::o;7918:441::-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;8022:27:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;8022:27;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;8082:19:::1;-1:-1:-1::0;;;;;8070:53:17::1;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;8129:4;8070:63;8062:102;;;::::0;-1:-1:-1;;;8062:102:17;;23728:2:21;8062:102:17::1;::::0;::::1;23710:21:21::0;23767:2;23747:18;;;23740:30;23806:28;23786:18;;;23779:56;23852:18;;8062:102:17::1;23526:350:21::0;8062:102:17::1;-1:-1:-1::0;8175:39:17::1;::::0;;;:24:::1;:39;::::0;;;;;:58:::1;::::0;::::1;:80:::0;;-1:-1:-1;;;;;8175:80:17;;::::1;-1:-1:-1::0;;;;;;8175:80:17;;::::1;::::0;::::1;::::0;;;8266:50:::1;::::0;;::::1;:85:::0;;;;::::1;;::::0;;7918:441::o;4548:296:5:-;4707:41;719:10:2;4726:12:5;4740:7;4707:18;:41::i;:::-;4699:99;;;;-1:-1:-1;;;4699:99:5;;;;;;;:::i;:::-;4809:28;4819:4;4825:2;4829:7;4809:9;:28::i;2301:419:4:-;2387:7;2444:26;;;:17;:26;;;;;;;;2415:55;;;;;;;;;-1:-1:-1;;;;;2415:55:4;;;;;-1:-1:-1;;;2415:55:4;;;-1:-1:-1;;;;;2415:55:4;;;;;;;;2387:7;;2481:90;;-1:-1:-1;2531:29:4;;;;;;;;;2541:19;2531:29;-1:-1:-1;;;;;2531:29:4;;;;-1:-1:-1;;;2531:29:4;;-1:-1:-1;;;;;2531:29:4;;;;;2481:90;2618:23;;;;2581:21;;3078:5;;2606:35;;-1:-1:-1;;;;;2606:35:4;:9;:35;:::i;:::-;2605:57;;;;:::i;:::-;2681:16;;;;;-1:-1:-1;2301:419:4;;-1:-1:-1;;;;2301:419:4:o;1306:253:6:-;1403:7;1438:23;1455:5;1438:16;:23::i;:::-;1430:5;:31;1422:87;;;;-1:-1:-1;;;1422:87:6;;25024:2:21;1422:87:6;;;25006:21:21;25063:2;25043:18;;;25036:30;25102:34;25082:18;;;25075:62;-1:-1:-1;;;25153:18:21;;;25146:41;25204:19;;1422:87:6;24822:407:21;1422:87:6;-1:-1:-1;;;;;;1526:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1306:253::o;17117:618:17:-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;17193:28:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;17193:28;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;17321:39:::1;::::0;;;:24:::1;:39;::::0;;;;;;:67:::1;;::::0;17277:14:::1;::::0;17261:57;;-1:-1:-1;;;17261:57:17;;::::1;::::0;::::1;8168:25:21::0;;;17321:67:17;;-1:-1:-1;;;;;17277:14:17::1;::::0;17261:42:::1;::::0;8141:18:21;;17261:57:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:127;;;;:::i;:::-;17243:15;:145;17234:178;;;::::0;-1:-1:-1;;;17234:178:17;;25625:2:21;17234:178:17::1;::::0;::::1;25607:21:21::0;25664:2;25644:18;;;25637:30;-1:-1:-1;;;25683:18:21;;;25676:49;25742:18;;17234:178:17::1;25423:343:21::0;17234:178:17::1;17487:39;::::0;;;:24:::1;:39;::::0;;;;:67:::1;::::0;::::1;::::0;17423:61:::1;::::0;;::::1;:131:::0;;;17726:1:::1;::::0;17631:27:::1;17512:13:::0;17647:11:::1;17631:27;:::i;:::-;17630:93;;;;:::i;:::-;:97;;;;:::i;:::-;17565:39;::::0;;;:24:::1;:39;::::0;;;;;:62:::1;;:162:::0;;;;-1:-1:-1;17117:618:17:o;18114:296::-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;18200:33:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;18200:33;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;18269:18:::1;-1:-1:-1::0;;;;;18254:50:17::1;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;18310:4;18254:60;18246:94;;;::::0;-1:-1:-1;;;18246:94:17;;26106:2:21;18246:94:17::1;::::0;::::1;26088:21:21::0;26145:2;26125:18;;;26118:30;-1:-1:-1;;;26164:18:21;;;26157:51;26225:18;;18246:94:17::1;25904:345:21::0;18246:94:17::1;-1:-1:-1::0;18351:14:17::1;:51:::0;;-1:-1:-1;;;;;;18351:51:17::1;-1:-1:-1::0;;;;;18351:51:17;;;::::1;::::0;;;::::1;::::0;;18114:296::o;10947:1115::-;11136:14;;-1:-1:-1;;;;;11136:14:17;11122:10;:28;11114:74;;;;-1:-1:-1;;;11114:74:17;;;;;;;:::i;:::-;11207:36;11226:6;11234:8;11207:18;:36::i;:::-;11199:94;;;;-1:-1:-1;;;11199:94:17;;;;;;;:::i;:::-;11378:43;;;;:24;:43;;;;;:71;;;:75;;11452:1;11378:75;:::i;:::-;11304:43;;;;:24;:43;;;;;:71;;;:149;;;11468:65;;;:140;11464:591;;11625:13;11641:17;11649:8;11641:7;:17::i;:::-;11625:33;;11673:15;11679:8;11673:5;:15::i;:::-;11735:29;;;;:10;:29;;;;;;:33;;11767:1;11735:33;:::i;:::-;11703:29;;;;:10;:29;;;;;;;;:65;;;;11834:41;;;:22;:41;;;;;-1:-1:-1;;;;;11834:48:17;;;;;;;;:52;;11885:1;11834:52;:::i;:::-;11783:41;;;;:22;:41;;;;;;;;-1:-1:-1;;;;;11783:48:17;;;;;;;;;:103;;;;11935:19;;;:9;:19;;;11901:85;;;;11917:9;;11825:5;;11935:19;11901:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11956:17;11975:10;11901:15;:85::i;:::-;11610:388;11464:591;;;12019:24;;-1:-1:-1;;;12019:24:17;;26858:2:21;12019:24:17;;;26840:21:21;26897:2;26877:18;;;26870:30;-1:-1:-1;;;26916:18:21;;;26909:44;26970:18;;12019:24:17;26656:338:21;11464:591:17;10947:1115;;;;;;:::o;23961:241::-;24098:29;;;;:14;:29;;;;;:47;;;24090:104;;24048:13;;;;24098:47;24147:46;;;;;24098:47;;24090:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23961:241;;;:::o;4910:149:5:-;5013:39;5030:4;5036:2;5040:7;5013:39;;;;;;;;;;;;:16;:39::i;1813:230:6:-;1888:7;1923:30;1717:10;:17;;1630:111;1923:30;1915:5;:38;1907:95;;;;-1:-1:-1;;;1907:95:6;;27201:2:21;1907:95:6;;;27183:21:21;27240:2;27220:18;;;27213:30;27279:34;27259:18;;;27252:62;-1:-1:-1;;;27330:18:21;;;27323:42;27382:19;;1907:95:6;26999:408:21;1907:95:6;2019:10;2030:5;2019:17;;;;;;;;:::i;:::-;;;;;;;;;2012:24;;1813:230;;;:::o;2126:219:5:-;2198:7;6730:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6730:16:5;;2260:56;;;;-1:-1:-1;;;2260:56:5;;;;;;;:::i;14141:415:17:-;14255:39;;;;:24;:39;;;;;:63;-1:-1:-1;;;;;14255:63:17;14241:10;:77;14233:100;;;;-1:-1:-1;;;14233:100:17;;27967:2:21;14233:100:17;;;27949:21:21;28006:2;27986:18;;;27979:30;-1:-1:-1;;;28025:18:21;;;28018:40;28075:18;;14233:100:17;27765:334:21;14233:100:17;14352:27;;;;:12;:27;;;;;;;;:36;14344:55;;;;-1:-1:-1;;;14344:55:17;;28306:2:21;14344:55:17;;;28288:21:21;28345:1;28325:18;;;28318:29;-1:-1:-1;;;28363:18:21;;;28356:36;28409:18;;14344:55:17;28104:329:21;14344:55:17;14445:1;14424:10;14418:24;:28;14410:37;;;;;;14458:32;;;;:17;:32;;;;;:45;14493:10;14458:32;:45;:::i;:::-;-1:-1:-1;;14514:27:17;;;;:12;:27;;;;;:34;;-1:-1:-1;;14514:34:17;14544:4;14514:34;;;14141:415::o;25076:623::-;25147:13;25173:23;25188:7;25173:14;:23::i;:::-;25207:24;25247:9;25242:248;25264:48;25279:32;;;:23;:32;;;;;;;;;25264:48;;:14;:48;;;;;:65;;:72;25260:76;;25242:248;;;25407:48;25422:32;;;:23;:32;;;;;;;;;25407:48;;:14;:48;;;;;:65;;:68;;25395:10;;25407:65;25473:1;;25407:68;;;;;;:::i;:::-;;;;;;;;25378:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25358:119;;25338:3;;;;;:::i;:::-;;;;25242:248;;;-1:-1:-1;25572:20:17;;;;:11;:20;;;;;;;;;25544:54;;:19;:54::i;:::-;25616:18;:7;:16;:18::i;:::-;25654;;;;:9;:18;;;;;;;;;25514:176;;;;;;25654:18;25679:10;;25514:176;;:::i;:::-;;;;;;;;;;;;;25500:191;;;25076:623;;;:::o;1865:204:5:-;1937:7;-1:-1:-1;;;;;1964:19:5;;1956:73;;;;-1:-1:-1;;;1956:73:5;;31272:2:21;1956:73:5;;;31254:21:21;31311:2;31291:18;;;31284:30;31350:34;31330:18;;;31323:62;-1:-1:-1;;;31401:18:21;;;31394:39;31450:19;;1956:73:5;31070:405:21;1956:73:5;-1:-1:-1;;;;;;2046:16:5;;;;;:9;:16;;;;;;;1865:204::o;1818:101:18:-;1088:13;:11;:13::i;:::-;1882:30:::1;1909:1;1882:18;:30::i;:::-;1818:101::o:0;5905:1953:17:-;4316:14;;:64;;-1:-1:-1;;;4316:64:17;;6120:13;;-1:-1:-1;;;6135:31:17;-1:-1:-1;;;;;4316:14:17;;;;:38;;:64;;4355:10;;6120:13;;4316:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4384:4;4316:72;;:143;;-1:-1:-1;4392:14:17;;:59;;-1:-1:-1;;;4392:59:17;;-1:-1:-1;;;;;4392:14:17;;;;:36;;:59;;4429:10;;4441:9;;4392:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4455:4;4392:67;4316:143;:201;;;-1:-1:-1;4463:14:17;;:46;;-1:-1:-1;;;4463:46:17;;-1:-1:-1;;;;;4463:14:17;;;;:34;;:46;;4498:10;;4463:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4513:4;4463:54;4316:201;4308:225;;;;-1:-1:-1;;;4308:225:17;;;;;;;:::i;:::-;6188:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;6187:90:::0;::::1;;;-1:-1:-1::0;6236:31:17::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;6187:90;:133;;;;;6308:11;6282:22;:37;;6187:133;6179:157;;;::::0;-1:-1:-1;;;6179:157:17;;31682:2:21;6179:157:17::1;::::0;::::1;31664:21:21::0;31721:2;31701:18;;;31694:30;-1:-1:-1;;;31740:18:21;;;31733:41;31791:18;;6179:157:17::1;31480:335:21::0;6179:157:17::1;6351:39;::::0;;;:24:::1;:39;::::0;;;;:61:::1;;::::0;:66;;6347:1504:::1;;6434:39;::::0;;;:24:::1;:39;::::0;;;;:90;;-1:-1:-1;;;;;;6434:90:17::1;-1:-1:-1::0;;;;;6434:90:17;::::1;;::::0;;-1:-1:-1;6539:62:17;::::1;:88:::0;;;6642:67:::1;::::0;::::1;:71:::0;;;;6728:61:::1;::::0;::::1;:86:::0;;;6829:67:::1;;:98:::0;;;7008:27:::1;6434:39:::0;7024:11:::1;7008:27;:::i;:::-;6942:39;::::0;;;:24:::1;:39;::::0;;;;:62:::1;;:94:::0;7173:1:::1;7148:22:::0;7117:27:::1;6967:13:::0;7133:11:::1;7117:27;:::i;:::-;7116:54;;;;:::i;:::-;:58;;;;:::i;:::-;7051:39;::::0;;;:24:::1;:39;::::0;;;;;;;:62:::1;;:123:::0;;;;7189:13:::1;:28:::0;;;:35;;-1:-1:-1;;7189:35:17::1;7220:4;7189:35;::::0;;6347:1504:::1;;;7246:27;::::0;;;:12:::1;:27;::::0;;;;;::::1;;:36;;::::0;;7242:609:::1;;7299:39;::::0;;;:24:::1;:39;::::0;;;;:90;;-1:-1:-1;;;;;;7299:90:17::1;-1:-1:-1::0;;;;;7299:90:17;::::1;;::::0;;-1:-1:-1;7404:62:17;::::1;:88:::0;;;7507:67:::1;;:98:::0;;;7242:609:::1;;;7638:39;::::0;;;:24:::1;:39;::::0;;;;:62:::1;::::0;::::1;:88:::0;;;7741:67:::1;;:98:::0;;;7242:609:::1;5905:1953:::0;;;;;;;:::o;26084:210::-;26212:33;;;;:23;:33;;;;;26204:82;;26163:13;;;;26283:1;26249:36;;;26212:33;;26204:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26084:210;;;:::o;2569:102:5:-;2625:13;2657:7;2650:14;;;;;:::i;15020:304:17:-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;15115:29:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;15115:29;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;15165:51:::1;15182:33:::0;;;:23:::1;:33;::::0;;;;;;;;15165:51;;:16:::1;:51:::0;;;;;;::::1;;:60;15157:84;;;;-1:-1:-1::0;;;15157:84:17::1;;;;;;;:::i;:::-;15252:24;15267:8;15252:14;:24::i;:::-;15287:19;::::0;;;:9:::1;:19;::::0;;;;:29:::1;15309:7:::0;15287:19;:29:::1;:::i;:::-;;15020:304:::0;;;:::o;16634:344::-;16756:39;;;;:24;:39;;;;;:58;;;-1:-1:-1;;;;;16756:58:17;16742:10;:72;16734:81;;;;;;16834:23;;;;:11;:23;;;;;;:93;16826:102;;;;;;16939:23;;;;:11;:23;;;;;;:31;-1:-1:-1;16634:344:17:o;4105:153:5:-;4199:52;719:10:2;4232:8:5;4242;4199:18;:52::i;:::-;4105:153;;:::o;15407:649:17:-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;15552:39:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;15552:39;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;15632:7:::1;:14;15613:8;:15;:33;15612:77;;;;;15670:11;:18;15652:7;:14;:36;15612:77;15604:98;;;::::0;-1:-1:-1;;;15604:98:17;;32362:2:21;15604:98:17::1;::::0;::::1;32344:21:21::0;32401:1;32381:18;;;32374:29;-1:-1:-1;;;32419:18:21;;;32412:37;32466:18;;15604:98:17::1;32160:330:21::0;15604:98:17::1;15718:9;15713:336;15733:8;:15;15729:1;:19;15713:336;;;15778:16;:54;15795:23;:36;15819:8;15828:1;15819:11;;;;;;;;:::i;:::-;;;;;;;15795:36;;;;;;;;;;;;15778:54;;;;;;;;;;;;;;;;;;;;;:63;;15836:5;15778:63;;;15770:87;;;;-1:-1:-1::0;;;15770:87:17::1;;;;;;;:::i;:::-;15872:27;15887:8;15896:1;15887:11;;;;;;;;:::i;:::-;;;;;;;15872:14;:27::i;:::-;15956:7;15964:1;15956:10;;;;;;;;:::i;:::-;;;;;;;15914:23;:36;15938:8;15947:1;15938:11;;;;;;;;:::i;:::-;;;;;;;15914:36;;;;;;;;;;;15951:1;15914:39;;;;;;;:::i;:::-;;::::0;:52:::1;::::0;:39;:52:::1;:::i;:::-;;16023:11;16035:1;16023:14;;;;;;;;:::i;:::-;;;;;;;15981:23;:36;16005:8;16014:1;16005:11;;;;;;;;:::i;:::-;;;;;;;15981:36;;;;;;;;;;;16018:1;15981:39;;;;;;;:::i;:::-;;::::0;:56:::1;::::0;:39;:56:::1;:::i;:::-;-1:-1:-1::0;15750:3:17;::::1;::::0;::::1;:::i;:::-;;;;15713:336;;;;15407:649:::0;;;;:::o;10412:462::-;10493:42;719:10:2;10512:12:17;640:96:2;10493:42:17;10485:100;;;;-1:-1:-1;;;10485:100:17;;;;;;;:::i;:::-;10618:39;;;;:24;:39;;;;;:62;;;10606:74;;;;;10605:156;;-1:-1:-1;10698:39:17;;;;:24;:39;;;;;:62;;;10686:74;;;10605:156;10596:176;;;;-1:-1:-1;;;10596:176:17;;32697:2:21;10596:176:17;;;32679:21:21;32736:1;32716:18;;;32709:29;-1:-1:-1;;;32754:18:21;;;32747:36;32800:18;;10596:176:17;32495:329:21;10596:176:17;10783:15;10789:8;10783:5;:15::i;:::-;10837:25;;;;:10;:25;;;;;;:29;;10865:1;10837:29;:::i;:::-;10809:25;;;;:10;:25;;;;;;:57;;;;-1:-1:-1;10412:462:17:o;2984:44::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5125:276:5:-;5255:41;719:10:2;5288:7:5;5255:18;:41::i;:::-;5247:99;;;;-1:-1:-1;;;5247:99:5;;;;;;;:::i;:::-;5356:38;5370:4;5376:2;5380:7;5389:4;5356:13;:38::i;16134:395:17:-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;16212:30:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;16212:30;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;16297:14:::1;::::0;16281:57:::1;::::0;-1:-1:-1;;;16281:57:17;;::::1;::::0;::::1;8168:25:21::0;;;-1:-1:-1;;;;;16297:14:17;;::::1;::::0;16281:42:::1;::::0;8141:18:21;;16281:57:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16263:15;:75;:141;;;;-1:-1:-1::0;16358:14:17::1;::::0;16342:57:::1;::::0;-1:-1:-1;;;16342:57:17;;::::1;::::0;::::1;8168:25:21::0;;;-1:-1:-1;;;;;16358:14:17;;::::1;::::0;16342:42:::1;::::0;8141:18:21;;16342:57:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62:::0;::::1;16263:141;16255:150;;;::::0;::::1;;16424:28;::::0;;;:13:::1;:28;::::0;;;;;::::1;;:36;;:28:::0;:36:::1;16416:56;;;::::0;-1:-1:-1;;;16416:56:17;;33031:2:21;16416:56:17::1;::::0;::::1;33013:21:21::0;33070:1;33050:18;;;33043:29;-1:-1:-1;;;33088:18:21;;;33081:37;33135:18;;16416:56:17::1;32829:330:21::0;16416:56:17::1;-1:-1:-1::0;16483:31:17::1;::::0;;;:16:::1;:31;::::0;;;;:38;;-1:-1:-1;;16483:38:17::1;16517:4;16483:38;::::0;;16134:395::o;18732:1604::-;18805:13;18831:23;18846:7;18831:14;:23::i;:::-;18869:49;18885:32;;;:23;:32;;;;;;;;;18869:49;;:15;:49;;;;;;;;:58;;;:152;;-1:-1:-1;18931:20:17;;;;:11;:20;;;;;;:90;;18869:152;18865:1464;;;19038:21;19077:32;;;:23;:32;;;;;;;;;19062:48;;:14;:48;;;;;:66;;19038:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19174:1;19156:7;19150:21;:25;:86;;;;;;;;;;;;;;;;;19202:7;19211:18;:7;:16;:18::i;:::-;19185:45;;;;;;;;;:::i;19150:86::-;19143:93;18732:1604;-1:-1:-1;;;18732:1604:17:o;18865:1464::-;19258:49;19274:32;;;:23;:32;;;;;;;;;19258:49;;:15;:49;;;;;;;;:58;;;:152;;-1:-1:-1;19320:20:17;;;;:11;:20;;;;;;:90;19258:152;19254:1075;;;19427:21;19466:32;;;:23;:32;;;;;;;;;19451:48;;:14;:48;;;;;:66;;19427:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19563:1;19545:7;19539:21;:25;:77;;;;;;;;;;;;;;;;;19591:7;19574:36;;;;;;;;:::i;19254:1075::-;19658:17;19766:32;;;:23;:32;;;;;;;;;19751:48;;:14;:48;;;;;19678:224;;19751:66;;19841:33;19790:7;19841:24;:33::i;:::-;19692:209;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19678:13;:224::i;:::-;19658:244;;19917:18;20004:21;20017:7;20004:12;:21::i;:::-;20050:48;20065:32;;;:23;:32;;;;;;;;;20050:48;;:14;:48;;;;;20139:32;;;:23;:32;;;;;;19945:345;;;;;20050:70;;;20230:1;20197:35;;;20280:3;;19945:345;;:::i;:::-;;;;-1:-1:-1;;19945:345:17;;;;;;;;;;18732:1604;-1:-1:-1;;;;18732:1604:17:o;19254:1075::-;18732:1604;;;:::o;23399:484::-;23582:29;;;;:14;:29;;;;;23574:301;;23474:13;;;;;;;;;;;;23628:46;;;;23676:51;;;;23729:47;;;;23778;;;;23827;;;;23582:29;;23574:301;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23399:484;;;;;;;:::o;9312:1068::-;9514:14;;-1:-1:-1;;;;;9514:14:17;9500:10;:28;9492:74;;;;-1:-1:-1;;;9492:74:17;;;;;;;:::i;:::-;9647:39;;;;:24;:39;;;;;:67;;;:71;;9717:1;9647:71;:::i;:::-;9577:39;;;;:24;:39;;;;;:67;;;:141;;;9733:61;;;:132;9729:644;;9886:5;9895:1;9886:10;9882:334;;9980:43;;;;:28;:43;;;;;;;;-1:-1:-1;;;;;9980:60:17;;;;;;;;;;:64;;10043:1;9980:64;:::i;:::-;9917:43;;;;:28;:43;;;;;;;;-1:-1:-1;;;;;9917:60:17;;;;;;;;;:127;9882:334;;;10142:37;;;;:22;:37;;;;;;;;-1:-1:-1;;;;;10142:54:17;;;;;;;;;;:58;;10199:1;10142:58;:::i;:::-;10085:37;;;;:22;:37;;;;;;;;-1:-1:-1;;;;;10085:54:17;;;;;;;;;:115;9882:334;10230:74;10246:9;10257:7;10266:10;10278:13;10293:10;10230:15;:74::i;:::-;9729:644;;2885:52;;;;;;;;;;;;;;;;:::i;17787:271::-;3968:14;;:59;;-1:-1:-1;;;3968:59:17;;-1:-1:-1;;;17868:31:17;-1:-1:-1;;;;;3968:14:17;;:36;;:59;;4005:10;;17868:31;;3968:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4031:4;3968:67;;:125;;-1:-1:-1;4039:14:17;;:46;;-1:-1:-1;;;4039:46:17;;-1:-1:-1;;;;;4039:14:17;;;;:34;;:46;;4074:10;;4039:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4089:4;4039:54;3968:125;3960:150;;;;-1:-1:-1;;;3960:150:17;;;;;;;:::i;:::-;17937:15:::1;-1:-1:-1::0;;;;;17921:49:17::1;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;17976:4;17921:59;17913:94;;;::::0;-1:-1:-1;;;17913:94:17;;37289:2:21;17913:94:17::1;::::0;::::1;37271:21:21::0;37328:2;37308:18;;;37301:30;-1:-1:-1;;;37347:18:21;;;37340:52;37409:18;;17913:94:17::1;37087:346:21::0;17913:94:17::1;-1:-1:-1::0;18018:14:17::1;:32:::0;;-1:-1:-1;;;;;;18018:32:17::1;-1:-1:-1::0;;;;;18018:32:17;;;::::1;::::0;;;::::1;::::0;;17787:271::o;4324:162:5:-;-1:-1:-1;;;;;4444:25:5;;;4421:4;4444:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4324:162::o;25765:209:17:-;25842:7;25940:25;;;:10;:25;;;;;;;;;25870:24;:39;;;;;:67;;;:95;;25940:25;25870:95;:::i;2068:198:18:-;1088:13;:11;:13::i;:::-;-1:-1:-1;;;;;2156:22:18;::::1;2148:73;;;::::0;-1:-1:-1;;;2148:73:18;;37640:2:21;2148:73:18::1;::::0;::::1;37622:21:21::0;37679:2;37659:18;;;37652:30;37718:34;37698:18;;;37691:62;-1:-1:-1;;;37769:18:21;;;37762:36;37815:19;;2148:73:18::1;37438:402:21::0;2148:73:18::1;2231:28;2250:8;2231:18;:28::i;:::-;2068:198:::0;:::o;8431:816:17:-;8604:14;;-1:-1:-1;;;;;8604:14:17;8590:10;:28;8582:74;;;;-1:-1:-1;;;8582:74:17;;;;;;;:::i;:::-;8737:39;;;;:24;:39;;;;;:67;;;:71;;8807:1;8737:71;:::i;:::-;8667:39;;;;:24;:39;;;;;:67;;;:141;;;8823:61;;;:132;8819:421;;9025:38;;;;:23;:38;;;;;;;;-1:-1:-1;;;;;9025:50:17;;;;;;;;;;:54;;9078:1;9025:54;:::i;:::-;8972:38;;;;:23;:38;;;;;;;;-1:-1:-1;;;;;8972:50:17;;;;;;;;;:107;9094:77;9110:9;9011:10;9133;8996:13;9160:10;9094:15;:77::i;:::-;8819:421;;14627:330;4316:14;;:64;;-1:-1:-1;;;4316:64:17;;14723:13;;-1:-1:-1;;;14738:32:17;-1:-1:-1;;;;;4316:14:17;;;;:38;;:64;;4355:10;;14723:13;;4316:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4384:4;4316:72;;:143;;-1:-1:-1;4392:14:17;;:59;;-1:-1:-1;;;4392:59:17;;-1:-1:-1;;;;;4392:14:17;;;;:36;;:59;;4429:10;;4441:9;;4392:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4455:4;4392:67;4316:143;:201;;;-1:-1:-1;4463:14:17;;:46;;-1:-1:-1;;;4463:46:17;;-1:-1:-1;;;;;4463:14:17;;;;:34;;:46;;4498:10;;4463:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4513:4;4463:54;4316:201;4308:225;;;;-1:-1:-1;;;4308:225:17;;;;;;;:::i;:::-;14793:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;14792:90:::0;::::1;;;-1:-1:-1::0;14841:31:17::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;14792:90;14784:114;;;;-1:-1:-1::0;;;14784:114:17::1;;;;;;;:::i;:::-;-1:-1:-1::0;;14909:30:17::1;::::0;;;:15:::1;:30;::::0;;;;;:40;;-1:-1:-1;;14909:40:17::1;::::0;::::1;;::::0;;;::::1;::::0;;14627:330::o;2038:213:4:-;2140:4;-1:-1:-1;;;;;;2163:41:4;;-1:-1:-1;;;2163:41:4;;:81;;;2208:36;2232:11;2208:23;:36::i;13176:133:5:-;13257:16;13265:7;13257;:16::i;:::-;13249:53;;;;-1:-1:-1;;;13249:53:5;;;;;;;:::i;12508:171::-;12582:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12582:29:5;-1:-1:-1;;;;;12582:29:5;;;;;;;;:24;;12635:23;12582:24;12635:14;:23::i;:::-;-1:-1:-1;;;;;12626:46:5;;;;;;;;;;;12508:171;;:::o;7340:261::-;7433:4;7449:13;7465:23;7480:7;7465:14;:23::i;:::-;7449:39;;7517:5;-1:-1:-1;;;;;7506:16:5;:7;-1:-1:-1;;;;;7506:16:5;;:52;;;;7526:32;7543:5;7550:7;7526:16;:32::i;:::-;7506:87;;;;7586:7;-1:-1:-1;;;;;7562:31:5;:20;7574:7;7562:11;:20::i;:::-;-1:-1:-1;;;;;7562:31:5;;7506:87;7498:96;7340:261;-1:-1:-1;;;;7340:261:5:o;11193:1203::-;11317:4;-1:-1:-1;;;;;11290:31:5;:23;11305:7;11290:14;:23::i;:::-;-1:-1:-1;;;;;11290:31:5;;11282:81;;;;-1:-1:-1;;;11282:81:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;11381:16:5;;11373:65;;;;-1:-1:-1;;;11373:65:5;;38453:2:21;11373:65:5;;;38435:21:21;38492:2;38472:18;;;38465:30;38531:34;38511:18;;;38504:62;-1:-1:-1;;;38582:18:21;;;38575:34;38626:19;;11373:65:5;38251:400:21;11373:65:5;11449:42;11470:4;11476:2;11480:7;11489:1;11449:20;:42::i;:::-;11618:4;-1:-1:-1;;;;;11591:31:5;:23;11606:7;11591:14;:23::i;:::-;-1:-1:-1;;;;;11591:31:5;;11583:81;;;;-1:-1:-1;;;11583:81:5;;;;;;;:::i;:::-;11733:24;;;;:15;:24;;;;;;;;11726:31;;-1:-1:-1;;;;;;11726:31:5;;;;;;-1:-1:-1;;;;;12201:15:5;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;12201:20:5;;;12235:13;;;;;;;;;:18;;11726:31;12235:18;;;12273:16;;;:7;:16;;;;;;:21;;;;;;;;;;12310:27;;11749:7;;-1:-1:-1;;;;;;;;;;;12310:27:5;;3474:336;3404:406;;:::o;10107:762::-;10166:13;10182:23;10197:7;10182:14;:23::i;:::-;10166:39;;10216:51;10237:5;10252:1;10256:7;10265:1;10216:20;:51::i;:::-;10377:23;10392:7;10377:14;:23::i;:::-;10445:24;;;;:15;:24;;;;;;;;10438:31;;-1:-1:-1;;;;;;10438:31:5;;;;;;-1:-1:-1;;;;;10685:16:5;;;;;:9;:16;;;;;:21;;-1:-1:-1;;10685:21:5;;;10733:16;;;:7;:16;;;;;;10726:23;;;;;;;10765:36;10369:31;;-1:-1:-1;10461:7:5;;-1:-1:-1;;;;;;;;;;;10765:36:5;10445:24;;10765:36;4105:153;;:::o;12096:421:17:-;12250:21;;;;:9;:21;;;;;:34;12274:10;12250:21;:34;:::i;:::-;-1:-1:-1;12295:35:17;;;;:23;:35;;;;;:51;;;12357:33;12367:10;12319;12357:9;:33::i;:::-;12401:39;;;;:24;:39;;;;;;;:50;;;:108;;-1:-1:-1;;;12401:108:17;;;;;38858:25:21;;;38899:18;;;38892:34;;;38942:18;;;38935:34;;;-1:-1:-1;;;;;12401:50:17;;;;:69;;38831:18:21;;12401:108:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12096:421;;;;;:::o;1809:437:20:-;1884:13;1909:19;1941:10;1945:6;1941:1;:10;:::i;:::-;:14;;1954:1;1941:14;:::i;:::-;-1:-1:-1;;;;;1931:25:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1931:25:20;;1909:47;;-1:-1:-1;;;1966:6:20;1973:1;1966:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1966:15:20;;;;;;;;;-1:-1:-1;;;1991:6:20;1998:1;1991:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1991:15:20;;;;;;;;-1:-1:-1;2021:9:20;2033:10;2037:6;2033:1;:10;:::i;:::-;:14;;2046:1;2033:14;:::i;:::-;2021:26;;2016:128;2053:1;2049;:5;2016:128;;;-1:-1:-1;;;2096:5:20;2104:3;2096:11;2087:21;;;;;;;:::i;:::-;;;;2075:6;2082:1;2075:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;2075:33:20;;;;;;;;-1:-1:-1;2132:1:20;2122:11;;;;;2056:3;;;:::i;:::-;;;2016:128;;;-1:-1:-1;2161:10:20;;2153:55;;;;-1:-1:-1;;;2153:55:20;;39323:2:21;2153:55:20;;;39305:21:21;;;39342:18;;;39335:30;39401:34;39381:18;;;39374:62;39453:18;;2153:55:20;39121:356:21;438:696:20;494:13;543:14;560:17;571:5;560:10;:17::i;:::-;580:1;560:21;543:38;;595:20;629:6;-1:-1:-1;;;;;618:18:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;618:18:20;-1:-1:-1;595:41:20;-1:-1:-1;756:28:20;;;772:2;756:28;811:280;-1:-1:-1;;842:5:20;-1:-1:-1;;;976:2:20;965:14;;960:30;842:5;947:44;1035:2;1026:11;;;-1:-1:-1;1055:21:20;811:280;1055:21;-1:-1:-1;1111:6:20;438:696;-1:-1:-1;;;438:696:20:o;1353:130:18:-;1267:6;;-1:-1:-1;;;;;1267:6:18;719:10:2;1416:23:18;1408:68;;;;-1:-1:-1;;;1408:68:18;;39684:2:21;1408:68:18;;;39666:21:21;;;39703:18;;;39696:30;39762:34;39742:18;;;39735:62;39814:18;;1408:68:18;39482:356:21;2420:187:18;2512:6;;;-1:-1:-1;;;;;2528:17:18;;;-1:-1:-1;;;;;;2528:17:18;;;;;;;2560:40;;2512:6;;;2528:17;2512:6;;2560:40;;2493:16;;2560:40;2483:124;2420:187;:::o;12815:277:5:-;12935:8;-1:-1:-1;;;;;12926:17:5;:5;-1:-1:-1;;;;;12926:17:5;;12918:55;;;;-1:-1:-1;;;12918:55:5;;40045:2:21;12918:55:5;;;40027:21:21;40084:2;40064:18;;;40057:30;-1:-1:-1;;;40103:18:21;;;40096:55;40168:18;;12918:55:5;39843:349:21;12918:55:5;-1:-1:-1;;;;;12983:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12983:46:5;;;;;;;;;;13044:41;;540::21;;;13044::5;;513:18:21;13044:41:5;;;;;;;12815:277;;;:::o;6262:267::-;6374:28;6384:4;6390:2;6394:7;6374:9;:28::i;:::-;6420:47;6443:4;6449:2;6453:7;6462:4;6420:22;:47::i;:::-;6412:110;;;;-1:-1:-1;;;6412:110:5;;;;;;;:::i;506:3026:1:-;564:13;796:4;:11;811:1;796:16;792:31;;-1:-1:-1;;814:9:1;;;;;;;;;-1:-1:-1;814:9:1;;;506:3026::o;792:31::-;873:19;895:6;;;;;;;;;;;;;;;;;873:28;;1304:20;1363:1;1344:4;:11;1358:1;1344:15;;;;:::i;:::-;1343:21;;;;:::i;:::-;1338:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;1327:39:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1327:39:1;;1304:62;;1541:1;1534:5;1530:13;1642:2;1634:6;1630:15;1749:4;1800;1794:11;1788:4;1784:22;1712:1403;1833:6;1824:7;1821:19;1712:1403;;;1935:1;1926:7;1922:15;1911:26;;1973:7;1967:14;2616:4;2608:5;2604:2;2600:14;2596:25;2586:8;2582:40;2576:47;2565:9;2557:67;2669:1;2658:9;2654:17;2641:30;;2759:4;2751:5;2747:2;2743:14;2739:25;2729:8;2725:40;2719:47;2708:9;2700:67;2812:1;2801:9;2797:17;2784:30;;2901:4;2893:5;2890:1;2886:13;2882:24;2872:8;2868:39;2862:46;2851:9;2843:66;2954:1;2943:9;2939:17;2926:30;;3035:4;3028:5;3024:16;3014:8;3010:31;3004:38;2993:9;2985:58;;3088:1;3077:9;3073:17;3060:30;;1712:1403;;;1716:104;;3273:1;3266:4;3260:11;3256:19;3293:1;3288:120;;;;3426:1;3421:71;;;;3249:243;;3288:120;3340:4;3336:1;3325:9;3321:17;3313:32;3389:4;3385:1;3374:9;3370:17;3362:32;3288:120;;3421:71;3473:4;3469:1;3458:9;3454:17;3446:32;3249:243;-1:-1:-1;3519:6:1;;506:3026;-1:-1:-1;;;;;506:3026:1:o;20394:325:17:-;20481:11;20530:32;;;:23;:32;;;;;;;;;20505:58;;:24;:58;;;;;:81;;;20454:13;;20481:11;20495:91;;20554:7;20495:91;:::i;:::-;20628:44;21087:33;;;:23;:33;;;;;;;;;20628:44;;:14;:44;;;;;20481:105;;-1:-1:-1;20695:14:17;20481:105;20695:12;:14::i;:::-;20611:99;;;;;;;;;:::i;1005:222:6:-;1107:4;-1:-1:-1;;;;;;1130:50:6;;-1:-1:-1;;;1130:50:6;;:90;;;1184:36;1208:11;1184:23;:36::i;7056:126:5:-;7121:4;6730:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6730:16:5;7144:31;;;7056:126::o;2112:890:6:-;2371:1;2359:9;:13;2355:219;;;2500:63;;-1:-1:-1;;;2500:63:6;;41354:2:21;2500:63:6;;;41336:21:21;41393:2;41373:18;;;41366:30;41432:34;41412:18;;;41405:62;-1:-1:-1;;;41483:18:21;;;41476:51;41544:19;;2500:63:6;41152:417:21;2355:219:6;2602:12;-1:-1:-1;;;;;2629:18:6;;2625:183;;2663:40;2695:7;3811:10;:17;;3784:24;;;;:15;:24;;;;;:44;;;3838:24;;;;;;;;;;;;3708:161;2663:40;2625:183;;;2732:2;-1:-1:-1;;;;;2724:10:6;:4;-1:-1:-1;;;;;2724:10:6;;2720:88;;2750:47;2783:4;2789:7;2750:32;:47::i;:::-;-1:-1:-1;;;;;2821:16:6;;2817:179;;2853:45;2890:7;2853:36;:45::i;2817:179::-;2925:4;-1:-1:-1;;;;;2919:10:6;:2;-1:-1:-1;;;;;2919:10:6;;2915:81;;2945:40;2973:2;2977:7;2945:27;:40::i;7931:108:5:-;8006:26;8016:2;8020:7;8006:26;;;;;;;;;;;;:9;:26::i;10139:916:16:-;10192:7;;-1:-1:-1;;;10267:17:16;;10263:103;;-1:-1:-1;;;10304:17:16;;;-1:-1:-1;10349:2:16;10339:12;10263:103;10392:8;10383:5;:17;10379:103;;10429:8;10420:17;;;-1:-1:-1;10465:2:16;10455:12;10379:103;10508:8;10499:5;:17;10495:103;;10545:8;10536:17;;;-1:-1:-1;10581:2:16;10571:12;10495:103;10624:7;10615:5;:16;10611:100;;10660:7;10651:16;;;-1:-1:-1;10695:1:16;10685:11;10611:100;10737:7;10728:5;:16;10724:100;;10773:7;10764:16;;;-1:-1:-1;10808:1:16;10798:11;10724:100;10850:7;10841:5;:16;10837:100;;10886:7;10877:16;;;-1:-1:-1;10921:1:16;10911:11;10837:100;10963:7;10954:5;:16;10950:66;;11000:1;10990:11;11042:6;10139:916;-1:-1:-1;;10139:916:16:o;13861:831:5:-;14010:4;-1:-1:-1;;;;;14030:13:5;;1702:19:0;:23;14026:660:5;;14065:71;;-1:-1:-1;;;14065:71:5;;-1:-1:-1;;;;;14065:36:5;;;;;:71;;719:10:2;;14116:4:5;;14122:7;;14131:4;;14065:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14065:71:5;;;;;;;;-1:-1:-1;;14065:71:5;;;;;;;;;;;;:::i;:::-;;;14061:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14303:6;:13;14320:1;14303:18;14299:321;;14345:60;;-1:-1:-1;;;14345:60:5;;;;;;;:::i;14299:321::-;14572:6;14566:13;14557:6;14553:2;14549:15;14542:38;14061:573;-1:-1:-1;;;;;;14186:51:5;-1:-1:-1;;;14186:51:5;;-1:-1:-1;14179:58:5;;14026:660;-1:-1:-1;14671:4:5;13861:831;;;;;;:::o;1506:300::-;1608:4;-1:-1:-1;;;;;;1643:40:5;;-1:-1:-1;;;1643:40:5;;:104;;-1:-1:-1;;;;;;;1699:48:5;;-1:-1:-1;;;1699:48:5;1643:104;:156;;;-1:-1:-1;;;;;;;;;;938:40:3;;;1763:36:5;830:155:3;4486:970:6;4748:22;4798:1;4773:22;4790:4;4773:16;:22::i;:::-;:26;;;;:::i;:::-;4809:18;4830:26;;;:17;:26;;;;;;4748:51;;-1:-1:-1;4960:28:6;;;4956:323;;-1:-1:-1;;;;;5026:18:6;;5004:19;5026:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5075:30;;;;;;:44;;;5191:30;;:17;:30;;;;;:43;;;4956:323;-1:-1:-1;5372:26:6;;;;:17;:26;;;;;;;;5365:33;;;-1:-1:-1;;;;;5415:18:6;;;;;:12;:18;;;;;:34;;;;;;;5408:41;4486:970::o;5744:1061::-;6018:10;:17;5993:22;;6018:21;;6038:1;;6018:21;:::i;:::-;6049:18;6070:24;;;:15;:24;;;;;;6438:10;:26;;5993:46;;-1:-1:-1;6070:24:6;;5993:46;;6438:26;;;;;;:::i;:::-;;;;;;;;;6416:48;;6500:11;6475:10;6486;6475:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6579:28;;;:15;:28;;;;;;;:41;;;6748:24;;;;;6741:31;6782:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5815:990;;;5744:1061;:::o;3296:217::-;3380:14;3397:20;3414:2;3397:16;:20::i;:::-;-1:-1:-1;;;;;3427:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3471:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3296:217:6:o;8260:279:5:-;8354:18;8360:2;8364:7;8354:5;:18::i;:::-;8403:53;8434:1;8438:2;8442:7;8451:4;8403:22;:53::i;:::-;8382:150;;;;-1:-1:-1;;;8382:150:5;;;;;;;:::i;8861:920::-;-1:-1:-1;;;;;8940:16:5;;8932:61;;;;-1:-1:-1;;;8932:61:5;;42656:2:21;8932:61:5;;;42638:21:21;;;42675:18;;;42668:30;42734:34;42714:18;;;42707:62;42786:18;;8932:61:5;42454:356:21;8932:61:5;9012:16;9020:7;9012;:16::i;:::-;9011:17;9003:58;;;;-1:-1:-1;;;9003:58:5;;;;;;;:::i;:::-;9072:48;9101:1;9105:2;9109:7;9118:1;9072:20;:48::i;:::-;9216:16;9224:7;9216;:16::i;:::-;9215:17;9207:58;;;;-1:-1:-1;;;9207:58:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;9607:13:5;;;;;;:9;:13;;;;;;;;:18;;9624:1;9607:18;;;9646:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9646:21:5;;;;;9683:33;9654:7;;9607:13;;-1:-1:-1;;;;;;;;;;;9683:33:5;9607:13;;9683:33;4105:153;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:21;-1:-1:-1;;;;;;88:32:21;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:21;825:40;;-1:-1:-1;;;;;880:34:21;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:21:o;1004:407::-;1069:5;-1:-1:-1;;;;;1095:6:21;1092:30;1089:56;;;1125:18;;:::i;:::-;1163:57;1208:2;1187:15;;-1:-1:-1;;1183:29:21;1214:4;1179:40;1163:57;:::i;:::-;1154:66;;1243:6;1236:5;1229:21;1283:3;1274:6;1269:3;1265:16;1262:25;1259:45;;;1300:1;1297;1290:12;1259:45;1349:6;1344:3;1337:4;1330:5;1326:16;1313:43;1403:1;1396:4;1387:6;1380:5;1376:18;1372:29;1365:40;1004:407;;;;;:::o;1416:222::-;1459:5;1512:3;1505:4;1497:6;1493:17;1489:27;1479:55;;1530:1;1527;1520:12;1479:55;1552:80;1628:3;1619:6;1606:20;1599:4;1591:6;1587:17;1552:80;:::i;1643:182::-;1702:4;-1:-1:-1;;;;;1727:6:21;1724:30;1721:56;;;1757:18;;:::i;:::-;-1:-1:-1;1802:1:21;1798:14;1814:4;1794:25;;1643:182::o;1830:887::-;1883:5;1936:3;1929:4;1921:6;1917:17;1913:27;1903:55;;1954:1;1951;1944:12;1903:55;1990:6;1977:20;2016:4;2040:59;2056:42;2095:2;2056:42;:::i;:::-;2040:59;:::i;:::-;2133:15;;;2219:1;2215:10;;;;2203:23;;2199:32;;;2164:12;;;;2243:15;;;2240:35;;;2271:1;2268;2261:12;2240:35;2307:2;2299:6;2295:15;2319:369;2335:6;2330:3;2327:15;2319:369;;;2421:3;2408:17;-1:-1:-1;;;;;2444:11:21;2441:35;2438:125;;;2517:1;2546:2;2542;2535:14;2438:125;2588:57;2641:3;2636:2;2622:11;2614:6;2610:24;2606:33;2588:57;:::i;:::-;2576:70;;-1:-1:-1;2666:12:21;;;;2352;;2319:369;;;-1:-1:-1;2706:5:21;1830:887;-1:-1:-1;;;;;;1830:887:21:o;2722:1783::-;2949:6;2957;2965;2973;2981;2989;2997;3005;3058:3;3046:9;3037:7;3033:23;3029:33;3026:53;;;3075:1;3072;3065:12;3026:53;3115:9;3102:23;-1:-1:-1;;;;;3185:2:21;3177:6;3174:14;3171:34;;;3201:1;3198;3191:12;3171:34;3224:50;3266:7;3257:6;3246:9;3242:22;3224:50;:::i;:::-;3214:60;;3327:2;3316:9;3312:18;3299:32;3283:48;;3356:2;3346:8;3343:16;3340:36;;;3372:1;3369;3362:12;3340:36;3395:52;3439:7;3428:8;3417:9;3413:24;3395:52;:::i;:::-;3385:62;;3500:2;3489:9;3485:18;3472:32;3456:48;;3529:2;3519:8;3516:16;3513:36;;;3545:1;3542;3535:12;3513:36;3568:52;3612:7;3601:8;3590:9;3586:24;3568:52;:::i;:::-;3558:62;;3673:2;3662:9;3658:18;3645:32;3629:48;;3702:2;3692:8;3689:16;3686:36;;;3718:1;3715;3708:12;3686:36;3741:52;3785:7;3774:8;3763:9;3759:24;3741:52;:::i;:::-;3731:62;;3846:3;3835:9;3831:19;3818:33;3802:49;;3876:2;3866:8;3863:16;3860:36;;;3892:1;3889;3882:12;3860:36;3915:52;3959:7;3948:8;3937:9;3933:24;3915:52;:::i;:::-;3905:62;;4020:3;4009:9;4005:19;3992:33;3976:49;;4050:2;4040:8;4037:16;4034:36;;;4066:1;4063;4056:12;4034:36;4089:52;4133:7;4122:8;4111:9;4107:24;4089:52;:::i;:::-;4079:62;;4194:3;4183:9;4179:19;4166:33;4150:49;;4224:2;4214:8;4211:16;4208:36;;;4240:1;4237;4230:12;4208:36;4263:52;4307:7;4296:8;4285:9;4281:24;4263:52;:::i;:::-;4253:62;;4368:3;4357:9;4353:19;4340:33;4324:49;;4398:2;4388:8;4385:16;4382:36;;;4414:1;4411;4404:12;4382:36;;4437:62;4491:7;4480:8;4469:9;4465:24;4437:62;:::i;:::-;4427:72;;;2722:1783;;;;;;;;;;;:::o;4510:250::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4695:11;;;4689:18;4676:11;;;4669:39;4641:2;4634:10;4605:113;;;-1:-1:-1;;4752:1:21;4734:16;;4727:27;4510:250::o;4765:271::-;4807:3;4845:5;4839:12;4872:6;4867:3;4860:19;4888:76;4957:6;4950:4;4945:3;4941:14;4934:4;4927:5;4923:16;4888:76;:::i;:::-;5018:2;4997:15;-1:-1:-1;;4993:29:21;4984:39;;;;5025:4;4980:50;;4765:271;-1:-1:-1;;4765:271:21:o;5041:220::-;5190:2;5179:9;5172:21;5153:4;5210:45;5251:2;5240:9;5236:18;5228:6;5210:45;:::i;5266:180::-;5325:6;5378:2;5366:9;5357:7;5353:23;5349:32;5346:52;;;5394:1;5391;5384:12;5346:52;-1:-1:-1;5417:23:21;;5266:180;-1:-1:-1;5266:180:21:o;5451:203::-;-1:-1:-1;;;;;5615:32:21;;;;5597:51;;5585:2;5570:18;;5451:203::o;5659:173::-;5727:20;;-1:-1:-1;;;;;5776:31:21;;5766:42;;5756:70;;5822:1;5819;5812:12;5837:254;5905:6;5913;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6005:29;6024:9;6005:29;:::i;:::-;5995:39;6081:2;6066:18;;;;6053:32;;-1:-1:-1;;;5837:254:21:o;6096:1921::-;6341:6;6349;6357;6365;6373;6381;6389;6397;6405;6413;6466:3;6454:9;6445:7;6441:23;6437:33;6434:53;;;6483:1;6480;6473:12;6434:53;6519:9;6506:23;6496:33;;6580:2;6569:9;6565:18;6552:32;-1:-1:-1;;;;;6644:2:21;6636:6;6633:14;6630:34;;;6660:1;6657;6650:12;6630:34;6683:50;6725:7;6716:6;6705:9;6701:22;6683:50;:::i;:::-;6673:60;;6786:2;6775:9;6771:18;6758:32;6742:48;;6815:2;6805:8;6802:16;6799:36;;;6831:1;6828;6821:12;6799:36;6854:52;6898:7;6887:8;6876:9;6872:24;6854:52;:::i;:::-;6844:62;;6959:2;6948:9;6944:18;6931:32;6915:48;;6988:2;6978:8;6975:16;6972:36;;;7004:1;7001;6994:12;6972:36;7027:52;7071:7;7060:8;7049:9;7045:24;7027:52;:::i;:::-;7017:62;;7132:3;7121:9;7117:19;7104:33;7088:49;;7162:2;7152:8;7149:16;7146:36;;;7178:1;7175;7168:12;7146:36;7201:52;7245:7;7234:8;7223:9;7219:24;7201:52;:::i;:::-;7191:62;;7306:3;7295:9;7291:19;7278:33;7262:49;;7336:2;7326:8;7323:16;7320:36;;;7352:1;7349;7342:12;7320:36;7375:52;7419:7;7408:8;7397:9;7393:24;7375:52;:::i;:::-;7365:62;;7480:3;7469:9;7465:19;7452:33;7436:49;;7510:2;7500:8;7497:16;7494:36;;;7526:1;7523;7516:12;7494:36;7549:52;7593:7;7582:8;7571:9;7567:24;7549:52;:::i;:::-;7539:62;;7654:3;7643:9;7639:19;7626:33;7610:49;;7684:2;7674:8;7671:16;7668:36;;;7700:1;7697;7690:12;7668:36;7723:52;7767:7;7756:8;7745:9;7741:24;7723:52;:::i;:::-;7713:62;;7822:3;7811:9;7807:19;7794:33;7784:43;;7880:3;7869:9;7865:19;7852:33;7836:49;;7910:2;7900:8;7897:16;7894:36;;;7926:1;7923;7916:12;7894:36;;7949:62;8003:7;7992:8;7981:9;7977:24;7949:62;:::i;:::-;7939:72;;;6096:1921;;;;;;;;;;;;;:::o;8204:254::-;8272:6;8280;8333:2;8321:9;8312:7;8308:23;8304:32;8301:52;;;8349:1;8346;8339:12;8301:52;8385:9;8372:23;8362:33;;8414:38;8448:2;8437:9;8433:18;8414:38;:::i;:::-;8404:48;;8204:254;;;;;:::o;8463:328::-;8540:6;8548;8556;8609:2;8597:9;8588:7;8584:23;8580:32;8577:52;;;8625:1;8622;8615:12;8577:52;8648:29;8667:9;8648:29;:::i;:::-;8638:39;;8696:38;8730:2;8719:9;8715:18;8696:38;:::i;:::-;8686:48;;8781:2;8770:9;8766:18;8753:32;8743:42;;8463:328;;;;;:::o;8796:248::-;8864:6;8872;8925:2;8913:9;8904:7;8900:23;8896:32;8893:52;;;8941:1;8938;8931:12;8893:52;-1:-1:-1;;8964:23:21;;;9034:2;9019:18;;;9006:32;;-1:-1:-1;8796:248:21:o;9049:274::-;-1:-1:-1;;;;;9241:32:21;;;;9223:51;;9305:2;9290:18;;9283:34;9211:2;9196:18;;9049:274::o;9328:186::-;9387:6;9440:2;9428:9;9419:7;9415:23;9411:32;9408:52;;;9456:1;9453;9446:12;9408:52;9479:29;9498:9;9479:29;:::i;9519:529::-;9623:6;9631;9639;9647;9655;9663;9716:3;9704:9;9695:7;9691:23;9687:33;9684:53;;;9733:1;9730;9723:12;9684:53;9769:9;9756:23;9746:33;;9826:2;9815:9;9811:18;9798:32;9788:42;;9877:2;9866:9;9862:18;9849:32;9839:42;;9928:2;9917:9;9913:18;9900:32;9890:42;;9979:3;9968:9;9964:19;9951:33;9941:43;;10003:39;10037:3;10026:9;10022:19;10003:39;:::i;:::-;9993:49;;9519:529;;;;;;;;:::o;10053:928::-;10300:2;10289:9;10282:21;10263:4;10326:45;10367:2;10356:9;10352:18;10344:6;10326:45;:::i;:::-;10390:2;10440:9;10432:6;10428:22;10423:2;10412:9;10408:18;10401:50;10471:6;10506;10500:13;10537:6;10529;10522:22;10572:2;10564:6;10560:15;10553:22;;10631:2;10621:6;10618:1;10614:14;10606:6;10602:27;10598:36;10669:2;10661:6;10657:15;10690:1;10700:252;10714:6;10711:1;10708:13;10700:252;;;10804:2;10800:7;10791:6;10783;10779:19;10775:33;10770:3;10763:46;10832:40;10865:6;10856;10850:13;10832:40;:::i;:::-;10930:12;;;;10822:50;-1:-1:-1;10895:15:21;;;;10736:1;10729:9;10700:252;;;-1:-1:-1;10969:6:21;;10053:928;-1:-1:-1;;;;;;;;;10053:928:21:o;11764:390::-;11842:6;11850;11903:2;11891:9;11882:7;11878:23;11874:32;11871:52;;;11919:1;11916;11909:12;11871:52;11955:9;11942:23;11932:33;;12016:2;12005:9;12001:18;11988:32;-1:-1:-1;;;;;12035:6:21;12032:30;12029:50;;;12075:1;12072;12065:12;12029:50;12098;12140:7;12131:6;12120:9;12116:22;12098:50;:::i;:::-;12088:60;;;11764:390;;;;;:::o;12159:460::-;12254:6;12262;12270;12278;12286;12339:3;12327:9;12318:7;12314:23;12310:33;12307:53;;;12356:1;12353;12346:12;12307:53;12392:9;12379:23;12369:33;;12421:38;12455:2;12444:9;12440:18;12421:38;:::i;:::-;12159:460;;12411:48;;-1:-1:-1;;;;12506:2:21;12491:18;;12478:32;;12557:2;12542:18;;12529:32;;12608:3;12593:19;;;12580:33;;-1:-1:-1;12159:460:21:o;12624:383::-;12821:2;12810:9;12803:21;12784:4;12847:45;12888:2;12877:9;12873:18;12865:6;12847:45;:::i;:::-;12940:9;12932:6;12928:22;12923:2;12912:9;12908:18;12901:50;12968:33;12994:6;12986;12968:33;:::i;:::-;12960:41;12624:383;-1:-1:-1;;;;;12624:383:21:o;13012:316::-;13089:6;13097;13105;13158:2;13146:9;13137:7;13133:23;13129:32;13126:52;;;13174:1;13171;13164:12;13126:52;-1:-1:-1;;13197:23:21;;;13267:2;13252:18;;13239:32;;-1:-1:-1;13318:2:21;13303:18;;;13290:32;;13012:316;-1:-1:-1;13012:316:21:o;13333:118::-;13419:5;13412:13;13405:21;13398:5;13395:32;13385:60;;13441:1;13438;13431:12;13456:315;13521:6;13529;13582:2;13570:9;13561:7;13557:23;13553:32;13550:52;;;13598:1;13595;13588:12;13550:52;13621:29;13640:9;13621:29;:::i;:::-;13611:39;;13700:2;13689:9;13685:18;13672:32;13713:28;13735:5;13713:28;:::i;:::-;13760:5;13750:15;;;13456:315;;;;;:::o;13776:1383::-;13948:6;13956;13964;14017:2;14005:9;13996:7;13992:23;13988:32;13985:52;;;14033:1;14030;14023:12;13985:52;14073:9;14060:23;-1:-1:-1;;;;;14143:2:21;14135:6;14132:14;14129:34;;;14159:1;14156;14149:12;14129:34;14197:6;14186:9;14182:22;14172:32;;14242:7;14235:4;14231:2;14227:13;14223:27;14213:55;;14264:1;14261;14254:12;14213:55;14300:2;14287:16;14322:4;14346:59;14362:42;14401:2;14362:42;:::i;14346:59::-;14439:15;;;14521:1;14517:10;;;;14509:19;;14505:28;;;14470:12;;;;14545:19;;;14542:39;;;14577:1;14574;14567:12;14542:39;14601:11;;;;14621:142;14637:6;14632:3;14629:15;14621:142;;;14703:17;;14691:30;;14654:12;;;;14741;;;;14621:142;;;14782:5;-1:-1:-1;;14825:18:21;;14812:32;;-1:-1:-1;;14856:16:21;;;14853:36;;;14885:1;14882;14875:12;14853:36;14908:62;14962:7;14951:8;14940:9;14936:24;14908:62;:::i;:::-;14898:72;;15023:2;15012:9;15008:18;14995:32;14979:48;;15052:2;15042:8;15039:16;15036:36;;;15068:1;15065;15058:12;15036:36;;15091:62;15145:7;15134:8;15123:9;15119:24;15091:62;:::i;:::-;15081:72;;;13776:1383;;;;;:::o;15164:667::-;15259:6;15267;15275;15283;15336:3;15324:9;15315:7;15311:23;15307:33;15304:53;;;15353:1;15350;15343:12;15304:53;15376:29;15395:9;15376:29;:::i;:::-;15366:39;;15424:38;15458:2;15447:9;15443:18;15424:38;:::i;:::-;15414:48;;15509:2;15498:9;15494:18;15481:32;15471:42;;15564:2;15553:9;15549:18;15536:32;-1:-1:-1;;;;;15583:6:21;15580:30;15577:50;;;15623:1;15620;15613:12;15577:50;15646:22;;15699:4;15691:13;;15687:27;-1:-1:-1;15677:55:21;;15728:1;15725;15718:12;15677:55;15751:74;15817:7;15812:2;15799:16;15794:2;15790;15786:11;15751:74;:::i;:::-;15741:84;;;15164:667;;;;;;;:::o;15836:1039::-;16225:3;16214:9;16207:22;16188:4;16252:46;16293:3;16282:9;16278:19;16270:6;16252:46;:::i;:::-;16346:9;16338:6;16334:22;16329:2;16318:9;16314:18;16307:50;16380:33;16406:6;16398;16380:33;:::i;:::-;16366:47;;16461:9;16453:6;16449:22;16444:2;16433:9;16429:18;16422:50;16495:33;16521:6;16513;16495:33;:::i;:::-;16481:47;;16576:9;16568:6;16564:22;16559:2;16548:9;16544:18;16537:50;16610:33;16636:6;16628;16610:33;:::i;:::-;16596:47;;16692:9;16684:6;16680:22;16674:3;16663:9;16659:19;16652:51;16726:33;16752:6;16744;16726:33;:::i;:::-;16712:47;;16808:9;16800:6;16796:22;16790:3;16779:9;16775:19;16768:51;16836:33;16862:6;16854;16836:33;:::i;:::-;16828:41;15836:1039;-1:-1:-1;;;;;;;;;15836:1039:21:o;16880:746::-;17003:6;17011;17019;17027;17035;17043;17051;17104:3;17092:9;17083:7;17079:23;17075:33;17072:53;;;17121:1;17118;17111:12;17072:53;17157:9;17144:23;17134:33;;17186:38;17220:2;17209:9;17205:18;17186:38;:::i;:::-;17176:48;;17243:38;17277:2;17266:9;17262:18;17243:38;:::i;:::-;17233:48;;17332:2;17321:9;17317:18;17304:32;-1:-1:-1;;;;;17351:6:21;17348:30;17345:50;;;17391:1;17388;17381:12;17345:50;17414;17456:7;17447:6;17436:9;17432:22;17414:50;:::i;:::-;16880:746;;;;-1:-1:-1;16880:746:21;;17511:3;17496:19;;17483:33;;17563:3;17548:19;;17535:33;;-1:-1:-1;17615:3:21;17600:19;;;17587:33;;-1:-1:-1;16880:746:21;-1:-1:-1;;;16880:746:21:o;17631:260::-;17699:6;17707;17760:2;17748:9;17739:7;17735:23;17731:32;17728:52;;;17776:1;17773;17766:12;17728:52;17799:29;17818:9;17799:29;:::i;:::-;17789:39;;17847:38;17881:2;17870:9;17866:18;17847:38;:::i;17896:602::-;18001:6;18009;18017;18025;18033;18086:3;18074:9;18065:7;18061:23;18057:33;18054:53;;;18103:1;18100;18093:12;18054:53;18139:9;18126:23;18116:33;;18168:38;18202:2;18191:9;18187:18;18168:38;:::i;:::-;18158:48;;18257:2;18246:9;18242:18;18229:32;-1:-1:-1;;;;;18276:6:21;18273:30;18270:50;;;18316:1;18313;18306:12;18270:50;18339;18381:7;18372:6;18361:9;18357:22;18339:50;:::i;:::-;17896:602;;;;-1:-1:-1;18329:60:21;;18436:2;18421:18;;18408:32;;-1:-1:-1;18487:3:21;18472:19;18459:33;;17896:602;-1:-1:-1;;;17896:602:21:o;18503:309::-;18568:6;18576;18629:2;18617:9;18608:7;18604:23;18600:32;18597:52;;;18645:1;18642;18635:12;18597:52;18681:9;18668:23;18658:33;;18741:2;18730:9;18726:18;18713:32;18754:28;18776:5;18754:28;:::i;18817:299::-;-1:-1:-1;;;;;19007:32:21;;;;18989:51;;-1:-1:-1;;;;;;19076:33:21;19071:2;19056:18;;19049:61;18977:2;18962:18;;18817:299::o;19121:245::-;19188:6;19241:2;19229:9;19220:7;19216:23;19212:32;19209:52;;;19257:1;19254;19247:12;19209:52;19289:9;19283:16;19308:28;19330:5;19308:28;:::i;19371:335::-;19573:2;19555:21;;;19612:2;19592:18;;;19585:30;-1:-1:-1;;;19646:2:21;19631:18;;19624:41;19697:2;19682:18;;19371:335::o;19711:380::-;19790:1;19786:12;;;;19833;;;19854:61;;19908:4;19900:6;19896:17;19886:27;;19854:61;19961:2;19953:6;19950:14;19930:18;19927:38;19924:161;;20007:10;20002:3;19998:20;19995:1;19988:31;20042:4;20039:1;20032:15;20070:4;20067:1;20060:15;19924:161;;19711:380;;;:::o;20222:545::-;20324:2;20319:3;20316:11;20313:448;;;20360:1;20385:5;20381:2;20374:17;20430:4;20426:2;20416:19;20500:2;20488:10;20484:19;20481:1;20477:27;20471:4;20467:38;20536:4;20524:10;20521:20;20518:47;;;-1:-1:-1;20559:4:21;20518:47;20614:2;20609:3;20605:12;20602:1;20598:20;20592:4;20588:31;20578:41;;20669:82;20687:2;20680:5;20677:13;20669:82;;;20732:17;;;20713:1;20702:13;20669:82;;20943:1352;21069:3;21063:10;-1:-1:-1;;;;;21088:6:21;21085:30;21082:56;;;21118:18;;:::i;:::-;21147:97;21237:6;21197:38;21229:4;21223:11;21197:38;:::i;:::-;21191:4;21147:97;:::i;:::-;21299:4;;21363:2;21352:14;;21380:1;21375:663;;;;22082:1;22099:6;22096:89;;;-1:-1:-1;22151:19:21;;;22145:26;22096:89;-1:-1:-1;;20900:1:21;20896:11;;;20892:24;20888:29;20878:40;20924:1;20920:11;;;20875:57;22198:81;;21345:944;;21375:663;20169:1;20162:14;;;20206:4;20193:18;;-1:-1:-1;;21411:20:21;;;21529:236;21543:7;21540:1;21537:14;21529:236;;;21632:19;;;21626:26;21611:42;;21724:27;;;;21692:1;21680:14;;;;21559:19;;21529:236;;;21533:3;21793:6;21784:7;21781:19;21778:201;;;21854:19;;;21848:26;-1:-1:-1;;21937:1:21;21933:14;;;21949:3;21929:24;21925:37;21921:42;21906:58;21891:74;;21778:201;-1:-1:-1;;;;;22025:1:21;22009:14;;;22005:22;21992:36;;-1:-1:-1;20943:1352:21:o;22300:127::-;22361:10;22356:3;22352:20;22349:1;22342:31;22392:4;22389:1;22382:15;22416:4;22413:1;22406:15;22432:125;22497:9;;;22518:10;;;22515:36;;;22531:18;;:::i;23394:127::-;23455:10;23450:3;23446:20;23443:1;23436:31;23486:4;23483:1;23476:15;23510:4;23507:1;23500:15;23881:409;24083:2;24065:21;;;24122:2;24102:18;;;24095:30;24161:34;24156:2;24141:18;;24134:62;-1:-1:-1;;;24227:2:21;24212:18;;24205:43;24280:3;24265:19;;23881:409::o;24295:168::-;24368:9;;;24399;;24416:15;;;24410:22;;24396:37;24386:71;;24437:18;;:::i;24600:217::-;24640:1;24666;24656:132;;24710:10;24705:3;24701:20;24698:1;24691:31;24745:4;24742:1;24735:15;24773:4;24770:1;24763:15;24656:132;-1:-1:-1;24802:9:21;;24600:217::o;25234:184::-;25304:6;25357:2;25345:9;25336:7;25332:23;25328:32;25325:52;;;25373:1;25370;25363:12;25325:52;-1:-1:-1;25396:16:21;;25234:184;-1:-1:-1;25234:184:21:o;25771:128::-;25838:9;;;25859:11;;;25856:37;;;25873:18;;:::i;26254:397::-;26456:2;26438:21;;;26495:2;26475:18;;;26468:30;26534:34;26529:2;26514:18;;26507:62;-1:-1:-1;;;26600:2:21;26585:18;;26578:31;26641:3;26626:19;;26254:397::o;27412:348::-;27614:2;27596:21;;;27653:2;27633:18;;;27626:30;-1:-1:-1;;;27687:2:21;27672:18;;27665:54;27751:2;27736:18;;27412:348::o;28438:722::-;28488:3;28529:5;28523:12;28558:36;28584:9;28558:36;:::i;:::-;28613:1;28630:18;;;28657:133;;;;28804:1;28799:355;;;;28623:531;;28657:133;-1:-1:-1;;28690:24:21;;28678:37;;28763:14;;28756:22;28744:35;;28735:45;;;-1:-1:-1;28657:133:21;;28799:355;28830:5;28827:1;28820:16;28859:4;28904:2;28901:1;28891:16;28929:1;28943:165;28957:6;28954:1;28951:13;28943:165;;;29035:14;;29022:11;;;29015:35;29078:16;;;;28972:10;;28943:165;;;28947:3;;;29137:6;29132:3;29128:16;29121:23;;28623:531;;;;;28438:722;;;;:::o;29165:369::-;29341:3;29379:6;29373:13;29395:66;29454:6;29449:3;29442:4;29434:6;29430:17;29395:66;:::i;:::-;29477:51;29520:6;29515:3;29511:16;29503:6;29477:51;:::i;29539:135::-;29578:3;29599:17;;;29596:43;;29619:18;;:::i;:::-;-1:-1:-1;29666:1:21;29655:13;;29539:135::o;29679:1386::-;-1:-1:-1;;;30380:3:21;30373:25;30355:3;30427:6;30421:13;30443:75;30511:6;30506:2;30501:3;30497:12;30490:4;30482:6;30478:17;30443:75;:::i;:::-;-1:-1:-1;;;30577:2:21;30537:16;;;30569:11;;;30562:37;30624:13;;30646:76;30624:13;30708:2;30700:11;;30693:4;30681:17;;30646:76;:::i;:::-;-1:-1:-1;;;30782:2:21;30741:17;;;;30774:11;;;30767:39;30825:46;30867:2;30859:11;;30851:6;30825:46;:::i;:::-;30815:56;;-1:-1:-1;;;30887:2:21;30880:16;30927:6;30921:13;30943:75;31009:8;31005:1;31001:2;30997:10;30990:4;30982:6;30978:17;30943:75;:::i;:::-;31038:17;31057:1;31034:25;;29679:1386;-1:-1:-1;;;;;;29679:1386:21:o;31820:335::-;32022:2;32004:21;;;32061:2;32041:18;;;32034:30;-1:-1:-1;;;32095:2:21;32080:18;;32073:41;32146:2;32131:18;;31820:335::o;33164:496::-;33343:3;33381:6;33375:13;33397:66;33456:6;33451:3;33444:4;33436:6;33432:17;33397:66;:::i;:::-;33526:13;;33485:16;;;;33548:70;33526:13;33485:16;33595:4;33583:17;;33548:70;:::i;:::-;33634:20;;33164:496;-1:-1:-1;;;;33164:496:21:o;33665:458::-;33897:3;33935:6;33929:13;33951:66;34010:6;34005:3;33998:4;33990:6;33986:17;33951:66;:::i;:::-;-1:-1:-1;;;34039:16:21;;34064:24;;;-1:-1:-1;34115:1:21;34104:13;;33665:458;-1:-1:-1;33665:458:21:o;34128:975::-;34637:34;34625:47;;-1:-1:-1;;;34697:2:21;34688:12;;34681:46;-1:-1:-1;34746:47:21;34789:2;34780:12;;34772:6;34746:47;:::i;:::-;-1:-1:-1;;;34802:62:21;;34887:13;;34909:72;34887:13;34969:2;34961:11;;34956:2;34944:15;;34909:72;:::i;:::-;-1:-1:-1;;;35039:2:21;35000:15;;;;35031:11;;;35024:46;35094:2;35086:11;;34128:975;-1:-1:-1;;;;34128:975:21:o;35108:1974::-;36058:66;36053:3;36046:79;36164:10;36159:3;36155:20;36150:2;36145:3;36141:12;36134:42;36028:3;36205:6;36199:13;36221:73;36287:6;36282:2;36277:3;36273:12;36268:2;36260:6;36256:15;36221:73;:::i;:::-;-1:-1:-1;;;36353:2:21;36313:16;;;36345:11;;;36338:67;36424:46;36466:2;36458:11;;36450:6;36424:46;:::i;:::-;-1:-1:-1;;;36479:46:21;;36414:56;-1:-1:-1;36544:46:21;36586:2;36578:11;;36570:6;36544:46;:::i;:::-;-1:-1:-1;;;36599:56:21;;36534;-1:-1:-1;36674:46:21;36716:2;36708:11;;36700:6;36674:46;:::i;:::-;36664:56;;36740:66;36736:2;36729:78;-1:-1:-1;;;36831:2:21;36827;36823:11;36816:32;36879:6;36873:13;36895:74;36960:8;36955:2;36951;36947:11;36942:2;36934:6;36930:15;36895:74;:::i;:::-;-1:-1:-1;;;37029:2:21;36988:17;;;;37021:11;;;37014:35;37073:2;37065:11;;35108:1974;-1:-1:-1;;;;;;;35108:1974:21:o;37845:401::-;38047:2;38029:21;;;38086:2;38066:18;;;38059:30;38125:34;38120:2;38105:18;;38098:62;-1:-1:-1;;;38191:2:21;38176:18;;38169:35;38236:3;38221:19;;37845:401::o;38980:136::-;39019:3;39047:5;39037:39;;39056:18;;:::i;:::-;-1:-1:-1;;;39092:18:21;;38980:136::o;40197:414::-;40399:2;40381:21;;;40438:2;40418:18;;;40411:30;40477:34;40472:2;40457:18;;40450:62;-1:-1:-1;;;40543:2:21;40528:18;;40521:48;40601:3;40586:19;;40197:414::o;40616:531::-;40893:3;40921:38;40955:3;40947:6;40921:38;:::i;:::-;-1:-1:-1;;;40975:2:21;40968:16;41013:6;41007:13;41029:73;41095:6;41091:1;41087:2;41083:10;41076:4;41068:6;41064:17;41029:73;:::i;:::-;41122:15;41139:1;41118:23;;40616:531;-1:-1:-1;;;;40616:531:21:o;41574:489::-;-1:-1:-1;;;;;41843:15:21;;;41825:34;;41895:15;;41890:2;41875:18;;41868:43;41942:2;41927:18;;41920:34;;;41990:3;41985:2;41970:18;;41963:31;;;41768:4;;42011:46;;42037:19;;42029:6;42011:46;:::i;:::-;42003:54;41574:489;-1:-1:-1;;;;;;41574:489:21:o;42068:249::-;42137:6;42190:2;42178:9;42169:7;42165:23;42161:32;42158:52;;;42206:1;42203;42196:12;42158:52;42238:9;42232:16;42257:30;42281:5;42257:30;:::i;42322:127::-;42383:10;42378:3;42374:20;42371:1;42364:31;42414:4;42411:1;42404:15;42438:4;42435:1;42428:15;42815:352;43017:2;42999:21;;;43056:2;43036:18;;;43029:30;43095;43090:2;43075:18;;43068:58;43158:2;43143:18;;42815:352::o

Swarm Source

ipfs://321dc53376657c9056d34e96f31aa591e06015be89a0c0d6a00de6d8a31a1d8b
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.