ETH Price: $3,390.00 (+1.52%)

Token

Nemus Genesis Drop Tickets (NEAT)
 

Overview

Max Total Supply

0 NEAT

Holders

223

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
thetaylor.eth
0x72eb41ae7f943445da9932662d31a06d56a3cfaa
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:
NeaMintTicketFactory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 16 of 21: NeaMintTicketFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 *
 *                                    (/  #%%                                    
 *                                 ((((   %%%%%*                                 
 *                                /(/(,  #%%%%%%*                                
 *                          (((((/((/(   %%%%%%%%#%%%%/                          
 *                       ((((((((((((/  *%%%%%%%%%%%%%%%%#                       
 *                      /((((((((((((*  #%%%%%%%%%%%%%%%%%%%                     
 *                        ./(((((((((,  #%%%%%%%%%%%%%%%%%%%%%                   
 *                 *(((((((((((((((((   %%%%%%%%%%%%%%%%%%%%%%%                  
 *                ,((((((((((((((((((   %%%%%%%%%%%%%%%%%%%%%%%%                 
 *                (((((((((((((((((((   %%%%%%%%%%%%%%%%%%%%%%%%%                
 *               .(/(((((((((((((((((   %%%%%%%%%%%%%%%%%%%%%%%%#.               
 *                    (((((((((((((((   %%%%%%%%%%%%%%%%%%%%%%%%%                
 *                   /(((((((((((((((   %%%%%%%%%%%%%%%%%%%%%##*                 
 *               *(((((((((((((((((((   %%%%%#%%#%%%%%%%%%%#%%                   
 *                (((((((((((((((((((.  %%%%%          %%%%%%                    
 *                (((((((((((((((((((,  #%%%         .%%%%%%,                    
 *                 ((((((((((((((((((/  (%%%       %%%%%%%%%.                    
 *                           ((((((((/  ,%%%   .%%%%%%%%%%%%%                    
 *                        *((((((((((/   %%#   %%%%%%%%%%%%%%                    
 *                    //((((((((((((((        ,%%%%%%%%%%%%%.                    
 *                      ((((((((((((((        %%%%%%%%%%%%(                      
 *                        (//(((((((((       *%%%%%%%%%#%                        
 *                          /(((((((((,      %%%%%%#%%(                          
 *                             (((((((*     *%%%%%%%                             
 *                               ./((((     %%%%#  
 * 
 * Hello Guardians,
 * We don't have a lot of time. You have been called upon to act, the time is now or never.
 * Together we can collectively push back the damage that has been done to the amazon.
 * 
 * This contract emits tickets that entitle you to NFTs  which you can use to join the fight.
 * Gas saving measures have been used to even further reduce carbon emission.
 * ~ See you in the rainforest.
 *
 * Project By: @nemus_earth
 * Developed By: @notmokk
 * 
 */

import "./ReentrancyGuard.sol";
import "./AccessControl.sol";
import "./ERC1155.sol";
import "./Strings.sol";
import "./Counters.sol";
import './AbstractMintVoucherFactory.sol';

contract NeaMintTicketFactory is AbstractMintVoucherFactory, ReentrancyGuard  {
    using Counters for Counters.Counter;

    Counters.Counter private mtCounter; 
    
    uint256 private constant MAX_PER_EARLY_ACCESS_ADDRESS = 3;

    address payable public treasuryWallet;
    address payable public nemusWallet;
    uint256 public treasuryPercentage;
    uint256 public nemusPercentage;

    mapping(address => bool) public isOnEarlyAccessList;
    mapping(address => uint256) public earlyAccessMintedCounts;
    mapping(uint256 => MintTicket) public mintTickets;
    
    event Claimed(uint index, address indexed account, uint amount);
    event ClaimedMultiple(uint[] index, address indexed account, uint[] amount);

    struct MintTicketParam {
        uint256 mtIndex; // Ticket index referencing mapping
        bool saleIsOpen; // Sale open or close boolean
        uint256 earlyAccessOpens; // Early access starting timestamp
        uint256 publicSaleOpens; // Public sale starting timestamp
        uint256 publicSaleCloses; // Public sale ending timestamp
        uint256 mintPrice; // Price of minting
        uint256 maxSupply; // Max possible supply of individual tickets
        uint256 maxPerWallet; // Max amount per users wallet
        uint256 maxMintPerTxn; // Max amount a user can mint per tx
        uint256 sizeID; // ID for ticket size reference
        string metadataHash; // ID for metadata reference
        address redeemableContract; // contract of the redeemable NFT
    }

    struct MintTicket {
        bool saleIsOpen;
        uint256 earlyAccessOpens; // Early access starting timestamp
        uint256 publicSaleOpens; // Public sale starting timestamp
        uint256 publicSaleCloses; // Public sale ending timestamp
        uint256 mintPrice; // Price of minting
        uint256 maxSupply; // Max possible supply of individual tickets
        uint256 maxPerWallet; // Max amount per users wallet
        uint256 maxMintPerTxn; // Max amount a user can mint per tx
        uint256 sizeID; // ID for ticket size reference
        string metadataHash; // ID for metadata reference
        address redeemableContract; // contract of the redeemable NFT
        mapping(address => uint256) claimedMTs;
    }
   
    constructor(
        string memory _name, 
        string memory _symbol,
        address _treasuryAddress,
        address _nemusAddress
    ) ERC1155("https://nemus-media.nyc3.digitaloceanspaces.com/tickets/seruini/genesis/metadata/") {
        require(address(_treasuryAddress) != address(0) && address(_nemusAddress) != address(0), "Treasury address cannot be zero");

        name_ = _name;
        symbol_ = _symbol;
        treasuryWallet = payable(_treasuryAddress);
        nemusWallet = payable(_nemusAddress);
        treasuryPercentage = 30;
        nemusPercentage = 70;
    }

    function addMintTicket(
        uint256 _earlyAccessOpens,
        uint256 _publicSaleOpens, 
        uint256 _publicSaleCloses, 
        uint256 _mintPrice, 
        uint256 _maxSupply,
        uint256 _maxMintPerTxn,
        uint256 _sizeID,
        string memory _metadataHash,
        address _redeemableContract,
        uint256 _maxPerWallet
    ) external onlyOwner {
        require(_earlyAccessOpens < _publicSaleOpens, "addMintTicket: open window must be before close window");
        require(_publicSaleOpens < _publicSaleCloses, "addMintTicket: open window must be before close window");
        require(_publicSaleOpens > 0 && _publicSaleCloses > 0 && _earlyAccessOpens > 0, "addMintTicket: window cannot be 0");
        require(_publicSaleOpens > block.timestamp && _earlyAccessOpens > block.timestamp, "addMintTicket: open window cannot be in the past");
        require(address(_redeemableContract) != address(0), "addMintTicket: cannot be zero address");


        MintTicket storage mt = mintTickets[mtCounter.current()];
        mt.saleIsOpen = false;
        mt.earlyAccessOpens = _earlyAccessOpens;
        mt.publicSaleOpens = _publicSaleOpens;
        mt.publicSaleCloses = _publicSaleCloses;
        mt.mintPrice = _mintPrice;
        mt.maxSupply = _maxSupply;
        mt.maxMintPerTxn = _maxMintPerTxn;
        mt.maxPerWallet = _maxPerWallet;
        mt.sizeID = _sizeID;
        mt.metadataHash = _metadataHash;
        mt.redeemableContract = _redeemableContract;
        mtCounter.increment();

    }

    function editMintTicket(
        MintTicketParam calldata params
    ) external onlyOwner {             
        require(mintTicketExists(params.mtIndex), "Mint ticket does not exist");

        require(params.earlyAccessOpens < params.publicSaleOpens, "editMintTicket: open window must be before close window");
        require(params.publicSaleOpens < params.publicSaleCloses, "editMintTicket: open window must be before close window");
        require(params.publicSaleOpens > 0 && params.publicSaleCloses > 0 && params.earlyAccessOpens > 0, "editMintTicket: window cannot be 0");
        require(address(params.redeemableContract) != address(0), "addMintTicket: cannot be zero address");

        mintTickets[params.mtIndex].earlyAccessOpens = params.earlyAccessOpens;
        mintTickets[params.mtIndex].publicSaleOpens = params.publicSaleOpens;
        mintTickets[params.mtIndex].publicSaleCloses = params.publicSaleCloses;
        mintTickets[params.mtIndex].mintPrice = params.mintPrice;  
        mintTickets[params.mtIndex].maxSupply = params.maxSupply;    
        mintTickets[params.mtIndex].maxMintPerTxn = params.maxMintPerTxn;
        mintTickets[params.mtIndex].sizeID = params.sizeID; 
        mintTickets[params.mtIndex].metadataHash = params.metadataHash;    
        mintTickets[params.mtIndex].redeemableContract = params.redeemableContract;
        mintTickets[params.mtIndex].saleIsOpen = params.saleIsOpen; 
        mintTickets[params.mtIndex].maxPerWallet = params.maxPerWallet; 
    }      

    function setMintTicketEarlyAccessOpens(uint256 _index, uint256 _earlyAccess) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        require((_earlyAccess < mintTickets[_index].publicSaleOpens) && (_earlyAccess > 0), "Cannot be after public opening");
        mintTickets[_index].earlyAccessOpens = _earlyAccess;
    }

    function setMintTicketPublicSaleOpens(uint256 _index, uint256 _publicSaleOpens) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        require((_publicSaleOpens < mintTickets[_index].publicSaleCloses) && (_publicSaleOpens > 0), "Cannot be after public closing");
        mintTickets[_index].publicSaleOpens = _publicSaleOpens;
    }

    function setMintTicketPublicSaleCloses(uint256 _index, uint256 _publicSaleCloses) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        require((_publicSaleCloses > mintTickets[_index].publicSaleOpens) && (_publicSaleCloses > 0), "Cannot be after public closing");
        mintTickets[_index].publicSaleCloses = _publicSaleCloses;
    }

    function setMintTicketPrice(uint256 _index, uint256 _mintPrice) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        mintTickets[_index].mintPrice = _mintPrice;
    } 

    function setMintTicketMaxSupplyt(uint256 _index, uint256 _maxSupply) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        mintTickets[_index].maxSupply = _maxSupply;
    } 

    function setMintTicketMaxMint(uint256 _index, uint256 _maxMintPerTxn) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        mintTickets[_index].maxMintPerTxn = _maxMintPerTxn;
    }

    function setMintTicketMaxPerWallet(uint256 _index, uint256 _maxMintPerWallet) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        mintTickets[_index].maxPerWallet = _maxMintPerWallet;
    }

    function setMintTicketSizeId(uint256 _index, uint256 _sizeId) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        mintTickets[_index].sizeID = _sizeId;
    }

    function setMintTicketMetadataId(uint256 _index, string calldata _metadataId) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        mintTickets[_index].metadataHash = _metadataId;
    }

    function setMintTicketRedeemableContract(uint256 _index, address _redeemableContract) public onlyOwner {
        require(mintTicketExists(_index), "Mint ticket does not exist");
        require(address(_redeemableContract) != address(0), "Cannot be zero address");
        mintTickets[_index].redeemableContract = _redeemableContract;
    }

    function mintTicketExists(uint256 _index) public view returns (bool) {
        require(mintTickets[_index].publicSaleOpens > 0, "Mint Ticket does not exist");
        return true;
    }

    function turnSaleOn(uint256 _index) external onlyOwner{
        require(mintTicketExists(_index), "Mint ticket does not exist");
         mintTickets[_index].saleIsOpen = true;
    }

    function turnSaleOff(uint256 _index) external onlyOwner{
        require(mintTicketExists(_index), "Mint ticket does not exist");
         mintTickets[_index].saleIsOpen = false;
    }


    function burnFromRedeem(
        address account, 
        uint256 mtIndex, 
        uint256 amount
    ) external {
        require(mintTickets[mtIndex].redeemableContract == msg.sender, "Burnable: Only allowed from redeemable contract");
        _burn(account, mtIndex, amount);
    }  

    function claim(
        uint256 amount,
        uint256 mtIndex
    ) external payable nonReentrant {
        // Verify claim is valid
        require(isValidClaim(amount,mtIndex));
        // Return excess funds to sender if they've overpaid
        uint256 excessPayment = msg.value - (amount * mintTickets[mtIndex].mintPrice);
        if (excessPayment > 0) {
            (bool returnExcessStatus, ) = _msgSender().call{value: excessPayment}("");
            require(returnExcessStatus, "Error returning excess payment");
        }
        // Add claimed amount to mintTicket index to keep track of user claiming
        mintTickets[mtIndex].claimedMTs[msg.sender] = mintTickets[mtIndex].claimedMTs[msg.sender] + amount;
        _mint(msg.sender, mtIndex, amount, "");
        // Emit claimed event
        emit Claimed(mtIndex, msg.sender, amount);
    }

    function claimMultiple(
        uint256[] calldata amounts,
        uint256[] calldata mtIndexes
    ) external payable nonReentrant {

        uint256 excessPayment = msg.value;
        uint256 totalTicketCost = 0;
        //validate all tokens being claimed and aggregate a total cost due
        for (uint i=0; i< mtIndexes.length; i++) {
            require(validateNonDupliateIndex(mtIndexes, mtIndexes[i]), "Index is duplcate");
            require(isValidClaim(amounts[i],mtIndexes[i]), "One or more claims are invalid");
            uint256 totalAmount = amounts[i] * mintTickets[mtIndexes[i]].mintPrice;
            totalTicketCost += totalAmount;
            excessPayment -= totalAmount ;
            mintTickets[mtIndexes[i]].claimedMTs[msg.sender] = mintTickets[mtIndexes[i]].claimedMTs[msg.sender] + amounts[i];
        }

        require(msg.value >= totalTicketCost, "Not enough ETH sent");

        if (excessPayment > 0) {
            (bool returnExcessStatus, ) = _msgSender().call{value: excessPayment}("");
            require(returnExcessStatus, "Error returning excess payment");
        }
    
        _mintBatch(msg.sender, mtIndexes, amounts, "");
        // Emit claimed event
        emit ClaimedMultiple(mtIndexes, msg.sender, amounts);

    }

    function claimEarlyAccess(uint256 _count, uint256 mtIndex) external payable nonReentrant {
        require(isValidEarlyAccessClaim(_count, mtIndex));

        // Return excess funds to sender if they've overpaid
        uint256 excessPayment = msg.value - (_count * mintTickets[mtIndex].mintPrice);
        if (excessPayment > 0) {
            (bool returnExcessStatus, ) = _msgSender().call{value: excessPayment}("");
            require(returnExcessStatus, "Error returning excess payment");
        }

        // Add claimed amount to mintTicket index to keep track of user claiming
        mintTickets[mtIndex].claimedMTs[msg.sender] = mintTickets[mtIndex].claimedMTs[msg.sender] + _count;
        uint256 userMintedAmount = earlyAccessMintedCounts[msg.sender] + _count;
        require(userMintedAmount <= MAX_PER_EARLY_ACCESS_ADDRESS, "Max early access count per address exceeded");

        // Mint it!
        _mint(msg.sender, mtIndex, _count, "");

        // Add early access count to keep track of early access claim
        earlyAccessMintedCounts[msg.sender] = userMintedAmount;

        // Emit claimed event
        emit Claimed(mtIndex, msg.sender, _count);
    }

    function claimMultipleEarlyAccess(uint256[] calldata _count, uint256[] calldata mtIndexes) external payable nonReentrant {
        //validate all tokens being claimed and aggregate a total cost due
        // Add claimed amount to mintTicket index to keep track of user claiming
        uint256 excessPayment = msg.value;
        uint256 userMintedAmount = earlyAccessMintedCounts[msg.sender];
        uint256 totalTicketCost = 0;
        for (uint i=0; i< mtIndexes.length; i++) {
            require(validateNonDupliateIndex(mtIndexes, mtIndexes[i]), "Index is duplicated");
            require(isValidEarlyAccessClaim(_count[i], mtIndexes[i]), "One or more claims are invalid");
            mintTickets[mtIndexes[i]].claimedMTs[msg.sender] = mintTickets[mtIndexes[i]].claimedMTs[msg.sender] + _count[i];
            uint256 totalAmount = _count[i] * mintTickets[mtIndexes[i]].mintPrice;
            userMintedAmount += _count[i];
            totalTicketCost += totalAmount;
            excessPayment -= totalAmount;
            if (msg.sender != nemusWallet) {
                require(userMintedAmount <= MAX_PER_EARLY_ACCESS_ADDRESS, "Max early access count per address exceeded");
            }
        }

        require(msg.value >= totalTicketCost, "Not enough ETH sent");

        if (excessPayment > 0) {
            (bool returnExcessStatus, ) = _msgSender().call{value: excessPayment}("");
            require(returnExcessStatus, "Error returning excess payment");
        }

        // Mint it!
        _mintBatch(msg.sender, mtIndexes, _count, "");

        // Add early access count to keep track of early access claim
        earlyAccessMintedCounts[msg.sender] = userMintedAmount;

        // Emit claimed event
        emit ClaimedMultiple(mtIndexes, msg.sender, _count);

    }

    function mint(
        address to,
        uint256 numPasses,
        uint256 mtIndex) public onlyOwner
    {
        _mint(to, mtIndex, numPasses, "");
    }

    function mintBatch(
        address to,
        uint256[] calldata numPasses,
        uint256[] calldata mtIndexes) public onlyOwner
    {
        _mintBatch(to, mtIndexes, numPasses, "");
    }

    function isValidClaim(
        uint256 numPasses,
        uint256 mtIndexes) internal view returns (bool) {
         // verify contract is not paused
        require(mintTickets[mtIndexes].saleIsOpen, "Sale is paused");
        require(!paused(), "Claim: claiming is paused");
        // Verify within window
        require (block.timestamp > mintTickets[mtIndexes].publicSaleOpens && block.timestamp < mintTickets[mtIndexes].publicSaleCloses, "Claim: time window closed");
        // Verify minting price
        require(msg.value >= (numPasses * mintTickets[mtIndexes].mintPrice), "Claim: Ether value incorrect");
        // Verify numPasses is within remaining claimable amount 
        require((mintTickets[mtIndexes].claimedMTs[msg.sender] + numPasses <= mintTickets[mtIndexes].maxPerWallet), "Claim: Not allowed to claim that many from one wallet");
        require(numPasses <= mintTickets[mtIndexes].maxMintPerTxn, "Max quantity per transaction exceeded");

        require(totalSupply(mtIndexes) + numPasses <= mintTickets[mtIndexes].maxSupply, "Purchase would exceed max supply");
        
        return true;
         
    }

    function isValidEarlyAccessClaim(uint256 _count, uint256 mtIndex) internal view returns (bool) {
            require(mintTickets[mtIndex].saleIsOpen, "Sale is paused");
            require(!paused(), "Claim: claiming is paused");
            // Verify there is an amount to be minted
            require(_count != 0, "Invalid count");
            // Verfiy sender is on early access list
            require(isOnEarlyAccessList[msg.sender], "Address not on early access list");
            // Verify within window between early access opens and public sale opens.
            require(isEarlyAccessOpen(mtIndex), "Early access window not open");
            // Verify sender value is correct for amount of passes being minted
            require(msg.value >= (_count * mintTickets[mtIndex].mintPrice), "Claim: Ether value incorrect");
            // Verify purchaase amount does not exceed max amount of passes
            require(totalSupply(mtIndex) + _count <= mintTickets[mtIndex].maxSupply, "Purchase would exceed max supply");

            return true;
    }

    function getClaimedMts(uint256 mtIndex, address userAdress) public view returns (uint256) {
        return mintTickets[mtIndex].claimedMTs[userAdress];
    }

    function getTicketSizeID(uint256 mtIndex) external view returns(uint256) {
        return mintTickets[mtIndex].sizeID;
    }

    function getRemainingEarlyAccessMints(address _addr) public view returns (uint256) {
        if (!isOnEarlyAccessList[_addr]) {
            return 0;
        }
        return MAX_PER_EARLY_ACCESS_ADDRESS - earlyAccessMintedCounts[_addr];
    }

    function addToEarlyAccessList(address[] memory toEarlyAccessList) external onlyOwner {
        for (uint256 i = 0; i < toEarlyAccessList.length; i++) {
            isOnEarlyAccessList[toEarlyAccessList[i]] = true;
        }
    }

    function removeFromEarlyAccessList(address[] memory toRemove) external onlyOwner {
        for (uint256 i = 0; i < toRemove.length; i++) {
            isOnEarlyAccessList[toRemove[i]] = false;
        }
    }

    function isEarlyAccessOpen(uint256 mtIndex) public view returns (bool) {
        return (block.timestamp >= mintTickets[mtIndex].earlyAccessOpens && block.timestamp <= mintTickets[mtIndex].publicSaleOpens);
    }

    function isSaleOpen(uint256 mtIndex) public view returns (bool) {
        return mintTickets[mtIndex].saleIsOpen;
    }

    function validateNonDupliateIndex(uint256[] calldata _indexes, uint256 _search) public pure returns (bool) {
        uint256 matchCount = 0;
        for (uint i=0; i< _indexes.length; i++) {
            if(_indexes[i] == _search) {
                matchCount++;
                if ( matchCount > 1) {
                    return false;
                }
            }
        }
        return true;
    }   

    function updatePayoutPercentage(uint256 _treasuryPercentage, uint256 _nemusPercentage) external onlyOwner 
    {
        require(_treasuryPercentage + _nemusPercentage <= 100, "Total percentage cannot be greater than 100");
        treasuryPercentage = _treasuryPercentage;
        nemusPercentage = _nemusPercentage;
    }
    
    function withdrawFunds() public onlyOwner
    {
        uint256 currentBalance = address(this).balance;
        uint256 amount1 = (currentBalance * treasuryPercentage)/100;
        uint256 amount2 = currentBalance - amount1;

        (bool success1, ) = address(treasuryWallet).call{value:amount1}("");
        require(success1, "Transfer1 failed.");

        (bool success2, ) = address(nemusWallet).call{value:amount2}("");
        require(success2, "Transfer2 failed.");
    }

    function uri(uint256 _id) public view override returns (string memory) {
            require(totalSupply(_id) > 0, "URI: nonexistent token");
            return string(abi.encodePacked(super.uri(_id), mintTickets[_id].metadataHash));
    } 
}

File 1 of 21: AbstractMintVoucherFactory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./AccessControl.sol";
import './Ownable.sol';
import './ERC1155Burnable.sol';
import './ERC1155Pausable.sol';
import './ERC1155Supply.sol';


abstract contract AbstractMintVoucherFactory is AccessControl, ERC1155Pausable, ERC1155Supply, ERC1155Burnable, Ownable {
    
    string public name_;
    string public symbol_;
    
    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyOwner {
        _setURI(baseURI);
    }    

    function name() public view returns (string memory) {
        return name_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }          

    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override(ERC1155) {
        super._mint(account, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155) {
        super._mintBatch(to, ids, amounts, data);
    }

    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override(ERC1155) {
        super._burn(account, id, amount);
    }

    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override(ERC1155) {
        super._burnBatch(account, ids, amounts);
    }  

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155Pausable, ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  

    function setOwner(address _addr) public onlyOwner {
        transferOwnership(_addr);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
   function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, AccessControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

}

File 2 of 21: AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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

File 3 of 21: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 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 5 of 21: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 6 of 21: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}

File 7 of 21: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 8 of 21: ERC1155Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";
import "./Pausable.sol";

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

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

File 9 of 21: ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";

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

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

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

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

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

File 10 of 21: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 11 of 21: IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

File 13 of 21: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";

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

File 14 of 21: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

File 15 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 17 of 21: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 18 of 21: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

File 19 of 21: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 20 of 21: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_nemusAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"index","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"ClaimedMultiple","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_earlyAccessOpens","type":"uint256"},{"internalType":"uint256","name":"_publicSaleOpens","type":"uint256"},{"internalType":"uint256","name":"_publicSaleCloses","type":"uint256"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintPerTxn","type":"uint256"},{"internalType":"uint256","name":"_sizeID","type":"uint256"},{"internalType":"string","name":"_metadataHash","type":"string"},{"internalType":"address","name":"_redeemableContract","type":"address"},{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"addMintTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"toEarlyAccessList","type":"address[]"}],"name":"addToEarlyAccessList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"mtIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFromRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mtIndex","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"mtIndex","type":"uint256"}],"name":"claimEarlyAccess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"mtIndexes","type":"uint256[]"}],"name":"claimMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_count","type":"uint256[]"},{"internalType":"uint256[]","name":"mtIndexes","type":"uint256[]"}],"name":"claimMultipleEarlyAccess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyAccessMintedCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"mtIndex","type":"uint256"},{"internalType":"bool","name":"saleIsOpen","type":"bool"},{"internalType":"uint256","name":"earlyAccessOpens","type":"uint256"},{"internalType":"uint256","name":"publicSaleOpens","type":"uint256"},{"internalType":"uint256","name":"publicSaleCloses","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTxn","type":"uint256"},{"internalType":"uint256","name":"sizeID","type":"uint256"},{"internalType":"string","name":"metadataHash","type":"string"},{"internalType":"address","name":"redeemableContract","type":"address"}],"internalType":"struct NeaMintTicketFactory.MintTicketParam","name":"params","type":"tuple"}],"name":"editMintTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mtIndex","type":"uint256"},{"internalType":"address","name":"userAdress","type":"address"}],"name":"getClaimedMts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getRemainingEarlyAccessMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mtIndex","type":"uint256"}],"name":"getTicketSizeID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mtIndex","type":"uint256"}],"name":"isEarlyAccessOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOnEarlyAccessList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mtIndex","type":"uint256"}],"name":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numPasses","type":"uint256"},{"internalType":"uint256","name":"mtIndex","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"numPasses","type":"uint256[]"},{"internalType":"uint256[]","name":"mtIndexes","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"mintTicketExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintTickets","outputs":[{"internalType":"bool","name":"saleIsOpen","type":"bool"},{"internalType":"uint256","name":"earlyAccessOpens","type":"uint256"},{"internalType":"uint256","name":"publicSaleOpens","type":"uint256"},{"internalType":"uint256","name":"publicSaleCloses","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTxn","type":"uint256"},{"internalType":"uint256","name":"sizeID","type":"uint256"},{"internalType":"string","name":"metadataHash","type":"string"},{"internalType":"address","name":"redeemableContract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nemusPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nemusWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toRemove","type":"address[]"}],"name":"removeFromEarlyAccessList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_earlyAccess","type":"uint256"}],"name":"setMintTicketEarlyAccessOpens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_maxMintPerTxn","type":"uint256"}],"name":"setMintTicketMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_maxMintPerWallet","type":"uint256"}],"name":"setMintTicketMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMintTicketMaxSupplyt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string","name":"_metadataId","type":"string"}],"name":"setMintTicketMetadataId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintTicketPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_publicSaleCloses","type":"uint256"}],"name":"setMintTicketPublicSaleCloses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_publicSaleOpens","type":"uint256"}],"name":"setMintTicketPublicSaleOpens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"address","name":"_redeemableContract","type":"address"}],"name":"setMintTicketRedeemableContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_sizeId","type":"uint256"}],"name":"setMintTicketSizeId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"turnSaleOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"turnSaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryPercentage","type":"uint256"},{"internalType":"uint256","name":"_nemusPercentage","type":"uint256"}],"name":"updatePayoutPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"uint256","name":"_search","type":"uint256"}],"name":"validateNonDupliateIndex","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200616f3803806200616f833981016040819052620000349162000335565b6040518060800160405280605181526020016200611e60519139620000598162000150565b506004805460ff191690556200006f3362000169565b60016009556001600160a01b038216158015906200009557506001600160a01b03811615155b620000e65760405162461bcd60e51b815260206004820152601f60248201527f547265617375727920616464726573732063616e6e6f74206265207a65726f00604482015260640160405180910390fd5b8351620000fb906007906020870190620001bb565b50825162000111906008906020860190620001bb565b50600b80546001600160a01b039384166001600160a01b031991821617909155600c80549290931691161790555050601e600d556046600e5562000417565b805162000165906003906020840190620001bb565b5050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001c990620003c4565b90600052602060002090601f016020900481019282620001ed576000855562000238565b82601f106200020857805160ff191683800117855562000238565b8280016001018555821562000238579182015b82811115620002385782518255916020019190600101906200021b565b50620002469291506200024a565b5090565b5b808211156200024657600081556001016200024b565b80516001600160a01b03811681146200027957600080fd5b919050565b600082601f8301126200029057600080fd5b81516001600160401b0380821115620002ad57620002ad62000401565b604051601f8301601f19908116603f01168101908282118183101715620002d857620002d862000401565b81604052838152602092508683858801011115620002f557600080fd5b600091505b83821015620003195785820183015181830184015290820190620002fa565b838211156200032b5760008385830101525b9695505050505050565b600080600080608085870312156200034c57600080fd5b84516001600160401b03808211156200036457600080fd5b62000372888389016200027e565b955060208701519150808211156200038957600080fd5b5062000398878288016200027e565b935050620003a96040860162000261565b9150620003b96060860162000261565b905092959194509250565b600181811c90821680620003d957607f821691505b60208210811415620003fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b615cf780620004276000396000f3fe6080604052600436106103f95760003560e01c80636dcec52811610213578063ac5fcdee11610123578063d81d0a15116100ab578063ea30b0041161007a578063ea30b00414610c60578063ec22944614610c90578063f242432a14610cb0578063f2fde38b14610cd0578063f5298aca14610cf057600080fd5b8063d81d0a1514610bc2578063dd6c4d6314610be2578063e2b9e18614610c02578063e985e9c514610c1757600080fd5b8063b301a776116100f2578063b301a77614610b2f578063bd85b03914610b4f578063bf8c6e6d14610b7c578063c349026314610b8f578063d547741f14610ba257600080fd5b8063ac5fcdee14610aaa578063af17dea614610ada578063b1acb34614610aef578063b2ca928e14610b0f57600080fd5b80638da5cb5b116101a6578063a08cdf6611610175578063a08cdf6614610a15578063a217fddf14610a42578063a22cb46514610a57578063aae33b9714610a77578063aaff570614610a9757600080fd5b80638da5cb5b146109a257806391d14854146109c05780639227923b146109e057806395d89b4114610a0057600080fd5b8063830e6048116101e2578063830e60481461092d5780638456cb591461094d57806387e4e3fd146109625780638d6d6f6b1461098257600080fd5b80636dcec528146108c25780636e642aba146108e2578063715018a6146109025780637ab560831461091757600080fd5b80633aeca2101161030e57806349f04f17116102a15780634f558e79116102705780634f558e791461082857806357db6e1d146108575780635c4ecfd91461086a5780635c975abb1461088a5780636b20c454146108a257600080fd5b806349f04f17146107a55780634c1c4177146107c55780634e1273f4146107db5780634e29f4411461080857600080fd5b806343e9d859116102dd57806343e9d859146106f657806344dd505a146107165780634610c745146107365780634626402b1461076d57600080fd5b80633aeca210146106715780633f071f3b146106915780633f4ba83a146106b15780634044556d146106c657600080fd5b8063156e29f6116103915780632b3af49e116103605780632b3af49e146105d15780632d06b3b8146105f15780632eb2c2d6146106115780632f2ff15d1461063157806336568abe1461065157600080fd5b8063156e29f61461054c57806324600fc31461056c578063248a9ca31461058157806325ca5522146105b157600080fd5b806306fdde03116103cd57806306fdde03146104ca5780630ab61fd2146104ec5780630e89341c1461050c57806313af40351461052c57600080fd5b8062fdd58e146103fe57806301ffc9a71461043157806302fe5305146104615780630377425314610483575b600080fd5b34801561040a57600080fd5b5061041e610419366004614e9d565b610d10565b6040519081526020015b60405180910390f35b34801561043d57600080fd5b5061045161044c3660046150a6565b610da9565b6040519015158152602001610428565b34801561046d57600080fd5b5061048161047c3660046150e0565b610dba565b005b34801561048f57600080fd5b5061041e61049e366004615083565b60008281526011602090815260408083206001600160a01b0385168452600b0190915290205492915050565b3480156104d657600080fd5b506104df610df0565b60405161042891906155c6565b3480156104f857600080fd5b50610451610507366004615004565b610e82565b34801561051857600080fd5b506104df61052736600461506a565b610ef0565b34801561053857600080fd5b50610481610547366004614c25565b610f8a565b34801561055857600080fd5b50610481610567366004614ec7565b610fbd565b34801561057857600080fd5b50610481611007565b34801561058d57600080fd5b5061041e61059c36600461506a565b60009081526020819052604090206001015490565b3480156105bd57600080fd5b506104816105cc366004615083565b611198565b3480156105dd57600080fd5b506104516105ec36600461506a565b611267565b3480156105fd57600080fd5b5061048161060c3660046151ca565b61129c565b34801561061d57600080fd5b5061048161062c366004614c73565b611300565b34801561063d57600080fd5b5061048161064c366004615083565b611390565b34801561065d57600080fd5b5061048161066c366004615083565b6113b6565b34801561067d57600080fd5b5061048161068c366004614ec7565b611434565b34801561069d57600080fd5b506104816106ac3660046151ca565b6114c0565b3480156106bd57600080fd5b50610481611563565b3480156106d257600080fd5b506104516106e136600461506a565b60009081526011602052604090205460ff1690565b34801561070257600080fd5b506104816107113660046151ca565b611597565b34801561072257600080fd5b506104816107313660046151ca565b611667565b34801561074257600080fd5b5061075661075136600461506a565b6116cb565b6040516104289b9a99989796959493929190615556565b34801561077957600080fd5b50600b5461078d906001600160a01b031681565b6040516001600160a01b039091168152602001610428565b3480156107b157600080fd5b506104816107c03660046151ec565b6117bb565b3480156107d157600080fd5b5061041e600e5481565b3480156107e757600080fd5b506107fb6107f6366004614f36565b6119d8565b6040516104289190615515565b34801561081457600080fd5b5061048161082336600461506a565b611b01565b34801561083457600080fd5b5061045161084336600461506a565b600090815260056020526040902054151590565b610481610865366004614f99565b611b6b565b34801561087657600080fd5b506104816108853660046151ca565b611f46565b34801561089657600080fd5b5060045460ff16610451565b3480156108ae57600080fd5b506104816108bd366004614e00565b612016565b3480156108ce57600080fd5b506104816108dd366004614efa565b612059565b3480156108ee57600080fd5b5061041e6108fd366004614c25565b6120eb565b34801561090e57600080fd5b50610481612137565b34801561092357600080fd5b5061041e600d5481565b34801561093957600080fd5b50600c5461078d906001600160a01b031681565b34801561095957600080fd5b5061048161216b565b34801561096e57600080fd5b5061048161097d3660046151ca565b61219d565b34801561098e57600080fd5b5061048161099d366004615114565b612201565b3480156109ae57600080fd5b506006546001600160a01b031661078d565b3480156109cc57600080fd5b506104516109db366004615083565b612465565b3480156109ec57600080fd5b506104816109fb3660046151ca565b61248e565b348015610a0c57600080fd5b506104df6124f2565b348015610a2157600080fd5b5061041e610a30366004614c25565b60106020526000908152604090205481565b348015610a4e57600080fd5b5061041e600081565b348015610a6357600080fd5b50610481610a72366004614e73565b612501565b348015610a8357600080fd5b50610481610a9236600461506a565b61250c565b610481610aa53660046151ca565b612573565b348015610ab657600080fd5b50610451610ac5366004614c25565b600f6020526000908152604090205460ff1681565b348015610ae657600080fd5b506104df612736565b348015610afb57600080fd5b50610481610b0a366004614efa565b6127c4565b348015610b1b57600080fd5b50610451610b2a36600461506a565b612856565b348015610b3b57600080fd5b50610481610b4a36600461514f565b6128bc565b348015610b5b57600080fd5b5061041e610b6a36600461506a565b60009081526005602052604090205490565b610481610b8a366004614f99565b61292d565b610481610b9d3660046151ca565b612d86565b348015610bae57600080fd5b50610481610bbd366004615083565b612f01565b348015610bce57600080fd5b50610481610bdd366004614d80565b612f27565b348015610bee57600080fd5b50610481610bfd3660046151ca565b612fcd565b348015610c0e57600080fd5b506104df613031565b348015610c2357600080fd5b50610451610c32366004614c40565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b348015610c6c57600080fd5b5061041e610c7b36600461506a565b60009081526011602052604090206008015490565b348015610c9c57600080fd5b50610481610cab3660046151ca565b61303e565b348015610cbc57600080fd5b50610481610ccb366004614d1c565b61310e565b348015610cdc57600080fd5b50610481610ceb366004614c25565b613153565b348015610cfc57600080fd5b50610481610d0b366004614ec7565b6131eb565b60006001600160a01b038316610d815760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6000610db482613223565b92915050565b6006546001600160a01b03163314610de45760405162461bcd60e51b8152600401610d78906158b5565b610ded81613263565b50565b606060078054610dff90615b42565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90615b42565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b5050505050905090565b600080805b84811015610ee25783868683818110610ea257610ea2615bda565b905060200201351415610ed05781610eb981615ba9565b9250506001821115610ed057600092505050610ee9565b80610eda81615ba9565b915050610e87565b5060019150505b9392505050565b60008181526005602052604081205460609110610f485760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610d78565b610f5182613276565b6000838152601160209081526040918290209151610f7493926009019101615325565b6040516020818303038152906040529050919050565b6006546001600160a01b03163314610fb45760405162461bcd60e51b8152600401610d78906158b5565b610ded81613153565b6006546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610d78906158b5565b6110028382846040518060200160405280600081525061330a565b505050565b6006546001600160a01b031633146110315760405162461bcd60e51b8152600401610d78906158b5565b600d5447906000906064906110469084615ac9565b6110509190615aa7565b9050600061105e8284615ae8565b600b546040519192506000916001600160a01b039091169084908381818185875af1925050503d80600081146110b0576040519150601f19603f3d011682016040523d82523d6000602084013e6110b5565b606091505b50509050806110fa5760405162461bcd60e51b81526020600482015260116024820152702a3930b739b332b918903330b4b632b21760791b6044820152606401610d78565b600c546040516000916001600160a01b03169084908381818185875af1925050503d8060008114611147576040519150601f19603f3d011682016040523d82523d6000602084013e61114c565b606091505b50509050806111915760405162461bcd60e51b81526020600482015260116024820152702a3930b739b332b919103330b4b632b21760791b6044820152606401610d78565b5050505050565b6006546001600160a01b031633146111c25760405162461bcd60e51b8152600401610d78906158b5565b6111cb82612856565b6111e75760405162461bcd60e51b8152600401610d78906158ea565b6001600160a01b0381166112365760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b6044820152606401610d78565b600091825260116020526040909120600a0180546001600160a01b0319166001600160a01b03909216919091179055565b6000818152601160205260408120600101544210801590610db457505060009081526011602052604090206002015442111590565b6006546001600160a01b031633146112c65760405162461bcd60e51b8152600401610d78906158b5565b6112cf82612856565b6112eb5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060050155565b6001600160a01b03851633148061131c575061131c8533610c32565b6113835760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610d78565b6111918585858585613316565b6000828152602081905260409020600101546113ac81336134c3565b6110028383613527565b6001600160a01b03811633146114265760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610d78565b61143082826135ab565b5050565b6000828152601160205260409020600a01546001600160a01b031633146114b55760405162461bcd60e51b815260206004820152602f60248201527f4275726e61626c653a204f6e6c7920616c6c6f7765642066726f6d207265646560448201526e195b58589b194818dbdb9d1c9858dd608a1b6064820152608401610d78565b611002838383613610565b6006546001600160a01b031633146114ea5760405162461bcd60e51b8152600401610d78906158b5565b60646114f68284615a8f565b11156115585760405162461bcd60e51b815260206004820152602b60248201527f546f74616c2070657263656e746167652063616e6e6f7420626520677265617460448201526a06572207468616e203130360ac1b6064820152608401610d78565b600d91909155600e55565b6006546001600160a01b0316331461158d5760405162461bcd60e51b8152600401610d78906158b5565b61159561361b565b565b6006546001600160a01b031633146115c15760405162461bcd60e51b8152600401610d78906158b5565b6115ca82612856565b6115e65760405162461bcd60e51b8152600401610d78906158ea565b600082815260116020526040902060020154811180156116065750600081115b6116525760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206265206166746572207075626c696320636c6f73696e6700006044820152606401610d78565b60009182526011602052604090912060030155565b6006546001600160a01b031633146116915760405162461bcd60e51b8152600401610d78906158b5565b61169a82612856565b6116b65760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060060155565b601160205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a01805460ff909a169a989997989697959694959394929391929161172990615b42565b80601f016020809104026020016040519081016040528092919081815260200182805461175590615b42565b80156117a25780601f10611777576101008083540402835291602001916117a2565b820191906000526020600020905b81548152906001019060200180831161178557829003601f168201915b505050600a90930154919250506001600160a01b03168b565b6006546001600160a01b031633146117e55760405162461bcd60e51b8152600401610d78906158b5565b888a106118045760405162461bcd60e51b8152600401610d789061570b565b8789106118235760405162461bcd60e51b8152600401610d789061570b565b6000891180156118335750600088115b801561183f575060008a115b6118955760405162461bcd60e51b815260206004820152602160248201527f6164644d696e745469636b65743a2077696e646f772063616e6e6f74206265206044820152600360fc1b6064820152608401610d78565b42891180156118a35750428a115b6119085760405162461bcd60e51b815260206004820152603060248201527f6164644d696e745469636b65743a206f70656e2077696e646f772063616e6e6f60448201526f1d081899481a5b881d1a19481c185cdd60821b6064820152608401610d78565b6001600160a01b03821661192e5760405162461bcd60e51b8152600401610d78906159e1565b60006011600061193d600a5490565b8152602080820192909252604001600020805460ff19168155600181018d9055600281018c9055600381018b9055600481018a90556005810189905560078101889055600681018490556008810187905585519092506119a591600984019190870190614946565b50600a81810180546001600160a01b0319166001600160a01b038616179055805460010190555050505050505050505050565b60608151835114611a3d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610d78565b600083516001600160401b03811115611a5857611a58615bf0565b604051908082528060200260200182016040528015611a81578160200160208202803683370190505b50905060005b8451811015611af957611acc858281518110611aa557611aa5615bda565b6020026020010151858381518110611abf57611abf615bda565b6020026020010151610d10565b828281518110611ade57611ade615bda565b6020908102919091010152611af281615ba9565b9050611a87565b509392505050565b6006546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610d78906158b5565b611b3481612856565b611b505760405162461bcd60e51b8152600401610d78906158ea565b6000908152601160205260409020805460ff19166001179055565b60026009541415611b8e5760405162461bcd60e51b8152600401610d78906159aa565b6002600955346000805b83811015611dbf57611bc38585878785818110611bb757611bb7615bda565b90506020020135610e82565b611c035760405162461bcd60e51b8152602060048201526011602482015270496e646578206973206475706c6361746560781b6044820152606401610d78565b611c3d878783818110611c1857611c18615bda565b90506020020135868684818110611c3157611c31615bda565b905060200201356136ae565b611c895760405162461bcd60e51b815260206004820152601e60248201527f4f6e65206f72206d6f726520636c61696d732061726520696e76616c696400006044820152606401610d78565b600060116000878785818110611ca157611ca1615bda565b90506020020135815260200190815260200160002060040154888884818110611ccc57611ccc615bda565b90506020020135611cdd9190615ac9565b9050611ce98184615a8f565b9250611cf58185615ae8565b9350878783818110611d0957611d09615bda565b9050602002013560116000888886818110611d2657611d26615bda565b905060200201358152602001908152602001600020600b016000336001600160a01b03166001600160a01b0316815260200190815260200160002054611d6c9190615a8f565b60116000888886818110611d8257611d82615bda565b602090810292909201358352508181019290925260409081016000908120338252600b019092529020555080611db781615ba9565b915050611b98565b5080341015611e065760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610d78565b8115611e7657604051600090339084908381818185875af1925050503d8060008114611e4e576040519150601f19603f3d011682016040523d82523d6000602084013e611e53565b606091505b5050905080611e745760405162461bcd60e51b8152600401610d7890615834565b505b611ef23385858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920182905250604080516020810190915290815292506139bd915050565b336001600160a01b03167f1f36743b8f77937c5a06ebeca4819ea0c795222f7ecf5a42583ff5d0063adabf85858989604051611f3194939291906154ee565b60405180910390a25050600160095550505050565b6006546001600160a01b03163314611f705760405162461bcd60e51b8152600401610d78906158b5565b611f7982612856565b611f955760405162461bcd60e51b8152600401610d78906158ea565b60008281526011602052604090206003015481108015611fb55750600081115b6120015760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206265206166746572207075626c696320636c6f73696e6700006044820152606401610d78565b60009182526011602052604090912060020155565b6001600160a01b03831633148061203257506120328333610c32565b61204e5760405162461bcd60e51b8152600401610d78906156c2565b6110028383836139c9565b6006546001600160a01b031633146120835760405162461bcd60e51b8152600401610d78906158b5565b60005b8151811015611430576001600f60008484815181106120a7576120a7615bda565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806120e381615ba9565b915050612086565b6001600160a01b0381166000908152600f602052604081205460ff1661211357506000919050565b6001600160a01b038216600090815260106020526040902054610db4906003615ae8565b6006546001600160a01b031633146121615760405162461bcd60e51b8152600401610d78906158b5565b61159560006139d4565b6006546001600160a01b031633146121955760405162461bcd60e51b8152600401610d78906158b5565b611595613a26565b6006546001600160a01b031633146121c75760405162461bcd60e51b8152600401610d78906158b5565b6121d082612856565b6121ec5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060040155565b6006546001600160a01b0316331461222b5760405162461bcd60e51b8152600401610d78906158b5565b6122358135612856565b6122515760405162461bcd60e51b8152600401610d78906158ea565b80606001358160400135106122785760405162461bcd60e51b8152600401610d7890615621565b806080013581606001351061229f5760405162461bcd60e51b8152600401610d7890615621565b600081606001351180156122b7575060008160800135115b80156122c7575060008160400135115b61231e5760405162461bcd60e51b815260206004820152602260248201527f656469744d696e745469636b65743a2077696e646f772063616e6e6f74206265604482015261020360f41b6064820152608401610d78565b600061233261018083016101608401614c25565b6001600160a01b031614156123595760405162461bcd60e51b8152600401610d78906159e1565b803560009081526011602052604090819020908201356001820155606082013560028201556080820135600382015560a0820135600482015560c0820135600582015561010082013560078201556101208201356008909101556123c1610140820182615a26565b823560009081526011602052604090206123e0926009909101916149ca565b506123f361018082016101608301614c25565b8135600090815260116020908152604091829020600a0180546001600160a01b0319166001600160a01b0394909416939093179092556124389190830190830161504f565b81356000908152601160205260409020805460ff191691151591909117815560e090910135600690910155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6006546001600160a01b031633146124b85760405162461bcd60e51b8152600401610d78906158b5565b6124c182612856565b6124dd5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060070155565b606060088054610dff90615b42565b611430338383613aa1565b6006546001600160a01b031633146125365760405162461bcd60e51b8152600401610d78906158b5565b61253f81612856565b61255b5760405162461bcd60e51b8152600401610d78906158ea565b6000908152601160205260409020805460ff19169055565b600260095414156125965760405162461bcd60e51b8152600401610d78906159aa565b60026009556125a58282613b82565b6125ae57600080fd5b6000818152601160205260408120600401546125ca9084615ac9565b6125d49034615ae8565b9050801561264657604051600090339083908381818185875af1925050503d806000811461261e576040519150601f19603f3d011682016040523d82523d6000602084013e612623565b606091505b50509050806126445760405162461bcd60e51b8152600401610d7890615834565b505b6000828152601160209081526040808320338452600b0190915290205461266e908490615a8f565b6000838152601160209081526040808320338452600b0182528083209390935560109052908120546126a1908590615a8f565b905060038111156126c45760405162461bcd60e51b8152600401610d78906157a6565b6126df3384866040518060200160405280600081525061330a565b3360008181526010602090815260409182902084905581518681529081018790527f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026910160405180910390a2505060016009555050565b6008805461274390615b42565b80601f016020809104026020016040519081016040528092919081815260200182805461276f90615b42565b80156127bc5780601f10612791576101008083540402835291602001916127bc565b820191906000526020600020905b81548152906001019060200180831161279f57829003601f168201915b505050505081565b6006546001600160a01b031633146127ee5760405162461bcd60e51b8152600401610d78906158b5565b60005b8151811015611430576000600f600084848151811061281257612812615bda565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061284e81615ba9565b9150506127f1565b6000818152601160205260408120600201546128b45760405162461bcd60e51b815260206004820152601a60248201527f4d696e74205469636b657420646f6573206e6f742065786973740000000000006044820152606401610d78565b506001919050565b6006546001600160a01b031633146128e65760405162461bcd60e51b8152600401610d78906158b5565b6128ef83612856565b61290b5760405162461bcd60e51b8152600401610d78906158ea565b60008381526011602052604090206129279060090183836149ca565b50505050565b600260095414156129505760405162461bcd60e51b8152600401610d78906159aa565b6002600955336000908152601060205260408120543491805b84811015612bf5576129888686888885818110611bb757611bb7615bda565b6129ca5760405162461bcd60e51b8152602060048201526013602482015272125b99195e081a5cc8191d5c1b1a58d85d1959606a1b6044820152606401610d78565b612a048888838181106129df576129df615bda565b905060200201358787848181106129f8576129f8615bda565b90506020020135613b82565b612a505760405162461bcd60e51b815260206004820152601e60248201527f4f6e65206f72206d6f726520636c61696d732061726520696e76616c696400006044820152606401610d78565b878782818110612a6257612a62615bda565b9050602002013560116000888885818110612a7f57612a7f615bda565b905060200201358152602001908152602001600020600b016000336001600160a01b03166001600160a01b0316815260200190815260200160002054612ac59190615a8f565b60116000888885818110612adb57612adb615bda565b905060200201358152602001908152602001600020600b016000336001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060116000888885818110612b3257612b32615bda565b90506020020135815260200190815260200160002060040154898984818110612b5d57612b5d615bda565b90506020020135612b6e9190615ac9565b9050888883818110612b8257612b82615bda565b9050602002013584612b949190615a8f565b9350612ba08184615a8f565b9250612bac8186615ae8565b600c549095506001600160a01b03163314612be2576003841115612be25760405162461bcd60e51b8152600401610d78906157a6565b5080612bed81615ba9565b915050612969565b5080341015612c3c5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610d78565b8215612cac57604051600090339085908381818185875af1925050503d8060008114612c84576040519150601f19603f3d011682016040523d82523d6000602084013e612c89565b606091505b5050905080612caa5760405162461bcd60e51b8152600401610d7890615834565b505b612d283386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920182905250604080516020810190915290815292506139bd915050565b3360008181526010602052604090819020849055517f1f36743b8f77937c5a06ebeca4819ea0c795222f7ecf5a42583ff5d0063adabf90612d7090889088908c908c906154ee565b60405180910390a2505060016009555050505050565b60026009541415612da95760405162461bcd60e51b8152600401610d78906159aa565b6002600955612db882826136ae565b612dc157600080fd5b600081815260116020526040812060040154612ddd9084615ac9565b612de79034615ae8565b90508015612e5957604051600090339083908381818185875af1925050503d8060008114612e31576040519150601f19603f3d011682016040523d82523d6000602084013e612e36565b606091505b5050905080612e575760405162461bcd60e51b8152600401610d7890615834565b505b6000828152601160209081526040808320338452600b01909152902054612e81908490615a8f565b600083815260116020908152604080832033808552600b90910183528184209490945580519182019052908152612ebc91908490869061330a565b604080518381526020810185905233917f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026910160405180910390a25050600160095550565b600082815260208190526040902060010154612f1d81336134c3565b61100283836135ab565b6006546001600160a01b03163314612f515760405162461bcd60e51b8152600401610d78906158b5565b6111918583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920182905250604080516020810190915290815292506139bd915050565b6006546001600160a01b03163314612ff75760405162461bcd60e51b8152600401610d78906158b5565b61300082612856565b61301c5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060080155565b6007805461274390615b42565b6006546001600160a01b031633146130685760405162461bcd60e51b8152600401610d78906158b5565b61307182612856565b61308d5760405162461bcd60e51b8152600401610d78906158ea565b600082815260116020526040902060020154811080156130ad5750600081115b6130f95760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206265206166746572207075626c6963206f70656e696e6700006044820152606401610d78565b60009182526011602052604090912060010155565b6001600160a01b03851633148061312a575061312a8533610c32565b6131465760405162461bcd60e51b8152600401610d78906156c2565b6111918585858585613d7c565b6006546001600160a01b0316331461317d5760405162461bcd60e51b8152600401610d78906158b5565b6001600160a01b0381166131e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d78565b610ded816139d4565b6001600160a01b03831633148061320757506132078333610c32565b6114b55760405162461bcd60e51b8152600401610d78906156c2565b60006001600160e01b03198216636cdb3d1360e11b148061325457506001600160e01b031982166303a24d0760e21b145b80610db45750610db482613eac565b8051611430906003906020840190614946565b60606003805461328590615b42565b80601f01602080910402602001604051908101604052809291908181526020018280546132b190615b42565b80156132fe5780601f106132d3576101008083540402835291602001916132fe565b820191906000526020600020905b8154815290600101906020018083116132e157829003601f168201915b50505050509050919050565b61292784848484613ee1565b81518351146133375760405162461bcd60e51b8152600401610d7890615921565b6001600160a01b03841661335d5760405162461bcd60e51b8152600401610d7890615761565b3361336c818787878787613faa565b60005b845181101561345557600085828151811061338c5761338c615bda565b6020026020010151905060008583815181106133aa576133aa615bda565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156133fb5760405162461bcd60e51b8152600401610d789061586b565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061343a908490615a8f565b925050819055505050508061344e90615ba9565b905061336f565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516134a5929190615528565b60405180910390a46134bb818787878787613fb8565b505050505050565b6134cd8282612465565b611430576134e5816001600160a01b03166014614123565b6134f0836020614123565b6040516020016135019291906153d6565b60408051601f198184030181529082905262461bcd60e51b8252610d78916004016155c6565b6135318282612465565b611430576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556135673390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6135b58282612465565b15611430576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6110028383836142be565b60045460ff166136645760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d78565b6004805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008181526011602052604081205460ff166136fd5760405162461bcd60e51b815260206004820152600e60248201526d14d85b19481a5cc81c185d5cd95960921b6044820152606401610d78565b60045460ff161561374c5760405162461bcd60e51b815260206004820152601960248201527810db185a5b4e8818db185a5b5a5b99c81a5cc81c185d5cd959603a1b6044820152606401610d78565b6000828152601160205260409020600201544211801561377c575060008281526011602052604090206003015442105b6137c85760405162461bcd60e51b815260206004820152601960248201527f436c61696d3a2074696d652077696e646f7720636c6f736564000000000000006044820152606401610d78565b6000828152601160205260409020600401546137e49084615ac9565b3410156138335760405162461bcd60e51b815260206004820152601c60248201527f436c61696d3a2045746865722076616c756520696e636f7272656374000000006044820152606401610d78565b60008281526011602090815260408083206006810154338552600b90910190925290912054613863908590615a8f565b11156138cf5760405162461bcd60e51b815260206004820152603560248201527f436c61696d3a204e6f7420616c6c6f77656420746f20636c61696d2074686174604482015274081b585b9e48199c9bdb481bdb99481dd85b1b195d605a1b6064820152608401610d78565b60008281526011602052604090206007015483111561393e5760405162461bcd60e51b815260206004820152602560248201527f4d6178207175616e7469747920706572207472616e73616374696f6e20657863604482015264195959195960da1b6064820152608401610d78565b6000828152601160209081526040808320600590810154925290912054613966908590615a8f565b11156139b45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610d78565b50600192915050565b612927848484846143c3565b61100283838361451e565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60045460ff1615613a6c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d78565b6004805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136913390565b816001600160a01b0316836001600160a01b03161415613b155760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610d78565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008181526011602052604081205460ff16613bd15760405162461bcd60e51b815260206004820152600e60248201526d14d85b19481a5cc81c185d5cd95960921b6044820152606401610d78565b60045460ff1615613c205760405162461bcd60e51b815260206004820152601960248201527810db185a5b4e8818db185a5b5a5b99c81a5cc81c185d5cd959603a1b6044820152606401610d78565b82613c5d5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a590818dbdd5b9d609a1b6044820152606401610d78565b336000908152600f602052604090205460ff16613cbc5760405162461bcd60e51b815260206004820181905260248201527f41646472657373206e6f74206f6e206561726c7920616363657373206c6973746044820152606401610d78565b613cc582611267565b613d115760405162461bcd60e51b815260206004820152601c60248201527f4561726c79206163636573732077696e646f77206e6f74206f70656e000000006044820152606401610d78565b600082815260116020526040902060040154613d2d9084615ac9565b34101561393e5760405162461bcd60e51b815260206004820152601c60248201527f436c61696d3a2045746865722076616c756520696e636f7272656374000000006044820152606401610d78565b6001600160a01b038416613da25760405162461bcd60e51b8152600401610d7890615761565b33613dc1818787613db2886146af565b613dbb886146af565b87613faa565b60008481526001602090815260408083206001600160a01b038a16845290915290205483811015613e045760405162461bcd60e51b8152600401610d789061586b565b60008581526001602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290613e43908490615a8f565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613ea38288888888886146fa565b50505050505050565b60006001600160e01b03198216637965db0b60e01b1480610db457506301ffc9a760e01b6001600160e01b0319831614610db4565b6001600160a01b038416613f075760405162461bcd60e51b8152600401610d7890615969565b33613f1881600087613db2886146af565b60008481526001602090815260408083206001600160a01b038916845290915281208054859290613f4a908490615a8f565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611191816000878787876146fa565b6134bb8686868686866147c4565b6001600160a01b0384163b156134bb5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613ffc908990899088908890889060040161544b565b602060405180830381600087803b15801561401657600080fd5b505af1925050508015614046575060408051601f3d908101601f19168201909252614043918101906150c3565b60015b6140f357614052615c06565b806308c379a0141561408c5750614067615c22565b80614072575061408e565b8060405162461bcd60e51b8152600401610d7891906155c6565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610d78565b6001600160e01b0319811663bc197c8160e01b14613ea35760405162461bcd60e51b8152600401610d78906155d9565b60606000614132836002615ac9565b61413d906002615a8f565b6001600160401b0381111561415457614154615bf0565b6040519080825280601f01601f19166020018201604052801561417e576020820181803683370190505b509050600360fc1b8160008151811061419957614199615bda565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106141c8576141c8615bda565b60200101906001600160f81b031916908160001a90535060006141ec846002615ac9565b6141f7906001615a8f565b90505b600181111561426f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061422b5761422b615bda565b1a60f81b82828151811061424157614241615bda565b60200101906001600160f81b031916908160001a90535060049490941c9361426881615b2b565b90506141fa565b508315610ee95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d78565b6001600160a01b0383166142e45760405162461bcd60e51b8152600401610d78906157f1565b33614313818560006142f5876146af565b6142fe876146af565b60405180602001604052806000815250613faa565b60008381526001602090815260408083206001600160a01b0388168452909152902054828110156143565760405162461bcd60e51b8152600401610d789061567e565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384166143e95760405162461bcd60e51b8152600401610d7890615969565b815183511461440a5760405162461bcd60e51b8152600401610d7890615921565b3361441a81600087878787613faa565b60005b84518110156144b65783818151811061443857614438615bda565b60200260200101516001600087848151811061445657614456615bda565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461449e9190615a8f565b909155508190506144ae81615ba9565b91505061441d565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051614507929190615528565b60405180910390a461119181600087878787613fb8565b6001600160a01b0383166145445760405162461bcd60e51b8152600401610d78906157f1565b80518251146145655760405162461bcd60e51b8152600401610d7890615921565b600033905061458881856000868660405180602001604052806000815250613faa565b60005b83518110156146505760008482815181106145a8576145a8615bda565b6020026020010151905060008483815181106145c6576145c6615bda565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156146175760405162461bcd60e51b8152600401610d789061567e565b60009283526001602090815260408085206001600160a01b038b168652909152909220910390558061464881615ba9565b91505061458b565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516146a1929190615528565b60405180910390a450505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106146e9576146e9615bda565b602090810291909101015292915050565b6001600160a01b0384163b156134bb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061473e90899089908890889088906004016154a9565b602060405180830381600087803b15801561475857600080fd5b505af1925050508015614788575060408051601f3d908101601f19168201909252614785918101906150c3565b60015b61479457614052615c06565b6001600160e01b0319811663f23a6e6160e01b14613ea35760405162461bcd60e51b8152600401610d78906155d9565b6147d28686868686866148de565b6001600160a01b0385166148595760005b8351811015614857578281815181106147fe576147fe615bda565b60200260200101516005600086848151811061481c5761481c615bda565b6020026020010151815260200190815260200160002060008282546148419190615a8f565b90915550614850905081615ba9565b90506147e3565b505b6001600160a01b0384166134bb5760005b8351811015613ea35782818151811061488557614885615bda565b6020026020010151600560008684815181106148a3576148a3615bda565b6020026020010151815260200190815260200160002060008282546148c89190615ae8565b909155506148d7905081615ba9565b905061486a565b60045460ff16156134bb5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610d78565b82805461495290615b42565b90600052602060002090601f01602090048101928261497457600085556149ba565b82601f1061498d57805160ff19168380011785556149ba565b828001600101855582156149ba579182015b828111156149ba57825182559160200191906001019061499f565b506149c6929150614a3e565b5090565b8280546149d690615b42565b90600052602060002090601f0160209004810192826149f857600085556149ba565b82601f10614a115782800160ff198235161785556149ba565b828001600101855582156149ba579182015b828111156149ba578235825591602001919060010190614a23565b5b808211156149c65760008155600101614a3f565b80356001600160a01b0381168114614a6a57600080fd5b919050565b600082601f830112614a8057600080fd5b81356020614a8d82615a6c565b604051614a9a8282615b7d565b8381528281019150858301600585901b87018401881015614aba57600080fd5b60005b85811015614ae057614ace82614a53565b84529284019290840190600101614abd565b5090979650505050505050565b60008083601f840112614aff57600080fd5b5081356001600160401b03811115614b1657600080fd5b6020830191508360208260051b8501011115614b3157600080fd5b9250929050565b600082601f830112614b4957600080fd5b81356020614b5682615a6c565b604051614b638282615b7d565b8381528281019150858301600585901b87018401881015614b8357600080fd5b60005b85811015614ae057813584529284019290840190600101614b86565b80358015158114614a6a57600080fd5b600082601f830112614bc357600080fd5b81356001600160401b03811115614bdc57614bdc615bf0565b604051614bf3601f8301601f191660200182615b7d565b818152846020838601011115614c0857600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215614c3757600080fd5b610ee982614a53565b60008060408385031215614c5357600080fd5b614c5c83614a53565b9150614c6a60208401614a53565b90509250929050565b600080600080600060a08688031215614c8b57600080fd5b614c9486614a53565b9450614ca260208701614a53565b935060408601356001600160401b0380821115614cbe57600080fd5b614cca89838a01614b38565b94506060880135915080821115614ce057600080fd5b614cec89838a01614b38565b93506080880135915080821115614d0257600080fd5b50614d0f88828901614bb2565b9150509295509295909350565b600080600080600060a08688031215614d3457600080fd5b614d3d86614a53565b9450614d4b60208701614a53565b9350604086013592506060860135915060808601356001600160401b03811115614d7457600080fd5b614d0f88828901614bb2565b600080600080600060608688031215614d9857600080fd5b614da186614a53565b945060208601356001600160401b0380821115614dbd57600080fd5b614dc989838a01614aed565b90965094506040880135915080821115614de257600080fd5b50614def88828901614aed565b969995985093965092949392505050565b600080600060608486031215614e1557600080fd5b614e1e84614a53565b925060208401356001600160401b0380821115614e3a57600080fd5b614e4687838801614b38565b93506040860135915080821115614e5c57600080fd5b50614e6986828701614b38565b9150509250925092565b60008060408385031215614e8657600080fd5b614e8f83614a53565b9150614c6a60208401614ba2565b60008060408385031215614eb057600080fd5b614eb983614a53565b946020939093013593505050565b600080600060608486031215614edc57600080fd5b614ee584614a53565b95602085013595506040909401359392505050565b600060208284031215614f0c57600080fd5b81356001600160401b03811115614f2257600080fd5b614f2e84828501614a6f565b949350505050565b60008060408385031215614f4957600080fd5b82356001600160401b0380821115614f6057600080fd5b614f6c86838701614a6f565b93506020850135915080821115614f8257600080fd5b50614f8f85828601614b38565b9150509250929050565b60008060008060408587031215614faf57600080fd5b84356001600160401b0380821115614fc657600080fd5b614fd288838901614aed565b90965094506020870135915080821115614feb57600080fd5b50614ff887828801614aed565b95989497509550505050565b60008060006040848603121561501957600080fd5b83356001600160401b0381111561502f57600080fd5b61503b86828701614aed565b909790965060209590950135949350505050565b60006020828403121561506157600080fd5b610ee982614ba2565b60006020828403121561507c57600080fd5b5035919050565b6000806040838503121561509657600080fd5b82359150614c6a60208401614a53565b6000602082840312156150b857600080fd5b8135610ee981615cab565b6000602082840312156150d557600080fd5b8151610ee981615cab565b6000602082840312156150f257600080fd5b81356001600160401b0381111561510857600080fd5b614f2e84828501614bb2565b60006020828403121561512657600080fd5b81356001600160401b0381111561513c57600080fd5b82016101808185031215610ee957600080fd5b60008060006040848603121561516457600080fd5b8335925060208401356001600160401b038082111561518257600080fd5b818601915086601f83011261519657600080fd5b8135818111156151a557600080fd5b8760208285010111156151b757600080fd5b6020830194508093505050509250925092565b600080604083850312156151dd57600080fd5b50508035926020909101359150565b6000806000806000806000806000806101408b8d03121561520c57600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b01356001600160401b0381111561525357600080fd5b61525f8d828e01614bb2565b93505061526f6101008c01614a53565b91506101208b013590509295989b9194979a5092959850565b81835260006001600160fb1b038311156152a157600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156152ee578151875295820195908201906001016152d2565b509495945050505050565b60008151808452615311816020860160208601615aff565b601f01601f19169290920160200192915050565b6000835160206153388285838901615aff565b845491840191600090600181811c908083168061535657607f831692505b85831081141561537457634e487b7160e01b85526022600452602485fd5b8080156153885760018114615399576153c6565b60ff198516885283880195506153c6565b60008b81526020902060005b858110156153be5781548a8201529084019088016153a5565b505083880195505b50939a9950505050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161540e816017850160208801615aff565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161543f816028840160208801615aff565b01602801949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090615477908301866152be565b828103606084015261548981866152be565b9050828103608084015261549d81856152f9565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906154e3908301846152f9565b979650505050505050565b604081526000615502604083018688615288565b82810360208401526154e3818587615288565b602081526000610ee960208301846152be565b60408152600061553b60408301856152be565b828103602084015261554d81856152be565b95945050505050565b60006101608d151583528c60208401528b60408401528a60608401528960808401528860a08401528760c08401528660e084015285610100840152806101208401526155a4818401866152f9565b91505060018060a01b0383166101408301529c9b505050505050505050505050565b602081526000610ee960208301846152f9565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526037908201527f656469744d696e745469636b65743a206f70656e2077696e646f77206d75737460408201527f206265206265666f726520636c6f73652077696e646f77000000000000000000606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526036908201527f6164644d696e745469636b65743a206f70656e2077696e646f77206d757374206040820152756265206265666f726520636c6f73652077696e646f7760501b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602b908201527f4d6178206561726c792061636365737320636f756e742070657220616464726560408201526a1cdcc8195e18d95959195960aa1b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601e908201527f4572726f722072657475726e696e6720657863657373207061796d656e740000604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f4d696e74207469636b657420646f6573206e6f74206578697374000000000000604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526025908201527f6164644d696e745469636b65743a2063616e6e6f74206265207a65726f206164604082015264647265737360d81b606082015260800190565b6000808335601e19843603018112615a3d57600080fd5b8301803591506001600160401b03821115615a5757600080fd5b602001915036819003821315614b3157600080fd5b60006001600160401b03821115615a8557615a85615bf0565b5060051b60200190565b60008219821115615aa257615aa2615bc4565b500190565b600082615ac457634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615ae357615ae3615bc4565b500290565b600082821015615afa57615afa615bc4565b500390565b60005b83811015615b1a578181015183820152602001615b02565b838111156129275750506000910152565b600081615b3a57615b3a615bc4565b506000190190565b600181811c90821680615b5657607f821691505b60208210811415615b7757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715615ba257615ba2615bf0565b6040525050565b6000600019821415615bbd57615bbd615bc4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115615c1f5760046000803e5060005160e01c5b90565b600060443d1015615c305790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615c5f57505050505090565b8285019150815181811115615c775750505050505090565b843d8701016020828501011115615c915750505050505090565b615ca060208286010187615b7d565b509095945050505050565b6001600160e01b031981168114610ded57600080fdfea264697066735822122082f7fa088f8490014cee04d3a3c4fa9b84b1de6940b3879b85d09fed26aa61bd64736f6c6343000807003368747470733a2f2f6e656d75732d6d656469612e6e7963332e6469676974616c6f6365616e7370616365732e636f6d2f7469636b6574732f73657275696e692f67656e657369732f6d657461646174612f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000083ec946ac5914915949f96c078c3324bb8e6561f00000000000000000000000087a9455ba6f034d28a373fdb70be1315a49d63f5000000000000000000000000000000000000000000000000000000000000001a4e656d75732047656e657369732044726f70205469636b65747300000000000000000000000000000000000000000000000000000000000000000000000000044e45415400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103f95760003560e01c80636dcec52811610213578063ac5fcdee11610123578063d81d0a15116100ab578063ea30b0041161007a578063ea30b00414610c60578063ec22944614610c90578063f242432a14610cb0578063f2fde38b14610cd0578063f5298aca14610cf057600080fd5b8063d81d0a1514610bc2578063dd6c4d6314610be2578063e2b9e18614610c02578063e985e9c514610c1757600080fd5b8063b301a776116100f2578063b301a77614610b2f578063bd85b03914610b4f578063bf8c6e6d14610b7c578063c349026314610b8f578063d547741f14610ba257600080fd5b8063ac5fcdee14610aaa578063af17dea614610ada578063b1acb34614610aef578063b2ca928e14610b0f57600080fd5b80638da5cb5b116101a6578063a08cdf6611610175578063a08cdf6614610a15578063a217fddf14610a42578063a22cb46514610a57578063aae33b9714610a77578063aaff570614610a9757600080fd5b80638da5cb5b146109a257806391d14854146109c05780639227923b146109e057806395d89b4114610a0057600080fd5b8063830e6048116101e2578063830e60481461092d5780638456cb591461094d57806387e4e3fd146109625780638d6d6f6b1461098257600080fd5b80636dcec528146108c25780636e642aba146108e2578063715018a6146109025780637ab560831461091757600080fd5b80633aeca2101161030e57806349f04f17116102a15780634f558e79116102705780634f558e791461082857806357db6e1d146108575780635c4ecfd91461086a5780635c975abb1461088a5780636b20c454146108a257600080fd5b806349f04f17146107a55780634c1c4177146107c55780634e1273f4146107db5780634e29f4411461080857600080fd5b806343e9d859116102dd57806343e9d859146106f657806344dd505a146107165780634610c745146107365780634626402b1461076d57600080fd5b80633aeca210146106715780633f071f3b146106915780633f4ba83a146106b15780634044556d146106c657600080fd5b8063156e29f6116103915780632b3af49e116103605780632b3af49e146105d15780632d06b3b8146105f15780632eb2c2d6146106115780632f2ff15d1461063157806336568abe1461065157600080fd5b8063156e29f61461054c57806324600fc31461056c578063248a9ca31461058157806325ca5522146105b157600080fd5b806306fdde03116103cd57806306fdde03146104ca5780630ab61fd2146104ec5780630e89341c1461050c57806313af40351461052c57600080fd5b8062fdd58e146103fe57806301ffc9a71461043157806302fe5305146104615780630377425314610483575b600080fd5b34801561040a57600080fd5b5061041e610419366004614e9d565b610d10565b6040519081526020015b60405180910390f35b34801561043d57600080fd5b5061045161044c3660046150a6565b610da9565b6040519015158152602001610428565b34801561046d57600080fd5b5061048161047c3660046150e0565b610dba565b005b34801561048f57600080fd5b5061041e61049e366004615083565b60008281526011602090815260408083206001600160a01b0385168452600b0190915290205492915050565b3480156104d657600080fd5b506104df610df0565b60405161042891906155c6565b3480156104f857600080fd5b50610451610507366004615004565b610e82565b34801561051857600080fd5b506104df61052736600461506a565b610ef0565b34801561053857600080fd5b50610481610547366004614c25565b610f8a565b34801561055857600080fd5b50610481610567366004614ec7565b610fbd565b34801561057857600080fd5b50610481611007565b34801561058d57600080fd5b5061041e61059c36600461506a565b60009081526020819052604090206001015490565b3480156105bd57600080fd5b506104816105cc366004615083565b611198565b3480156105dd57600080fd5b506104516105ec36600461506a565b611267565b3480156105fd57600080fd5b5061048161060c3660046151ca565b61129c565b34801561061d57600080fd5b5061048161062c366004614c73565b611300565b34801561063d57600080fd5b5061048161064c366004615083565b611390565b34801561065d57600080fd5b5061048161066c366004615083565b6113b6565b34801561067d57600080fd5b5061048161068c366004614ec7565b611434565b34801561069d57600080fd5b506104816106ac3660046151ca565b6114c0565b3480156106bd57600080fd5b50610481611563565b3480156106d257600080fd5b506104516106e136600461506a565b60009081526011602052604090205460ff1690565b34801561070257600080fd5b506104816107113660046151ca565b611597565b34801561072257600080fd5b506104816107313660046151ca565b611667565b34801561074257600080fd5b5061075661075136600461506a565b6116cb565b6040516104289b9a99989796959493929190615556565b34801561077957600080fd5b50600b5461078d906001600160a01b031681565b6040516001600160a01b039091168152602001610428565b3480156107b157600080fd5b506104816107c03660046151ec565b6117bb565b3480156107d157600080fd5b5061041e600e5481565b3480156107e757600080fd5b506107fb6107f6366004614f36565b6119d8565b6040516104289190615515565b34801561081457600080fd5b5061048161082336600461506a565b611b01565b34801561083457600080fd5b5061045161084336600461506a565b600090815260056020526040902054151590565b610481610865366004614f99565b611b6b565b34801561087657600080fd5b506104816108853660046151ca565b611f46565b34801561089657600080fd5b5060045460ff16610451565b3480156108ae57600080fd5b506104816108bd366004614e00565b612016565b3480156108ce57600080fd5b506104816108dd366004614efa565b612059565b3480156108ee57600080fd5b5061041e6108fd366004614c25565b6120eb565b34801561090e57600080fd5b50610481612137565b34801561092357600080fd5b5061041e600d5481565b34801561093957600080fd5b50600c5461078d906001600160a01b031681565b34801561095957600080fd5b5061048161216b565b34801561096e57600080fd5b5061048161097d3660046151ca565b61219d565b34801561098e57600080fd5b5061048161099d366004615114565b612201565b3480156109ae57600080fd5b506006546001600160a01b031661078d565b3480156109cc57600080fd5b506104516109db366004615083565b612465565b3480156109ec57600080fd5b506104816109fb3660046151ca565b61248e565b348015610a0c57600080fd5b506104df6124f2565b348015610a2157600080fd5b5061041e610a30366004614c25565b60106020526000908152604090205481565b348015610a4e57600080fd5b5061041e600081565b348015610a6357600080fd5b50610481610a72366004614e73565b612501565b348015610a8357600080fd5b50610481610a9236600461506a565b61250c565b610481610aa53660046151ca565b612573565b348015610ab657600080fd5b50610451610ac5366004614c25565b600f6020526000908152604090205460ff1681565b348015610ae657600080fd5b506104df612736565b348015610afb57600080fd5b50610481610b0a366004614efa565b6127c4565b348015610b1b57600080fd5b50610451610b2a36600461506a565b612856565b348015610b3b57600080fd5b50610481610b4a36600461514f565b6128bc565b348015610b5b57600080fd5b5061041e610b6a36600461506a565b60009081526005602052604090205490565b610481610b8a366004614f99565b61292d565b610481610b9d3660046151ca565b612d86565b348015610bae57600080fd5b50610481610bbd366004615083565b612f01565b348015610bce57600080fd5b50610481610bdd366004614d80565b612f27565b348015610bee57600080fd5b50610481610bfd3660046151ca565b612fcd565b348015610c0e57600080fd5b506104df613031565b348015610c2357600080fd5b50610451610c32366004614c40565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b348015610c6c57600080fd5b5061041e610c7b36600461506a565b60009081526011602052604090206008015490565b348015610c9c57600080fd5b50610481610cab3660046151ca565b61303e565b348015610cbc57600080fd5b50610481610ccb366004614d1c565b61310e565b348015610cdc57600080fd5b50610481610ceb366004614c25565b613153565b348015610cfc57600080fd5b50610481610d0b366004614ec7565b6131eb565b60006001600160a01b038316610d815760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6000610db482613223565b92915050565b6006546001600160a01b03163314610de45760405162461bcd60e51b8152600401610d78906158b5565b610ded81613263565b50565b606060078054610dff90615b42565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90615b42565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b5050505050905090565b600080805b84811015610ee25783868683818110610ea257610ea2615bda565b905060200201351415610ed05781610eb981615ba9565b9250506001821115610ed057600092505050610ee9565b80610eda81615ba9565b915050610e87565b5060019150505b9392505050565b60008181526005602052604081205460609110610f485760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610d78565b610f5182613276565b6000838152601160209081526040918290209151610f7493926009019101615325565b6040516020818303038152906040529050919050565b6006546001600160a01b03163314610fb45760405162461bcd60e51b8152600401610d78906158b5565b610ded81613153565b6006546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610d78906158b5565b6110028382846040518060200160405280600081525061330a565b505050565b6006546001600160a01b031633146110315760405162461bcd60e51b8152600401610d78906158b5565b600d5447906000906064906110469084615ac9565b6110509190615aa7565b9050600061105e8284615ae8565b600b546040519192506000916001600160a01b039091169084908381818185875af1925050503d80600081146110b0576040519150601f19603f3d011682016040523d82523d6000602084013e6110b5565b606091505b50509050806110fa5760405162461bcd60e51b81526020600482015260116024820152702a3930b739b332b918903330b4b632b21760791b6044820152606401610d78565b600c546040516000916001600160a01b03169084908381818185875af1925050503d8060008114611147576040519150601f19603f3d011682016040523d82523d6000602084013e61114c565b606091505b50509050806111915760405162461bcd60e51b81526020600482015260116024820152702a3930b739b332b919103330b4b632b21760791b6044820152606401610d78565b5050505050565b6006546001600160a01b031633146111c25760405162461bcd60e51b8152600401610d78906158b5565b6111cb82612856565b6111e75760405162461bcd60e51b8152600401610d78906158ea565b6001600160a01b0381166112365760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b6044820152606401610d78565b600091825260116020526040909120600a0180546001600160a01b0319166001600160a01b03909216919091179055565b6000818152601160205260408120600101544210801590610db457505060009081526011602052604090206002015442111590565b6006546001600160a01b031633146112c65760405162461bcd60e51b8152600401610d78906158b5565b6112cf82612856565b6112eb5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060050155565b6001600160a01b03851633148061131c575061131c8533610c32565b6113835760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610d78565b6111918585858585613316565b6000828152602081905260409020600101546113ac81336134c3565b6110028383613527565b6001600160a01b03811633146114265760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610d78565b61143082826135ab565b5050565b6000828152601160205260409020600a01546001600160a01b031633146114b55760405162461bcd60e51b815260206004820152602f60248201527f4275726e61626c653a204f6e6c7920616c6c6f7765642066726f6d207265646560448201526e195b58589b194818dbdb9d1c9858dd608a1b6064820152608401610d78565b611002838383613610565b6006546001600160a01b031633146114ea5760405162461bcd60e51b8152600401610d78906158b5565b60646114f68284615a8f565b11156115585760405162461bcd60e51b815260206004820152602b60248201527f546f74616c2070657263656e746167652063616e6e6f7420626520677265617460448201526a06572207468616e203130360ac1b6064820152608401610d78565b600d91909155600e55565b6006546001600160a01b0316331461158d5760405162461bcd60e51b8152600401610d78906158b5565b61159561361b565b565b6006546001600160a01b031633146115c15760405162461bcd60e51b8152600401610d78906158b5565b6115ca82612856565b6115e65760405162461bcd60e51b8152600401610d78906158ea565b600082815260116020526040902060020154811180156116065750600081115b6116525760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206265206166746572207075626c696320636c6f73696e6700006044820152606401610d78565b60009182526011602052604090912060030155565b6006546001600160a01b031633146116915760405162461bcd60e51b8152600401610d78906158b5565b61169a82612856565b6116b65760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060060155565b601160205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a01805460ff909a169a989997989697959694959394929391929161172990615b42565b80601f016020809104026020016040519081016040528092919081815260200182805461175590615b42565b80156117a25780601f10611777576101008083540402835291602001916117a2565b820191906000526020600020905b81548152906001019060200180831161178557829003601f168201915b505050600a90930154919250506001600160a01b03168b565b6006546001600160a01b031633146117e55760405162461bcd60e51b8152600401610d78906158b5565b888a106118045760405162461bcd60e51b8152600401610d789061570b565b8789106118235760405162461bcd60e51b8152600401610d789061570b565b6000891180156118335750600088115b801561183f575060008a115b6118955760405162461bcd60e51b815260206004820152602160248201527f6164644d696e745469636b65743a2077696e646f772063616e6e6f74206265206044820152600360fc1b6064820152608401610d78565b42891180156118a35750428a115b6119085760405162461bcd60e51b815260206004820152603060248201527f6164644d696e745469636b65743a206f70656e2077696e646f772063616e6e6f60448201526f1d081899481a5b881d1a19481c185cdd60821b6064820152608401610d78565b6001600160a01b03821661192e5760405162461bcd60e51b8152600401610d78906159e1565b60006011600061193d600a5490565b8152602080820192909252604001600020805460ff19168155600181018d9055600281018c9055600381018b9055600481018a90556005810189905560078101889055600681018490556008810187905585519092506119a591600984019190870190614946565b50600a81810180546001600160a01b0319166001600160a01b038616179055805460010190555050505050505050505050565b60608151835114611a3d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610d78565b600083516001600160401b03811115611a5857611a58615bf0565b604051908082528060200260200182016040528015611a81578160200160208202803683370190505b50905060005b8451811015611af957611acc858281518110611aa557611aa5615bda565b6020026020010151858381518110611abf57611abf615bda565b6020026020010151610d10565b828281518110611ade57611ade615bda565b6020908102919091010152611af281615ba9565b9050611a87565b509392505050565b6006546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610d78906158b5565b611b3481612856565b611b505760405162461bcd60e51b8152600401610d78906158ea565b6000908152601160205260409020805460ff19166001179055565b60026009541415611b8e5760405162461bcd60e51b8152600401610d78906159aa565b6002600955346000805b83811015611dbf57611bc38585878785818110611bb757611bb7615bda565b90506020020135610e82565b611c035760405162461bcd60e51b8152602060048201526011602482015270496e646578206973206475706c6361746560781b6044820152606401610d78565b611c3d878783818110611c1857611c18615bda565b90506020020135868684818110611c3157611c31615bda565b905060200201356136ae565b611c895760405162461bcd60e51b815260206004820152601e60248201527f4f6e65206f72206d6f726520636c61696d732061726520696e76616c696400006044820152606401610d78565b600060116000878785818110611ca157611ca1615bda565b90506020020135815260200190815260200160002060040154888884818110611ccc57611ccc615bda565b90506020020135611cdd9190615ac9565b9050611ce98184615a8f565b9250611cf58185615ae8565b9350878783818110611d0957611d09615bda565b9050602002013560116000888886818110611d2657611d26615bda565b905060200201358152602001908152602001600020600b016000336001600160a01b03166001600160a01b0316815260200190815260200160002054611d6c9190615a8f565b60116000888886818110611d8257611d82615bda565b602090810292909201358352508181019290925260409081016000908120338252600b019092529020555080611db781615ba9565b915050611b98565b5080341015611e065760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610d78565b8115611e7657604051600090339084908381818185875af1925050503d8060008114611e4e576040519150601f19603f3d011682016040523d82523d6000602084013e611e53565b606091505b5050905080611e745760405162461bcd60e51b8152600401610d7890615834565b505b611ef23385858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920182905250604080516020810190915290815292506139bd915050565b336001600160a01b03167f1f36743b8f77937c5a06ebeca4819ea0c795222f7ecf5a42583ff5d0063adabf85858989604051611f3194939291906154ee565b60405180910390a25050600160095550505050565b6006546001600160a01b03163314611f705760405162461bcd60e51b8152600401610d78906158b5565b611f7982612856565b611f955760405162461bcd60e51b8152600401610d78906158ea565b60008281526011602052604090206003015481108015611fb55750600081115b6120015760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206265206166746572207075626c696320636c6f73696e6700006044820152606401610d78565b60009182526011602052604090912060020155565b6001600160a01b03831633148061203257506120328333610c32565b61204e5760405162461bcd60e51b8152600401610d78906156c2565b6110028383836139c9565b6006546001600160a01b031633146120835760405162461bcd60e51b8152600401610d78906158b5565b60005b8151811015611430576001600f60008484815181106120a7576120a7615bda565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806120e381615ba9565b915050612086565b6001600160a01b0381166000908152600f602052604081205460ff1661211357506000919050565b6001600160a01b038216600090815260106020526040902054610db4906003615ae8565b6006546001600160a01b031633146121615760405162461bcd60e51b8152600401610d78906158b5565b61159560006139d4565b6006546001600160a01b031633146121955760405162461bcd60e51b8152600401610d78906158b5565b611595613a26565b6006546001600160a01b031633146121c75760405162461bcd60e51b8152600401610d78906158b5565b6121d082612856565b6121ec5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060040155565b6006546001600160a01b0316331461222b5760405162461bcd60e51b8152600401610d78906158b5565b6122358135612856565b6122515760405162461bcd60e51b8152600401610d78906158ea565b80606001358160400135106122785760405162461bcd60e51b8152600401610d7890615621565b806080013581606001351061229f5760405162461bcd60e51b8152600401610d7890615621565b600081606001351180156122b7575060008160800135115b80156122c7575060008160400135115b61231e5760405162461bcd60e51b815260206004820152602260248201527f656469744d696e745469636b65743a2077696e646f772063616e6e6f74206265604482015261020360f41b6064820152608401610d78565b600061233261018083016101608401614c25565b6001600160a01b031614156123595760405162461bcd60e51b8152600401610d78906159e1565b803560009081526011602052604090819020908201356001820155606082013560028201556080820135600382015560a0820135600482015560c0820135600582015561010082013560078201556101208201356008909101556123c1610140820182615a26565b823560009081526011602052604090206123e0926009909101916149ca565b506123f361018082016101608301614c25565b8135600090815260116020908152604091829020600a0180546001600160a01b0319166001600160a01b0394909416939093179092556124389190830190830161504f565b81356000908152601160205260409020805460ff191691151591909117815560e090910135600690910155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6006546001600160a01b031633146124b85760405162461bcd60e51b8152600401610d78906158b5565b6124c182612856565b6124dd5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060070155565b606060088054610dff90615b42565b611430338383613aa1565b6006546001600160a01b031633146125365760405162461bcd60e51b8152600401610d78906158b5565b61253f81612856565b61255b5760405162461bcd60e51b8152600401610d78906158ea565b6000908152601160205260409020805460ff19169055565b600260095414156125965760405162461bcd60e51b8152600401610d78906159aa565b60026009556125a58282613b82565b6125ae57600080fd5b6000818152601160205260408120600401546125ca9084615ac9565b6125d49034615ae8565b9050801561264657604051600090339083908381818185875af1925050503d806000811461261e576040519150601f19603f3d011682016040523d82523d6000602084013e612623565b606091505b50509050806126445760405162461bcd60e51b8152600401610d7890615834565b505b6000828152601160209081526040808320338452600b0190915290205461266e908490615a8f565b6000838152601160209081526040808320338452600b0182528083209390935560109052908120546126a1908590615a8f565b905060038111156126c45760405162461bcd60e51b8152600401610d78906157a6565b6126df3384866040518060200160405280600081525061330a565b3360008181526010602090815260409182902084905581518681529081018790527f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026910160405180910390a2505060016009555050565b6008805461274390615b42565b80601f016020809104026020016040519081016040528092919081815260200182805461276f90615b42565b80156127bc5780601f10612791576101008083540402835291602001916127bc565b820191906000526020600020905b81548152906001019060200180831161279f57829003601f168201915b505050505081565b6006546001600160a01b031633146127ee5760405162461bcd60e51b8152600401610d78906158b5565b60005b8151811015611430576000600f600084848151811061281257612812615bda565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061284e81615ba9565b9150506127f1565b6000818152601160205260408120600201546128b45760405162461bcd60e51b815260206004820152601a60248201527f4d696e74205469636b657420646f6573206e6f742065786973740000000000006044820152606401610d78565b506001919050565b6006546001600160a01b031633146128e65760405162461bcd60e51b8152600401610d78906158b5565b6128ef83612856565b61290b5760405162461bcd60e51b8152600401610d78906158ea565b60008381526011602052604090206129279060090183836149ca565b50505050565b600260095414156129505760405162461bcd60e51b8152600401610d78906159aa565b6002600955336000908152601060205260408120543491805b84811015612bf5576129888686888885818110611bb757611bb7615bda565b6129ca5760405162461bcd60e51b8152602060048201526013602482015272125b99195e081a5cc8191d5c1b1a58d85d1959606a1b6044820152606401610d78565b612a048888838181106129df576129df615bda565b905060200201358787848181106129f8576129f8615bda565b90506020020135613b82565b612a505760405162461bcd60e51b815260206004820152601e60248201527f4f6e65206f72206d6f726520636c61696d732061726520696e76616c696400006044820152606401610d78565b878782818110612a6257612a62615bda565b9050602002013560116000888885818110612a7f57612a7f615bda565b905060200201358152602001908152602001600020600b016000336001600160a01b03166001600160a01b0316815260200190815260200160002054612ac59190615a8f565b60116000888885818110612adb57612adb615bda565b905060200201358152602001908152602001600020600b016000336001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060116000888885818110612b3257612b32615bda565b90506020020135815260200190815260200160002060040154898984818110612b5d57612b5d615bda565b90506020020135612b6e9190615ac9565b9050888883818110612b8257612b82615bda565b9050602002013584612b949190615a8f565b9350612ba08184615a8f565b9250612bac8186615ae8565b600c549095506001600160a01b03163314612be2576003841115612be25760405162461bcd60e51b8152600401610d78906157a6565b5080612bed81615ba9565b915050612969565b5080341015612c3c5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610d78565b8215612cac57604051600090339085908381818185875af1925050503d8060008114612c84576040519150601f19603f3d011682016040523d82523d6000602084013e612c89565b606091505b5050905080612caa5760405162461bcd60e51b8152600401610d7890615834565b505b612d283386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920182905250604080516020810190915290815292506139bd915050565b3360008181526010602052604090819020849055517f1f36743b8f77937c5a06ebeca4819ea0c795222f7ecf5a42583ff5d0063adabf90612d7090889088908c908c906154ee565b60405180910390a2505060016009555050505050565b60026009541415612da95760405162461bcd60e51b8152600401610d78906159aa565b6002600955612db882826136ae565b612dc157600080fd5b600081815260116020526040812060040154612ddd9084615ac9565b612de79034615ae8565b90508015612e5957604051600090339083908381818185875af1925050503d8060008114612e31576040519150601f19603f3d011682016040523d82523d6000602084013e612e36565b606091505b5050905080612e575760405162461bcd60e51b8152600401610d7890615834565b505b6000828152601160209081526040808320338452600b01909152902054612e81908490615a8f565b600083815260116020908152604080832033808552600b90910183528184209490945580519182019052908152612ebc91908490869061330a565b604080518381526020810185905233917f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026910160405180910390a25050600160095550565b600082815260208190526040902060010154612f1d81336134c3565b61100283836135ab565b6006546001600160a01b03163314612f515760405162461bcd60e51b8152600401610d78906158b5565b6111918583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920182905250604080516020810190915290815292506139bd915050565b6006546001600160a01b03163314612ff75760405162461bcd60e51b8152600401610d78906158b5565b61300082612856565b61301c5760405162461bcd60e51b8152600401610d78906158ea565b60009182526011602052604090912060080155565b6007805461274390615b42565b6006546001600160a01b031633146130685760405162461bcd60e51b8152600401610d78906158b5565b61307182612856565b61308d5760405162461bcd60e51b8152600401610d78906158ea565b600082815260116020526040902060020154811080156130ad5750600081115b6130f95760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206265206166746572207075626c6963206f70656e696e6700006044820152606401610d78565b60009182526011602052604090912060010155565b6001600160a01b03851633148061312a575061312a8533610c32565b6131465760405162461bcd60e51b8152600401610d78906156c2565b6111918585858585613d7c565b6006546001600160a01b0316331461317d5760405162461bcd60e51b8152600401610d78906158b5565b6001600160a01b0381166131e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d78565b610ded816139d4565b6001600160a01b03831633148061320757506132078333610c32565b6114b55760405162461bcd60e51b8152600401610d78906156c2565b60006001600160e01b03198216636cdb3d1360e11b148061325457506001600160e01b031982166303a24d0760e21b145b80610db45750610db482613eac565b8051611430906003906020840190614946565b60606003805461328590615b42565b80601f01602080910402602001604051908101604052809291908181526020018280546132b190615b42565b80156132fe5780601f106132d3576101008083540402835291602001916132fe565b820191906000526020600020905b8154815290600101906020018083116132e157829003601f168201915b50505050509050919050565b61292784848484613ee1565b81518351146133375760405162461bcd60e51b8152600401610d7890615921565b6001600160a01b03841661335d5760405162461bcd60e51b8152600401610d7890615761565b3361336c818787878787613faa565b60005b845181101561345557600085828151811061338c5761338c615bda565b6020026020010151905060008583815181106133aa576133aa615bda565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156133fb5760405162461bcd60e51b8152600401610d789061586b565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061343a908490615a8f565b925050819055505050508061344e90615ba9565b905061336f565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516134a5929190615528565b60405180910390a46134bb818787878787613fb8565b505050505050565b6134cd8282612465565b611430576134e5816001600160a01b03166014614123565b6134f0836020614123565b6040516020016135019291906153d6565b60408051601f198184030181529082905262461bcd60e51b8252610d78916004016155c6565b6135318282612465565b611430576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556135673390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6135b58282612465565b15611430576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6110028383836142be565b60045460ff166136645760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d78565b6004805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008181526011602052604081205460ff166136fd5760405162461bcd60e51b815260206004820152600e60248201526d14d85b19481a5cc81c185d5cd95960921b6044820152606401610d78565b60045460ff161561374c5760405162461bcd60e51b815260206004820152601960248201527810db185a5b4e8818db185a5b5a5b99c81a5cc81c185d5cd959603a1b6044820152606401610d78565b6000828152601160205260409020600201544211801561377c575060008281526011602052604090206003015442105b6137c85760405162461bcd60e51b815260206004820152601960248201527f436c61696d3a2074696d652077696e646f7720636c6f736564000000000000006044820152606401610d78565b6000828152601160205260409020600401546137e49084615ac9565b3410156138335760405162461bcd60e51b815260206004820152601c60248201527f436c61696d3a2045746865722076616c756520696e636f7272656374000000006044820152606401610d78565b60008281526011602090815260408083206006810154338552600b90910190925290912054613863908590615a8f565b11156138cf5760405162461bcd60e51b815260206004820152603560248201527f436c61696d3a204e6f7420616c6c6f77656420746f20636c61696d2074686174604482015274081b585b9e48199c9bdb481bdb99481dd85b1b195d605a1b6064820152608401610d78565b60008281526011602052604090206007015483111561393e5760405162461bcd60e51b815260206004820152602560248201527f4d6178207175616e7469747920706572207472616e73616374696f6e20657863604482015264195959195960da1b6064820152608401610d78565b6000828152601160209081526040808320600590810154925290912054613966908590615a8f565b11156139b45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610d78565b50600192915050565b612927848484846143c3565b61100283838361451e565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60045460ff1615613a6c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d78565b6004805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136913390565b816001600160a01b0316836001600160a01b03161415613b155760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610d78565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008181526011602052604081205460ff16613bd15760405162461bcd60e51b815260206004820152600e60248201526d14d85b19481a5cc81c185d5cd95960921b6044820152606401610d78565b60045460ff1615613c205760405162461bcd60e51b815260206004820152601960248201527810db185a5b4e8818db185a5b5a5b99c81a5cc81c185d5cd959603a1b6044820152606401610d78565b82613c5d5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a590818dbdd5b9d609a1b6044820152606401610d78565b336000908152600f602052604090205460ff16613cbc5760405162461bcd60e51b815260206004820181905260248201527f41646472657373206e6f74206f6e206561726c7920616363657373206c6973746044820152606401610d78565b613cc582611267565b613d115760405162461bcd60e51b815260206004820152601c60248201527f4561726c79206163636573732077696e646f77206e6f74206f70656e000000006044820152606401610d78565b600082815260116020526040902060040154613d2d9084615ac9565b34101561393e5760405162461bcd60e51b815260206004820152601c60248201527f436c61696d3a2045746865722076616c756520696e636f7272656374000000006044820152606401610d78565b6001600160a01b038416613da25760405162461bcd60e51b8152600401610d7890615761565b33613dc1818787613db2886146af565b613dbb886146af565b87613faa565b60008481526001602090815260408083206001600160a01b038a16845290915290205483811015613e045760405162461bcd60e51b8152600401610d789061586b565b60008581526001602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290613e43908490615a8f565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613ea38288888888886146fa565b50505050505050565b60006001600160e01b03198216637965db0b60e01b1480610db457506301ffc9a760e01b6001600160e01b0319831614610db4565b6001600160a01b038416613f075760405162461bcd60e51b8152600401610d7890615969565b33613f1881600087613db2886146af565b60008481526001602090815260408083206001600160a01b038916845290915281208054859290613f4a908490615a8f565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611191816000878787876146fa565b6134bb8686868686866147c4565b6001600160a01b0384163b156134bb5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613ffc908990899088908890889060040161544b565b602060405180830381600087803b15801561401657600080fd5b505af1925050508015614046575060408051601f3d908101601f19168201909252614043918101906150c3565b60015b6140f357614052615c06565b806308c379a0141561408c5750614067615c22565b80614072575061408e565b8060405162461bcd60e51b8152600401610d7891906155c6565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610d78565b6001600160e01b0319811663bc197c8160e01b14613ea35760405162461bcd60e51b8152600401610d78906155d9565b60606000614132836002615ac9565b61413d906002615a8f565b6001600160401b0381111561415457614154615bf0565b6040519080825280601f01601f19166020018201604052801561417e576020820181803683370190505b509050600360fc1b8160008151811061419957614199615bda565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106141c8576141c8615bda565b60200101906001600160f81b031916908160001a90535060006141ec846002615ac9565b6141f7906001615a8f565b90505b600181111561426f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061422b5761422b615bda565b1a60f81b82828151811061424157614241615bda565b60200101906001600160f81b031916908160001a90535060049490941c9361426881615b2b565b90506141fa565b508315610ee95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d78565b6001600160a01b0383166142e45760405162461bcd60e51b8152600401610d78906157f1565b33614313818560006142f5876146af565b6142fe876146af565b60405180602001604052806000815250613faa565b60008381526001602090815260408083206001600160a01b0388168452909152902054828110156143565760405162461bcd60e51b8152600401610d789061567e565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384166143e95760405162461bcd60e51b8152600401610d7890615969565b815183511461440a5760405162461bcd60e51b8152600401610d7890615921565b3361441a81600087878787613faa565b60005b84518110156144b65783818151811061443857614438615bda565b60200260200101516001600087848151811061445657614456615bda565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461449e9190615a8f565b909155508190506144ae81615ba9565b91505061441d565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051614507929190615528565b60405180910390a461119181600087878787613fb8565b6001600160a01b0383166145445760405162461bcd60e51b8152600401610d78906157f1565b80518251146145655760405162461bcd60e51b8152600401610d7890615921565b600033905061458881856000868660405180602001604052806000815250613faa565b60005b83518110156146505760008482815181106145a8576145a8615bda565b6020026020010151905060008483815181106145c6576145c6615bda565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156146175760405162461bcd60e51b8152600401610d789061567e565b60009283526001602090815260408085206001600160a01b038b168652909152909220910390558061464881615ba9565b91505061458b565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516146a1929190615528565b60405180910390a450505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106146e9576146e9615bda565b602090810291909101015292915050565b6001600160a01b0384163b156134bb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061473e90899089908890889088906004016154a9565b602060405180830381600087803b15801561475857600080fd5b505af1925050508015614788575060408051601f3d908101601f19168201909252614785918101906150c3565b60015b61479457614052615c06565b6001600160e01b0319811663f23a6e6160e01b14613ea35760405162461bcd60e51b8152600401610d78906155d9565b6147d28686868686866148de565b6001600160a01b0385166148595760005b8351811015614857578281815181106147fe576147fe615bda565b60200260200101516005600086848151811061481c5761481c615bda565b6020026020010151815260200190815260200160002060008282546148419190615a8f565b90915550614850905081615ba9565b90506147e3565b505b6001600160a01b0384166134bb5760005b8351811015613ea35782818151811061488557614885615bda565b6020026020010151600560008684815181106148a3576148a3615bda565b6020026020010151815260200190815260200160002060008282546148c89190615ae8565b909155506148d7905081615ba9565b905061486a565b60045460ff16156134bb5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610d78565b82805461495290615b42565b90600052602060002090601f01602090048101928261497457600085556149ba565b82601f1061498d57805160ff19168380011785556149ba565b828001600101855582156149ba579182015b828111156149ba57825182559160200191906001019061499f565b506149c6929150614a3e565b5090565b8280546149d690615b42565b90600052602060002090601f0160209004810192826149f857600085556149ba565b82601f10614a115782800160ff198235161785556149ba565b828001600101855582156149ba579182015b828111156149ba578235825591602001919060010190614a23565b5b808211156149c65760008155600101614a3f565b80356001600160a01b0381168114614a6a57600080fd5b919050565b600082601f830112614a8057600080fd5b81356020614a8d82615a6c565b604051614a9a8282615b7d565b8381528281019150858301600585901b87018401881015614aba57600080fd5b60005b85811015614ae057614ace82614a53565b84529284019290840190600101614abd565b5090979650505050505050565b60008083601f840112614aff57600080fd5b5081356001600160401b03811115614b1657600080fd5b6020830191508360208260051b8501011115614b3157600080fd5b9250929050565b600082601f830112614b4957600080fd5b81356020614b5682615a6c565b604051614b638282615b7d565b8381528281019150858301600585901b87018401881015614b8357600080fd5b60005b85811015614ae057813584529284019290840190600101614b86565b80358015158114614a6a57600080fd5b600082601f830112614bc357600080fd5b81356001600160401b03811115614bdc57614bdc615bf0565b604051614bf3601f8301601f191660200182615b7d565b818152846020838601011115614c0857600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215614c3757600080fd5b610ee982614a53565b60008060408385031215614c5357600080fd5b614c5c83614a53565b9150614c6a60208401614a53565b90509250929050565b600080600080600060a08688031215614c8b57600080fd5b614c9486614a53565b9450614ca260208701614a53565b935060408601356001600160401b0380821115614cbe57600080fd5b614cca89838a01614b38565b94506060880135915080821115614ce057600080fd5b614cec89838a01614b38565b93506080880135915080821115614d0257600080fd5b50614d0f88828901614bb2565b9150509295509295909350565b600080600080600060a08688031215614d3457600080fd5b614d3d86614a53565b9450614d4b60208701614a53565b9350604086013592506060860135915060808601356001600160401b03811115614d7457600080fd5b614d0f88828901614bb2565b600080600080600060608688031215614d9857600080fd5b614da186614a53565b945060208601356001600160401b0380821115614dbd57600080fd5b614dc989838a01614aed565b90965094506040880135915080821115614de257600080fd5b50614def88828901614aed565b969995985093965092949392505050565b600080600060608486031215614e1557600080fd5b614e1e84614a53565b925060208401356001600160401b0380821115614e3a57600080fd5b614e4687838801614b38565b93506040860135915080821115614e5c57600080fd5b50614e6986828701614b38565b9150509250925092565b60008060408385031215614e8657600080fd5b614e8f83614a53565b9150614c6a60208401614ba2565b60008060408385031215614eb057600080fd5b614eb983614a53565b946020939093013593505050565b600080600060608486031215614edc57600080fd5b614ee584614a53565b95602085013595506040909401359392505050565b600060208284031215614f0c57600080fd5b81356001600160401b03811115614f2257600080fd5b614f2e84828501614a6f565b949350505050565b60008060408385031215614f4957600080fd5b82356001600160401b0380821115614f6057600080fd5b614f6c86838701614a6f565b93506020850135915080821115614f8257600080fd5b50614f8f85828601614b38565b9150509250929050565b60008060008060408587031215614faf57600080fd5b84356001600160401b0380821115614fc657600080fd5b614fd288838901614aed565b90965094506020870135915080821115614feb57600080fd5b50614ff887828801614aed565b95989497509550505050565b60008060006040848603121561501957600080fd5b83356001600160401b0381111561502f57600080fd5b61503b86828701614aed565b909790965060209590950135949350505050565b60006020828403121561506157600080fd5b610ee982614ba2565b60006020828403121561507c57600080fd5b5035919050565b6000806040838503121561509657600080fd5b82359150614c6a60208401614a53565b6000602082840312156150b857600080fd5b8135610ee981615cab565b6000602082840312156150d557600080fd5b8151610ee981615cab565b6000602082840312156150f257600080fd5b81356001600160401b0381111561510857600080fd5b614f2e84828501614bb2565b60006020828403121561512657600080fd5b81356001600160401b0381111561513c57600080fd5b82016101808185031215610ee957600080fd5b60008060006040848603121561516457600080fd5b8335925060208401356001600160401b038082111561518257600080fd5b818601915086601f83011261519657600080fd5b8135818111156151a557600080fd5b8760208285010111156151b757600080fd5b6020830194508093505050509250925092565b600080604083850312156151dd57600080fd5b50508035926020909101359150565b6000806000806000806000806000806101408b8d03121561520c57600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b01356001600160401b0381111561525357600080fd5b61525f8d828e01614bb2565b93505061526f6101008c01614a53565b91506101208b013590509295989b9194979a5092959850565b81835260006001600160fb1b038311156152a157600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156152ee578151875295820195908201906001016152d2565b509495945050505050565b60008151808452615311816020860160208601615aff565b601f01601f19169290920160200192915050565b6000835160206153388285838901615aff565b845491840191600090600181811c908083168061535657607f831692505b85831081141561537457634e487b7160e01b85526022600452602485fd5b8080156153885760018114615399576153c6565b60ff198516885283880195506153c6565b60008b81526020902060005b858110156153be5781548a8201529084019088016153a5565b505083880195505b50939a9950505050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161540e816017850160208801615aff565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161543f816028840160208801615aff565b01602801949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090615477908301866152be565b828103606084015261548981866152be565b9050828103608084015261549d81856152f9565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906154e3908301846152f9565b979650505050505050565b604081526000615502604083018688615288565b82810360208401526154e3818587615288565b602081526000610ee960208301846152be565b60408152600061553b60408301856152be565b828103602084015261554d81856152be565b95945050505050565b60006101608d151583528c60208401528b60408401528a60608401528960808401528860a08401528760c08401528660e084015285610100840152806101208401526155a4818401866152f9565b91505060018060a01b0383166101408301529c9b505050505050505050505050565b602081526000610ee960208301846152f9565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526037908201527f656469744d696e745469636b65743a206f70656e2077696e646f77206d75737460408201527f206265206265666f726520636c6f73652077696e646f77000000000000000000606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526036908201527f6164644d696e745469636b65743a206f70656e2077696e646f77206d757374206040820152756265206265666f726520636c6f73652077696e646f7760501b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602b908201527f4d6178206561726c792061636365737320636f756e742070657220616464726560408201526a1cdcc8195e18d95959195960aa1b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601e908201527f4572726f722072657475726e696e6720657863657373207061796d656e740000604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f4d696e74207469636b657420646f6573206e6f74206578697374000000000000604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526025908201527f6164644d696e745469636b65743a2063616e6e6f74206265207a65726f206164604082015264647265737360d81b606082015260800190565b6000808335601e19843603018112615a3d57600080fd5b8301803591506001600160401b03821115615a5757600080fd5b602001915036819003821315614b3157600080fd5b60006001600160401b03821115615a8557615a85615bf0565b5060051b60200190565b60008219821115615aa257615aa2615bc4565b500190565b600082615ac457634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615ae357615ae3615bc4565b500290565b600082821015615afa57615afa615bc4565b500390565b60005b83811015615b1a578181015183820152602001615b02565b838111156129275750506000910152565b600081615b3a57615b3a615bc4565b506000190190565b600181811c90821680615b5657607f821691505b60208210811415615b7757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715615ba257615ba2615bf0565b6040525050565b6000600019821415615bbd57615bbd615bc4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115615c1f5760046000803e5060005160e01c5b90565b600060443d1015615c305790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615c5f57505050505090565b8285019150815181811115615c775750505050505090565b843d8701016020828501011115615c915750505050505090565b615ca060208286010187615b7d565b509095945050505050565b6001600160e01b031981168114610ded57600080fdfea264697066735822122082f7fa088f8490014cee04d3a3c4fa9b84b1de6940b3879b85d09fed26aa61bd64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000083ec946ac5914915949f96c078c3324bb8e6561f00000000000000000000000087a9455ba6f034d28a373fdb70be1315a49d63f5000000000000000000000000000000000000000000000000000000000000001a4e656d75732047656e657369732044726f70205469636b65747300000000000000000000000000000000000000000000000000000000000000000000000000044e45415400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Nemus Genesis Drop Tickets
Arg [1] : _symbol (string): NEAT
Arg [2] : _treasuryAddress (address): 0x83EC946AC5914915949F96c078c3324bb8E6561f
Arg [3] : _nemusAddress (address): 0x87a9455ba6f034d28A373FDb70be1315A49d63F5

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000083ec946ac5914915949f96c078c3324bb8e6561f
Arg [3] : 00000000000000000000000087a9455ba6f034d28a373fdb70be1315a49d63f5
Arg [4] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [5] : 4e656d75732047656e657369732044726f70205469636b657473000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4e45415400000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

2740:20139:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2115:228:5;;;;;;;;;;-1:-1:-1;2115:228:5;;;;;:::i;:::-;;:::i;:::-;;;21403:25:21;;;21391:2;21376:18;2115:228:5;;;;;;;;2179:175:0;;;;;;;;;;-1:-1:-1;2179:175:0;;;;;:::i;:::-;;:::i;:::-;;;20229:14:21;;20222:22;20204:41;;20192:2;20177:18;2179:175:0;20064:187:21;538:91:0;;;;;;;;;;-1:-1:-1;538:91:0;;;;;:::i;:::-;;:::i;:::-;;20073:157:15;;;;;;;;;;-1:-1:-1;20073:157:15;;;;;:::i;:::-;20154:7;20180:20;;;:11;:20;;;;;;;;-1:-1:-1;;;;;20180:43:15;;;;:31;;:43;;;;;;20073:157;;;;;639:81:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21407:403:15:-;;;;;;;;;;-1:-1:-1;21407:403:15;;;;;:::i;:::-;;:::i;22637:239::-;;;;;;;;;;-1:-1:-1;22637:239:15;;;;;:::i;:::-;;:::i;2022:91:0:-;;;;;;;;;;-1:-1:-1;2022:91:0;;;;;:::i;:::-;;:::i;17497:158:15:-;;;;;;;;;;-1:-1:-1;17497:158:15;;;;;:::i;:::-;;:::i;22152:479::-;;;;;;;;;;;;;:::i;3882:121:1:-;;;;;;;;;;-1:-1:-1;3882:121:1;;;;;:::i;:::-;3948:7;3974:12;;;;;;;;;;:22;;;;3882:121;11157:340:15;;;;;;;;;;-1:-1:-1;11157:340:15;;;;;:::i;:::-;;:::i;21064:212::-;;;;;;;;;;-1:-1:-1;21064:212:15;;;;;:::i;:::-;;:::i;10008:218::-;;;;;;;;;;-1:-1:-1;10008:218:15;;;;;:::i;:::-;;:::i;3990:430:5:-;;;;;;;;;;-1:-1:-1;3990:430:5;;;;;:::i;:::-;;:::i;4253:145:1:-;;;;;;;;;;-1:-1:-1;4253:145:1;;;;;:::i;:::-;;:::i;5270:214::-;;;;;;;;;;-1:-1:-1;5270:214:1;;;;;:::i;:::-;;:::i;12073:286:15:-;;;;;;;;;;-1:-1:-1;12073:286:15;;;;;:::i;:::-;;:::i;21819:323::-;;;;;;;;;;-1:-1:-1;21819:323:15;;;;;:::i;:::-;;:::i;463:65:0:-;;;;;;;;;;;;;:::i;21282:119:15:-;;;;;;;;;;-1:-1:-1;21282:119:15;;;;;:::i;:::-;21340:4;21363:20;;;:11;:20;;;;;:31;;;;21282:119;9400:382;;;;;;;;;;-1:-1:-1;9400:382:15;;;;;:::i;:::-;;:::i;10466:237::-;;;;;;;;;;-1:-1:-1;10466:237:15;;;;;:::i;:::-;;:::i;3256:49::-;;;;;;;;;;-1:-1:-1;3256:49:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;2976:37::-;;;;;;;;;;-1:-1:-1;2976:37:15;;;;-1:-1:-1;;;;;2976:37:15;;;;;;-1:-1:-1;;;;;17140:32:21;;;17122:51;;17110:2;17095:18;2976:37:15;16976:203:21;5589:1531:15;;;;;;;;;;-1:-1:-1;5589:1531:15;;;;;:::i;:::-;;:::i;3098:30::-;;;;;;;;;;;;;;;;2500:508:5;;;;;;;;;;-1:-1:-1;2500:508:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11694:182:15:-;;;;;;;;;;-1:-1:-1;11694:182:15;;;;;:::i;:::-;;:::i;885:120:8:-;;;;;;;;;;-1:-1:-1;885:120:8;;;;;:::i;:::-;942:4;769:16;;;:12;:16;;;;;;-1:-1:-1;;;885:120:8;13231:1272:15;;;;;;:::i;:::-;;:::i;9017:377::-;;;;;;;;;;-1:-1:-1;9017:377:15;;;;;:::i;:::-;;:::i;1091:84:17:-;;;;;;;;;;-1:-1:-1;1161:7:17;;;;1091:84;;708:342:6;;;;;;;;;;-1:-1:-1;708:342:6;;;;;:::i;:::-;;:::i;20615:229:15:-;;;;;;;;;;-1:-1:-1;20615:229:15;;;;;:::i;:::-;;:::i;20366:243::-;;;;;;;;;;-1:-1:-1;20366:243:15;;;;;:::i;:::-;;:::i;1661:101:16:-;;;;;;;;;;;;;:::i;3059:33:15:-;;;;;;;;;;;;;;;;3019:34;;;;;;;;;;-1:-1:-1;3019:34:15;;;;-1:-1:-1;;;;;3019:34:15;;;396:61:0;;;;;;;;;;;;;:::i;9788:213:15:-;;;;;;;;;;-1:-1:-1;9788:213:15;;;;;:::i;:::-;;:::i;7126:1511::-;;;;;;;;;;-1:-1:-1;7126:1511:15;;;;;:::i;:::-;;:::i;1029:85:16:-;;;;;;;;;;-1:-1:-1;1101:6:16;;-1:-1:-1;;;;;1101:6:16;1029:85;;2799:137:1;;;;;;;;;;-1:-1:-1;2799:137:1;;;;;:::i;:::-;;:::i;10233:227:15:-;;;;;;;;;;-1:-1:-1;10233:227:15;;;;;:::i;:::-;;:::i;726:85:0:-;;;;;;;;;;;;;:::i;3192:58:15:-;;;;;;;;;;-1:-1:-1;3192:58:15;;;;;:::i;:::-;;;;;;;;;;;;;;1917:49:1;;;;;;;;;;-1:-1:-1;1917:49:1;1962:4;1917:49;;3076:153:5;;;;;;;;;;-1:-1:-1;3076:153:5;;;;;:::i;:::-;;:::i;11882:184:15:-;;;;;;;;;;-1:-1:-1;11882:184:15;;;;;:::i;:::-;;:::i;14509:1180::-;;;;;;:::i;:::-;;:::i;3135:51::-;;;;;;;;;;-1:-1:-1;3135:51:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;364:21:0;;;;;;;;;;;;;:::i;20850:208:15:-;;;;;;;;;;-1:-1:-1;20850:208:15;;;;;:::i;:::-;;:::i;11503:185::-;;;;;;;;;;-1:-1:-1;11503:185:15;;;;;:::i;:::-;;:::i;10920:231::-;;;;;;;;;;-1:-1:-1;10920:231:15;;;;;:::i;:::-;;:::i;681:111:8:-;;;;;;;;;;-1:-1:-1;681:111:8;;;;;:::i;:::-;743:7;769:16;;;:12;:16;;;;;;;681:111;15695:1796:15;;;;;;:::i;:::-;;:::i;12367:858::-;;;;;;:::i;:::-;;:::i;4632:147:1:-;;;;;;;;;;-1:-1:-1;4632:147:1;;;;;:::i;:::-;;:::i;17661:194:15:-;;;;;;;;;;-1:-1:-1;17661:194:15;;;;;:::i;:::-;;:::i;10709:205::-;;;;;;;;;;-1:-1:-1;10709:205:15;;;;;:::i;:::-;;:::i;339:19:0:-;;;;;;;;;;;;;:::i;3296:166:5:-;;;;;;;;;;-1:-1:-1;3296:166:5;;;;;:::i;:::-;-1:-1:-1;;;;;3418:27:5;;;3395:4;3418:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3296:166;20236:124:15;;;;;;;;;;-1:-1:-1;20236:124:15;;;;;:::i;:::-;20300:7;20326:20;;;:11;:20;;;;;:27;;;;20236:124;8649:362;;;;;;;;;;-1:-1:-1;8649:362:15;;;;;:::i;:::-;;:::i;3529:389:5:-;;;;;;;;;;-1:-1:-1;3529:389:5;;;;;:::i;:::-;;:::i;1911:198:16:-;;;;;;;;;;-1:-1:-1;1911:198:16;;;;;:::i;:::-;;:::i;392:310:6:-;;;;;;;;;;-1:-1:-1;392:310:6;;;;;:::i;:::-;;:::i;2115:228:5:-;2201:7;-1:-1:-1;;;;;2228:21:5;;2220:77;;;;-1:-1:-1;;;2220:77:5;;24530:2:21;2220:77:5;;;24512:21:21;24569:2;24549:18;;;24542:30;24608:34;24588:18;;;24581:62;-1:-1:-1;;;24659:18:21;;;24652:41;24710:19;;2220:77:5;;;;;;;;;-1:-1:-1;2314:13:5;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;2314:22:5;;;;;;;;;;;;2115:228::o;2179:175:0:-;2288:4;2311:36;2335:11;2311:23;:36::i;:::-;2304:43;2179:175;-1:-1:-1;;2179:175:0:o;538:91::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;606:16:0::1;614:7;606;:16::i;:::-;538:91:::0;:::o;639:81::-;676:13;708:5;701:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;639:81;:::o;21407:403:15:-;21508:4;;;21556:227;21571:18;;;21556:227;;;21628:7;21613:8;;21622:1;21613:11;;;;;;;:::i;:::-;;;;;;;:22;21610:163;;;21655:12;;;;:::i;:::-;;;;21703:1;21690:10;:14;21685:74;;;21735:5;21728:12;;;;;;21685:74;21591:3;;;;:::i;:::-;;;;21556:227;;;;21799:4;21792:11;;;21407:403;;;;;;:::o;22637:239::-;22749:1;769:16:8;;;:12;:16;;;;;;22693:13:15;;-1:-1:-1;22722:55:15;;;;-1:-1:-1;;;22722:55:15;;37159:2:21;22722:55:15;;;37141:21:21;37198:2;37178:18;;;37171:30;-1:-1:-1;;;37217:18:21;;;37210:52;37279:18;;22722:55:15;36957:346:21;22722:55:15;22822:14;22832:3;22822:9;:14::i;:::-;22838:16;;;;:11;:16;;;;;;;;;22805:63;;;;;22838:29;;;22805:63;;:::i;:::-;;;;;;;;;;;;;22791:78;;22637:239;;;:::o;2022:91:0:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;2082:24:0::1;2100:5;2082:17;:24::i;17497:158:15:-:0;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;17615:33:15::1;17621:2;17625:7;17634:9;17615:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;17497:158:::0;;;:::o;22152:479::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;22300:18:15::1;::::0;22233:21:::1;::::0;22208:22:::1;::::0;22320:3:::1;::::0;22283:35:::1;::::0;22233:21;22283:35:::1;:::i;:::-;22282:41;;;;:::i;:::-;22264:59:::0;-1:-1:-1;22333:15:15::1;22351:24;22264:59:::0;22351:14;:24:::1;:::i;:::-;22414:14;::::0;22406:47:::1;::::0;22333:42;;-1:-1:-1;22387:13:15::1;::::0;-1:-1:-1;;;;;22414:14:15;;::::1;::::0;22441:7;;22387:13;22406:47;22387:13;22406:47;22441:7;22414:14;22406:47:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22386:67;;;22471:8;22463:38;;;::::0;-1:-1:-1;;;22463:38:15;;27747:2:21;22463:38:15::1;::::0;::::1;27729:21:21::0;27786:2;27766:18;;;27759:30;-1:-1:-1;;;27805:18:21;;;27798:47;27862:18;;22463:38:15::1;27545:341:21::0;22463:38:15::1;22540:11;::::0;22532:44:::1;::::0;22513:13:::1;::::0;-1:-1:-1;;;;;22540:11:15::1;::::0;22564:7;;22513:13;22532:44;22513:13;22532:44;22564:7;22540:11;22532:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22512:64;;;22594:8;22586:38;;;::::0;-1:-1:-1;;;22586:38:15;;36465:2:21;22586:38:15::1;::::0;::::1;36447:21:21::0;36504:2;36484:18;;;36477:30;-1:-1:-1;;;36523:18:21;;;36516:47;36580:18;;22586:38:15::1;36263:341:21::0;22586:38:15::1;22198:433;;;;;22152:479::o:0;11157:340::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;11278:24:15::1;11295:6;11278:16;:24::i;:::-;11270:63;;;;-1:-1:-1::0;;;11270:63:15::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11351:42:15;::::1;11343:77;;;::::0;-1:-1:-1;;;11343:77:15;;29977:2:21;11343:77:15::1;::::0;::::1;29959:21:21::0;30016:2;29996:18;;;29989:30;-1:-1:-1;;;30035:18:21;;;30028:52;30097:18;;11343:77:15::1;29775:346:21::0;11343:77:15::1;11430:19;::::0;;;:11:::1;:19;::::0;;;;;:38:::1;;:60:::0;;-1:-1:-1;;;;;;11430:60:15::1;-1:-1:-1::0;;;;;11430:60:15;;::::1;::::0;;;::::1;::::0;;11157:340::o;21064:212::-;21129:4;21172:20;;;:11;:20;;;;;:37;;;21153:15;:56;;;;:115;;-1:-1:-1;;21232:20:15;;;;:11;:20;;;;;:36;;;21213:15;:55;;;21064:212::o;10008:218::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;10112:24:15::1;10129:6;10112:16;:24::i;:::-;10104:63;;;;-1:-1:-1::0;;;10104:63:15::1;;;;;;;:::i;:::-;10177:19;::::0;;;:11:::1;:19;::::0;;;;;:29:::1;;:42:::0;10008:218::o;3990:430:5:-;-1:-1:-1;;;;;4215:20:5;;719:10:3;4215:20:5;;:60;;-1:-1:-1;4239:36:5;4256:4;719:10:3;3296:166:5;:::i;4239:36::-;4194:157;;;;-1:-1:-1;;;4194:157:5;;30734:2:21;4194:157:5;;;30716:21:21;30773:2;30753:18;;;30746:30;30812:34;30792:18;;;30785:62;-1:-1:-1;;;30863:18:21;;;30856:48;30921:19;;4194:157:5;30532:414:21;4194:157:5;4361:52;4384:4;4390:2;4394:3;4399:7;4408:4;4361:22;:52::i;4253:145:1:-;3948:7;3974:12;;;;;;;;;;:22;;;2395:30;2406:4;719:10:3;2395::1;:30::i;:::-;4366:25:::1;4377:4;4383:7;4366:10;:25::i;5270:214::-:0;-1:-1:-1;;;;;5365:23:1;;719:10:3;5365:23:1;5357:83;;;;-1:-1:-1;;;5357:83:1;;41743:2:21;5357:83:1;;;41725:21:21;41782:2;41762:18;;;41755:30;41821:34;41801:18;;;41794:62;-1:-1:-1;;;41872:18:21;;;41865:45;41927:19;;5357:83:1;41541:411:21;5357:83:1;5451:26;5463:4;5469:7;5451:11;:26::i;:::-;5270:214;;:::o;12073:286:15:-;12206:20;;;;:11;:20;;;;;:39;;;-1:-1:-1;;;;;12206:39:15;12249:10;12206:53;12198:113;;;;-1:-1:-1;;;12198:113:15;;28093:2:21;12198:113:15;;;28075:21:21;28132:2;28112:18;;;28105:30;28171:34;28151:18;;;28144:62;-1:-1:-1;;;28222:18:21;;;28215:45;28277:19;;12198:113:15;27891:411:21;12198:113:15;12321:31;12327:7;12336;12345:6;12321:5;:31::i;21819:323::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;21990:3:15::1;21948:38;21970:16:::0;21948:19;:38:::1;:::i;:::-;:45;;21940:101;;;::::0;-1:-1:-1;;;21940:101:15;;26109:2:21;21940:101:15::1;::::0;::::1;26091:21:21::0;26148:2;26128:18;;;26121:30;26187:34;26167:18;;;26160:62;-1:-1:-1;;;26238:18:21;;;26231:41;26289:19;;21940:101:15::1;25907:407:21::0;21940:101:15::1;22051:18;:40:::0;;;;22101:15:::1;:34:::0;21819:323::o;463:65:0:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;511:10:0::1;:8;:10::i;:::-;463:65::o:0;9400:382:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;9517:24:15::1;9534:6;9517:16;:24::i;:::-;9509:63;;;;-1:-1:-1::0;;;9509:63:15::1;;;;;;;:::i;:::-;9611:19;::::0;;;:11:::1;:19;::::0;;;;:35:::1;;::::0;9591:55;::::1;9590:84:::0;::::1;;;;9672:1;9652:17;:21;9590:84;9582:127;;;::::0;-1:-1:-1;;;9582:127:15;;33919:2:21;9582:127:15::1;::::0;::::1;33901:21:21::0;33958:2;33938:18;;;33931:30;33997:32;33977:18;;;33970:60;34047:18;;9582:127:15::1;33717:354:21::0;9582:127:15::1;9719:19;::::0;;;:11:::1;:19;::::0;;;;;:36:::1;;:56:::0;9400:382::o;10466:237::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;10579:24:15::1;10596:6;10579:16;:24::i;:::-;10571:63;;;;-1:-1:-1::0;;;10571:63:15::1;;;;;;;:::i;:::-;10644:19;::::0;;;:11:::1;:19;::::0;;;;;:32:::1;;:52:::0;10466:237::o;3256:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3256:49:15;;;;;;;-1:-1:-1;;;;;;;3256:49:15;;:::o;5589:1531::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;6000:16:15::1;5980:17;:36;5972:103;;;;-1:-1:-1::0;;;5972:103:15::1;;;;;;;:::i;:::-;6112:17;6093:16;:36;6085:103;;;;-1:-1:-1::0;;;6085:103:15::1;;;;;;;:::i;:::-;6225:1;6206:16;:20;:45;;;;;6250:1;6230:17;:21;6206:45;:70;;;;;6275:1;6255:17;:21;6206:70;6198:116;;;::::0;-1:-1:-1;;;6198:116:15;;31565:2:21;6198:116:15::1;::::0;::::1;31547:21:21::0;31604:2;31584:18;;;31577:30;31643:34;31623:18;;;31616:62;-1:-1:-1;;;31694:18:21;;;31687:31;31735:19;;6198:116:15::1;31363:397:21::0;6198:116:15::1;6351:15;6332:16;:34;:73;;;;;6390:15;6370:17;:35;6332:73;6324:134;;;::::0;-1:-1:-1;;;6324:134:15;;32328:2:21;6324:134:15::1;::::0;::::1;32310:21:21::0;32367:2;32347:18;;;32340:30;32406:34;32386:18;;;32379:62;-1:-1:-1;;;32457:18:21;;;32450:46;32513:19;;6324:134:15::1;32126:412:21::0;6324:134:15::1;-1:-1:-1::0;;;;;6476:42:15;::::1;6468:92;;;;-1:-1:-1::0;;;6468:92:15::1;;;;;;;:::i;:::-;6572:21;6596:11;:32;6608:19;:9;864:14:4::0;;773:112;6608:19:15::1;6596:32:::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;6596:32:15;6638:21;;-1:-1:-1;;6638:21:15::1;::::0;;;6669:19;::::1;:39:::0;;;6718:18:::1;::::0;::::1;:37:::0;;;6765:19:::1;::::0;::::1;:39:::0;;;6814:12:::1;::::0;::::1;:25:::0;;;6849:12:::1;::::0;::::1;:25:::0;;;6884:16:::1;::::0;::::1;:33:::0;;;6927:15:::1;::::0;::::1;:31:::0;;;6968:9:::1;::::0;::::1;:19:::0;;;6997:31;;6596:32;;-1:-1:-1;6997:31:15::1;::::0;:15:::1;::::0;::::1;::::0;:31;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7038:21:15::1;::::0;;::::1;:43:::0;;-1:-1:-1;;;;;;7038:43:15::1;-1:-1:-1::0;;;;;7038:43:15;::::1;;::::0;;978:19:4;;-1:-1:-1;978:19:4;;;5962:1158:15::1;5589:1531:::0;;;;;;;;;;:::o;2500:508:5:-;2651:16;2710:3;:10;2691:8;:15;:29;2683:83;;;;-1:-1:-1;;;2683:83:5;;39413:2:21;2683:83:5;;;39395:21:21;39452:2;39432:18;;;39425:30;39491:34;39471:18;;;39464:62;-1:-1:-1;;;39542:18:21;;;39535:39;39591:19;;2683:83:5;39211:405:21;2683:83:5;2777:30;2824:8;:15;-1:-1:-1;;;;;2810:30:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2810:30:5;;2777:63;;2856:9;2851:120;2875:8;:15;2871:1;:19;2851:120;;;2930:30;2940:8;2949:1;2940:11;;;;;;;;:::i;:::-;;;;;;;2953:3;2957:1;2953:6;;;;;;;;:::i;:::-;;;;;;;2930:9;:30::i;:::-;2911:13;2925:1;2911:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2892:3;;;:::i;:::-;;;2851:120;;;-1:-1:-1;2988:13:5;2500:508;-1:-1:-1;;;2500:508:5:o;11694:182:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;11766:24:15::1;11783:6;11766:16;:24::i;:::-;11758:63;;;;-1:-1:-1::0;;;11758:63:15::1;;;;;;;:::i;:::-;11832:19;::::0;;;:11:::1;:19;::::0;;;;:37;;-1:-1:-1;;11832:37:15::1;11865:4;11832:37;::::0;;11694:182::o;13231:1272::-;1713:1:18;2309:7;;:19;;2301:63;;;;-1:-1:-1;;;2301:63:18;;;;;;;:::i;:::-;1713:1;2442:7;:18;13399:9:15::1;13375:21;::::0;13530:536:::1;13545:19:::0;;::::1;13530:536;;;13593:49;13618:9;;13629;;13639:1;13629:12;;;;;;;:::i;:::-;;;;;;;13593:24;:49::i;:::-;13585:79;;;::::0;-1:-1:-1;;;13585:79:15;;28509:2:21;13585:79:15::1;::::0;::::1;28491:21:21::0;28548:2;28528:18;;;28521:30;-1:-1:-1;;;28567:18:21;;;28560:47;28624:18;;13585:79:15::1;28307:341:21::0;13585:79:15::1;13686:37;13699:7;;13707:1;13699:10;;;;;;;:::i;:::-;;;;;;;13710:9;;13720:1;13710:12;;;;;;;:::i;:::-;;;;;;;13686;:37::i;:::-;13678:80;;;::::0;-1:-1:-1;;;13678:80:15;;37932:2:21;13678:80:15::1;::::0;::::1;37914:21:21::0;37971:2;37951:18;;;37944:30;38010:32;37990:18;;;37983:60;38060:18;;13678:80:15::1;37730:354:21::0;13678:80:15::1;13772:19;13807:11;:25;13819:9;;13829:1;13819:12;;;;;;;:::i;:::-;;;;;;;13807:25;;;;;;;;;;;:35;;;13794:7;;13802:1;13794:10;;;;;;;:::i;:::-;;;;;;;:48;;;;:::i;:::-;13772:70:::0;-1:-1:-1;13856:30:15::1;13772:70:::0;13856:30;::::1;:::i;:::-;::::0;-1:-1:-1;13900:28:15::1;13917:11:::0;13900:28;::::1;:::i;:::-;;;14045:7;;14053:1;14045:10;;;;;;;:::i;:::-;;;;;;;13994:11;:25;14006:9;;14016:1;14006:12;;;;;;;:::i;:::-;;;;;;;13994:25;;;;;;;;;;;:36;;:48;14031:10;-1:-1:-1::0;;;;;13994:48:15::1;-1:-1:-1::0;;;;;13994:48:15::1;;;;;;;;;;;;;:61;;;;:::i;:::-;13943:11;:25;13955:9;;13965:1;13955:12;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;13943:25:::0;;-1:-1:-1;13943:25:15;;::::1;::::0;;;;;;;;-1:-1:-1;13943:25:15;;;13980:10:::1;13943:48:::0;;:36:::1;;:48:::0;;;;;:112;-1:-1:-1;13566:3:15;::::1;::::0;::::1;:::i;:::-;;;;13530:536;;;;14097:15;14084:9;:28;;14076:60;;;::::0;-1:-1:-1;;;14076:60:15;;36811:2:21;14076:60:15::1;::::0;::::1;36793:21:21::0;36850:2;36830:18;;;36823:30;-1:-1:-1;;;36869:18:21;;;36862:49;36928:18;;14076:60:15::1;36609:343:21::0;14076:60:15::1;14151:17:::0;;14147:196:::1;;14214:43;::::0;14185:23:::1;::::0;719:10:3;;14239:13:15;;14185:23;14214:43;14185:23;14214:43;14239:13;719:10:3;14214:43:15::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14184:73;;;14279:18;14271:61;;;;-1:-1:-1::0;;;14271:61:15::1;;;;;;;:::i;:::-;14170:173;14147:196;14357:46;14368:10;14380:9;;14357:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;14357:46:15::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;14391:7:15;;-1:-1:-1;14391:7:15;;;;14357:46;::::1;::::0;14391:7;;14357:46;14391:7;14357:46;::::1;;::::0;::::1;::::0;;;-1:-1:-1;14357:46:15::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;14357:10:15::1;::::0;-1:-1:-1;;14357:46:15:i:1;:::-;14475:10;-1:-1:-1::0;;;;;14448:47:15::1;;14464:9;;14487:7;;14448:47;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1669:1:18;2621:7;:22;-1:-1:-1;;;;13231:1272:15:o;9017:377::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;9132:24:15::1;9149:6;9132:16;:24::i;:::-;9124:63;;;;-1:-1:-1::0;;;9124:63:15::1;;;;;;;:::i;:::-;9225:19;::::0;;;:11:::1;:19;::::0;;;;:36:::1;;::::0;9206:55;::::1;9205:83:::0;::::1;;;;9286:1;9267:16;:20;9205:83;9197:126;;;::::0;-1:-1:-1;;;9197:126:15;;33919:2:21;9197:126:15::1;::::0;::::1;33901:21:21::0;33958:2;33938:18;;;33931:30;33997:32;33977:18;;;33970:60;34047:18;;9197:126:15::1;33717:354:21::0;9197:126:15::1;9333:19;::::0;;;:11:::1;:19;::::0;;;;;:35:::1;;:54:::0;9017:377::o;708:342:6:-;-1:-1:-1;;;;;867:23:6;;719:10:3;867:23:6;;:66;;-1:-1:-1;894:39:6;911:7;719:10:3;3296:166:5;:::i;894:39:6:-;846:154;;;;-1:-1:-1;;;846:154:6;;;;;;;:::i;:::-;1011:32;1022:7;1031:3;1036:6;1011:10;:32::i;20615:229:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;20715:9:15::1;20710:128;20734:17;:24;20730:1;:28;20710:128;;;20823:4;20779:19;:41;20799:17;20817:1;20799:20;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;20779:41:15::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;20779:41:15;:48;;-1:-1:-1;;20779:48:15::1;::::0;::::1;;::::0;;;::::1;::::0;;20760:3;::::1;::::0;::::1;:::i;:::-;;;;20710:128;;20366:243:::0;-1:-1:-1;;;;;20464:26:15;;20440:7;20464:26;;;:19;:26;;;;;;;;20459:66;;-1:-1:-1;20513:1:15;;20366:243;-1:-1:-1;20366:243:15:o;20459:66::-;-1:-1:-1;;;;;20572:30:15;;;;;;:23;:30;;;;;;20541:61;;2968:1;20541:61;:::i;1661:101:16:-;1101:6;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;396:61:0:-:0;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;442:8:0::1;:6;:8::i;9788:213:15:-:0;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;9887:24:15::1;9904:6;9887:16;:24::i;:::-;9879:63;;;;-1:-1:-1::0;;;9879:63:15::1;;;;;;;:::i;:::-;9952:19;::::0;;;:11:::1;:19;::::0;;;;;:29:::1;;:42:::0;9788:213::o;7126:1511::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;7247:32:15::1;7264:14:::0;::::1;7247:16;:32::i;:::-;7239:71;;;;-1:-1:-1::0;;;7239:71:15::1;;;;;;;:::i;:::-;7355:6;:22;;;7329:6;:23;;;:48;7321:116;;;;-1:-1:-1::0;;;7321:116:15::1;;;;;;;:::i;:::-;7480:6;:23;;;7455:6;:22;;;:48;7447:116;;;;-1:-1:-1::0;;;7447:116:15::1;;;;;;;:::i;:::-;7606:1;7581:6;:22;;;:26;:57;;;;;7637:1;7611:6;:23;;;:27;7581:57;:88;;;;;7668:1;7642:6;:23;;;:27;7581:88;7573:135;;;::::0;-1:-1:-1;;;7573:135:15;;26521:2:21;7573:135:15::1;::::0;::::1;26503:21:21::0;26560:2;26540:18;;;26533:30;26599:34;26579:18;;;26572:62;-1:-1:-1;;;26650:18:21;;;26643:32;26692:19;;7573:135:15::1;26319:398:21::0;7573:135:15::1;7772:1;7734:25;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;7726:48:15::1;;;7718:98;;;;-1:-1:-1::0;;;7718:98:15::1;;;;;;;:::i;:::-;7839:14:::0;::::1;7827:27;::::0;;;:11:::1;:27;::::0;7874:23:::1;7827:27:::0;;;;7874:23;;::::1;;7827:44;::::0;::::1;:70:::0;7953:22:::1;::::0;::::1;;7907:43;::::0;::::1;:68:::0;8032:23:::1;::::0;::::1;;7985:44;::::0;::::1;:70:::0;8105:16:::1;::::0;::::1;;8065:37;::::0;::::1;:56:::0;8173:16:::1;::::0;::::1;;8133:37;::::0;::::1;:56:::0;8247:20:::1;::::0;::::1;;8203:41;::::0;::::1;:64:::0;8314:13:::1;::::0;::::1;;8277:34;::::0;;::::1;:50:::0;8381:19:::1;;::::0;::::1;7874:6:::0;8381:19:::1;:::i;:::-;8350:14:::0;::::1;8338:27;::::0;;;:11:::1;:27;::::0;;;;:62:::1;::::0;:40:::1;::::0;;::::1;::::0;:62:::1;:::i;:::-;-1:-1:-1::0;8463:25:15::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;8426:14:::0;::::1;8414:27;::::0;;;:11:::1;:27;::::0;;;;;;;;:46:::1;;:74:::0;;-1:-1:-1;;;;;;8414:74:15::1;-1:-1:-1::0;;;;;8414:74:15;;;::::1;::::0;;;::::1;::::0;;;8539:17:::1;::::0;;;;;;::::1;;:::i;:::-;8510:14:::0;::::1;8498:27;::::0;;;:11:::1;:27;::::0;;;;:58;;-1:-1:-1;;8498:58:15::1;::::0;::::1;;::::0;;;::::1;::::0;;8610:19:::1;::::0;;::::1;;8567:40;::::0;;::::1;:62:::0;7126:1511::o;2799:137:1:-;2877:4;2900:12;;;;;;;;;;;-1:-1:-1;;;;;2900:29:1;;;;;;;;;;;;;;;2799:137::o;10233:227:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;10338:24:15::1;10355:6;10338:16;:24::i;:::-;10330:63;;;;-1:-1:-1::0;;;10330:63:15::1;;;;;;;:::i;:::-;10403:19;::::0;;;:11:::1;:19;::::0;;;;;:33:::1;;:50:::0;10233:227::o;726:85:0:-;765:13;797:7;790:14;;;;;:::i;3076:153:5:-;3170:52;719:10:3;3203:8:5;3213;3170:18;:52::i;11882:184:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;11955:24:15::1;11972:6;11955:16;:24::i;:::-;11947:63;;;;-1:-1:-1::0;;;11947:63:15::1;;;;;;;:::i;:::-;12054:5;12021:19:::0;;;:11:::1;:19;::::0;;;;:38;;-1:-1:-1;;12021:38:15::1;::::0;;11882:184::o;14509:1180::-;1713:1:18;2309:7;;:19;;2301:63;;;;-1:-1:-1;;;2301:63:18;;;;;;;:::i;:::-;1713:1;2442:7;:18;14616:40:15::1;14640:6:::0;14648:7;14616:23:::1;:40::i;:::-;14608:49;;;::::0;::::1;;14729:21;14775:20:::0;;;:11:::1;:20;::::0;;;;:30:::1;;::::0;14766:39:::1;::::0;:6;:39:::1;:::i;:::-;14753:53;::::0;:9:::1;:53;:::i;:::-;14729:77:::0;-1:-1:-1;14820:17:15;;14816:196:::1;;14883:43;::::0;14854:23:::1;::::0;719:10:3;;14908:13:15;;14854:23;14883:43;14854:23;14883:43;14908:13;719:10:3;14883:43:15::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14853:73;;;14948:18;14940:61;;;;-1:-1:-1::0;;;14940:61:15::1;;;;;;;:::i;:::-;14839:173;14816:196;15149:20;::::0;;;:11:::1;:20;::::0;;;;;;;15181:10:::1;15149:43:::0;;:31:::1;;:43:::0;;;;;;:52:::1;::::0;15195:6;;15149:52:::1;:::i;:::-;15103:20;::::0;;;:11:::1;:20;::::0;;;;;;;15135:10:::1;15103:43:::0;;:31:::1;;:43:::0;;;;;:98;;;;15238:23:::1;:35:::0;;;;;;:44:::1;::::0;15276:6;;15238:44:::1;:::i;:::-;15211:71;;2968:1;15300:16;:48;;15292:104;;;;-1:-1:-1::0;;;15292:104:15::1;;;;;;;:::i;:::-;15427:38;15433:10;15445:7;15454:6;15427:38;;;;;;;;;;;::::0;:5:::1;:38::i;:::-;15570:10;15546:35;::::0;;;:23:::1;:35;::::0;;;;;;;;:54;;;15646:36;;42313:25:21;;;42354:18;;;42347:34;;;15646:36:15::1;::::0;42286:18:21;15646:36:15::1;;;;;;;-1:-1:-1::0;;1669:1:18;2621:7;:22;-1:-1:-1;;14509:1180:15:o;364:21:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20850:208:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;20946:9:15::1;20941:111;20965:8;:15;20961:1;:19;20941:111;;;21036:5;21001:19;:32;21021:8;21030:1;21021:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;21001:32:15::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;21001:32:15;:40;;-1:-1:-1;;21001:40:15::1;::::0;::::1;;::::0;;;::::1;::::0;;20982:3;::::1;::::0;::::1;:::i;:::-;;;;20941:111;;11503:185:::0;11566:4;11590:19;;;:11;:19;;;;;:35;;;11582:78;;;;-1:-1:-1;;;11582:78:15;;24942:2:21;11582:78:15;;;24924:21:21;24981:2;24961:18;;;24954:30;25020:28;25000:18;;;24993:56;25066:18;;11582:78:15;24740:350:21;11582:78:15;-1:-1:-1;11677:4:15;;11503:185;-1:-1:-1;11503:185:15:o;10920:231::-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;11033:24:15::1;11050:6;11033:16;:24::i;:::-;11025:63;;;;-1:-1:-1::0;;;11025:63:15::1;;;;;;;:::i;:::-;11098:19;::::0;;;:11:::1;:19;::::0;;;;:46:::1;::::0;:32:::1;;11133:11:::0;;11098:46:::1;:::i;:::-;;10920:231:::0;;;:::o;15695:1796::-;1713:1:18;2309:7;;:19;;2301:63;;;;-1:-1:-1;;;2301:63:18;;;;;;;:::i;:::-;1713:1;2442:7;:18;16076:10:15::1;15982:21;16052:35:::0;;;:23:::1;:35;::::0;;;;;16006:9:::1;::::0;15982:21;16134:770:::1;16149:19:::0;;::::1;16134:770;;;16197:49;16222:9;;16233;;16243:1;16233:12;;;;;;;:::i;16197:49::-;16189:81;;;::::0;-1:-1:-1;;;16189:81:15;;35045:2:21;16189:81:15::1;::::0;::::1;35027:21:21::0;35084:2;35064:18;;;35057:30;-1:-1:-1;;;35103:18:21;;;35096:49;35162:18;;16189:81:15::1;34843:343:21::0;16189:81:15::1;16292:48;16316:6;;16323:1;16316:9;;;;;;;:::i;:::-;;;;;;;16327;;16337:1;16327:12;;;;;;;:::i;:::-;;;;;;;16292:23;:48::i;:::-;16284:91;;;::::0;-1:-1:-1;;;16284:91:15;;37932:2:21;16284:91:15::1;::::0;::::1;37914:21:21::0;37971:2;37951:18;;;37944:30;38010:32;37990:18;;;37983:60;38060:18;;16284:91:15::1;37730:354:21::0;16284:91:15::1;16491:6;;16498:1;16491:9;;;;;;;:::i;:::-;;;;;;;16440:11;:25;16452:9;;16462:1;16452:12;;;;;;;:::i;:::-;;;;;;;16440:25;;;;;;;;;;;:36;;:48;16477:10;-1:-1:-1::0;;;;;16440:48:15::1;-1:-1:-1::0;;;;;16440:48:15::1;;;;;;;;;;;;;:60;;;;:::i;:::-;16389:11;:25;16401:9;;16411:1;16401:12;;;;;;;:::i;:::-;;;;;;;16389:25;;;;;;;;;;;:36;;:48;16426:10;-1:-1:-1::0;;;;;16389:48:15::1;-1:-1:-1::0;;;;;16389:48:15::1;;;;;;;;;;;;:111;;;;16514:19;16548:11;:25;16560:9;;16570:1;16560:12;;;;;;;:::i;:::-;;;;;;;16548:25;;;;;;;;;;;:35;;;16536:6;;16543:1;16536:9;;;;;;;:::i;:::-;;;;;;;:47;;;;:::i;:::-;16514:69;;16617:6;;16624:1;16617:9;;;;;;;:::i;:::-;;;;;;;16597:29;;;;;:::i;:::-;::::0;-1:-1:-1;16640:30:15::1;16659:11:::0;16640:30;::::1;:::i;:::-;::::0;-1:-1:-1;16684:28:15::1;16701:11:::0;16684:28;::::1;:::i;:::-;16744:11;::::0;16684:28;;-1:-1:-1;;;;;;16744:11:15::1;16730:10;:25;16726:168;;2968:1;16783:16;:48;;16775:104;;;;-1:-1:-1::0;;;16775:104:15::1;;;;;;;:::i;:::-;-1:-1:-1::0;16170:3:15;::::1;::::0;::::1;:::i;:::-;;;;16134:770;;;;16935:15;16922:9;:28;;16914:60;;;::::0;-1:-1:-1;;;16914:60:15;;36811:2:21;16914:60:15::1;::::0;::::1;36793:21:21::0;36850:2;36830:18;;;36823:30;-1:-1:-1;;;36869:18:21;;;36862:49;36928:18;;16914:60:15::1;36609:343:21::0;16914:60:15::1;16989:17:::0;;16985:196:::1;;17052:43;::::0;17023:23:::1;::::0;719:10:3;;17077:13:15;;17023:23;17052:43;17023:23;17052:43;17077:13;719:10:3;17052:43:15::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17022:73;;;17117:18;17109:61;;;;-1:-1:-1::0;;;17109:61:15::1;;;;;;;:::i;:::-;17008:173;16985:196;17211:45;17222:10;17234:9;;17211:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;17211:45:15::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;17245:6:15;;-1:-1:-1;17245:6:15;;;;17211:45;::::1;::::0;17245:6;;17211:45;17245:6;17211:45;::::1;;::::0;::::1;::::0;;;-1:-1:-1;17211:45:15::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;17211:10:15::1;::::0;-1:-1:-1;;17211:45:15:i:1;:::-;17361:10;17337:35;::::0;;;:23:::1;:35;::::0;;;;;;:54;;;17437:46;::::1;::::0;::::1;::::0;17453:9;;;;17476:6;;;;17437:46:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;1669:1:18;2621:7;:22;-1:-1:-1;;;;;15695:1796:15:o;12367:858::-;1713:1:18;2309:7;;:19;;2301:63;;;;-1:-1:-1;;;2301:63:18;;;;;;;:::i;:::-;1713:1;2442:7;:18;12518:28:15::1;12531:6:::0;12538:7;12518:12:::1;:28::i;:::-;12510:37;;;::::0;::::1;;12618:21;12664:20:::0;;;:11:::1;:20;::::0;;;;:30:::1;;::::0;12655:39:::1;::::0;:6;:39:::1;:::i;:::-;12642:53;::::0;:9:::1;:53;:::i;:::-;12618:77:::0;-1:-1:-1;12709:17:15;;12705:196:::1;;12772:43;::::0;12743:23:::1;::::0;719:10:3;;12797:13:15;;12743:23;12772:43;12743:23;12772:43;12797:13;719:10:3;12772:43:15::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12742:73;;;12837:18;12829:61;;;;-1:-1:-1::0;;;12829:61:15::1;;;;;;;:::i;:::-;12728:173;12705:196;13037:20;::::0;;;:11:::1;:20;::::0;;;;;;;13069:10:::1;13037:43:::0;;:31:::1;;:43:::0;;;;;;:52:::1;::::0;13083:6;;13037:52:::1;:::i;:::-;12991:20;::::0;;;:11:::1;:20;::::0;;;;;;;13023:10:::1;12991:43:::0;;;:31:::1;::::0;;::::1;:43:::0;;;;;:98;;;;13099:38;;;;::::1;::::0;;;;;::::1;::::0;13023:10;13003:7;;13126:6;;13099:5:::1;:38::i;:::-;13182:36;::::0;;42313:25:21;;;42369:2;42354:18;;42347:34;;;13199:10:15::1;::::0;13182:36:::1;::::0;42286:18:21;13182:36:15::1;;;;;;;-1:-1:-1::0;;1669:1:18;2621:7;:22;-1:-1:-1;12367:858:15:o;4632:147:1:-;3948:7;3974:12;;;;;;;;;;:22;;;2395:30;2406:4;719:10:3;2395::1;:30::i;:::-;4746:26:::1;4758:4;4764:7;4746:11;:26::i;17661:194:15:-:0;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;17808:40:15::1;17819:2;17823:9;;17808:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;17808:40:15::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;17834:9:15;;-1:-1:-1;17834:9:15;;;;17808:40;::::1;::::0;17834:9;;17808:40;17834:9;17808:40;::::1;;::::0;::::1;::::0;;;-1:-1:-1;17808:40:15::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;17808:10:15::1;::::0;-1:-1:-1;;17808:40:15:i:1;10709:205::-:0;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;10806:24:15::1;10823:6;10806:16;:24::i;:::-;10798:63;;;;-1:-1:-1::0;;;10798:63:15::1;;;;;;;:::i;:::-;10871:19;::::0;;;:11:::1;:19;::::0;;;;;:26:::1;;:36:::0;10709:205::o;339:19:0:-;;;;;;;:::i;8649:362:15:-;1101:6:16;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;8761:24:15::1;8778:6;8761:16;:24::i;:::-;8753:63;;;;-1:-1:-1::0;;;8753:63:15::1;;;;;;;:::i;:::-;8850:19;::::0;;;:11:::1;:19;::::0;;;;:35:::1;;::::0;8835:50;::::1;8834:74:::0;::::1;;;;8906:1;8891:12;:16;8834:74;8826:117;;;::::0;-1:-1:-1;;;8826:117:15;;23398:2:21;8826:117:15::1;::::0;::::1;23380:21:21::0;23437:2;23417:18;;;23410:30;23476:32;23456:18;;;23449:60;23526:18;;8826:117:15::1;23196:354:21::0;8826:117:15::1;8953:19;::::0;;;:11:::1;:19;::::0;;;;;:36:::1;;:51:::0;8649:362::o;3529:389:5:-;-1:-1:-1;;;;;3729:20:5;;719:10:3;3729:20:5;;:60;;-1:-1:-1;3753:36:5;3770:4;719:10:3;3296:166:5;:::i;3753:36::-;3708:148;;;;-1:-1:-1;;;3708:148:5;;;;;;;:::i;:::-;3866:45;3884:4;3890:2;3894;3898:6;3906:4;3866:17;:45::i;1911:198:16:-;1101:6;;-1:-1:-1;;;;;1101:6:16;719:10:3;1241:23:16;1233:68;;;;-1:-1:-1;;;1233:68:16;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:16;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:16;;25297:2:21;1991:73:16::1;::::0;::::1;25279:21:21::0;25336:2;25316:18;;;25309:30;25375:34;25355:18;;;25348:62;-1:-1:-1;;;25426:18:21;;;25419:36;25472:19;;1991:73:16::1;25095:402:21::0;1991:73:16::1;2074:28;2093:8;2074:18;:28::i;392:310:6:-:0;-1:-1:-1;;;;;526:23:6;;719:10:3;526:23:6;;:66;;-1:-1:-1;553:39:6;570:7;719:10:3;3296:166:5;:::i;553:39:6:-;505:154;;;;-1:-1:-1;;;505:154:6;;;;;;;:::i;1166:305:5:-;1268:4;-1:-1:-1;;;;;;1303:41:5;;-1:-1:-1;;;1303:41:5;;:109;;-1:-1:-1;;;;;;;1360:52:5;;-1:-1:-1;;;1360:52:5;1303:109;:161;;;;1428:36;1452:11;1428:23;:36::i;7881:86::-;7947:13;;;;:4;;:13;;;;;:::i;1870:103::-;1930:13;1962:4;1955:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1870:103;;;:::o;827:207:0:-;989:38;1001:7;1010:2;1014:6;1022:4;989:11;:38::i;6013:1045:5:-;6233:7;:14;6219:3;:10;:28;6211:81;;;;-1:-1:-1;;;6211:81:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;6310:16:5;;6302:66;;;;-1:-1:-1;;;6302:66:5;;;;;;;:::i;:::-;719:10:3;6421:60:5;719:10:3;6452:4:5;6458:2;6462:3;6467:7;6476:4;6421:20;:60::i;:::-;6497:9;6492:411;6516:3;:10;6512:1;:14;6492:411;;;6547:10;6560:3;6564:1;6560:6;;;;;;;;:::i;:::-;;;;;;;6547:19;;6580:14;6597:7;6605:1;6597:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6622:19;6644:13;;;:9;:13;;;;;;-1:-1:-1;;;;;6644:19:5;;;;;;;;;;;;6597:10;;-1:-1:-1;6685:21:5;;;;6677:76;;;;-1:-1:-1;;;6677:76:5;;;;;;;:::i;:::-;6795:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;6795:19:5;;;;;;;;;;6817:20;;;6795:42;;6865:17;;;;;;;:27;;6817:20;;6795:13;6865:27;;6817:20;;6865:27;:::i;:::-;;;;;;;;6533:370;;;6528:3;;;;:::i;:::-;;;6492:411;;;;6948:2;-1:-1:-1;;;;;6918:47:5;6942:4;-1:-1:-1;;;;;6918:47:5;6932:8;-1:-1:-1;;;;;6918:47:5;;6952:3;6957:7;6918:47;;;;;;;:::i;:::-;;;;;;;;6976:75;7012:8;7022:4;7028:2;7032:3;7037:7;7046:4;6976:35;:75::i;:::-;6201:857;6013:1045;;;;;:::o;3217:484:1:-;3297:22;3305:4;3311:7;3297;:22::i;:::-;3292:403;;3480:41;3508:7;-1:-1:-1;;;;;3480:41:1;3518:2;3480:19;:41::i;:::-;3592:38;3620:4;3627:2;3592:19;:38::i;:::-;3387:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3387:265:1;;;;;;;;;;-1:-1:-1;;;3335:349:1;;;;;;;:::i;6537:224::-;6611:22;6619:4;6625:7;6611;:22::i;:::-;6606:149;;6649:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6649:29:1;;;;;;;;;:36;;-1:-1:-1;;6649:36:1;6681:4;6649:36;;;6731:12;719:10:3;;640:96;6731:12:1;-1:-1:-1;;;;;6704:40:1;6722:7;-1:-1:-1;;;;;6704:40:1;6716:4;6704:40;;;;;;;;;;6537:224;;:::o;6767:225::-;6841:22;6849:4;6855:7;6841;:22::i;:::-;6837:149;;;6911:5;6879:12;;;;;;;;;;;-1:-1:-1;;;;;6879:29:1;;;;;;;;;;:37;;-1:-1:-1;;6879:37:1;;;6935:40;719:10:3;;6879:12:1;;6935:40;;6911:5;6935:40;6767:225;;:::o;1275:174:0:-;1410:32;1422:7;1431:2;1435:6;1410:11;:32::i;2103:117:17:-;1161:7;;;;1662:41;;;;-1:-1:-1;;;1662:41:17;;23757:2:21;1662:41:17;;;23739:21:21;23796:2;23776:18;;;23769:30;-1:-1:-1;;;23815:18:21;;;23808:50;23875:18;;1662:41:17;23555:344:21;1662:41:17;2161:7:::1;:15:::0;;-1:-1:-1;;2161:15:17::1;::::0;;2191:22:::1;719:10:3::0;2200:12:17::1;2191:22;::::0;-1:-1:-1;;;;;17140:32:21;;;17122:51;;17110:2;17095:18;2191:22:17::1;;;;;;;2103:117::o:0;17861:1137:15:-;17961:4;18027:22;;;:11;:22;;;;;:33;;;18019:60;;;;-1:-1:-1;;;18019:60:15;;40232:2:21;18019:60:15;;;40214:21:21;40271:2;40251:18;;;40244:30;-1:-1:-1;;;40290:18:21;;;40283:44;40344:18;;18019:60:15;40030:338:21;18019:60:15;1161:7:17;;;;18097:9:15;18089:47;;;;-1:-1:-1;;;18089:47:15;;29278:2:21;18089:47:15;;;29260:21:21;29317:2;29297:18;;;29290:30;-1:-1:-1;;;29336:18:21;;;29329:55;29401:18;;18089:47:15;29076:349:21;18089:47:15;18205:22;;;;:11;:22;;;;;:38;;;18187:15;:56;:117;;;;-1:-1:-1;18265:22:15;;;;:11;:22;;;;;:39;;;18247:15;:57;18187:117;18178:156;;;;-1:-1:-1;;;18178:156:15;;35393:2:21;18178:156:15;;;35375:21:21;35432:2;35412:18;;;35405:30;35471:27;35451:18;;;35444:55;35516:18;;18178:156:15;35191:349:21;18178:156:15;18410:22;;;;:11;:22;;;;;:32;;;18398:44;;:9;:44;:::i;:::-;18384:9;:59;;18376:100;;;;-1:-1:-1;;;18376:100:15;;36108:2:21;18376:100:15;;;36090:21:21;36147:2;36127:18;;;36120:30;36186;36166:18;;;36159:58;36234:18;;18376:100:15;35906:352:21;18376:100:15;18622:22;;;;:11;:22;;;;;;;;:35;;;;18595:10;18561:45;;:33;;;;:45;;;;;;;:57;;18609:9;;18561:57;:::i;:::-;:96;;18552:164;;;;-1:-1:-1;;;18552:164:15;;37510:2:21;18552:164:15;;;37492:21:21;37549:2;37529:18;;;37522:30;37588:34;37568:18;;;37561:62;-1:-1:-1;;;37639:18:21;;;37632:51;37700:19;;18552:164:15;37308:417:21;18552:164:15;18747:22;;;;:11;:22;;;;;:36;;;18734:49;;;18726:99;;;;-1:-1:-1;;;18726:99:15;;34639:2:21;18726:99:15;;;34621:21:21;34678:2;34658:18;;;34651:30;34717:34;34697:18;;;34690:62;-1:-1:-1;;;34768:18:21;;;34761:35;34813:19;;18726:99:15;34437:401:21;18726:99:15;18882:22;;;;:11;:22;;;;;;;;:32;;;;;769:16:8;;;;;;18844:34:15;;18869:9;;18844:34;:::i;:::-;:70;;18836:115;;;;-1:-1:-1;;;18836:115:15;;31967:2:21;18836:115:15;;;31949:21:21;;;31986:18;;;31979:30;32045:34;32025:18;;;32018:62;32097:18;;18836:115:15;31765:356:21;18836:115:15;-1:-1:-1;18977:4:15;17861:1137;;;;:::o;1040:229:0:-;1222:40;1239:2;1243:3;1248:7;1257:4;1222:16;:40::i;1455:206::-;1615:39;1632:7;1641:3;1646:7;1615:16;:39::i;2263:187:16:-;2355:6;;;-1:-1:-1;;;;;2371:17:16;;;-1:-1:-1;;;;;;2371:17:16;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;1856:115:17:-;1161:7;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:17;;29632:2:21;1396:38:17;;;29614:21:21;29671:2;29651:18;;;29644:30;-1:-1:-1;;;29690:18:21;;;29683:46;29746:18;;1396:38:17;29430:340:21;1396:38:17;1915:7:::1;:14:::0;;-1:-1:-1;;1915:14:17::1;1925:4;1915:14;::::0;;1944:20:::1;1951:12;719:10:3::0;;640:96;12019:323:5;12169:8;-1:-1:-1;;;;;12160:17:5;:5;-1:-1:-1;;;;;12160:17:5;;;12152:71;;;;-1:-1:-1;;;12152:71:5;;39003:2:21;12152:71:5;;;38985:21:21;39042:2;39022:18;;;39015:30;39081:34;39061:18;;;39054:62;-1:-1:-1;;;39132:18:21;;;39125:39;39181:19;;12152:71:5;38801:405:21;12152:71:5;-1:-1:-1;;;;;12233:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12233:46:5;;;;;;;;;;12294:41;;20204::21;;;12294::5;;20177:18:21;12294:41:5;;;;;;;12019:323;;;:::o;19004:1063:15:-;19093:4;19121:20;;;:11;:20;;;;;:31;;;19113:58;;;;-1:-1:-1;;;19113:58:15;;40232:2:21;19113:58:15;;;40214:21:21;40271:2;40251:18;;;40244:30;-1:-1:-1;;;40290:18:21;;;40283:44;40344:18;;19113:58:15;40030:338:21;19113:58:15;1161:7:17;;;;19193:9:15;19185:47;;;;-1:-1:-1;;;19185:47:15;;29278:2:21;19185:47:15;;;29260:21:21;29317:2;29297:18;;;29290:30;-1:-1:-1;;;29336:18:21;;;29329:55;29401:18;;19185:47:15;29076:349:21;19185:47:15;19308:11;19300:37;;;;-1:-1:-1;;;19300:37:15;;23056:2:21;19300:37:15;;;23038:21:21;23095:2;23075:18;;;23068:30;-1:-1:-1;;;23114:18:21;;;23107:43;23167:18;;19300:37:15;22854:337:21;19300:37:15;19432:10;19412:31;;;;:19;:31;;;;;;;;19404:76;;;;-1:-1:-1;;;19404:76:15;;34278:2:21;19404:76:15;;;34260:21:21;;;34297:18;;;34290:30;34356:34;34336:18;;;34329:62;34408:18;;19404:76:15;34076:356:21;19404:76:15;19588:26;19606:7;19588:17;:26::i;:::-;19580:67;;;;-1:-1:-1;;;19580:67:15;;38646:2:21;19580:67:15;;;38628:21:21;38685:2;38665:18;;;38658:30;38724;38704:18;;;38697:58;38772:18;;19580:67:15;38444:352:21;19580:67:15;19772:20;;;;:11;:20;;;;;:30;;;19763:39;;:6;:39;:::i;:::-;19749:9;:54;;19741:95;;;;-1:-1:-1;;;19741:95:15;;36108:2:21;19741:95:15;;;36090:21:21;36147:2;36127:18;;;36120:30;36186;36166:18;;;36159:58;36234:18;;19741:95:15;35906:352:21;4870:797:5;-1:-1:-1;;;;;5051:16:5;;5043:66;;;;-1:-1:-1;;;5043:66:5;;;;;;;:::i;:::-;719:10:3;5162:96:5;719:10:3;5193:4:5;5199:2;5203:21;5221:2;5203:17;:21::i;:::-;5226:25;5244:6;5226:17;:25::i;:::-;5253:4;5162:20;:96::i;:::-;5269:19;5291:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5291:19:5;;;;;;;;;;5328:21;;;;5320:76;;;;-1:-1:-1;;;5320:76:5;;;;;;;:::i;:::-;5430:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5430:19:5;;;;;;;;;;5452:20;;;5430:42;;5492:17;;;;;;;:27;;5452:20;;5430:13;5492:27;;5452:20;;5492:27;:::i;:::-;;;;-1:-1:-1;;5535:46:5;;;42313:25:21;;;42369:2;42354:18;;42347:34;;;-1:-1:-1;;;;;5535:46:5;;;;;;;;;;;;;;42286:18:21;5535:46:5;;;;;;;5592:68;5623:8;5633:4;5639:2;5643;5647:6;5655:4;5592:30;:68::i;:::-;5033:634;;4870:797;;;;;:::o;2510:202:1:-;2595:4;-1:-1:-1;;;;;;2618:47:1;;-1:-1:-1;;;2618:47:1;;:87;;-1:-1:-1;;;;;;;;;;937:40:9;;;2669:36:1;829:155:9;8340:553:5;-1:-1:-1;;;;;8487:16:5;;8479:62;;;;-1:-1:-1;;;8479:62:5;;;;;;;:::i;:::-;719:10:3;8594:102:5;719:10:3;8552:16:5;8637:2;8641:21;8659:2;8641:17;:21::i;8594:102::-;8707:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;8707:17:5;;;;;;;;;:27;;8728:6;;8707:13;:27;;8728:6;;8707:27;:::i;:::-;;;;-1:-1:-1;;8749:52:5;;;42313:25:21;;;42369:2;42354:18;;42347:34;;;-1:-1:-1;;;;;8749:52:5;;;;8782:1;;8749:52;;;;;;42286:18:21;8749:52:5;;;;;;;8812:74;8843:8;8861:1;8865:2;8869;8873:6;8881:4;8812:30;:74::i;1669:345:0:-;1941:66;1968:8;1978:4;1984:2;1988:3;1993:7;2002:4;1941:26;:66::i;14227:792:5:-;-1:-1:-1;;;;;14459:13:5;;1034:20:2;1080:8;14455:558:5;;14494:79;;-1:-1:-1;;;14494:79:5;;-1:-1:-1;;;;;14494:43:5;;;;;:79;;14538:8;;14548:4;;14554:3;;14559:7;;14568:4;;14494:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14494:79:5;;;;;;;;-1:-1:-1;;14494:79:5;;;;;;;;;;;;:::i;:::-;;;14490:513;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14879:6;14872:14;;-1:-1:-1;;;14872:14:5;;;;;;;;:::i;14490:513::-;;;14926:62;;-1:-1:-1;;;14926:62:5;;21865:2:21;14926:62:5;;;21847:21:21;21904:2;21884:18;;;21877:30;21943:34;21923:18;;;21916:62;-1:-1:-1;;;21994:18:21;;;21987:50;22054:19;;14926:62:5;21663:416:21;14490:513:5;-1:-1:-1;;;;;;14652:60:5;;-1:-1:-1;;;14652:60:5;14648:157;;14736:50;;-1:-1:-1;;;14736:50:5;;;;;;;:::i;1588:441:20:-;1663:13;1688:19;1720:10;1724:6;1720:1;:10;:::i;:::-;:14;;1733:1;1720:14;:::i;:::-;-1:-1:-1;;;;;1710:25:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1710:25:20;;1688:47;;-1:-1:-1;;;1745:6:20;1752:1;1745:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1745:15:20;;;;;;;;;-1:-1:-1;;;1770:6:20;1777:1;1770:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1770:15:20;;;;;;;;-1:-1:-1;1800:9:20;1812:10;1816:6;1812:1;:10;:::i;:::-;:14;;1825:1;1812:14;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;-1:-1:-1;;;1879:5:20;1887:3;1879:11;1866:25;;;;;;;:::i;:::-;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;1854:37:20;;;;;;;;-1:-1:-1;1915:1:20;1905:11;;;;;1835:3;;;:::i;:::-;;;1795:132;;;-1:-1:-1;1944:10:20;;1936:55;;;;-1:-1:-1;;;1936:55:20;;22286:2:21;1936:55:20;;;22268:21:21;;;22305:18;;;22298:30;22364:34;22344:18;;;22337:62;22416:18;;1936:55:20;22084:356:21;10193:630:5;-1:-1:-1;;;;;10315:18:5;;10307:66;;;;-1:-1:-1;;;10307:66:5;;;;;;;:::i;:::-;719:10:3;10426:102:5;719:10:3;10457:4:5;10384:16;10475:21;10493:2;10475:17;:21::i;:::-;10498:25;10516:6;10498:17;:25::i;:::-;10426:102;;;;;;;;;;;;:20;:102::i;:::-;10539:19;10561:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;10561:19:5;;;;;;;;;;10598:21;;;;10590:70;;;;-1:-1:-1;;;10590:70:5;;;;;;;:::i;:::-;10694:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;10694:19:5;;;;;;;;;;;;10716:20;;;10694:42;;10762:54;;42313:25:21;;;42354:18;;;42347:34;;;10694:19:5;;10762:54;;;;;;42286:18:21;10762:54:5;;;;;;;10297:526;;10193:630;;;:::o;9238:715::-;-1:-1:-1;;;;;9410:16:5;;9402:62;;;;-1:-1:-1;;;9402:62:5;;;;;;;:::i;:::-;9496:7;:14;9482:3;:10;:28;9474:81;;;;-1:-1:-1;;;9474:81:5;;;;;;;:::i;:::-;719:10:3;9608:66:5;719:10:3;9566:16:5;9651:2;9655:3;9660:7;9669:4;9608:20;:66::i;:::-;9690:9;9685:101;9709:3;:10;9705:1;:14;9685:101;;;9765:7;9773:1;9765:10;;;;;;;;:::i;:::-;;;;;;;9740:9;:17;9750:3;9754:1;9750:6;;;;;;;;:::i;:::-;;;;;;;9740:17;;;;;;;;;;;:21;9758:2;-1:-1:-1;;;;;9740:21:5;-1:-1:-1;;;;;9740:21:5;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;9721:3:5;;-1:-1:-1;9721:3:5;;;:::i;:::-;;;;9685:101;;;;9837:2;-1:-1:-1;;;;;9801:53:5;9833:1;-1:-1:-1;;;;;9801:53:5;9815:8;-1:-1:-1;;;;;9801:53:5;;9841:3;9846:7;9801:53;;;;;;;:::i;:::-;;;;;;;;9865:81;9901:8;9919:1;9923:2;9927:3;9932:7;9941:4;9865:35;:81::i;11017:867::-;-1:-1:-1;;;;;11164:18:5;;11156:66;;;;-1:-1:-1;;;11156:66:5;;;;;;;:::i;:::-;11254:7;:14;11240:3;:10;:28;11232:81;;;;-1:-1:-1;;;11232:81:5;;;;;;;:::i;:::-;11324:16;719:10:3;11324:31:5;;11366:66;11387:8;11397:4;11411:1;11415:3;11420:7;11366:66;;;;;;;;;;;;:20;:66::i;:::-;11448:9;11443:364;11467:3;:10;11463:1;:14;11443:364;;;11498:10;11511:3;11515:1;11511:6;;;;;;;;:::i;:::-;;;;;;;11498:19;;11531:14;11548:7;11556:1;11548:10;;;;;;;;:::i;:::-;;;;;;;;;;;;11573:19;11595:13;;;:9;:13;;;;;;-1:-1:-1;;;;;11595:19:5;;;;;;;;;;;;11548:10;;-1:-1:-1;11636:21:5;;;;11628:70;;;;-1:-1:-1;;;11628:70:5;;;;;;;:::i;:::-;11740:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11740:19:5;;;;;;;;;;11762:20;;11740:42;;11479:3;;;;:::i;:::-;;;;11443:364;;;;11860:1;-1:-1:-1;;;;;11822:55:5;11846:4;-1:-1:-1;;;;;11822:55:5;11836:8;-1:-1:-1;;;;;11822:55:5;;11864:3;11869:7;11822:55;;;;;;;:::i;:::-;;;;;;;;11146:738;11017:867;;;:::o;15025:193::-;15144:16;;;15158:1;15144:16;;;;;;;;;15091;;15119:22;;15144:16;;;;;;;;;;;;-1:-1:-1;15144:16:5;15119:41;;15181:7;15170:5;15176:1;15170:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;15206:5;15025:193;-1:-1:-1;;15025:193:5:o;13496:725::-;-1:-1:-1;;;;;13703:13:5;;1034:20:2;1080:8;13699:516:5;;13738:72;;-1:-1:-1;;;13738:72:5;;-1:-1:-1;;;;;13738:38:5;;;;;:72;;13777:8;;13787:4;;13793:2;;13797:6;;13805:4;;13738:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13738:72:5;;;;;;;;-1:-1:-1;;13738:72:5;;;;;;;;;;;;:::i;:::-;;;13734:471;;;;:::i;:::-;-1:-1:-1;;;;;;13859:55:5;;-1:-1:-1;;;13859:55:5;13855:152;;13938:50;;-1:-1:-1;;;13938:50:5;;;;;;;:::i;1075:634:8:-;1306:66;1333:8;1343:4;1349:2;1353:3;1358:7;1367:4;1306:26;:66::i;:::-;-1:-1:-1;;;;;1387:18:8;;1383:156;;1426:9;1421:108;1445:3;:10;1441:1;:14;1421:108;;;1504:7;1512:1;1504:10;;;;;;;;:::i;:::-;;;;;;;1480:12;:20;1493:3;1497:1;1493:6;;;;;;;;:::i;:::-;;;;;;;1480:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1457:3:8;;-1:-1:-1;1457:3:8;;:::i;:::-;;;1421:108;;;;1383:156;-1:-1:-1;;;;;1553:16:8;;1549:154;;1590:9;1585:108;1609:3;:10;1605:1;:14;1585:108;;;1668:7;1676:1;1668:10;;;;;;;;:::i;:::-;;;;;;;1644:12;:20;1657:3;1661:1;1657:6;;;;;;;;:::i;:::-;;;;;;;1644:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1621:3:8;;-1:-1:-1;1621:3:8;;:::i;:::-;;;1585:108;;692:381:7;1161:7:17;;;;1008:9:7;1000:66;;;;-1:-1:-1;;;1000:66:7;;26924:2:21;1000:66:7;;;26906:21:21;26963:2;26943:18;;;26936:30;27002:34;26982:18;;;26975:62;-1:-1:-1;;;27053:18:21;;;27046:42;27105:19;;1000:66:7;26722:408:21;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:21;82:20;;-1:-1:-1;;;;;131:31:21;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:741::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:21;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:21;;;702:1;699;692:12;645:61;724:1;734:169;748:2;745:1;742:9;734:169;;;805:23;824:3;805:23;:::i;:::-;793:36;;849:12;;;;881;;;;766:1;759:9;734:169;;;-1:-1:-1;921:6:21;;192:741;-1:-1:-1;;;;;;;192:741:21:o;938:367::-;1001:8;1011:6;1065:3;1058:4;1050:6;1046:17;1042:27;1032:55;;1083:1;1080;1073:12;1032:55;-1:-1:-1;1106:20:21;;-1:-1:-1;;;;;1138:30:21;;1135:50;;;1181:1;1178;1171:12;1135:50;1218:4;1210:6;1206:17;1194:29;;1278:3;1271:4;1261:6;1258:1;1254:14;1246:6;1242:27;1238:38;1235:47;1232:67;;;1295:1;1292;1285:12;1232:67;938:367;;;;;:::o;1310:735::-;1364:5;1417:3;1410:4;1402:6;1398:17;1394:27;1384:55;;1435:1;1432;1425:12;1384:55;1471:6;1458:20;1497:4;1520:43;1560:2;1520:43;:::i;:::-;1592:2;1586:9;1604:31;1632:2;1624:6;1604:31;:::i;:::-;1670:18;;;1704:15;;;;-1:-1:-1;1739:15:21;;;1789:1;1785:10;;;1773:23;;1769:32;;1766:41;-1:-1:-1;1763:61:21;;;1820:1;1817;1810:12;1763:61;1842:1;1852:163;1866:2;1863:1;1860:9;1852:163;;;1923:17;;1911:30;;1961:12;;;;1993;;;;1884:1;1877:9;1852:163;;2050:160;2115:20;;2171:13;;2164:21;2154:32;;2144:60;;2200:1;2197;2190:12;2215:555;2257:5;2310:3;2303:4;2295:6;2291:17;2287:27;2277:55;;2328:1;2325;2318:12;2277:55;2364:6;2351:20;-1:-1:-1;;;;;2386:2:21;2383:26;2380:52;;;2412:18;;:::i;:::-;2461:2;2455:9;2473:67;2528:2;2509:13;;-1:-1:-1;;2505:27:21;2534:4;2501:38;2455:9;2473:67;:::i;:::-;2564:2;2556:6;2549:18;2610:3;2603:4;2598:2;2590:6;2586:15;2582:26;2579:35;2576:55;;;2627:1;2624;2617:12;2576:55;2691:2;2684:4;2676:6;2672:17;2665:4;2657:6;2653:17;2640:54;2738:1;2714:15;;;2731:4;2710:26;2703:37;;;;2718:6;2215:555;-1:-1:-1;;;2215:555:21:o;2775:186::-;2834:6;2887:2;2875:9;2866:7;2862:23;2858:32;2855:52;;;2903:1;2900;2893:12;2855:52;2926:29;2945:9;2926:29;:::i;2966:260::-;3034:6;3042;3095:2;3083:9;3074:7;3070:23;3066:32;3063:52;;;3111:1;3108;3101:12;3063:52;3134:29;3153:9;3134:29;:::i;:::-;3124:39;;3182:38;3216:2;3205:9;3201:18;3182:38;:::i;:::-;3172:48;;2966:260;;;;;:::o;3231:943::-;3385:6;3393;3401;3409;3417;3470:3;3458:9;3449:7;3445:23;3441:33;3438:53;;;3487:1;3484;3477:12;3438:53;3510:29;3529:9;3510:29;:::i;:::-;3500:39;;3558:38;3592:2;3581:9;3577:18;3558:38;:::i;:::-;3548:48;;3647:2;3636:9;3632:18;3619:32;-1:-1:-1;;;;;3711:2:21;3703:6;3700:14;3697:34;;;3727:1;3724;3717:12;3697:34;3750:61;3803:7;3794:6;3783:9;3779:22;3750:61;:::i;:::-;3740:71;;3864:2;3853:9;3849:18;3836:32;3820:48;;3893:2;3883:8;3880:16;3877:36;;;3909:1;3906;3899:12;3877:36;3932:63;3987:7;3976:8;3965:9;3961:24;3932:63;:::i;:::-;3922:73;;4048:3;4037:9;4033:19;4020:33;4004:49;;4078:2;4068:8;4065:16;4062:36;;;4094:1;4091;4084:12;4062:36;;4117:51;4160:7;4149:8;4138:9;4134:24;4117:51;:::i;:::-;4107:61;;;3231:943;;;;;;;;:::o;4179:606::-;4283:6;4291;4299;4307;4315;4368:3;4356:9;4347:7;4343:23;4339:33;4336:53;;;4385:1;4382;4375:12;4336:53;4408:29;4427:9;4408:29;:::i;:::-;4398:39;;4456:38;4490:2;4479:9;4475:18;4456:38;:::i;:::-;4446:48;;4541:2;4530:9;4526:18;4513:32;4503:42;;4592:2;4581:9;4577:18;4564:32;4554:42;;4647:3;4636:9;4632:19;4619:33;-1:-1:-1;;;;;4667:6:21;4664:30;4661:50;;;4707:1;4704;4697:12;4661:50;4730:49;4771:7;4762:6;4751:9;4747:22;4730:49;:::i;4790:847::-;4921:6;4929;4937;4945;4953;5006:2;4994:9;4985:7;4981:23;4977:32;4974:52;;;5022:1;5019;5012:12;4974:52;5045:29;5064:9;5045:29;:::i;:::-;5035:39;;5125:2;5114:9;5110:18;5097:32;-1:-1:-1;;;;;5189:2:21;5181:6;5178:14;5175:34;;;5205:1;5202;5195:12;5175:34;5244:70;5306:7;5297:6;5286:9;5282:22;5244:70;:::i;:::-;5333:8;;-1:-1:-1;5218:96:21;-1:-1:-1;5421:2:21;5406:18;;5393:32;;-1:-1:-1;5437:16:21;;;5434:36;;;5466:1;5463;5456:12;5434:36;;5505:72;5569:7;5558:8;5547:9;5543:24;5505:72;:::i;:::-;4790:847;;;;-1:-1:-1;4790:847:21;;-1:-1:-1;5596:8:21;;5479:98;4790:847;-1:-1:-1;;;4790:847:21:o;5642:669::-;5769:6;5777;5785;5838:2;5826:9;5817:7;5813:23;5809:32;5806:52;;;5854:1;5851;5844:12;5806:52;5877:29;5896:9;5877:29;:::i;:::-;5867:39;;5957:2;5946:9;5942:18;5929:32;-1:-1:-1;;;;;6021:2:21;6013:6;6010:14;6007:34;;;6037:1;6034;6027:12;6007:34;6060:61;6113:7;6104:6;6093:9;6089:22;6060:61;:::i;:::-;6050:71;;6174:2;6163:9;6159:18;6146:32;6130:48;;6203:2;6193:8;6190:16;6187:36;;;6219:1;6216;6209:12;6187:36;;6242:63;6297:7;6286:8;6275:9;6271:24;6242:63;:::i;:::-;6232:73;;;5642:669;;;;;:::o;6316:254::-;6381:6;6389;6442:2;6430:9;6421:7;6417:23;6413:32;6410:52;;;6458:1;6455;6448:12;6410:52;6481:29;6500:9;6481:29;:::i;:::-;6471:39;;6529:35;6560:2;6549:9;6545:18;6529:35;:::i;6575:254::-;6643:6;6651;6704:2;6692:9;6683:7;6679:23;6675:32;6672:52;;;6720:1;6717;6710:12;6672:52;6743:29;6762:9;6743:29;:::i;:::-;6733:39;6819:2;6804:18;;;;6791:32;;-1:-1:-1;;;6575:254:21:o;6834:322::-;6911:6;6919;6927;6980:2;6968:9;6959:7;6955:23;6951:32;6948:52;;;6996:1;6993;6986:12;6948:52;7019:29;7038:9;7019:29;:::i;:::-;7009:39;7095:2;7080:18;;7067:32;;-1:-1:-1;7146:2:21;7131:18;;;7118:32;;6834:322;-1:-1:-1;;;6834:322:21:o;7161:348::-;7245:6;7298:2;7286:9;7277:7;7273:23;7269:32;7266:52;;;7314:1;7311;7304:12;7266:52;7354:9;7341:23;-1:-1:-1;;;;;7379:6:21;7376:30;7373:50;;;7419:1;7416;7409:12;7373:50;7442:61;7495:7;7486:6;7475:9;7471:22;7442:61;:::i;:::-;7432:71;7161:348;-1:-1:-1;;;;7161:348:21:o;7514:595::-;7632:6;7640;7693:2;7681:9;7672:7;7668:23;7664:32;7661:52;;;7709:1;7706;7699:12;7661:52;7749:9;7736:23;-1:-1:-1;;;;;7819:2:21;7811:6;7808:14;7805:34;;;7835:1;7832;7825:12;7805:34;7858:61;7911:7;7902:6;7891:9;7887:22;7858:61;:::i;:::-;7848:71;;7972:2;7961:9;7957:18;7944:32;7928:48;;8001:2;7991:8;7988:16;7985:36;;;8017:1;8014;8007:12;7985:36;;8040:63;8095:7;8084:8;8073:9;8069:24;8040:63;:::i;:::-;8030:73;;;7514:595;;;;;:::o;8114:773::-;8236:6;8244;8252;8260;8313:2;8301:9;8292:7;8288:23;8284:32;8281:52;;;8329:1;8326;8319:12;8281:52;8369:9;8356:23;-1:-1:-1;;;;;8439:2:21;8431:6;8428:14;8425:34;;;8455:1;8452;8445:12;8425:34;8494:70;8556:7;8547:6;8536:9;8532:22;8494:70;:::i;:::-;8583:8;;-1:-1:-1;8468:96:21;-1:-1:-1;8671:2:21;8656:18;;8643:32;;-1:-1:-1;8687:16:21;;;8684:36;;;8716:1;8713;8706:12;8684:36;;8755:72;8819:7;8808:8;8797:9;8793:24;8755:72;:::i;:::-;8114:773;;;;-1:-1:-1;8846:8:21;-1:-1:-1;;;;8114:773:21:o;8892:505::-;8987:6;8995;9003;9056:2;9044:9;9035:7;9031:23;9027:32;9024:52;;;9072:1;9069;9062:12;9024:52;9112:9;9099:23;-1:-1:-1;;;;;9137:6:21;9134:30;9131:50;;;9177:1;9174;9167:12;9131:50;9216:70;9278:7;9269:6;9258:9;9254:22;9216:70;:::i;:::-;9305:8;;9190:96;;-1:-1:-1;9387:2:21;9372:18;;;;9359:32;;8892:505;-1:-1:-1;;;;8892:505:21:o;9402:180::-;9458:6;9511:2;9499:9;9490:7;9486:23;9482:32;9479:52;;;9527:1;9524;9517:12;9479:52;9550:26;9566:9;9550:26;:::i;9587:180::-;9646:6;9699:2;9687:9;9678:7;9674:23;9670:32;9667:52;;;9715:1;9712;9705:12;9667:52;-1:-1:-1;9738:23:21;;9587:180;-1:-1:-1;9587:180:21:o;9772:254::-;9840:6;9848;9901:2;9889:9;9880:7;9876:23;9872:32;9869:52;;;9917:1;9914;9907:12;9869:52;9953:9;9940:23;9930:33;;9982:38;10016:2;10005:9;10001:18;9982:38;:::i;10031:245::-;10089:6;10142:2;10130:9;10121:7;10117:23;10113:32;10110:52;;;10158:1;10155;10148:12;10110:52;10197:9;10184:23;10216:30;10240:5;10216:30;:::i;10281:249::-;10350:6;10403:2;10391:9;10382:7;10378:23;10374:32;10371:52;;;10419:1;10416;10409:12;10371:52;10451:9;10445:16;10470:30;10494:5;10470:30;:::i;10535:321::-;10604:6;10657:2;10645:9;10636:7;10632:23;10628:32;10625:52;;;10673:1;10670;10663:12;10625:52;10713:9;10700:23;-1:-1:-1;;;;;10738:6:21;10735:30;10732:50;;;10778:1;10775;10768:12;10732:50;10801:49;10842:7;10833:6;10822:9;10818:22;10801:49;:::i;10861:395::-;10955:6;11008:2;10996:9;10987:7;10983:23;10979:32;10976:52;;;11024:1;11021;11014:12;10976:52;11064:9;11051:23;-1:-1:-1;;;;;11089:6:21;11086:30;11083:50;;;11129:1;11126;11119:12;11083:50;11152:22;;11208:3;11190:16;;;11186:26;11183:46;;;11225:1;11222;11215:12;11705:660;11785:6;11793;11801;11854:2;11842:9;11833:7;11829:23;11825:32;11822:52;;;11870:1;11867;11860:12;11822:52;11906:9;11893:23;11883:33;;11967:2;11956:9;11952:18;11939:32;-1:-1:-1;;;;;12031:2:21;12023:6;12020:14;12017:34;;;12047:1;12044;12037:12;12017:34;12085:6;12074:9;12070:22;12060:32;;12130:7;12123:4;12119:2;12115:13;12111:27;12101:55;;12152:1;12149;12142:12;12101:55;12192:2;12179:16;12218:2;12210:6;12207:14;12204:34;;;12234:1;12231;12224:12;12204:34;12279:7;12274:2;12265:6;12261:2;12257:15;12253:24;12250:37;12247:57;;;12300:1;12297;12290:12;12247:57;12331:2;12327;12323:11;12313:21;;12353:6;12343:16;;;;;11705:660;;;;;:::o;12370:248::-;12438:6;12446;12499:2;12487:9;12478:7;12474:23;12470:32;12467:52;;;12515:1;12512;12505:12;12467:52;-1:-1:-1;;12538:23:21;;;12608:2;12593:18;;;12580:32;;-1:-1:-1;12370:248:21:o;12623:946::-;12773:6;12781;12789;12797;12805;12813;12821;12829;12837;12845;12898:3;12886:9;12877:7;12873:23;12869:33;12866:53;;;12915:1;12912;12905:12;12866:53;12951:9;12938:23;12928:33;;13008:2;12997:9;12993:18;12980:32;12970:42;;13059:2;13048:9;13044:18;13031:32;13021:42;;13110:2;13099:9;13095:18;13082:32;13072:42;;13161:3;13150:9;13146:19;13133:33;13123:43;;13213:3;13202:9;13198:19;13185:33;13175:43;;13265:3;13254:9;13250:19;13237:33;13227:43;;13321:3;13310:9;13306:19;13293:33;-1:-1:-1;;;;;13341:6:21;13338:30;13335:50;;;13381:1;13378;13371:12;13335:50;13404:49;13445:7;13436:6;13425:9;13421:22;13404:49;:::i;:::-;13394:59;;;13472:39;13506:3;13495:9;13491:19;13472:39;:::i;:::-;13462:49;;13558:3;13547:9;13543:19;13530:33;13520:43;;12623:946;;;;;;;;;;;;;:::o;13574:354::-;13662:19;;;13644:3;-1:-1:-1;;;;;13693:31:21;;13690:51;;;13737:1;13734;13727:12;13690:51;13773:6;13770:1;13766:14;13825:8;13818:5;13811:4;13806:3;13802:14;13789:45;13902:1;13857:18;;13877:4;13853:29;13891:13;;;-1:-1:-1;13853:29:21;;13574:354;-1:-1:-1;;13574:354:21:o;13933:435::-;13986:3;14024:5;14018:12;14051:6;14046:3;14039:19;14077:4;14106:2;14101:3;14097:12;14090:19;;14143:2;14136:5;14132:14;14164:1;14174:169;14188:6;14185:1;14182:13;14174:169;;;14249:13;;14237:26;;14283:12;;;;14318:15;;;;14210:1;14203:9;14174:169;;;-1:-1:-1;14359:3:21;;13933:435;-1:-1:-1;;;;;13933:435:21:o;14373:257::-;14414:3;14452:5;14446:12;14479:6;14474:3;14467:19;14495:63;14551:6;14544:4;14539:3;14535:14;14528:4;14521:5;14517:16;14495:63;:::i;:::-;14612:2;14591:15;-1:-1:-1;;14587:29:21;14578:39;;;;14619:4;14574:50;;14373:257;-1:-1:-1;;14373:257:21:o;14635:1335::-;14811:3;14849:6;14843:13;14875:4;14888:51;14932:6;14927:3;14922:2;14914:6;14910:15;14888:51;:::i;:::-;15024:13;;14961:16;;;;14997:1;;15084;15106:18;;;;15159;;;;15186:93;;15264:4;15254:8;15250:19;15238:31;;15186:93;15327:2;15317:8;15314:16;15294:18;15291:40;15288:167;;;-1:-1:-1;;;15354:33:21;;15410:4;15407:1;15400:15;15440:4;15361:3;15428:17;15288:167;15471:18;15498:110;;;;15622:1;15617:328;;;;15464:481;;15498:110;-1:-1:-1;;15533:24:21;;15519:39;;15578:20;;;;-1:-1:-1;15498:110:21;;15617:328;43180:1;43173:14;;;43217:4;43204:18;;15712:1;15726:169;15740:8;15737:1;15734:15;15726:169;;;15822:14;;15807:13;;;15800:37;15865:16;;;;15757:10;;15726:169;;;15730:3;;15926:8;15919:5;15915:20;15908:27;;15464:481;-1:-1:-1;15961:3:21;;14635:1335;-1:-1:-1;;;;;;;;;;14635:1335:21:o;16185:786::-;16596:25;16591:3;16584:38;16566:3;16651:6;16645:13;16667:62;16722:6;16717:2;16712:3;16708:12;16701:4;16693:6;16689:17;16667:62;:::i;:::-;-1:-1:-1;;;16788:2:21;16748:16;;;16780:11;;;16773:40;16838:13;;16860:63;16838:13;16909:2;16901:11;;16894:4;16882:17;;16860:63;:::i;:::-;16943:17;16962:2;16939:26;;16185:786;-1:-1:-1;;;;16185:786:21:o;17408:826::-;-1:-1:-1;;;;;17805:15:21;;;17787:34;;17857:15;;17852:2;17837:18;;17830:43;17767:3;17904:2;17889:18;;17882:31;;;17730:4;;17936:57;;17973:19;;17965:6;17936:57;:::i;:::-;18041:9;18033:6;18029:22;18024:2;18013:9;18009:18;18002:50;18075:44;18112:6;18104;18075:44;:::i;:::-;18061:58;;18168:9;18160:6;18156:22;18150:3;18139:9;18135:19;18128:51;18196:32;18221:6;18213;18196:32;:::i;:::-;18188:40;17408:826;-1:-1:-1;;;;;;;;17408:826:21:o;18239:560::-;-1:-1:-1;;;;;18536:15:21;;;18518:34;;18588:15;;18583:2;18568:18;;18561:43;18635:2;18620:18;;18613:34;;;18678:2;18663:18;;18656:34;;;18498:3;18721;18706:19;;18699:32;;;18461:4;;18748:45;;18773:19;;18765:6;18748:45;:::i;:::-;18740:53;18239:560;-1:-1:-1;;;;;;;18239:560:21:o;18804:519::-;19081:2;19070:9;19063:21;19044:4;19107:73;19176:2;19165:9;19161:18;19153:6;19145;19107:73;:::i;:::-;19228:9;19220:6;19216:22;19211:2;19200:9;19196:18;19189:50;19256:61;19310:6;19302;19294;19256:61;:::i;19328:261::-;19507:2;19496:9;19489:21;19470:4;19527:56;19579:2;19568:9;19564:18;19556:6;19527:56;:::i;19594:465::-;19851:2;19840:9;19833:21;19814:4;19877:56;19929:2;19918:9;19914:18;19906:6;19877:56;:::i;:::-;19981:9;19973:6;19969:22;19964:2;19953:9;19949:18;19942:50;20009:44;20046:6;20038;20009:44;:::i;:::-;20001:52;19594:465;-1:-1:-1;;;;;19594:465:21:o;20256:996::-;20643:4;20672:3;20716:6;20709:14;20702:22;20691:9;20684:41;20761:6;20756:2;20745:9;20741:18;20734:34;20804:6;20799:2;20788:9;20784:18;20777:34;20847:6;20842:2;20831:9;20827:18;20820:34;20891:6;20885:3;20874:9;20870:19;20863:35;20935:6;20929:3;20918:9;20914:19;20907:35;20979:6;20973:3;20962:9;20958:19;20951:35;21023:6;21017:3;21006:9;21002:19;20995:35;21067:6;21061:3;21050:9;21046:19;21039:35;21111:2;21105:3;21094:9;21090:19;21083:31;21131:44;21171:2;21160:9;21156:18;21148:6;21131:44;:::i;:::-;21123:52;;;21242:1;21238;21233:3;21229:11;21225:19;21216:7;21212:33;21206:3;21195:9;21191:19;21184:62;20256:996;;;;;;;;;;;;;;:::o;21439:219::-;21588:2;21577:9;21570:21;21551:4;21608:44;21648:2;21637:9;21633:18;21625:6;21608:44;:::i;22445:404::-;22647:2;22629:21;;;22686:2;22666:18;;;22659:30;22725:34;22720:2;22705:18;;22698:62;-1:-1:-1;;;22791:2:21;22776:18;;22769:38;22839:3;22824:19;;22445:404::o;23904:419::-;24106:2;24088:21;;;24145:2;24125:18;;;24118:30;24184:34;24179:2;24164:18;;24157:62;24255:25;24250:2;24235:18;;24228:53;24313:3;24298:19;;23904:419::o;25502:400::-;25704:2;25686:21;;;25743:2;25723:18;;;25716:30;25782:34;25777:2;25762:18;;25755:62;-1:-1:-1;;;25848:2:21;25833:18;;25826:34;25892:3;25877:19;;25502:400::o;27135:405::-;27337:2;27319:21;;;27376:2;27356:18;;;27349:30;27415:34;27410:2;27395:18;;27388:62;-1:-1:-1;;;27481:2:21;27466:18;;27459:39;27530:3;27515:19;;27135:405::o;28653:418::-;28855:2;28837:21;;;28894:2;28874:18;;;28867:30;28933:34;28928:2;28913:18;;28906:62;-1:-1:-1;;;28999:2:21;28984:18;;28977:52;29061:3;29046:19;;28653:418::o;30126:401::-;30328:2;30310:21;;;30367:2;30347:18;;;30340:30;30406:34;30401:2;30386:18;;30379:62;-1:-1:-1;;;30472:2:21;30457:18;;30450:35;30517:3;30502:19;;30126:401::o;30951:407::-;31153:2;31135:21;;;31192:2;31172:18;;;31165:30;31231:34;31226:2;31211:18;;31204:62;-1:-1:-1;;;31297:2:21;31282:18;;31275:41;31348:3;31333:19;;30951:407::o;32543:399::-;32745:2;32727:21;;;32784:2;32764:18;;;32757:30;32823:34;32818:2;32803:18;;32796:62;-1:-1:-1;;;32889:2:21;32874:18;;32867:33;32932:3;32917:19;;32543:399::o;32947:354::-;33149:2;33131:21;;;33188:2;33168:18;;;33161:30;33227:32;33222:2;33207:18;;33200:60;33292:2;33277:18;;32947:354::o;33306:406::-;33508:2;33490:21;;;33547:2;33527:18;;;33520:30;33586:34;33581:2;33566:18;;33559:62;-1:-1:-1;;;33652:2:21;33637:18;;33630:40;33702:3;33687:19;;33306:406::o;35545:356::-;35747:2;35729:21;;;35766:18;;;35759:30;35825:34;35820:2;35805:18;;35798:62;35892:2;35877:18;;35545:356::o;38089:350::-;38291:2;38273:21;;;38330:2;38310:18;;;38303:30;38369:28;38364:2;38349:18;;38342:56;38430:2;38415:18;;38089:350::o;39621:404::-;39823:2;39805:21;;;39862:2;39842:18;;;39835:30;39901:34;39896:2;39881:18;;39874:62;-1:-1:-1;;;39967:2:21;39952:18;;39945:38;40015:3;40000:19;;39621:404::o;40373:397::-;40575:2;40557:21;;;40614:2;40594:18;;;40587:30;40653:34;40648:2;40633:18;;40626:62;-1:-1:-1;;;40719:2:21;40704:18;;40697:31;40760:3;40745:19;;40373:397::o;40775:355::-;40977:2;40959:21;;;41016:2;40996:18;;;40989:30;41055:33;41050:2;41035:18;;41028:61;41121:2;41106:18;;40775:355::o;41135:401::-;41337:2;41319:21;;;41376:2;41356:18;;;41349:30;41415:34;41410:2;41395:18;;41388:62;-1:-1:-1;;;41481:2:21;41466:18;;41459:35;41526:3;41511:19;;41135:401::o;42392:522::-;42470:4;42476:6;42536:11;42523:25;42630:2;42626:7;42615:8;42599:14;42595:29;42591:43;42571:18;42567:68;42557:96;;42649:1;42646;42639:12;42557:96;42676:33;;42728:20;;;-1:-1:-1;;;;;;42760:30:21;;42757:50;;;42803:1;42800;42793:12;42757:50;42836:4;42824:17;;-1:-1:-1;42867:14:21;42863:27;;;42853:38;;42850:58;;;42904:1;42901;42894:12;42919:183;42979:4;-1:-1:-1;;;;;43004:6:21;43001:30;42998:56;;;43034:18;;:::i;:::-;-1:-1:-1;43079:1:21;43075:14;43091:4;43071:25;;42919:183::o;43233:128::-;43273:3;43304:1;43300:6;43297:1;43294:13;43291:39;;;43310:18;;:::i;:::-;-1:-1:-1;43346:9:21;;43233:128::o;43366:217::-;43406:1;43432;43422:132;;43476:10;43471:3;43467:20;43464:1;43457:31;43511:4;43508:1;43501:15;43539:4;43536:1;43529:15;43422:132;-1:-1:-1;43568:9:21;;43366:217::o;43588:168::-;43628:7;43694:1;43690;43686:6;43682:14;43679:1;43676:21;43671:1;43664:9;43657:17;43653:45;43650:71;;;43701:18;;:::i;:::-;-1:-1:-1;43741:9:21;;43588:168::o;43761:125::-;43801:4;43829:1;43826;43823:8;43820:34;;;43834:18;;:::i;:::-;-1:-1:-1;43871:9:21;;43761:125::o;43891:258::-;43963:1;43973:113;43987:6;43984:1;43981:13;43973:113;;;44063:11;;;44057:18;44044:11;;;44037:39;44009:2;44002:10;43973:113;;;44104:6;44101:1;44098:13;44095:48;;;-1:-1:-1;;44139:1:21;44121:16;;44114:27;43891:258::o;44154:136::-;44193:3;44221:5;44211:39;;44230:18;;:::i;:::-;-1:-1:-1;;;44266:18:21;;44154:136::o;44295:380::-;44374:1;44370:12;;;;44417;;;44438:61;;44492:4;44484:6;44480:17;44470:27;;44438:61;44545:2;44537:6;44534:14;44514:18;44511:38;44508:161;;;44591:10;44586:3;44582:20;44579:1;44572:31;44626:4;44623:1;44616:15;44654:4;44651:1;44644:15;44508:161;;44295:380;;;:::o;44680:249::-;44790:2;44771:13;;-1:-1:-1;;44767:27:21;44755:40;;-1:-1:-1;;;;;44810:34:21;;44846:22;;;44807:62;44804:88;;;44872:18;;:::i;:::-;44908:2;44901:22;-1:-1:-1;;44680:249:21:o;44934:135::-;44973:3;-1:-1:-1;;44994:17:21;;44991:43;;;45014:18;;:::i;:::-;-1:-1:-1;45061:1:21;45050:13;;44934:135::o;45074:127::-;45135:10;45130:3;45126:20;45123:1;45116:31;45166:4;45163:1;45156:15;45190:4;45187:1;45180:15;45206:127;45267:10;45262:3;45258:20;45255:1;45248:31;45298:4;45295:1;45288:15;45322:4;45319:1;45312:15;45338:127;45399:10;45394:3;45390:20;45387:1;45380:31;45430:4;45427:1;45420:15;45454:4;45451:1;45444:15;45470:179;45505:3;45547:1;45529:16;45526:23;45523:120;;;45593:1;45590;45587;45572:23;-1:-1:-1;45630:1:21;45624:8;45619:3;45615:18;45523:120;45470:179;:::o;45654:671::-;45693:3;45735:4;45717:16;45714:26;45711:39;;;45654:671;:::o;45711:39::-;45777:2;45771:9;-1:-1:-1;;45842:16:21;45838:25;;45835:1;45771:9;45814:50;45893:4;45887:11;45917:16;-1:-1:-1;;;;;46023:2:21;46016:4;46008:6;46004:17;46001:25;45996:2;45988:6;45985:14;45982:45;45979:58;;;46030:5;;;;;45654:671;:::o;45979:58::-;46067:6;46061:4;46057:17;46046:28;;46103:3;46097:10;46130:2;46122:6;46119:14;46116:27;;;46136:5;;;;;;45654:671;:::o;46116:27::-;46220:2;46201:16;46195:4;46191:27;46187:36;46180:4;46171:6;46166:3;46162:16;46158:27;46155:69;46152:82;;;46227:5;;;;;;45654:671;:::o;46152:82::-;46243:57;46294:4;46285:6;46277;46273:19;46269:30;46263:4;46243:57;:::i;:::-;-1:-1:-1;46316:3:21;;45654:671;-1:-1:-1;;;;;45654:671:21:o;46330:131::-;-1:-1:-1;;;;;;46404:32:21;;46394:43;;46384:71;;46451:1;46448;46441:12

Swarm Source

ipfs://82f7fa088f8490014cee04d3a3c4fa9b84b1de6940b3879b85d09fed26aa61bd
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.