ETH Price: $2,970.42 (-1.65%)
Gas: 2 Gwei

Token

Bonklerito (BNKLTO)
 

Overview

Max Total Supply

59.8 BNKLTO

Holders

89

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
0.00000001 BNKLTO

Value
$0.00
0x522111f71627a3188c2a9d9961160be1839ec3d1
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x00000000...4e6B95A54
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
E741V1Wrapped741

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-03
*/

//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣷⣾⣿⣿⣿⣿⣶⣾⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⢉⡽⢋⣙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢰⣿⣦⣀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣛⣓⣒⠶⢤⣾⠀⠀⠸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢸⣿⠳⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⡄⠀⠀⢳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⡦⠀⠀⠻⠿⣦⣀⡀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⡏⠀⠜⡴⠁⠀⠀⠀⡀⠀⠀⠉⠉⠲⢦⡀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢠⣿⣷⡾⢿⣿⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⣸⠀⠀⠀⢧⠀⠀⠀⠀⠹⠒⢤⣀⠀⠀⠁⠈⢢⠀
//⠀⠀⠀⠀⠀⠀⠀⠈⣿⣟⠀⠀⠈⠻⣿⠏⢨⠔⢦⠈⢻⣿⡼⠋⢀⣤⣶⣶⣿⣿⣿⣄⢠⣀⡜⠆⠀⢀⡠⠴⠒⠂⠈⢻⢦⡀⠀⠈⡇
//⠀⠀⢀⣶⣿⣷⠀⠀⠘⣿⡄⠀⠐⣶⢬⣇⠉⢣⡸⠀⣰⣿⣁⣴⣿⣿⣿⣿⣿⣿⣟⢿⣽⡛⣧⠔⠒⡏⣀⠀⠀⣀⣀⣾⠀⠑⠢⠤⠃
//⠀⣴⡟⣾⡟⣿⡇⣀⣼⣿⣿⣦⡀⠀⠙⠻⡆⠀⠇⢰⠟⠻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣷⡿⠟⣇⠀⠀⢙⣰⣺⣽⣿⣿⣿⠀⠀⠀⠀⠀
//⢸⡿⢸⡿⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡴⠃⠀⠀⢸⡀⠀⢹⣿⣿⣿⣿⣿⢹⣿⣿⣯⣀⣀⣀⣭⣏⠁⠀⠀⠈⠻⣿⣿⠀⠀⠀⠀⠀
//⣿⡇⢸⡗⢸⠛⣿⡍⠉⠙⠛⠻⢭⣻⣿⣧⠀⠀⢀⣴⠷⣄⡀⠻⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⡻⡆⠀⠀⠀⠀⠙⠇⠀⠀⠀⠀⠀
//⣿⡇⢸⣷⣽⠶⠛⢷⡀⣠⠤⢤⣾⣿⣿⣽⣞⣿⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⢿⣿⠉⠛⢿⣿⣷⡇⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀
//⣿⣇⣼⢿⠁⠀⠀⢠⡷⡇⢠⣶⡽⣿⠋⠉⢻⠿⠛⠋⠉⠉⢹⠉⢻⢻⣿⣿⣿⣿⣿⣷⡶⢏⡠⠿⣿⣷⡞⠛⠙⢳⣦⡀⠀⠀⠀⠀⠀
//⣿⡏⢠⡋⣆⠀⠀⡞⠀⠇⠈⢿⣿⣏⠀⠀⠸⡀⠀⠀⠀⢀⡞⠀⢸⢸⣿⡏⠛⠛⠛⠉⣠⠋⣠⠀⠸⠧⢻⡝⢷⡄⢿⣷⠀⠀⠀⠀⠀
//⢸⣧⠸⡹⡌⢆⣴⣿⡀⠀⠀⠈⠻⠿⣆⠀⠀⠳⣄⣰⣚⠉⠉⠉⠻⣾⣿⡻⣦⣀⣠⣴⠷⠟⣻⠀⠀⠀⢸⡇⢸⣧⢨⣿⠀⠀⠀⠀⠀
//⠀⢿⣇⠓⠃⣼⣇⡈⠻⣄⠀⠰⢦⣀⢀⣷⡄⠀⠀⠀⠈⠉⠓⡤⣄⡈⡿⣿⣷⣶⣶⣶⣾⣿⠟⢀⠆⠀⡾⢷⣾⡇⣼⡟⠀⠀⠀⠀⠀
//⠀⠈⢿⢷⣞⠛⣿⣿⣤⡍⠳⣤⣤⣤⡿⠗⠁⠀⠀⠀⠀⠀⠀⠙⠀⠹⡅⠀⠈⠉⠉⠉⠻⣤⠔⠚⠒⠊⠀⠀⠈⣿⡿⠃⠀⠀⠀⠀⠀
// ███████ █████ ██   ██  ██⣤⣔⡊⣀⠀⠀⡷⠀⠀⠀⢀⣴⠞⠓⠲⠦⣤⡀⠀⠀⣠⡿⠁⠀⠀⠀⠀⠀⠀
// ██         ██ ██   ██ ███⠀⢹⠀⠙⣤⣃⣤⠶⠞⣫⣤⣟⣛⣷⣶⣿⢟⡦⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀
// █████     ██  ███████  ██ ⢸⠀⠀⣿⡏⠾⠿⣶⣿⣿⣿⠿⣛⣽⣾⡿⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ██       ██        ██  ██ ⡇⠀⣠⠏⠉⠛⠳⠶⢶⣶⡿⠿⠟⠊⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ███████  ██        ██  ██⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

// A public demonstration in single-contract dual-token implementations
// with zero-conflict events, and function overloading.
// https://github.com/SJ741/E741-Platform
// https://741.gg   (Get the token telegram link from 'telegram' variable)
// Emerald Token Standard

// WARNING - Fungible NFT specs are universally new, and inherently DANGEROUS
// no systems have been built with these usecases in mind, and there are a number of 
// ways that experimental, complex contracts can lead to unforseen consequences.
// INTERACT WITH EXPERIMENTAL SMART CONTRACTS AT YOUR OWN RISK

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


// libraries to separate ERC20 and ERC721 events, and certain signature-specific functions
// ERC20 events
library libES20 {
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); }
    function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); }
}

// ERC721 events
library libES721 {
    event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); }
    function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); }
    function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); }
}

// ERC165 https://eips.ethereum.org/EIPS/eip-721
interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// ERC20 https://eips.ethereum.org/EIPS/eip-20
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function decimals() external view returns (uint);
}

// ERC721 https://eips.ethereum.org/EIPS/eip-721
interface IERC721 is IERC165 {
    function balanceOf(address account) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    // payable removed for erc20 etherscan compatibility
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface IE741 is IERC20, IERC721 {
    // supportsInterface 0x5a46575f 
    // library transfers can not be included in the interface
    // incorporate them directly with library
    // libES20.Transfer
    // libES20.Approval
    // libES721.Transfer
    // libES721.Approval
    // libES721.ApprovalForAll
    function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256);
    function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool);
    function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool);
}

interface IERC721Metadata {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IERC7572 {
    function contractURI() external view returns (string memory);
    event ContractURIUpdated();
}

interface IERC20Metadata {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IDevable {
    function initialize(bytes memory encodedParameters) external returns (address);
    function dev() external returns (address dev);
    function setContractURI(string memory newContractURI) external;
    function setBaseURI(string memory newBaseURI) external;
    function changeDev(address newDev) external;
    function toggelNFTinterface() external;
    function withdraw() external;
    function setExtension(string memory newExtension) external;
    function setTelegram(string memory newTelegram) external;
    function setSkipMintingGlobal(bool newSkipMintingGlobal) external;
}

// ERC721 Token Receiver https://eips.ethereum.org/EIPS/eip-721
interface IERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

contract ERC721TokenReceiver is IERC721TokenReceiver {
    function onERC721Received(address, address, uint256, bytes memory) external virtual returns(bytes4) {
        return IERC721TokenReceiver.onERC721Received.selector;
    }
}

abstract contract E741V1Base is IDevable, ERC721TokenReceiver, IE741  {

    address public constant BROKEN_ADDRESS = address(0x5e7ec);
    address public constant DEPOSIT_ADDRESS = address(0x0);
    address public constant MINT_ADDRESS = address(0x0);

    string public baseURI;
    string internal _contractURI;
    string public extension;
    string public telegram;
    string internal _name;
    string internal _symbol;
    uint internal _decimals;
    uint internal _totalIds;
    uint internal _totalSupply;
    uint internal ONE; // 1.0 token(s)
    uint internal MAXID; // e.g. 1.00000001 : 1.00007777 is the range for NFT IDs
    uint64 public minted; // number of unique ID mints + ONE
    address public dev;
    bool public supportsNFTinterface;
    bool public skipMintingGlobal = false;

    mapping(address => mapping(address => bool)) private _operatorApprovals;
    mapping(address => mapping(address => uint)) internal _allowance;
    mapping(uint256 tokenId => address) public ownerOf;
    mapping(uint256 => address) private _nftApprovals;
    mapping(address => uint) internal _balanceOf;
    mapping(address => uint64[]) public ownedNFTs; // broken NFTs stored in limbo list are at ownedNFTs[BROKEN_ADDRESS]
    mapping(uint64 => uint256) internal idToIndex; 
    mapping(address => bool) internal skipMintingUser;

    error UnsupportedReceiver();

    modifier onlyDev() {
        require(msg.sender == dev, "Not the developer");
        _;
    }

    constructor() {
        dev = msg.sender;
    }

    function initialize(bytes memory encodedParameters) public override virtual returns (address underlyingToken);
    function deposit(uint[] memory amounts) public virtual;
    function withdraw(uint[] memory amounts) public payable virtual;

    function name() public view virtual returns (string memory) { return _name; }
    function symbol() public view virtual returns (string memory) { return _symbol; }
    function decimals() public view virtual returns (uint) { return _decimals; }
    function totalSupply() public view virtual returns (uint) { return _totalSupply; }
    function maxSupply() public view virtual returns (uint) { return _totalIds * ONE; }
    function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; }
    function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; }
    function setBaseURI(string memory newBaseURI) public onlyDev override {baseURI = newBaseURI;}
    function setContractURI(string memory newContractURI) public onlyDev override virtual {_contractURI = newContractURI; emit IERC7572.ContractURIUpdated();}
    function setExtension(string memory newExtension) public onlyDev override virtual {extension = newExtension;}
    function setTelegram(string memory newTelegram) public onlyDev virtual {telegram = newTelegram;}
    function changeDev(address newDev) public onlyDev override  {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0))
    // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag
    // don't waste it, as frontends don't typically change classification of contracts
    // probably never to be used.
    function toggelNFTinterface() public onlyDev override {supportsNFTinterface = !supportsNFTinterface;}
    function tokensOfOwner(address owner) public view returns (uint64[] memory){return ownedNFTs[owner];}
    function nftBalanceOf(address account) public view returns (uint) {return ownedNFTs[account].length;}
    function contractURI() public view virtual returns (string memory) {return _contractURI;}
    function setSkipMintingGlobal(bool newSkipMintingGlobal) public override virtual onlyDev { skipMintingGlobal = newSkipMintingGlobal; } 
    function setSkipMinting(bool newSkipMinting) public virtual { skipMintingUser[msg.sender] = newSkipMinting; }

    function approve(address spender, uint amount) public override returns (bool) {

        // if the amount is greater than one token, and within range of IDs for NFTs 
        // then set NFT approval for the given ID
        if(amount >= ONE && amount <= MAXID) {
            address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input
            if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("E741: You are not approved");
            _nftApprovals[amount] = spender; // calling nft approval for the token and spender
            libES721.emitApproval(owner, spender, amount);
            return true;
        }
        
        // else set the ERC20 allowance
        // the NFT ID range being set within a limited subset of ONE token(s)
        // allows for non-clashing interactions
        _allowance[msg.sender][spender] = amount;
        libES20.emitApproval(msg.sender, spender, amount);
        return true;
    }

    function _transfer741(address from, address to, uint amount) internal virtual {
        
        require(_balanceOf[from] >= amount, "E741: transfer amount exceeds balance");
        
        // checking the decimal amount of tokens owned before transaction for both participants
        uint256 fromDecimalsPre = _balanceOf[from] % ONE;
        uint256 toDecimalsPre = _balanceOf[to] % ONE;
        
        // simple erc20 balance operations
        _transfer20(from, to, amount);

        // checking the decimal amount of tokens after transaction for both partcipants
        uint256 fromDecimalsPost = _balanceOf[from] % ONE;
        uint256 toDecimalsPost = _balanceOf[to] % ONE;

        // stores the NFT IDs owned by `from`, enabling NFT management for that address.
        uint64[] storage ownedNFTsArray = ownedNFTs[from];

        // references NFTs marked as "broken", tracking these special state NFTs.
        uint64[] storage brokenIDsArray = ownedNFTs[BROKEN_ADDRESS];
        

        // if sender has higher decimal count after transaction, then they "roll under" and break an NFT
        if (fromDecimalsPre < fromDecimalsPost) {

            if(ownedNFTsArray.length > 0) { // if the sender has an nft to send
                //pushes the last nft in the owned list into the "broken list" for limbo NFTs
                _transfer721Pop(from, BROKEN_ADDRESS, ownedNFTsArray); //transfers the NFT ID ownership to BROKEN address for stewardship
            }
        }

        // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft 
        if (toDecimalsPre > toDecimalsPost) {

            if(brokenIDsArray.length > 0) { // recover an id from broken list

                _transfer721Pop(BROKEN_ADDRESS, to, brokenIDsArray);
            }
            else { // mint new id
                _mint(to);
            }
            
        }
        
        // amount of tokens - amount of whole tokens being processed in int
        uint amountInTokens = amount / ONE;

        uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array

        // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations
        // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract
        // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected
        if(skipMintingGlobal || from == DEPOSIT_ADDRESS || skipMintingUser[to] || skipMintingUser[from] || from == dev) {
            //  When skipping minting the nft holder can only send out the tokens they hold (reduce gas)
            amountInTokens = amountInTokens < len ? amountInTokens : len;
        }

        if(amountInTokens > 0) {
            
            len = amountInTokens < len ? amountInTokens : len;
            // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached
            // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers
            for (uint i = 0; i < len; i++) {
                _transfer721Pop(from, to, ownedNFTsArray); 
            }
            amountInTokens -= len;
            len = brokenIDsArray.length;
            len = amountInTokens < len ? amountInTokens : len;
            
            // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available
            // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance
            for (uint i = 0; i < len; i++) {        
                _transfer721Pop(BROKEN_ADDRESS, to, brokenIDsArray);
            }

            _mintBatch(to, amountInTokens - len);

        }
    }

    function _mintBatch(address to, uint256 amount) internal virtual {
        if(amount == 0) return; // Exit if no NFTs to mint

        if(amount == 1) { // Optimize single mint process
            _mint(to);
            return;
        }
        uint64 id = minted; // Start ID from last minted value
        uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to'
        for(uint i = 0; i < amount;) {
            unchecked {
                id++; // Increment ID for each new NFT
            }
            ownerOf[id] = to; // Assign new NFT to owner.
            idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array
            ownedNFTs[to].push(id); // Add new NFT ID to owner's list

            libES721.emitTransfer(MINT_ADDRESS, to, id); // Emit NFT transfer event

            unchecked {
                ownedLen++; // Increment count of owned NFTs
                i++; // Move to next NFT
            }
        }
        unchecked {
            minted += uint64(amount); // Update total minted count
        }
    }


    function _mint(address to) internal virtual returns(uint64 tokenId){
        unchecked {
            minted++; // Increment the total number of minted tokens
        }
        tokenId = minted; // Assign the newly minted token ID

        ownerOf[tokenId] = to; // Set ownership of the new token to 'to'
        idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list
        ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens
        
        libES721.emitTransfer(MINT_ADDRESS, to, tokenId); // Emit an event for the token transfer
    }


    // Updates the mappings and arrays managing ownership and index of NFTs after a transfer
    function _updateOwnedNFTs(address from, address to, uint64 tokenId) internal { 
        uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list
        uint64[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from'
        uint256 len = nftArray.length; // Current number of NFTs owned by 'from'
        uint64 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token
        
        nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array
        nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from'
        
        if(len - 1 != 0){ 
            idToIndex[lastTokenId] = index; // Update the index of the swapped token
        } 
    
        ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array
        idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token
    }

    // Executes a simple ERC20 token transfer.
    function _transfer20(address from, address to, uint256 amount) internal {
        _balanceOf[from] -= amount; // Deduct the amount from the sender's balance
        unchecked {
            _balanceOf[to] += amount; // Add the amount to the recipient's balance
        }
        libES20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event
    }

    // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission
    function _transfer721(address from, address to, uint64 tokenId) internal virtual {
        require(from == ownerOf[tokenId], "E741: Incorrect owner"); // Ensure 'from' is the current owner
        
        delete _nftApprovals[tokenId]; // Clear any approvals for this token
        ownerOf[tokenId] = to; // Transfer ownership of the token to 'to'
        _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures
        libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event
    }

    // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission
    function _transfer721Pop(address from, address to, uint64[] storage nftArray) internal virtual {
        uint64 tokenId = nftArray[nftArray.length - 1];
        
        delete _nftApprovals[tokenId]; // Clear any approvals for this token
        ownerOf[tokenId] = to; // Transfer ownership of the token to 'to'
        
        // update owned nfts pop edition
        nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from'    
        ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array
        idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token

        libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event
    }


    // only erc20 calls this
    // if amount is a token id owned my the caller send as an NFT
    // else transfer741
    function transfer(address to, uint amount) public override returns (bool) {
        if(ownerOf[amount] == msg.sender) {
            _transfer721(msg.sender, to, uint64(amount));
            _transfer20(msg.sender, to, ONE);
            return true;
        }
        _transfer741(msg.sender, to, amount);
        return true;
    }

    // erc20 and erc721 call this
    function transferFrom(address from, address to, uint amount) public override returns (bool) {

        //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE)
        if(amount >= ONE && amount <= MAXID) {
            require(
                //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs 
                msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
                );

            _transfer721(from, to, uint64(amount));
            _transfer20(from, to, ONE);
            return true;
        }

        _spendAllowance(from, msg.sender, amount);
        _transfer741(from, to, amount);
        return true;

    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
            );
        _transfer721(from, to, uint64(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
            );
        _transfer721(from, to, uint64(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    function _spendAllowance(address owner, address spender, uint amount) internal virtual {
        require(_allowance[owner][spender] >= amount, "E741: insufficient allowance");
        _allowance[owner][spender] -= amount;
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        if (ownerOf[tokenId] == address(0)) revert();
        return _nftApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _operatorApprovals[msg.sender][operator] = approved;
        libES721.emitApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(tokenId <= MAXID, "E741: invalid id");
        if (bytes(baseURI).length == 0) {return "";}
        return string(abi.encodePacked(baseURI, toString(tokenId - ONE), extension));
    }

    function toString(uint256 value) internal pure returns (string memory) {
        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(value % 10) + 48); value /= 10;}
        return string(buffer);
    }

    function withdraw() external onlyDev override {
        (bool success,) = payable(dev).call{value: address(this).balance}("");
        require(success);
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return
            // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20
            // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific
            (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165
            interfaceId == 0x36372b07 || // ERC165 interface ID for ERC20
            interfaceId == 0x150b7a02 || // ERC165 interface ID for IERC721TokenReceiver
            interfaceId == 0x5a46575f;   // ERC165 interface ID for IE741
            
    }
}

pragma solidity ^0.8.24;


contract E741V1Wrapped741 is E741V1Base {

    event Deposit(address indexed from, uint amount741Out, uint[] amounts741In);
    event Withdrawal(address indexed to, uint amountUnderlyingOut, uint[] amounts741In);

    address constant EMERALDS = 0x382EDfe4c6168858C81893fE00fCB7b68914d929;
    address public underlying741;
    uint public underlyingWeiPerNft;

    address public feeRecipient;
    uint public withdrawalFees;
    uint internal withdrawalFeesDivisor = 10000;
    uint constant WITHDRAWAL_FEES_MIN = 5; // 0.05%
    uint constant WITHDRAWAL_FEES_MAX = 50; // 0.5%

    function initialize(bytes memory encodedParameters) public virtual override returns (address) {
        require(_decimals == 0, "Already initialized");
        
        {
            // to prevent stack to deep error
            string memory _inputName; 
            string memory _inputSymbol;
            (withdrawalFees, underlying741, _inputName, _inputSymbol, _decimals, baseURI, _contractURI, _totalIds, underlyingWeiPerNft) = 
                abi.decode(encodedParameters, (uint,address,string,string,uint,string,string,uint,uint));

            _name = _inputName;
            _symbol = _inputSymbol;
        }

        {
            address _token = underlying741;
            require(_token != address(0), 'E741V1: ZERO_ADDRESS');
            try IERC165(_token).supportsInterface(0x5a46575f) returns (bool supports741) {
                require(_token == EMERALDS || supports741, "The underlying token does not support e741");
            } catch {
                revert("The underlying token does not support ERC165");
            }
        }

        ONE = 10 ** _decimals;
        MAXID = ONE + _totalIds - 1;
        minted = uint64(ONE) - 1; // start minting from ID ONE-1 so you can get id 0

        feeRecipient = msg.sender; // our factory is always the fee recipient even if dev of token changes

        require(_decimals <= 18 && IERC20(underlying741).decimals() <= 18, "Too many decimals");
        require(_totalIds > 0, "Need at least 1 nft");
        require(withdrawalFees >= WITHDRAWAL_FEES_MIN, "Min fees of 0.05%");
        require(withdrawalFees <= WITHDRAWAL_FEES_MAX, "Max fees of 0.5%");
        require(ONE > _totalIds, "Not enough decimals for NFT count");

        return underlying741;
    }


    // deposit amount of underlying741
    function deposit(uint[] memory _amountsArray) public virtual override {

        uint _len = _amountsArray.length;
        uint _amount741Out;
        uint _underlyingONE = 10 ** IERC20(underlying741).decimals();

        if(_len == 1) {
            if(IE741(underlying741).ownerOf(_amountsArray[0]) != msg.sender) { // not single nft transfer
                _amount741Out = (_amountsArray[0] * ONE) / underlyingWeiPerNft;
            }
            else {
                _amount741Out = (_underlyingONE * ONE) / underlyingWeiPerNft; // _len is 1
            }            
            // use direct from array to transfer the nft id if used
            IE741(underlying741).transferFrom(msg.sender, address(this), _amountsArray[0]);
        }
        else {
            for(uint i = 0; i < _len; i++) {
                // reverts if they deposit unowned or invalid id
                IE741(underlying741).safeTransferFrom(msg.sender, address(this), _amountsArray[i]);
            }
            _amount741Out = ((_len * _underlyingONE) * ONE) / underlyingWeiPerNft;
        }
        // spawn raw tokens
        _balanceOf[DEPOSIT_ADDRESS] += _amount741Out;

        _totalSupply += _amount741Out;

        _transfer741(DEPOSIT_ADDRESS, msg.sender, _amount741Out); // use _transfer741 to give user broken nfts if necessary

        // donating tokens to this wrapper will only make the wrapped token more scarce
        require(underlyingWeiPerNft * _totalIds >=  IERC20(underlying741).balanceOf(address(this)), "NFT capacity reached, wait for someone to withdraw");

        emit Deposit(msg.sender, _amount741Out, _amountsArray);
    }

    // Two modes
    // withdraw([amount])
    // withdraw([id1, id2, id3])
    function withdraw(uint256[] memory _amountsArray741) public virtual override payable {
        uint _arrayLen = _amountsArray741.length;
        require(_arrayLen > 0, "Trying to withdraw nothing");

        uint _amount741; uint _amount741Sum;
        uint _underlyingONE = 10 ** IERC20(underlying741).decimals();

        if (_arrayLen == 1) {
            _amount741 = _amountsArray741[0];
            if (ownerOf[_amount741] == msg.sender) {
                _amount741Sum = ONE; // only record ONE for owned transfer
            } else {
                _amount741Sum = _amount741;
            }
            transfer(DEPOSIT_ADDRESS, _amount741);
        } else {
            for(uint i = 0; i < _arrayLen;) {
                _amount741 = _amountsArray741[i];
                require(ownerOf[_amount741] == msg.sender, "Can only withdraw for nfts you own");
                transfer(DEPOSIT_ADDRESS, _amount741);
                unchecked { i++; }
            }
            _amount741Sum = _arrayLen * ONE; // only record ONE for owned transfer
        }
        // remove raw tokens
        _balanceOf[DEPOSIT_ADDRESS] -= _amount741Sum;
        _totalSupply -= _amount741Sum;

        uint _totalUnderlyingOut = (_amount741Sum * underlyingWeiPerNft) / ONE; // use ONE not _underlyingONE
        uint _totalUnderlyingFees = (_totalUnderlyingOut * withdrawalFees) / withdrawalFeesDivisor;

        IE741(underlying741).transfer(feeRecipient, _totalUnderlyingFees);
        
        IE741(underlying741).transfer(msg.sender, (_totalUnderlyingOut - _totalUnderlyingFees));

        emit Withdrawal(msg.sender, _totalUnderlyingOut, _amountsArray741);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount741Out","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts741In","type":"uint256[]"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUnderlyingOut","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts741In","type":"uint256[]"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"BROKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amountsArray","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedParameters","type":"bytes"}],"name":"initialize","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSkipMinting","type":"bool"}],"name":"setSkipMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSkipMintingGlobal","type":"bool"}],"name":"setSkipMintingGlobal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTelegram","type":"string"}],"name":"setTelegram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skipMintingGlobal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportsNFTinterface","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":"telegram","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying741","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingWeiPerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amountsArray741","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600b805460ff60e81b19169055612710601855348015610022575f80fd5b50600b8054600160401b600160e01b03191633680100000000000000000217905561386e806100505f395ff3fe6080604052600436106102a5575f3560e01c80636bcef9a61161016f578063a9059cbb116100d8578063d5abeb0111610092578063e8e81fe41161006d578063e8e81fe414610856578063e985e9c514610875578063f835ab0014610894578063ff0d2c26146104c9575f80fd5b8063d5abeb01146107ea578063dd62ed3e146107fe578063e8a3d48514610842575f80fd5b8063a9059cbb14610745578063b3720c3414610764578063b88d4fde14610784578063bb74e1ae14610797578063c87b56dd146107b6578063caf0dcc2146107d5575f80fd5b806391cca3db1161012957806391cca3db1461069a578063938e3d7b146106c057806395d89b41146106df578063983d95ce146106f3578063a22cb46514610706578063a563833b14610725575f80fd5b80636bcef9a6146105d45780636c0360eb146105e857806370a08231146105fc5780637e2285aa146106305780638462151c1461064f57806388a8c95c1461067b575f80fd5b80633ccfd60b116102115780634ee2c4ce116101cb5780634ee2c4ce1461050f5780634f02c4201461052457806355f804b314610543578063598b8e71146105625780636352211e146105815780636a21f8e1146105b5575f80fd5b80633ccfd60b1461048157806342842e0e14610497578063439fab91146104aa578063466c35fc146104c957806346904840146104dc57806347ecb665146104fb575f80fd5b806318160ddd1161026257806318160ddd146103d95780631a72b87d146103ed57806323b872dd146104245780632d5537b0146104435780632ff3a24214610457578063313ce5671461046d575f80fd5b806301ffc9a7146102a957806306fdde03146102dd578063081812fc146102fe578063095ea7b3146103355780630e313e9814610354578063150b7a0214610396575b5f80fd5b3480156102b4575f80fd5b506102c86102c3366004612db5565b6108cd565b60405190151581526020015b60405180910390f35b3480156102e8575f80fd5b506102f161096a565b6040516102d49190612e1d565b348015610309575f80fd5b5061031d610318366004612e2f565b6109fa565b6040516001600160a01b0390911681526020016102d4565b348015610340575f80fd5b506102c861034f366004612e5a565b610a34565b34801561035f575f80fd5b5061038861036e366004612e84565b6001600160a01b03165f9081526011602052604090205490565b6040519081526020016102d4565b3480156103a1575f80fd5b506103c06103b0366004612f62565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102d4565b3480156103e4575f80fd5b50600854610388565b3480156103f8575f80fd5b5061040c610407366004612e5a565b610b42565b6040516001600160401b0390911681526020016102d4565b34801561042f575f80fd5b506102c861043e366004612fc9565b610b89565b34801561044e575f80fd5b506102f1610c40565b348015610462575f80fd5b5061031d6205e7ec81565b348015610478575f80fd5b50600654610388565b34801561048c575f80fd5b50610495610ccc565b005b6104956104a5366004612fc9565b610d63565b3480156104b5575f80fd5b5061031d6104c4366004613007565b610ea2565b3480156104d4575f80fd5b5061031d5f81565b3480156104e7575f80fd5b5060165461031d906001600160a01b031681565b348015610506575f80fd5b506102f16113a2565b34801561051a575f80fd5b5061038860175481565b34801561052f575f80fd5b50600b5461040c906001600160401b031681565b34801561054e575f80fd5b5061049561055d366004613038565b6113af565b34801561056d575f80fd5b5061049561057c36600461307c565b6113ef565b34801561058c575f80fd5b5061031d61059b366004612e2f565b600e6020525f90815260409020546001600160a01b031681565b3480156105c0575f80fd5b506104956105cf366004613129565b611880565b3480156105df575f80fd5b506104956118cf565b3480156105f3575f80fd5b506102f1611921565b348015610607575f80fd5b50610388610616366004612e84565b6001600160a01b03165f9081526010602052604090205490565b34801561063b575f80fd5b5061049561064a366004613038565b61192d565b34801561065a575f80fd5b5061066e610669366004612e84565b61196a565b6040516102d49190613144565b348015610686575f80fd5b50610495610695366004612e84565b611a04565b3480156106a5575f80fd5b50600b5461031d90600160401b90046001600160a01b031681565b3480156106cb575f80fd5b506104956106da366004613038565b611a66565b3480156106ea575f80fd5b506102f1611acf565b61049561070136600461307c565b611ade565b348015610711575f80fd5b50610495610720366004613190565b611eb8565b348015610730575f80fd5b50600b546102c890600160e01b900460ff1681565b348015610750575f80fd5b506102c861075f366004612e5a565b611ef1565b34801561076f575f80fd5b50600b546102c890600160e81b900460ff1681565b610495610792366004612f62565b611f3b565b3480156107a2575f80fd5b5060145461031d906001600160a01b031681565b3480156107c1575f80fd5b506102f16107d0366004612e2f565b612068565b3480156107e0575f80fd5b5061038860155481565b3480156107f5575f80fd5b50610388612117565b348015610809575f80fd5b506103886108183660046131c7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b34801561084d575f80fd5b506102f161212d565b348015610861575f80fd5b50610495610870366004613038565b61213c565b348015610880575f80fd5b506102c861088f3660046131c7565b612179565b34801561089f575f80fd5b506104956108ae366004613129565b335f908152601360205260409020805460ff1916911515919091179055565b600b545f90600160e01b900460ff1680156108f857506380ac58cd60e01b6001600160e01b03198316145b8061091357506301ffc9a760e01b6001600160e01b03198316145b8061092e57506336372b0760e01b6001600160e01b03198316145b806109495750630a85bd0160e11b6001600160e01b03198316145b806109645750635a46575f60e01b6001600160e01b03198316145b92915050565b606060048054610979906131f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109a5906131f3565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f818152600e60205260408120546001600160a01b0316610a19575f80fd5b505f908152600f60205260409020546001600160a01b031690565b5f6009548210158015610a495750600a548211155b15610b09575f828152600e60205260409020546001600160a01b0316338114801590610a7c5750610a7a8133612179565b155b15610ace5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600f6020526040902080546001600160a01b0319166001600160a01b038616179055610aff8185856121a6565b6001915050610964565b335f818152600d602090815260408083206001600160a01b03881684529091529020839055610b399084846121ec565b50600192915050565b6011602052815f5260405f208181548110610b5b575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6009548210158015610b9e5750600a548211155b15610c1f57336001600160a01b0385161480610bd35750610bbe826109fa565b6001600160a01b0316336001600160a01b0316145b80610be35750610be38433612179565b610bff5760405162461bcd60e51b8152600401610ac59061322b565b610c0a84848461223e565b610c17848460095461230c565b506001610c39565b610c2a843384612360565b610c35848484612414565b5060015b9392505050565b60028054610c4d906131f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906131f3565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b505050505081565b600b54600160401b90046001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610ac590613262565b600b546040515f91600160401b90046001600160a01b03169047908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d60575f80fd5b50565b336001600160a01b0384161480610d935750610d7e816109fa565b6001600160a01b0316336001600160a01b0316145b80610da35750610da38333612179565b610dbf5760405162461bcd60e51b8152600401610ac59061322b565b610dca83838361223e565b610dd7838360095461230c565b6001600160a01b0382163b15801590610e7f5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e72919061328d565b6001600160e01b03191614155b15610e9d576040516301d6c93560e61b815260040160405180910390fd5b505050565b5f6006545f14610eea5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610ac5565b60608083806020019051810190610f0191906132f5565b6015819055600782905560175f60148160068180806001610f228c8261341a565b50610f2f90508b8261341a565b508a91905055899d508a9e508b91906101000a8154816001600160a01b0302191690836001600160a01b031602179055508a919050555050505050505050508160049081610f7d919061341a565b506005610f8a828261341a565b50506014546001600160a01b0316905080610fde5760405162461bcd60e51b81526020600482015260146024820152734537343156313a205a45524f5f4144445245535360601b6044820152606401610ac5565b6040516301ffc9a760e01b8152635a46575f60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015611045575060408051601f3d908101601f19168201909252611042918101906134d9565b60015b6110a65760405162461bcd60e51b815260206004820152602c60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526b70706f72742045524331363560a01b6064820152608401610ac5565b6001600160a01b03821673382edfe4c6168858c81893fe00fcb7b68914d92914806110ce5750805b61112d5760405162461bcd60e51b815260206004820152602a60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526970706f7274206537343160b01b6064820152608401610ac5565b505060065461113d90600a6135d9565b600981905560075460019161115291906135e4565b61115c91906135f7565b600a5560095461116e9060019061360a565b600b80546001600160401b039290921667ffffffffffffffff19909216919091179055601680546001600160a01b0319163317905560065460121080159061122057506014546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156111f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121d9190613631565b11155b6112605760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920646563696d616c7360781b6044820152606401610ac5565b5f600754116112a75760405162461bcd60e51b81526020600482015260136024820152721399595908185d081b19585cdd080c481b999d606a1b6044820152606401610ac5565b600560175410156112ee5760405162461bcd60e51b81526020600482015260116024820152704d696e2066656573206f6620302e30352560781b6044820152606401610ac5565b603260175411156113345760405162461bcd60e51b815260206004820152601060248201526f4d61782066656573206f6620302e352560801b6044820152606401610ac5565b600754600954116113915760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610ac5565b50506014546001600160a01b031690565b60038054610c4d906131f3565b600b54600160401b90046001600160a01b031633146113e05760405162461bcd60e51b8152600401610ac590613262565b5f6113eb828261341a565b5050565b80516014546040805163313ce56760e01b815290515f9283926001600160a01b039091169163313ce567916004808201926020929091908290030181865afa15801561143d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190613631565b61146c90600a6135d9565b90508260010361161957601454845133916001600160a01b031690636352211e9087905f9061149d5761149d613648565b60200260200101516040518263ffffffff1660e01b81526004016114c391815260200190565b602060405180830381865afa1580156114de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611502919061365c565b6001600160a01b03161461154b57601554600954855f8151811061152857611528613648565b602002602001015161153a9190613677565b61154491906136a2565b9150611568565b60155460095461155b9083613677565b61156591906136a2565b91505b60145484516001600160a01b03909116906323b872dd903390309088905f9061159357611593613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af11580156115ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906134d9565b506116f1565b5f5b838110156116c95760145485516001600160a01b03909116906342842e0e903390309089908690811061165057611650613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b1580156116a7575f80fd5b505af11580156116b9573d5f803e3d5ffd5b50506001909201915061161b9050565b506015546009546116da8386613677565b6116e49190613677565b6116ee91906136a2565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805484929061172b9084906135e4565b925050819055508160085f82825461174391906135e4565b9091555061175490505f3384612414565b6014546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613631565b6007546015546117ce9190613677565b10156118375760405162461bcd60e51b815260206004820152603260248201527f4e465420636170616369747920726561636865642c207761697420666f7220736044820152716f6d656f6e6520746f20776974686472617760701b6064820152608401610ac5565b336001600160a01b03167fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66683866040516118729291906136b5565b60405180910390a250505050565b600b54600160401b90046001600160a01b031633146118b15760405162461bcd60e51b8152600401610ac590613262565b600b8054911515600160e81b0260ff60e81b19909216919091179055565b600b54600160401b90046001600160a01b031633146119005760405162461bcd60e51b8152600401610ac590613262565b600b805460ff60e01b198116600160e01b9182900460ff1615909102179055565b5f8054610c4d906131f3565b600b54600160401b90046001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ac590613262565b60026113eb828261341a565b6001600160a01b0381165f908152601160209081526040918290208054835181840281018401909452808452606093928301828280156119f857602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b0316815260200190600801906020826007010492830192600103820291508084116119b55790505b50505050509050919050565b600b54600160401b90046001600160a01b03163314611a355760405162461bcd60e51b8152600401610ac590613262565b600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b600b54600160401b90046001600160a01b03163314611a975760405162461bcd60e51b8152600401610ac590613262565b6001611aa3828261341a565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a150565b606060058054610979906131f3565b805180611b2d5760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f207769746864726177206e6f7468696e670000000000006044820152606401610ac5565b5f805f60145f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba49190613631565b611baf90600a6135d9565b905083600103611c1857845f81518110611bcb57611bcb613648565b6020908102919091018101515f818152600e909252604090912054909350336001600160a01b0390911603611c04576009549150611c08565b8291505b611c125f84611ef1565b50611cd8565b5f5b84811015611cc757858181518110611c3457611c34613648565b6020908102919091018101515f818152600e9092526040909120549094506001600160a01b03163314611cb45760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920776974686472617720666f72206e66747320796f75206f6044820152613bb760f11b6064820152608401610ac5565b611cbe5f85611ef1565b50600101611c1a565b50600954611cd59085613677565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054849290611d129084906135f7565b925050819055508160085f828254611d2a91906135f7565b90915550506009546015545f9190611d429085613677565b611d4c91906136a2565b90505f60185460175483611d609190613677565b611d6a91906136a2565b60145460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de291906134d9565b506014546001600160a01b031663a9059cbb33611dff84866135f7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b91906134d9565b50336001600160a01b03167f2384392c42d82ed11db876875a09153a0d3585ff3fc7b9dc12393a232e46b2cf8389604051611ea79291906136b5565b60405180910390a250505050505050565b335f818152600c602090815260408083206001600160a01b03871684529091529020805460ff19168315151790556113eb908383612706565b5f818152600e6020526040812054336001600160a01b0390911603611f3057611f1b33848461223e565b611f28338460095461230c565b506001610964565b610b39338484612414565b336001600160a01b0385161480611f6b5750611f56826109fa565b6001600160a01b0316336001600160a01b0316145b80611f7b5750611f7b8433612179565b611f975760405162461bcd60e51b8152600401610ac59061322b565b611fa284848461223e565b611faf848460095461230c565b6001600160a01b0383163b158015906120445750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ff7903390899088908890600401613703565b6020604051808303815f875af1158015612013573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612037919061328d565b6001600160e01b03191614155b15612062576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060600a548211156120af5760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610ac5565b5f80546120bb906131f3565b90505f036120d657505060408051602081019091525f815290565b5f6120ed600954846120e891906135f7565b61274d565b6002604051602001612101939291906137ae565b6040516020818303038152906040529050919050565b5f6009546007546121289190613677565b905090565b606060018054610979906131f3565b600b54600160401b90046001600160a01b0316331461216d5760405162461bcd60e51b8152600401610ac590613262565b60036113eb828261341a565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161223191815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600e60205260409020546001600160a01b038481169116146122a85760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610ac5565b6001600160401b0381165f908152600f6020908152604080832080546001600160a01b0319908116909155600e90925290912080549091166001600160a01b0384161790556122f8838383612851565b610e9d8383836001600160401b0316612a07565b6001600160a01b0383165f90815260106020526040812080548392906123339084906135f7565b90915550506001600160a01b0382165f908152601060205260409020805482019055610e9d838383612a4d565b6001600160a01b038084165f908152600d60209081526040808320938616835292905220548111156123d45760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610ac5565b6001600160a01b038084165f908152600d602090815260408083209386168352929052908120805483929061240a9084906135f7565b9091555050505050565b6001600160a01b0383165f908152601060205260409020548111156124895760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610ac5565b6009546001600160a01b0384165f9081526010602052604081205490916124af916137e0565b6009546001600160a01b0385165f90815260106020526040812054929350916124d891906137e0565b90506124e585858561230c565b6009546001600160a01b0386165f90815260106020526040812054909161250b916137e0565b6009546001600160a01b0387165f908152601060205260408120549293509161253491906137e0565b6001600160a01b0388165f9081526011602052604081206205e7ec9091529091507f1b6e7c417ed9cfc24ca11cc87b3bdb69a80c713b279159d52af44c081e616a17838610156125935781541561259357612593896205e7ec84612a92565b828511156125c0578054156125b5576125b06205e7ec8983612a92565b6125c0565b6125be88612be2565b505b5f600954886125cf91906136a2565b8354600b5491925090600160e81b900460ff16806125f457506001600160a01b038b16155b8061261657506001600160a01b038a165f9081526013602052604090205460ff165b8061263857506001600160a01b038b165f9081526013602052604090205460ff165b806126575750600b546001600160a01b038c8116600160401b90920416145b1561266e57808210612669578061266b565b815b91505b81156126f9578082106126815780612683565b815b90505f5b818110156126a25761269a8c8c87612a92565b600101612687565b506126ad81836135f7565b835490925090508082106126c157806126c3565b815b90505f5b818110156126e5576126dd6205e7ec8c86612a92565b6001016126c7565b506126f98a6126f483856135f7565b612c8f565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612231911515815260200190565b6060815f036127735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561279c5780612786816137f3565b91506127959050600a836136a2565b9150612776565b5f816001600160401b038111156127b5576127b5612e9f565b6040519080825280601f01601f1916602001820160405280156127df576020820181803683370190505b5090505b8415612849576127f46001836135f7565b9150612801600a866137e0565b61280c90603061380b565b60f81b81838151811061282157612821613648565b60200101906001600160f81b03191690815f1a905350612842600a866136a2565b94506127e3565b949350505050565b6001600160401b0381165f908152601260209081526040808320546001600160a01b03871684526011909252822080549192909190826128926001846135f7565b815481106128a2576128a2613648565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03169050808385815481106128de576128de613648565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b031602179055508280548061292557612925613824565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a0219169055905561295f6001836135f7565b1561297f576001600160401b0381165f9081526012602052604090208490555b6001600160a01b0386165f81815260116020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c16029190911790559290915290546129e391906135f7565b6001600160401b039095165f90815260126020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161223191815260200190565b80545f908290612aa4906001906135f7565b81548110612ab457612ab4613648565b5f918252602080832060048304015460039092166008026101000a9091046001600160401b0316808352600f8252604080842080546001600160a01b0319908116909155600e90935290922080549091166001600160a01b0386161790558254909150829080612b2657612b26613824565b5f828152602080822060045f1990940184810490910180546001600160401b0360086003808616820261010090810a840219909416909455939097556001600160a01b038a16808652601185526040862080546001818101835582895296882098810490980180548b8b169990951690950290920a968702969097021990911694909417905592905254612bba91906135f7565b6001600160401b0382165f818152601260205260409020919091556120629085908590612a07565b600b805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600e6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526011808352818420805486865260128552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255612c8a908383612a07565b919050565b805f03612c9a575050565b80600103612cab57610e9d82612be2565b600b546001600160a01b0383165f908152601160205260408120546001600160401b0390921691905b83811015612d735760019283016001600160401b038181165f818152600e6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560128352818420899055835260118252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093612d6791908790612a07565b60019182019101612cd4565b5050600b805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610d60575f80fd5b5f60208284031215612dc5575f80fd5b8135610c3981612da0565b5f5b83811015612dea578181015183820152602001612dd2565b50505f910152565b5f8151808452612e09816020860160208601612dd0565b601f01601f19169290920160200192915050565b602081525f610c396020830184612df2565b5f60208284031215612e3f575f80fd5b5035919050565b6001600160a01b0381168114610d60575f80fd5b5f8060408385031215612e6b575f80fd5b8235612e7681612e46565b946020939093013593505050565b5f60208284031215612e94575f80fd5b8135610c3981612e46565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612edb57612edb612e9f565b604052919050565b5f6001600160401b03821115612efb57612efb612e9f565b50601f01601f191660200190565b5f612f1b612f1684612ee3565b612eb3565b9050828152838383011115612f2e575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612f53575f80fd5b610c3983833560208501612f09565b5f805f8060808587031215612f75575f80fd5b8435612f8081612e46565b93506020850135612f9081612e46565b92506040850135915060608501356001600160401b03811115612fb1575f80fd5b612fbd87828801612f44565b91505092959194509250565b5f805f60608486031215612fdb575f80fd5b8335612fe681612e46565b92506020840135612ff681612e46565b929592945050506040919091013590565b5f60208284031215613017575f80fd5b81356001600160401b0381111561302c575f80fd5b61284984828501612f44565b5f60208284031215613048575f80fd5b81356001600160401b0381111561305d575f80fd5b8201601f8101841361306d575f80fd5b61284984823560208401612f09565b5f602080838503121561308d575f80fd5b82356001600160401b03808211156130a3575f80fd5b818501915085601f8301126130b6575f80fd5b8135818111156130c8576130c8612e9f565b8060051b91506130d9848301612eb3565b81815291830184019184810190888411156130f2575f80fd5b938501935b83851015613110578435825293850193908501906130f7565b98975050505050505050565b8015158114610d60575f80fd5b5f60208284031215613139575f80fd5b8135610c398161311c565b602080825282518282018190525f9190848201906040850190845b818110156131845783516001600160401b03168352928401929184019160010161315f565b50909695505050505050565b5f80604083850312156131a1575f80fd5b82356131ac81612e46565b915060208301356131bc8161311c565b809150509250929050565b5f80604083850312156131d8575f80fd5b82356131e381612e46565b915060208301356131bc81612e46565b600181811c9082168061320757607f821691505b60208210810361322557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f6020828403121561329d575f80fd5b8151610c3981612da0565b8051612c8a81612e46565b5f82601f8301126132c2575f80fd5b81516132d0612f1682612ee3565b8181528460208386010111156132e4575f80fd5b612849826020830160208701612dd0565b5f805f805f805f805f6101208a8c03121561330e575f80fd5b8951985061331e60208b016132a8565b975060408a01516001600160401b0380821115613339575f80fd5b6133458d838e016132b3565b985060608c015191508082111561335a575f80fd5b6133668d838e016132b3565b975060808c0151965060a08c0151915080821115613382575f80fd5b61338e8d838e016132b3565b955060c08c01519150808211156133a3575f80fd5b506133b08c828d016132b3565b93505060e08a015191506101008a015190509295985092959850929598565b601f821115610e9d57805f5260205f20601f840160051c810160208510156133f45750805b601f840160051c820191505b81811015613413575f8155600101613400565b5050505050565b81516001600160401b0381111561343357613433612e9f565b6134478161344184546131f3565b846133cf565b602080601f83116001811461347a575f84156134635750858301515b5f19600386901b1c1916600185901b1785556134d1565b5f85815260208120601f198616915b828110156134a857888601518255948401946001909101908401613489565b50858210156134c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156134e9575f80fd5b8151610c398161311c565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561354257815f1904821115613528576135286134f4565b8085161561353557918102915b93841c939080029061350d565b509250929050565b5f8261355857506001610964565b8161356457505f610964565b8160018114610aff57600281036135915760ff841115613586576135866134f4565b50506001821b610964565b5060208310610133831016604e8410600b84101617156135b4575081810a610964565b6135be8383613508565b805f19048211156135d1576135d16134f4565b029392505050565b5f610c39838361354a565b80820180821115610964576109646134f4565b81810381811115610964576109646134f4565b6001600160401b0382811682821603908082111561362a5761362a6134f4565b5092915050565b5f60208284031215613641575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561366c575f80fd5b8151610c3981612e46565b8082028115828204841417610964576109646134f4565b634e487b7160e01b5f52601260045260245ffd5b5f826136b0576136b061368e565b500490565b5f604082018483526020604060208501528185518084526060860191506020870193505f5b818110156136f6578451835293830193918301916001016136da565b5090979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061373590830184612df2565b9695505050505050565b5f815461374b816131f3565b600182811680156137635760018114613778576137a4565b60ff19841687528215158302870194506137a4565b855f526020805f205f5b8581101561379b5781548a820152908401908201613782565b50505082870194505b5050505092915050565b5f6137b9828661373f565b84516137c9818360208901612dd0565b6137d58183018661373f565b979650505050505050565b5f826137ee576137ee61368e565b500690565b5f60018201613804576138046134f4565b5060010190565b60ff8181168382160190811115610964576109646134f4565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe71664736f6c63430008180033

Deployed Bytecode

0x6080604052600436106102a5575f3560e01c80636bcef9a61161016f578063a9059cbb116100d8578063d5abeb0111610092578063e8e81fe41161006d578063e8e81fe414610856578063e985e9c514610875578063f835ab0014610894578063ff0d2c26146104c9575f80fd5b8063d5abeb01146107ea578063dd62ed3e146107fe578063e8a3d48514610842575f80fd5b8063a9059cbb14610745578063b3720c3414610764578063b88d4fde14610784578063bb74e1ae14610797578063c87b56dd146107b6578063caf0dcc2146107d5575f80fd5b806391cca3db1161012957806391cca3db1461069a578063938e3d7b146106c057806395d89b41146106df578063983d95ce146106f3578063a22cb46514610706578063a563833b14610725575f80fd5b80636bcef9a6146105d45780636c0360eb146105e857806370a08231146105fc5780637e2285aa146106305780638462151c1461064f57806388a8c95c1461067b575f80fd5b80633ccfd60b116102115780634ee2c4ce116101cb5780634ee2c4ce1461050f5780634f02c4201461052457806355f804b314610543578063598b8e71146105625780636352211e146105815780636a21f8e1146105b5575f80fd5b80633ccfd60b1461048157806342842e0e14610497578063439fab91146104aa578063466c35fc146104c957806346904840146104dc57806347ecb665146104fb575f80fd5b806318160ddd1161026257806318160ddd146103d95780631a72b87d146103ed57806323b872dd146104245780632d5537b0146104435780632ff3a24214610457578063313ce5671461046d575f80fd5b806301ffc9a7146102a957806306fdde03146102dd578063081812fc146102fe578063095ea7b3146103355780630e313e9814610354578063150b7a0214610396575b5f80fd5b3480156102b4575f80fd5b506102c86102c3366004612db5565b6108cd565b60405190151581526020015b60405180910390f35b3480156102e8575f80fd5b506102f161096a565b6040516102d49190612e1d565b348015610309575f80fd5b5061031d610318366004612e2f565b6109fa565b6040516001600160a01b0390911681526020016102d4565b348015610340575f80fd5b506102c861034f366004612e5a565b610a34565b34801561035f575f80fd5b5061038861036e366004612e84565b6001600160a01b03165f9081526011602052604090205490565b6040519081526020016102d4565b3480156103a1575f80fd5b506103c06103b0366004612f62565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102d4565b3480156103e4575f80fd5b50600854610388565b3480156103f8575f80fd5b5061040c610407366004612e5a565b610b42565b6040516001600160401b0390911681526020016102d4565b34801561042f575f80fd5b506102c861043e366004612fc9565b610b89565b34801561044e575f80fd5b506102f1610c40565b348015610462575f80fd5b5061031d6205e7ec81565b348015610478575f80fd5b50600654610388565b34801561048c575f80fd5b50610495610ccc565b005b6104956104a5366004612fc9565b610d63565b3480156104b5575f80fd5b5061031d6104c4366004613007565b610ea2565b3480156104d4575f80fd5b5061031d5f81565b3480156104e7575f80fd5b5060165461031d906001600160a01b031681565b348015610506575f80fd5b506102f16113a2565b34801561051a575f80fd5b5061038860175481565b34801561052f575f80fd5b50600b5461040c906001600160401b031681565b34801561054e575f80fd5b5061049561055d366004613038565b6113af565b34801561056d575f80fd5b5061049561057c36600461307c565b6113ef565b34801561058c575f80fd5b5061031d61059b366004612e2f565b600e6020525f90815260409020546001600160a01b031681565b3480156105c0575f80fd5b506104956105cf366004613129565b611880565b3480156105df575f80fd5b506104956118cf565b3480156105f3575f80fd5b506102f1611921565b348015610607575f80fd5b50610388610616366004612e84565b6001600160a01b03165f9081526010602052604090205490565b34801561063b575f80fd5b5061049561064a366004613038565b61192d565b34801561065a575f80fd5b5061066e610669366004612e84565b61196a565b6040516102d49190613144565b348015610686575f80fd5b50610495610695366004612e84565b611a04565b3480156106a5575f80fd5b50600b5461031d90600160401b90046001600160a01b031681565b3480156106cb575f80fd5b506104956106da366004613038565b611a66565b3480156106ea575f80fd5b506102f1611acf565b61049561070136600461307c565b611ade565b348015610711575f80fd5b50610495610720366004613190565b611eb8565b348015610730575f80fd5b50600b546102c890600160e01b900460ff1681565b348015610750575f80fd5b506102c861075f366004612e5a565b611ef1565b34801561076f575f80fd5b50600b546102c890600160e81b900460ff1681565b610495610792366004612f62565b611f3b565b3480156107a2575f80fd5b5060145461031d906001600160a01b031681565b3480156107c1575f80fd5b506102f16107d0366004612e2f565b612068565b3480156107e0575f80fd5b5061038860155481565b3480156107f5575f80fd5b50610388612117565b348015610809575f80fd5b506103886108183660046131c7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b34801561084d575f80fd5b506102f161212d565b348015610861575f80fd5b50610495610870366004613038565b61213c565b348015610880575f80fd5b506102c861088f3660046131c7565b612179565b34801561089f575f80fd5b506104956108ae366004613129565b335f908152601360205260409020805460ff1916911515919091179055565b600b545f90600160e01b900460ff1680156108f857506380ac58cd60e01b6001600160e01b03198316145b8061091357506301ffc9a760e01b6001600160e01b03198316145b8061092e57506336372b0760e01b6001600160e01b03198316145b806109495750630a85bd0160e11b6001600160e01b03198316145b806109645750635a46575f60e01b6001600160e01b03198316145b92915050565b606060048054610979906131f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109a5906131f3565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f818152600e60205260408120546001600160a01b0316610a19575f80fd5b505f908152600f60205260409020546001600160a01b031690565b5f6009548210158015610a495750600a548211155b15610b09575f828152600e60205260409020546001600160a01b0316338114801590610a7c5750610a7a8133612179565b155b15610ace5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600f6020526040902080546001600160a01b0319166001600160a01b038616179055610aff8185856121a6565b6001915050610964565b335f818152600d602090815260408083206001600160a01b03881684529091529020839055610b399084846121ec565b50600192915050565b6011602052815f5260405f208181548110610b5b575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6009548210158015610b9e5750600a548211155b15610c1f57336001600160a01b0385161480610bd35750610bbe826109fa565b6001600160a01b0316336001600160a01b0316145b80610be35750610be38433612179565b610bff5760405162461bcd60e51b8152600401610ac59061322b565b610c0a84848461223e565b610c17848460095461230c565b506001610c39565b610c2a843384612360565b610c35848484612414565b5060015b9392505050565b60028054610c4d906131f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906131f3565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b505050505081565b600b54600160401b90046001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610ac590613262565b600b546040515f91600160401b90046001600160a01b03169047908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d60575f80fd5b50565b336001600160a01b0384161480610d935750610d7e816109fa565b6001600160a01b0316336001600160a01b0316145b80610da35750610da38333612179565b610dbf5760405162461bcd60e51b8152600401610ac59061322b565b610dca83838361223e565b610dd7838360095461230c565b6001600160a01b0382163b15801590610e7f5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e72919061328d565b6001600160e01b03191614155b15610e9d576040516301d6c93560e61b815260040160405180910390fd5b505050565b5f6006545f14610eea5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610ac5565b60608083806020019051810190610f0191906132f5565b6015819055600782905560175f60148160068180806001610f228c8261341a565b50610f2f90508b8261341a565b508a91905055899d508a9e508b91906101000a8154816001600160a01b0302191690836001600160a01b031602179055508a919050555050505050505050508160049081610f7d919061341a565b506005610f8a828261341a565b50506014546001600160a01b0316905080610fde5760405162461bcd60e51b81526020600482015260146024820152734537343156313a205a45524f5f4144445245535360601b6044820152606401610ac5565b6040516301ffc9a760e01b8152635a46575f60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015611045575060408051601f3d908101601f19168201909252611042918101906134d9565b60015b6110a65760405162461bcd60e51b815260206004820152602c60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526b70706f72742045524331363560a01b6064820152608401610ac5565b6001600160a01b03821673382edfe4c6168858c81893fe00fcb7b68914d92914806110ce5750805b61112d5760405162461bcd60e51b815260206004820152602a60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526970706f7274206537343160b01b6064820152608401610ac5565b505060065461113d90600a6135d9565b600981905560075460019161115291906135e4565b61115c91906135f7565b600a5560095461116e9060019061360a565b600b80546001600160401b039290921667ffffffffffffffff19909216919091179055601680546001600160a01b0319163317905560065460121080159061122057506014546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156111f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121d9190613631565b11155b6112605760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920646563696d616c7360781b6044820152606401610ac5565b5f600754116112a75760405162461bcd60e51b81526020600482015260136024820152721399595908185d081b19585cdd080c481b999d606a1b6044820152606401610ac5565b600560175410156112ee5760405162461bcd60e51b81526020600482015260116024820152704d696e2066656573206f6620302e30352560781b6044820152606401610ac5565b603260175411156113345760405162461bcd60e51b815260206004820152601060248201526f4d61782066656573206f6620302e352560801b6044820152606401610ac5565b600754600954116113915760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610ac5565b50506014546001600160a01b031690565b60038054610c4d906131f3565b600b54600160401b90046001600160a01b031633146113e05760405162461bcd60e51b8152600401610ac590613262565b5f6113eb828261341a565b5050565b80516014546040805163313ce56760e01b815290515f9283926001600160a01b039091169163313ce567916004808201926020929091908290030181865afa15801561143d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190613631565b61146c90600a6135d9565b90508260010361161957601454845133916001600160a01b031690636352211e9087905f9061149d5761149d613648565b60200260200101516040518263ffffffff1660e01b81526004016114c391815260200190565b602060405180830381865afa1580156114de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611502919061365c565b6001600160a01b03161461154b57601554600954855f8151811061152857611528613648565b602002602001015161153a9190613677565b61154491906136a2565b9150611568565b60155460095461155b9083613677565b61156591906136a2565b91505b60145484516001600160a01b03909116906323b872dd903390309088905f9061159357611593613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af11580156115ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906134d9565b506116f1565b5f5b838110156116c95760145485516001600160a01b03909116906342842e0e903390309089908690811061165057611650613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b1580156116a7575f80fd5b505af11580156116b9573d5f803e3d5ffd5b50506001909201915061161b9050565b506015546009546116da8386613677565b6116e49190613677565b6116ee91906136a2565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805484929061172b9084906135e4565b925050819055508160085f82825461174391906135e4565b9091555061175490505f3384612414565b6014546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613631565b6007546015546117ce9190613677565b10156118375760405162461bcd60e51b815260206004820152603260248201527f4e465420636170616369747920726561636865642c207761697420666f7220736044820152716f6d656f6e6520746f20776974686472617760701b6064820152608401610ac5565b336001600160a01b03167fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66683866040516118729291906136b5565b60405180910390a250505050565b600b54600160401b90046001600160a01b031633146118b15760405162461bcd60e51b8152600401610ac590613262565b600b8054911515600160e81b0260ff60e81b19909216919091179055565b600b54600160401b90046001600160a01b031633146119005760405162461bcd60e51b8152600401610ac590613262565b600b805460ff60e01b198116600160e01b9182900460ff1615909102179055565b5f8054610c4d906131f3565b600b54600160401b90046001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ac590613262565b60026113eb828261341a565b6001600160a01b0381165f908152601160209081526040918290208054835181840281018401909452808452606093928301828280156119f857602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b0316815260200190600801906020826007010492830192600103820291508084116119b55790505b50505050509050919050565b600b54600160401b90046001600160a01b03163314611a355760405162461bcd60e51b8152600401610ac590613262565b600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b600b54600160401b90046001600160a01b03163314611a975760405162461bcd60e51b8152600401610ac590613262565b6001611aa3828261341a565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a150565b606060058054610979906131f3565b805180611b2d5760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f207769746864726177206e6f7468696e670000000000006044820152606401610ac5565b5f805f60145f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba49190613631565b611baf90600a6135d9565b905083600103611c1857845f81518110611bcb57611bcb613648565b6020908102919091018101515f818152600e909252604090912054909350336001600160a01b0390911603611c04576009549150611c08565b8291505b611c125f84611ef1565b50611cd8565b5f5b84811015611cc757858181518110611c3457611c34613648565b6020908102919091018101515f818152600e9092526040909120549094506001600160a01b03163314611cb45760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920776974686472617720666f72206e66747320796f75206f6044820152613bb760f11b6064820152608401610ac5565b611cbe5f85611ef1565b50600101611c1a565b50600954611cd59085613677565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054849290611d129084906135f7565b925050819055508160085f828254611d2a91906135f7565b90915550506009546015545f9190611d429085613677565b611d4c91906136a2565b90505f60185460175483611d609190613677565b611d6a91906136a2565b60145460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de291906134d9565b506014546001600160a01b031663a9059cbb33611dff84866135f7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b91906134d9565b50336001600160a01b03167f2384392c42d82ed11db876875a09153a0d3585ff3fc7b9dc12393a232e46b2cf8389604051611ea79291906136b5565b60405180910390a250505050505050565b335f818152600c602090815260408083206001600160a01b03871684529091529020805460ff19168315151790556113eb908383612706565b5f818152600e6020526040812054336001600160a01b0390911603611f3057611f1b33848461223e565b611f28338460095461230c565b506001610964565b610b39338484612414565b336001600160a01b0385161480611f6b5750611f56826109fa565b6001600160a01b0316336001600160a01b0316145b80611f7b5750611f7b8433612179565b611f975760405162461bcd60e51b8152600401610ac59061322b565b611fa284848461223e565b611faf848460095461230c565b6001600160a01b0383163b158015906120445750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ff7903390899088908890600401613703565b6020604051808303815f875af1158015612013573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612037919061328d565b6001600160e01b03191614155b15612062576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060600a548211156120af5760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610ac5565b5f80546120bb906131f3565b90505f036120d657505060408051602081019091525f815290565b5f6120ed600954846120e891906135f7565b61274d565b6002604051602001612101939291906137ae565b6040516020818303038152906040529050919050565b5f6009546007546121289190613677565b905090565b606060018054610979906131f3565b600b54600160401b90046001600160a01b0316331461216d5760405162461bcd60e51b8152600401610ac590613262565b60036113eb828261341a565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161223191815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600e60205260409020546001600160a01b038481169116146122a85760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610ac5565b6001600160401b0381165f908152600f6020908152604080832080546001600160a01b0319908116909155600e90925290912080549091166001600160a01b0384161790556122f8838383612851565b610e9d8383836001600160401b0316612a07565b6001600160a01b0383165f90815260106020526040812080548392906123339084906135f7565b90915550506001600160a01b0382165f908152601060205260409020805482019055610e9d838383612a4d565b6001600160a01b038084165f908152600d60209081526040808320938616835292905220548111156123d45760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610ac5565b6001600160a01b038084165f908152600d602090815260408083209386168352929052908120805483929061240a9084906135f7565b9091555050505050565b6001600160a01b0383165f908152601060205260409020548111156124895760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610ac5565b6009546001600160a01b0384165f9081526010602052604081205490916124af916137e0565b6009546001600160a01b0385165f90815260106020526040812054929350916124d891906137e0565b90506124e585858561230c565b6009546001600160a01b0386165f90815260106020526040812054909161250b916137e0565b6009546001600160a01b0387165f908152601060205260408120549293509161253491906137e0565b6001600160a01b0388165f9081526011602052604081206205e7ec9091529091507f1b6e7c417ed9cfc24ca11cc87b3bdb69a80c713b279159d52af44c081e616a17838610156125935781541561259357612593896205e7ec84612a92565b828511156125c0578054156125b5576125b06205e7ec8983612a92565b6125c0565b6125be88612be2565b505b5f600954886125cf91906136a2565b8354600b5491925090600160e81b900460ff16806125f457506001600160a01b038b16155b8061261657506001600160a01b038a165f9081526013602052604090205460ff165b8061263857506001600160a01b038b165f9081526013602052604090205460ff165b806126575750600b546001600160a01b038c8116600160401b90920416145b1561266e57808210612669578061266b565b815b91505b81156126f9578082106126815780612683565b815b90505f5b818110156126a25761269a8c8c87612a92565b600101612687565b506126ad81836135f7565b835490925090508082106126c157806126c3565b815b90505f5b818110156126e5576126dd6205e7ec8c86612a92565b6001016126c7565b506126f98a6126f483856135f7565b612c8f565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612231911515815260200190565b6060815f036127735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561279c5780612786816137f3565b91506127959050600a836136a2565b9150612776565b5f816001600160401b038111156127b5576127b5612e9f565b6040519080825280601f01601f1916602001820160405280156127df576020820181803683370190505b5090505b8415612849576127f46001836135f7565b9150612801600a866137e0565b61280c90603061380b565b60f81b81838151811061282157612821613648565b60200101906001600160f81b03191690815f1a905350612842600a866136a2565b94506127e3565b949350505050565b6001600160401b0381165f908152601260209081526040808320546001600160a01b03871684526011909252822080549192909190826128926001846135f7565b815481106128a2576128a2613648565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03169050808385815481106128de576128de613648565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b031602179055508280548061292557612925613824565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a0219169055905561295f6001836135f7565b1561297f576001600160401b0381165f9081526012602052604090208490555b6001600160a01b0386165f81815260116020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c16029190911790559290915290546129e391906135f7565b6001600160401b039095165f90815260126020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161223191815260200190565b80545f908290612aa4906001906135f7565b81548110612ab457612ab4613648565b5f918252602080832060048304015460039092166008026101000a9091046001600160401b0316808352600f8252604080842080546001600160a01b0319908116909155600e90935290922080549091166001600160a01b0386161790558254909150829080612b2657612b26613824565b5f828152602080822060045f1990940184810490910180546001600160401b0360086003808616820261010090810a840219909416909455939097556001600160a01b038a16808652601185526040862080546001818101835582895296882098810490980180548b8b169990951690950290920a968702969097021990911694909417905592905254612bba91906135f7565b6001600160401b0382165f818152601260205260409020919091556120629085908590612a07565b600b805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600e6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526011808352818420805486865260128552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255612c8a908383612a07565b919050565b805f03612c9a575050565b80600103612cab57610e9d82612be2565b600b546001600160a01b0383165f908152601160205260408120546001600160401b0390921691905b83811015612d735760019283016001600160401b038181165f818152600e6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560128352818420899055835260118252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093612d6791908790612a07565b60019182019101612cd4565b5050600b805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610d60575f80fd5b5f60208284031215612dc5575f80fd5b8135610c3981612da0565b5f5b83811015612dea578181015183820152602001612dd2565b50505f910152565b5f8151808452612e09816020860160208601612dd0565b601f01601f19169290920160200192915050565b602081525f610c396020830184612df2565b5f60208284031215612e3f575f80fd5b5035919050565b6001600160a01b0381168114610d60575f80fd5b5f8060408385031215612e6b575f80fd5b8235612e7681612e46565b946020939093013593505050565b5f60208284031215612e94575f80fd5b8135610c3981612e46565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612edb57612edb612e9f565b604052919050565b5f6001600160401b03821115612efb57612efb612e9f565b50601f01601f191660200190565b5f612f1b612f1684612ee3565b612eb3565b9050828152838383011115612f2e575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612f53575f80fd5b610c3983833560208501612f09565b5f805f8060808587031215612f75575f80fd5b8435612f8081612e46565b93506020850135612f9081612e46565b92506040850135915060608501356001600160401b03811115612fb1575f80fd5b612fbd87828801612f44565b91505092959194509250565b5f805f60608486031215612fdb575f80fd5b8335612fe681612e46565b92506020840135612ff681612e46565b929592945050506040919091013590565b5f60208284031215613017575f80fd5b81356001600160401b0381111561302c575f80fd5b61284984828501612f44565b5f60208284031215613048575f80fd5b81356001600160401b0381111561305d575f80fd5b8201601f8101841361306d575f80fd5b61284984823560208401612f09565b5f602080838503121561308d575f80fd5b82356001600160401b03808211156130a3575f80fd5b818501915085601f8301126130b6575f80fd5b8135818111156130c8576130c8612e9f565b8060051b91506130d9848301612eb3565b81815291830184019184810190888411156130f2575f80fd5b938501935b83851015613110578435825293850193908501906130f7565b98975050505050505050565b8015158114610d60575f80fd5b5f60208284031215613139575f80fd5b8135610c398161311c565b602080825282518282018190525f9190848201906040850190845b818110156131845783516001600160401b03168352928401929184019160010161315f565b50909695505050505050565b5f80604083850312156131a1575f80fd5b82356131ac81612e46565b915060208301356131bc8161311c565b809150509250929050565b5f80604083850312156131d8575f80fd5b82356131e381612e46565b915060208301356131bc81612e46565b600181811c9082168061320757607f821691505b60208210810361322557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f6020828403121561329d575f80fd5b8151610c3981612da0565b8051612c8a81612e46565b5f82601f8301126132c2575f80fd5b81516132d0612f1682612ee3565b8181528460208386010111156132e4575f80fd5b612849826020830160208701612dd0565b5f805f805f805f805f6101208a8c03121561330e575f80fd5b8951985061331e60208b016132a8565b975060408a01516001600160401b0380821115613339575f80fd5b6133458d838e016132b3565b985060608c015191508082111561335a575f80fd5b6133668d838e016132b3565b975060808c0151965060a08c0151915080821115613382575f80fd5b61338e8d838e016132b3565b955060c08c01519150808211156133a3575f80fd5b506133b08c828d016132b3565b93505060e08a015191506101008a015190509295985092959850929598565b601f821115610e9d57805f5260205f20601f840160051c810160208510156133f45750805b601f840160051c820191505b81811015613413575f8155600101613400565b5050505050565b81516001600160401b0381111561343357613433612e9f565b6134478161344184546131f3565b846133cf565b602080601f83116001811461347a575f84156134635750858301515b5f19600386901b1c1916600185901b1785556134d1565b5f85815260208120601f198616915b828110156134a857888601518255948401946001909101908401613489565b50858210156134c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156134e9575f80fd5b8151610c398161311c565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561354257815f1904821115613528576135286134f4565b8085161561353557918102915b93841c939080029061350d565b509250929050565b5f8261355857506001610964565b8161356457505f610964565b8160018114610aff57600281036135915760ff841115613586576135866134f4565b50506001821b610964565b5060208310610133831016604e8410600b84101617156135b4575081810a610964565b6135be8383613508565b805f19048211156135d1576135d16134f4565b029392505050565b5f610c39838361354a565b80820180821115610964576109646134f4565b81810381811115610964576109646134f4565b6001600160401b0382811682821603908082111561362a5761362a6134f4565b5092915050565b5f60208284031215613641575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561366c575f80fd5b8151610c3981612e46565b8082028115828204841417610964576109646134f4565b634e487b7160e01b5f52601260045260245ffd5b5f826136b0576136b061368e565b500490565b5f604082018483526020604060208501528185518084526060860191506020870193505f5b818110156136f6578451835293830193918301916001016136da565b5090979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061373590830184612df2565b9695505050505050565b5f815461374b816131f3565b600182811680156137635760018114613778576137a4565b60ff19841687528215158302870194506137a4565b855f526020805f205f5b8581101561379b5781548a820152908401908201613782565b50505082870194505b5050505092915050565b5f6137b9828661373f565b84516137c9818360208901612dd0565b6137d58183018661373f565b979650505050505050565b5f826137ee576137ee61368e565b500690565b5f60018201613804576138046134f4565b5060010190565b60ff8181168382160190811115610964576109646134f4565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe71664736f6c63430008180033

Deployed Bytecode Sourcemap

28539:5871:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27707:795;;;;;;;;;;-1:-1:-1;27707:795:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27707:795:0;;;;;;;;11357:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26277:180::-;;;;;;;;;;-1:-1:-1;26277:180:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;26277:180:0;1533:203:1;13631:997:0;;;;;;;;;;-1:-1:-1;13631:997:0;;;;;:::i;:::-;;:::i;13171:101::-;;;;;;;;;;-1:-1:-1;13171:101:0;;;;;:::i;:::-;-1:-1:-1;;;;;13245:18:0;13231:4;13245:18;;;:9;:18;;;;;:25;;13171:101;;;;2595:25:1;;;2583:2;2568:18;13171:101:0;2449:177:1;9354:172:0;;;;;;;;;;-1:-1:-1;9354:172:0;;;;;:::i;:::-;-1:-1:-1;;;9354:172:0;;;;;;;;;;-1:-1:-1;;;;;;4632:33:1;;;4614:52;;4602:2;4587:18;9354:172:0;4470:202:1;11609:82:0;;;;;;;;;;-1:-1:-1;11676:12:0;;11609:82;;10678:45;;;;;;;;;;-1:-1:-1;10678:45:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4839:31:1;;;4821:50;;4809:2;4794:18;10678:45:0;4677:200:1;23839:817:0;;;;;;;;;;-1:-1:-1;23839:817:0;;;;;:::i;:::-;;:::i;9860:23::-;;;;;;;;;;;;;:::i;9612:57::-;;;;;;;;;;;;9661:7;9612:57;;11527:76;;;;;;;;;;-1:-1:-1;11591:9:0;;11527:76;;27538:161;;;;;;;;;;;;;:::i;:::-;;24679:654;;;;;;:::i;:::-;;:::i;29139:1769::-;;;;;;;;;;-1:-1:-1;29139:1769:0;;;;;:::i;:::-;;:::i;9737:51::-;;;;;;;;;;;;9784:3;9737:51;;28914:27;;;;;;;;;;-1:-1:-1;28914:27:0;;;;-1:-1:-1;;;;;28914:27:0;;;9890:22;;;;;;;;;;;;;:::i;28948:26::-;;;;;;;;;;;;;;;;10193:20;;;;;;;;;;-1:-1:-1;10193:20:0;;;;-1:-1:-1;;;;;10193:20:0;;;12027:93;;;;;;;;;;-1:-1:-1;12027:93:0;;;;;:::i;:::-;;:::i;30958:1671::-;;;;;;;;;;-1:-1:-1;30958:1671:0;;;;;:::i;:::-;;:::i;10514:50::-;;;;;;;;;;-1:-1:-1;10514:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;10514:50:0;;;13373:134;;;;;;;;;;-1:-1:-1;13373:134:0;;;;;:::i;:::-;;:::i;12957:101::-;;;;;;;;;;;;;:::i;9797:21::-;;;;;;;;;;;;;:::i;11786:104::-;;;;;;;;;;-1:-1:-1;11786:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;11868:19:0;11853:4;11868:19;;;:10;:19;;;;;;;11786:104;12286:109;;;;;;;;;;-1:-1:-1;12286:109:0;;;;;:::i;:::-;;:::i;13064:101::-;;;;;;;;;;-1:-1:-1;13064:101:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12503:75::-;;;;;;;;;;-1:-1:-1;12503:75:0;;;;;:::i;:::-;;:::i;10255:18::-;;;;;;;;;;-1:-1:-1;10255:18:0;;;;-1:-1:-1;;;10255:18:0;;-1:-1:-1;;;;;10255:18:0;;;12126:154;;;;;;;;;;-1:-1:-1;12126:154:0;;;;;:::i;:::-;;:::i;11440:81::-;;;;;;;;;;;;;:::i;32716:1691::-;;;;;;:::i;:::-;;:::i;26465:216::-;;;;;;;;;;-1:-1:-1;26465:216:0;;;;;:::i;:::-;;:::i;10280:32::-;;;;;;;;;;-1:-1:-1;10280:32:0;;;;-1:-1:-1;;;10280:32:0;;;;;;23457:339;;;;;;;;;;-1:-1:-1;23457:339:0;;;;;:::i;:::-;;:::i;10319:37::-;;;;;;;;;;-1:-1:-1;10319:37:0;;;;-1:-1:-1;;;10319:37:0;;;;;;25356:675;;;;;;:::i;:::-;;:::i;28839:28::-;;;;;;;;;;-1:-1:-1;28839:28:0;;;;-1:-1:-1;;;;;28839:28:0;;;26853:284;;;;;;;;;;-1:-1:-1;26853:284:0;;;;;:::i;:::-;;:::i;28874:31::-;;;;;;;;;;;;;;;;11697:83;;;;;;;;;;;;;:::i;11896:125::-;;;;;;;;;;-1:-1:-1;11896:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;11992:17:0;;;11977:4;11992:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;11896:125;13278:89;;;;;;;;;;;;;:::i;12401:96::-;;;;;;;;;;-1:-1:-1;12401:96:0;;;;;:::i;:::-;;:::i;26689:156::-;;;;;;;;;;-1:-1:-1;26689:156:0;;;;;:::i;:::-;;:::i;13514:109::-;;;;;;;;;;-1:-1:-1;13514:109:0;;;;;:::i;:::-;13592:10;13576:27;;;;:15;:27;;;;;:44;;-1:-1:-1;;13576:44:0;;;;;;;;;;13514:109;27707:795;28078:20;;27784:4;;-1:-1:-1;;;28078:20:0;;;;:49;;;;-1:-1:-1;;;;;;;;;;28102:25:0;;;28078:49;28077:127;;;-1:-1:-1;;;;;;;;;;28179:25:0;;;28077:127;:203;;;-1:-1:-1;;;;;;;;;;28255:25:0;;;28077:203;:278;;;-1:-1:-1;;;;;;;;;;28330:25:0;;;28077:278;:368;;;-1:-1:-1;;;;;;;;;;28420:25:0;;;28077:368;27801:644;27707:795;-1:-1:-1;;27707:795:0:o;11357:77::-;11402:13;11426:5;11419:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:77;:::o;26277:180::-;26345:7;26369:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26369:16:0;26365:44;;26401:8;;;26365:44;-1:-1:-1;26427:22:0;;;;:13;:22;;;;;;-1:-1:-1;;;;;26427:22:0;;26277:180::o;13631:997::-;13703:4;13873:3;;13863:6;:13;;:32;;;;;13890:5;;13880:6;:15;;13863:32;13860:449;;;13912:13;13928:15;;;:7;:15;;;;;;-1:-1:-1;;;;;13928:15:0;14018:10;:19;;;;;:59;;;14042:35;14059:5;14066:10;14042:16;:35::i;:::-;14041:36;14018:59;14014:101;;;14079:36;;-1:-1:-1;;;14079:36:0;;9470:2:1;14079:36:0;;;9452:21:1;9509:2;9489:18;;;9482:30;9548:28;9528:18;;;9521:56;9594:18;;14079:36:0;;;;;;;;14014:101;14130:21;;;;:13;:21;;;;;:31;;-1:-1:-1;;;;;;14130:31:0;-1:-1:-1;;;;;14130:31:0;;;;;14226:45;14248:5;14130:31;:21;14226;:45::i;:::-;14293:4;14286:11;;;;;13860:449;14509:10;14498:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;14498:31:0;;;;;;;;;:40;;;14549:49;;14521:7;14532:6;14549:20;:49::i;:::-;-1:-1:-1;14616:4:0;13631:997;;;;:::o;10678:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10678:45:0;;:::o;23839:817::-;23925:4;24054:3;;24044:6;:13;;:32;;;;;24071:5;;24061:6;:15;;24044:32;24041:489;;;24233:10;-1:-1:-1;;;;;24233:18:0;;;;:55;;;24269:19;24281:6;24269:11;:19::i;:::-;-1:-1:-1;;;;;24255:33:0;:10;-1:-1:-1;;;;;24255:33:0;;24233:55;:93;;;;24292:34;24309:4;24315:10;24292:16;:34::i;:::-;24093:303;;;;-1:-1:-1;;;24093:303:0;;;;;;;:::i;:::-;24413:38;24426:4;24432:2;24443:6;24413:12;:38::i;:::-;24466:26;24478:4;24484:2;24488:3;;24466:11;:26::i;:::-;-1:-1:-1;24514:4:0;24507:11;;24041:489;24542:41;24558:4;24564:10;24576:6;24542:15;:41::i;:::-;24594:30;24607:4;24613:2;24617:6;24594:12;:30::i;:::-;-1:-1:-1;24642:4:0;23839:817;;;;;;:::o;9860:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27538:161::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;27621:3:::1;::::0;27613:51:::1;::::0;27596:12:::1;::::0;-1:-1:-1;;;27621:3:0;::::1;-1:-1:-1::0;;;;;27621:3:0::1;::::0;27638:21:::1;::::0;27596:12;27613:51;27596:12;27613:51;27638:21;27621:3;27613:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27595:69;;;27683:7;27675:16;;;::::0;::::1;;27584:115;27538:161::o:0;24679:654::-;24809:10;-1:-1:-1;;;;;24809:18:0;;;;:56;;;24845:20;24857:7;24845:11;:20::i;:::-;-1:-1:-1;;;;;24831:34:0;:10;-1:-1:-1;;;;;24831:34:0;;24809:56;:94;;;;24869:34;24886:4;24892:10;24869:16;:34::i;:::-;24783:186;;;;-1:-1:-1;;;24783:186:0;;;;;;;:::i;:::-;24980:39;24993:4;24999:2;25010:7;24980:12;:39::i;:::-;25031:26;25043:4;25049:2;25053:3;;25031:11;:26::i;:::-;-1:-1:-1;;;;;25088:14:0;;;:19;;;;:171;;-1:-1:-1;25124:72:0;;-1:-1:-1;;;25124:72:0;;;25166:10;25124:72;;;10843:34:1;-1:-1:-1;;;;;10913:15:1;;;10893:18;;;10886:43;10945:18;;;10938:34;;;11008:3;10988:18;;;10981:31;-1:-1:-1;11028:19:1;;;11021:30;25213:46:0;;25124:41;;;;25213:46;;11068:19:1;;25124:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25124:135:0;;;25088:171;25070:256;;;25293:21;;-1:-1:-1;;;25293:21:0;;;;;;;;;;;25070:256;24679:654;;;:::o;29139:1769::-;29224:7;29252:9;;29265:1;29252:14;29244:46;;;;-1:-1:-1;;;29244:46:0;;11554:2:1;29244:46:0;;;11536:21:1;11593:2;11573:18;;;11566:30;-1:-1:-1;;;11612:18:1;;;11605:49;11671:18;;29244:46:0;11352:343:1;29244:46:0;29373:24;29413:26;29609:17;29598:88;;;;;;;;;;;;:::i;:::-;29557:19;29454:232;;;29546:9;29454:232;;;29455:14;;29471:13;29455:14;29512:9;29455:14;;;29532:12;29454:232;;29532:12;29454:232;:::i;:::-;-1:-1:-1;29454:232:0;;-1:-1:-1;29454:232:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29454:232:0;;;;;-1:-1:-1;;;;;29454:232:0;;;;;;;;;;;;;;;;;;;;29711:10;29703:5;:18;;;;;;:::i;:::-;-1:-1:-1;29736:7:0;:22;29746:12;29736:7;:22;:::i;:::-;-1:-1:-1;;29814:13:0;;-1:-1:-1;;;;;29814:13:0;;-1:-1:-1;29814:13:0;29842:53;;;;-1:-1:-1;;;29842:53:0;;15996:2:1;29842:53:0;;;15978:21:1;16035:2;16015:18;;;16008:30;-1:-1:-1;;;16054:18:1;;;16047:50;16114:18;;29842:53:0;15794:344:1;29842:53:0;29914:45;;-1:-1:-1;;;29914:45:0;;-1:-1:-1;;;29914:45:0;;;16305:62:1;-1:-1:-1;;;;;29914:33:0;;;;;16278:18:1;;29914:45:0;;;;;;;;;;;;;;;;;;-1:-1:-1;29914:45:0;;;;;;;;-1:-1:-1;;29914:45:0;;;;;;;;;;;;:::i;:::-;;;29910:296;;30136:54;;-1:-1:-1;;;30136:54:0;;16830:2:1;30136:54:0;;;16812:21:1;16869:2;16849:18;;;16842:30;16908:34;16888:18;;;16881:62;-1:-1:-1;;;16959:18:1;;;16952:42;17011:19;;30136:54:0;16628:408:1;29910:296:0;-1:-1:-1;;;;;30014:18:0;;28790:42;30014:18;;:33;;;30036:11;30014:33;30006:88;;;;-1:-1:-1;;;30006:88:0;;17243:2:1;30006:88:0;;;17225:21:1;17282:2;17262:18;;;17255:30;17321:34;17301:18;;;17294:62;-1:-1:-1;;;17372:18:1;;;17365:40;17422:19;;30006:88:0;17041:406:1;30006:88:0;29960:150;-1:-1:-1;30241:9:0;;30235:15;;:2;:15;:::i;:::-;30229:3;:21;;;30275:9;;30287:1;;30269:15;;30275:9;30269:15;:::i;:::-;:19;;;;:::i;:::-;30261:5;:27;30315:3;;30308:15;;30322:1;;30308:15;:::i;:::-;30299:6;:24;;-1:-1:-1;;;;;30299:24:0;;;;-1:-1:-1;;30299:24:0;;;;;;;;;30387:12;:25;;-1:-1:-1;;;;;;30387:25:0;30402:10;30387:25;;;30505:9;;30518:2;-1:-1:-1;30505:15:0;;;:57;;-1:-1:-1;30531:13:0;;30524:32;;;-1:-1:-1;;;30524:32:0;;;;30560:2;;-1:-1:-1;;;;;30531:13:0;;30524:30;;:32;;;;;;;;;;;;;;30531:13;30524:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;30505:57;30497:87;;;;-1:-1:-1;;;30497:87:0;;19794:2:1;30497:87:0;;;19776:21:1;19833:2;19813:18;;;19806:30;-1:-1:-1;;;19852:18:1;;;19845:47;19909:18;;30497:87:0;19592:341:1;30497:87:0;30615:1;30603:9;;:13;30595:45;;;;-1:-1:-1;;;30595:45:0;;20140:2:1;30595:45:0;;;20122:21:1;20179:2;20159:18;;;20152:30;-1:-1:-1;;;20198:18:1;;;20191:49;20257:18;;30595:45:0;19938:343:1;30595:45:0;29067:1;30659:14;;:37;;30651:67;;;;-1:-1:-1;;;30651:67:0;;20488:2:1;30651:67:0;;;20470:21:1;20527:2;20507:18;;;20500:30;-1:-1:-1;;;20546:18:1;;;20539:47;20603:18;;30651:67:0;20286:341:1;30651:67:0;29120:2;30737:14;;:37;;30729:66;;;;-1:-1:-1;;;30729:66:0;;20834:2:1;30729:66:0;;;20816:21:1;20873:2;20853:18;;;20846:30;-1:-1:-1;;;20892:18:1;;;20885:46;20948:18;;30729:66:0;20632:340:1;30729:66:0;30820:9;;30814:3;;:15;30806:61;;;;-1:-1:-1;;;30806:61:0;;21179:2:1;30806:61:0;;;21161:21:1;21218:2;21198:18;;;21191:30;21257:34;21237:18;;;21230:62;-1:-1:-1;;;21308:18:1;;;21301:31;21349:19;;30806:61:0;20977:397:1;30806:61:0;-1:-1:-1;;30887:13:0;;-1:-1:-1;;;;;30887:13:0;;29139:1769::o;9890:22::-;;;;;;;:::i;12027:93::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12098:7:::1;:20;12108:10:::0;12098:7;:20:::1;:::i;:::-;;12027:93:::0;:::o;30958:1671::-;31053:20;;31148:13;;31141:32;;;-1:-1:-1;;;31141:32:0;;;;31041:9;;;;-1:-1:-1;;;;;31148:13:0;;;;31141:30;;:32;;;;;;;;;;;;;;;31148:13;31141:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31135:38;;:2;:38;:::i;:::-;31113:60;;31189:4;31197:1;31189:9;31186:869;;31224:13;;31247:16;;31268:10;;-1:-1:-1;;;;;31224:13:0;;31218:28;;31247:13;;31224;;31247:16;;;;:::i;:::-;;;;;;;31218:46;;;;;;;;;;;;;2595:25:1;;2583:2;2568:18;;2449:177;31218:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31218:60:0;;31215:316;;31369:19;;31362:3;;31343:13;31357:1;31343:16;;;;;;;;:::i;:::-;;;;;;;:22;;;;:::i;:::-;31342:46;;;;:::i;:::-;31326:62;;31215:316;;;31483:19;;31476:3;;31459:20;;:14;:20;:::i;:::-;31458:44;;;;:::i;:::-;31442:60;;31215:316;31632:13;;31687:16;;-1:-1:-1;;;;;31632:13:0;;;;31626:33;;31660:10;;31680:4;;31687:13;;31632;;31687:16;;;;:::i;:::-;;;;;;;;;;;31626:78;;-1:-1:-1;;;;;;31626:78:0;;;;;;;-1:-1:-1;;;;;22455:15:1;;;31626:78:0;;;22437:34:1;22507:15;;;;22487:18;;;22480:43;22539:18;;;22532:34;22372:18;;31626:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31186:869;;;31750:6;31746:214;31766:4;31762:1;:8;31746:214;;;31868:13;;31927:16;;-1:-1:-1;;;;;31868:13:0;;;;31862:37;;31900:10;;31920:4;;31927:13;;31941:1;;31927:16;;;;;;:::i;:::-;;;;;;;;;;;31862:82;;-1:-1:-1;;;;;;31862:82:0;;;;;;;-1:-1:-1;;;;;22455:15:1;;;31862:82:0;;;22437:34:1;22507:15;;;;22487:18;;;22480:43;22539:18;;;22532:34;22372:18;;31862:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31772:3:0;;;;;-1:-1:-1;31746:214:0;;-1:-1:-1;31746:214:0;;-1:-1:-1;32024:19:0;;32017:3;;31992:21;31999:14;31992:4;:21;:::i;:::-;31991:29;;;;:::i;:::-;31990:53;;;;:::i;:::-;31974:69;;31186:869;32094:27;;;;:10;:27;;;:44;;32125:13;;32094:27;:44;;32125:13;;32094:44;:::i;:::-;;;;;;;;32167:13;32151:12;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;32193:56:0;;-1:-1:-1;9726:3:0;32223:10;32235:13;32193:12;:56::i;:::-;32460:13;;32453:46;;-1:-1:-1;;;32453:46:0;;32493:4;32453:46;;;1679:51:1;-1:-1:-1;;;;;32460:13:0;;;;32453:31;;1652:18:1;;32453:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32439:9;;32417:19;;:31;;;;:::i;:::-;:82;;32409:145;;;;-1:-1:-1;;;32409:145:0;;22779:2:1;32409:145:0;;;22761:21:1;22818:2;22798:18;;;22791:30;22857:34;22837:18;;;22830:62;-1:-1:-1;;;22908:18:1;;;22901:48;22966:19;;32409:145:0;22577:414:1;32409:145:0;32580:10;-1:-1:-1;;;;;32572:49:0;;32592:13;32607;32572:49;;;;;;;:::i;:::-;;;;;;;;31028:1601;;;30958:1671;:::o;13373:134::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;13464:17:::1;:40:::0;;;::::1;;-1:-1:-1::0;;;13464:40:0::1;-1:-1:-1::0;;;;13464:40:0;;::::1;::::0;;;::::1;::::0;;13373:134::o;12957:101::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;13036:20:::1;::::0;;-1:-1:-1;;;;13012:44:0;::::1;-1:-1:-1::0;;;13036:20:0;;;::::1;;;13035:21;13012:44:::0;;::::1;;::::0;;12957:101::o;9797:21::-;;;;;;;:::i;12286:109::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12369:9:::1;:24;12381:12:::0;12369:9;:24:::1;:::i;13064:101::-:0;-1:-1:-1;;;;;13147:16:0;;;;;;:9;:16;;;;;;;;;13140:23;;;;;;;;;;;;;;;;;13123:15;;13140:23;;;13147:16;13140:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13140:23:0;-1:-1:-1;;;;;13140:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13064:101;;;:::o;12503:75::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12564:3:::1;:12:::0;;-1:-1:-1;;;;;12564:12:0;;::::1;-1:-1:-1::0;;;12564:12:0::1;-1:-1:-1::0;;;;;;12564:12:0;;::::1;::::0;;;::::1;::::0;;12503:75::o;12126:154::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12213:12:::1;:29;12228:14:::0;12213:12;:29:::1;:::i;:::-;-1:-1:-1::0;12249:29:0::1;::::0;::::1;::::0;;;::::1;12126:154:::0;:::o;11440:81::-;11487:13;11511:7;11504:14;;;;;:::i;32716:1691::-;32829:23;;32871:13;32863:52;;;;-1:-1:-1;;;32863:52:0;;23906:2:1;32863:52:0;;;23888:21:1;23945:2;23925:18;;;23918:30;23984:28;23964:18;;;23957:56;24030:18;;32863:52:0;23704:350:1;32863:52:0;32928:15;32945:18;32974:19;33009:13;;;;;;;;;-1:-1:-1;;;;;33009:13:0;-1:-1:-1;;;;;33002:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32996:38;;:2;:38;:::i;:::-;32974:60;;33051:9;33064:1;33051:14;33047:749;;33095:16;33112:1;33095:19;;;;;;;;:::i;:::-;;;;;;;;;;;;33133;;;;:7;:19;;;;;;;;33095;;-1:-1:-1;33156:10:0;-1:-1:-1;;;;;33133:19:0;;;:33;33129:198;;33203:3;;33187:19;;33129:198;;;33301:10;33285:26;;33129:198;33341:37;9726:3;33367:10;33341:8;:37::i;:::-;;33047:749;;;33415:6;33411:290;33431:9;33427:1;:13;33411:290;;;33475:16;33492:1;33475:19;;;;;;;;:::i;:::-;;;;;;;;;;;;33521;;;;:7;:19;;;;;;;;33475;;-1:-1:-1;;;;;;33521:19:0;33544:10;33521:33;33513:80;;;;-1:-1:-1;;;33513:80:0;;24261:2:1;33513:80:0;;;24243:21:1;24300:2;24280:18;;;24273:30;24339:34;24319:18;;;24312:62;-1:-1:-1;;;24390:18:1;;;24383:32;24432:19;;33513:80:0;24059:398:1;33513:80:0;33612:37;9726:3;33638:10;33612:8;:37::i;:::-;-1:-1:-1;33680:3:0;;33411:290;;;-1:-1:-1;33743:3:0;;33731:15;;:9;:15;:::i;:::-;33715:31;;33047:749;33836:27;;;;:10;:27;;;:44;;33867:13;;33836:27;:44;;33867:13;;33836:44;:::i;:::-;;;;;;;;33907:13;33891:12;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;34000:3:0;;33977:19;;33933:24;;34000:3;33961:35;;:13;:35;:::i;:::-;33960:43;;;;:::i;:::-;33933:70;;34044:25;34113:21;;34095:14;;34073:19;:36;;;;:::i;:::-;34072:62;;;;:::i;:::-;34153:13;;34177:12;;34147:65;;-1:-1:-1;;;34147:65:0;;-1:-1:-1;;;;;34177:12:0;;;34147:65;;;24636:51:1;24703:18;;;24696:34;;;34044:90:0;;-1:-1:-1;34153:13:0;;34147:29;;24609:18:1;;34147:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34239:13:0;;-1:-1:-1;;;;;34239:13:0;34233:29;34263:10;34276:42;34298:20;34276:19;:42;:::i;:::-;34233:87;;-1:-1:-1;;;;;;34233:87:0;;;;;;;-1:-1:-1;;;;;24654:32:1;;;34233:87:0;;;24636:51:1;24703:18;;;24696:34;24609:18;;34233:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34349:10;-1:-1:-1;;;;;34338:61:0;;34361:19;34382:16;34338:61;;;;;;;:::i;:::-;;;;;;;;32801:1606;;;;;;32716:1691;:::o;26465:216::-;26571:10;26552:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;26552:40:0;;;;;;;;;:51;;-1:-1:-1;;26552:51:0;;;;;;;26614:59;;26552:40;:51;26614:27;:59::i;23457:339::-;23525:4;23545:15;;;:7;:15;;;;;;23564:10;-1:-1:-1;;;;;23545:15:0;;;:29;23542:178;;23591:44;23604:10;23616:2;23627:6;23591:12;:44::i;:::-;23650:32;23662:10;23674:2;23678:3;;23650:11;:32::i;:::-;-1:-1:-1;23704:4:0;23697:11;;23542:178;23730:36;23743:10;23755:2;23759:6;23730:12;:36::i;25356:675::-;25505:10;-1:-1:-1;;;;;25505:18:0;;;;:56;;;25541:20;25553:7;25541:11;:20::i;:::-;-1:-1:-1;;;;;25527:34:0;:10;-1:-1:-1;;;;;25527:34:0;;25505:56;:94;;;;25565:34;25582:4;25588:10;25565:16;:34::i;:::-;25479:186;;;;-1:-1:-1;;;25479:186:0;;;;;;;:::i;:::-;25676:39;25689:4;25695:2;25706:7;25676:12;:39::i;:::-;25727:26;25739:4;25745:2;25749:3;;25727:11;:26::i;:::-;-1:-1:-1;;;;;25784:14:0;;;:19;;;;:173;;-1:-1:-1;25820:74:0;;-1:-1:-1;;;25820:74:0;;;25911:46;-1:-1:-1;;;;;25820:41:0;;;25911:46;;25820:74;;25862:10;;25874:4;;25880:7;;25889:4;;25820:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25820:137:0;;;25784:173;25766:258;;;25991:21;;-1:-1:-1;;;25991:21:0;;;;;;;;;;;25766:258;25356:675;;;;:::o;26853:284::-;26917:13;26962:5;;26951:7;:16;;26943:45;;;;-1:-1:-1;;;26943:45:0;;25437:2:1;26943:45:0;;;25419:21:1;25476:2;25456:18;;;25449:30;-1:-1:-1;;;25495:18:1;;;25488:46;25551:18;;26943:45:0;25235:340:1;26943:45:0;27009:7;27003:21;;;;;:::i;:::-;;;27028:1;27003:26;26999:44;;-1:-1:-1;;27032:9:0;;;;;;;;;-1:-1:-1;27032:9:0;;;26853:284::o;26999:44::-;27084:7;27093:23;27112:3;;27102:7;:13;;;;:::i;:::-;27093:8;:23::i;:::-;27118:9;27067:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27053:76;;26853:284;;;:::o;11697:83::-;11747:4;11774:3;;11762:9;;:15;;;;:::i;:::-;11755:22;;11697:83;:::o;13278:89::-;13330:13;13353:12;13346:19;;;;;:::i;12401:96::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12473:8:::1;:22;12484:11:::0;12473:8;:22:::1;:::i;26689:156::-:0;-1:-1:-1;;;;;26802:25:0;;;26778:4;26802:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26689:156::o;5201:126::-;5315:8;5305;-1:-1:-1;;;;;5288:36:0;5297:6;-1:-1:-1;;;;;5288:36:0;;;;;;;;;;;5201:126;;;:::o;4633:122::-;4735:8;-1:-1:-1;;;;;4718:34:0;4727:6;-1:-1:-1;;;;;4718:34:0;;4745:6;4718:34;;;;2595:25:1;;2583:2;2568:18;;2449:177;4718:34:0;;;;;;;;4633:122;;;:::o;21926:529::-;-1:-1:-1;;;;;22034:16:0;;;;;;:7;:16;;;;;;-1:-1:-1;;;;;22026:24:0;;;22034:16;;22026:24;22018:58;;;;-1:-1:-1;;;22018:58:0;;26984:2:1;22018:58:0;;;26966:21:1;27023:2;27003:18;;;26996:30;-1:-1:-1;;;27042:18:1;;;27035:51;27103:18;;22018:58:0;26782:345:1;22018:58:0;-1:-1:-1;;;;;22142:22:0;;;;;;:13;:22;;;;;;;;22135:29;;-1:-1:-1;;;;;;22135:29:0;;;;;;22213:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;22213:21:0;;;;;22288:35;22305:4;22213:21;22142:22;22288:16;:35::i;:::-;22374:40;22396:4;22402:2;22406:7;-1:-1:-1;;;;;22374:40:0;:21;:40::i;21463:361::-;-1:-1:-1;;;;;21546:16:0;;;;;;:10;:16;;;;;:26;;21566:6;;21546:16;:26;;21566:6;;21546:26;:::i;:::-;;;;-1:-1:-1;;;;;;;21655:14:0;;;;;;:10;:14;;;;;:24;;;;;;21746:38;21767:4;21666:2;21673:6;21746:20;:38::i;26039:230::-;-1:-1:-1;;;;;26145:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;:36;-1:-1:-1;26145:36:0;26137:77;;;;-1:-1:-1;;;26137:77:0;;27334:2:1;26137:77:0;;;27316:21:1;27373:2;27353:18;;;27346:30;27412;27392:18;;;27385:58;27460:18;;26137:77:0;27132:352:1;26137:77:0;-1:-1:-1;;;;;26225:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;:36;;26255:6;;26225:17;:36;;26255:6;;26225:36;:::i;:::-;;;;-1:-1:-1;;;;;26039:230:0:o;14636:3875::-;-1:-1:-1;;;;;14743:16:0;;;;;;:10;:16;;;;;;:26;-1:-1:-1;14743:26:0;14735:76;;;;-1:-1:-1;;;14735:76:0;;27691:2:1;14735:76:0;;;27673:21:1;27730:2;27710:18;;;27703:30;27769:34;27749:18;;;27742:62;-1:-1:-1;;;27820:18:1;;;27813:35;27865:19;;14735:76:0;27489:401:1;14735:76:0;14974:3;;-1:-1:-1;;;;;14955:16:0;;14929:23;14955:16;;;:10;:16;;;;;;14929:23;;14955:22;;;:::i;:::-;15029:3;;-1:-1:-1;;;;;15012:14:0;;14988:21;15012:14;;;:10;:14;;;;;;14929:48;;-1:-1:-1;14988:21:0;15012:20;;15029:3;15012:20;:::i;:::-;14988:44;;15097:29;15109:4;15115:2;15119:6;15097:11;:29::i;:::-;15274:3;;-1:-1:-1;;;;;15255:16:0;;15228:24;15255:16;;;:10;:16;;;;;;15228:24;;15255:22;;;:::i;:::-;15330:3;;-1:-1:-1;;;;;15313:14:0;;15288:22;15313:14;;;:10;:14;;;;;;15228:49;;-1:-1:-1;15288:22:0;15313:20;;15330:3;15313:20;:::i;:::-;-1:-1:-1;;;;;15470:15:0;;15436:31;15470:15;;;:9;:15;;;;;9661:7;15615:25;;;15288:45;;-1:-1:-1;15615:25:0;15773:34;;;15769:384;;;15829:21;;:25;15826:316;;16006:53;16022:4;9661:7;16044:14;16006:15;:53::i;:::-;16299:14;16283:13;:30;16279:308;;;16335:21;;:25;16332:230;;16417:51;9661:7;16449:2;16453:14;16417:15;:51::i;:::-;16332:230;;;16537:9;16543:2;16537:5;:9::i;:::-;;16332:230;16684:19;16715:3;;16706:6;:12;;;;:::i;:::-;16742:21;;17157:17;;16684:34;;-1:-1:-1;16742:21:0;-1:-1:-1;;;17157:17:0;;;;;:44;;-1:-1:-1;;;;;;17178:23:0;;;17157:44;:67;;;-1:-1:-1;;;;;;17205:19:0;;;;;;:15;:19;;;;;;;;17157:67;:92;;;-1:-1:-1;;;;;;17228:21:0;;;;;;:15;:21;;;;;;;;17157:92;:107;;;-1:-1:-1;17261:3:0;;-1:-1:-1;;;;;17253:11:0;;;-1:-1:-1;;;17261:3:0;;;;17253:11;17157:107;17154:305;;;17421:3;17404:14;:20;:43;;17444:3;17404:43;;;17427:14;17404:43;17387:60;;17154:305;17474:18;;17471:1033;;17546:3;17529:14;:20;:43;;17569:3;17529:43;;;17552:14;17529:43;17523:49;;17815:6;17810:108;17831:3;17827:1;:7;17810:108;;;17860:41;17876:4;17882:2;17886:14;17860:15;:41::i;:::-;17836:3;;17810:108;;;-1:-1:-1;17932:21:0;17950:3;17932:21;;:::i;:::-;17974;;17932;;-1:-1:-1;17974:21:0;-1:-1:-1;18016:20:0;;;:43;;18056:3;18016:43;;;18039:14;18016:43;18010:49;;18318:6;18313:125;18334:3;18330:1;:7;18313:125;;;18371:51;9661:7;18403:2;18407:14;18371:15;:51::i;:::-;18339:3;;18313:125;;;-1:-1:-1;18454:36:0;18465:2;18469:20;18486:3;18469:14;:20;:::i;:::-;18454:10;:36::i;:::-;14714:3797;;;;;;;;14636:3875;;;:::o;5333:142::-;5451:9;-1:-1:-1;;;;;5428:44:0;5443:6;-1:-1:-1;;;;;5428:44:0;;5462:9;5428:44;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;27145:385:0;27201:13;27231:5;27240:1;27231:10;27227:29;;-1:-1:-1;;27244:10:0;;;;;;;;;;;;-1:-1:-1;;;27244:10:0;;;;;27145:385::o;27227:29::-;27272:5;27257:12;27304:41;27311:9;;27304:41;;27323:8;;;;:::i;:::-;;-1:-1:-1;27333:10:0;;-1:-1:-1;27341:2:0;27333:10;;:::i;:::-;;;27304:41;;;27346:19;27378:6;-1:-1:-1;;;;;27368:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27368:17:0;;27346:39;;27396:95;27403:10;;27396:95;;27416:11;27426:1;27416:11;;:::i;:::-;;-1:-1:-1;27459:10:0;27467:2;27459:5;:10;:::i;:::-;27453:22;;27473:2;27453:22;:::i;:::-;27446:30;;27429:6;27436;27429:14;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;27429:47:0;;;;;;;;-1:-1:-1;27478:11:0;27487:2;27478:11;;:::i;:::-;;;27396:95;;;27515:6;27145:385;-1:-1:-1;;;;27145:385:0:o;20362:1045::-;-1:-1:-1;;;;;20467:18:0;;20451:13;20467:18;;;:9;:18;;;;;;;;;-1:-1:-1;;;;;20578:15:0;;;;:9;:15;;;;;20667;;20467:18;;20578:15;;20667;20578;20765:7;20771:1;20667:15;20765:7;:::i;:::-;20756:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20756:17:0;20735:38;;20877:11;20859:8;20868:5;20859:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;20859:29:0;;;;;-1:-1:-1;;;;;20859:29:0;;;;;;20965:8;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;20965:14:0;;;;;;;;;-1:-1:-1;;;;;20965:14:0;;;;;;;;;;;;;;21086:7;20965:14;21086:3;:7;:::i;:::-;:12;21083:115;;-1:-1:-1;;;;;21115:22:0;;;;;;:9;:22;;;;;:30;;;21083:115;-1:-1:-1;;;;;21215:13:0;;;;;;:9;:13;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21215:27:0;;;;;;;;;;;;;;;;;21321:13;;;;:20;;:24;;21215:27;21321:24;:::i;:::-;-1:-1:-1;;;;;21300:18:0;;;;;;;:9;:18;;;;;:45;;;;-1:-1:-1;;;;;;20362:1045:0:o;5081:114::-;5183:8;5178:3;-1:-1:-1;;;;;5162:30:0;5171:5;-1:-1:-1;;;;;5162:30:0;;;;;;;;;;;5081:114;;;:::o;4515:112::-;4611:3;-1:-1:-1;;;;;4595:29:0;4604:5;-1:-1:-1;;;;;4595:29:0;;4616:7;4595:29;;;;2595:25:1;;2583:2;2568:18;;2449:177;22557:768:0;22689:15;;22663:14;;22680:8;;22689:19;;22707:1;;22689:19;:::i;:::-;22680:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22680:29:0;22737:22;;;:13;:22;;;;;;22730:29;;-1:-1:-1;;;;;;22730:29:0;;;;;;22808:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;22808:21:0;;;;;22935:14;;22680:29;;-1:-1:-1;22935:14:0;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;22935:14:0;;;;;;;;;;;-1:-1:-1;;;;;22935:14:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23047:13:0;;;;;:9;:13;;;;;:27;;22935:14;23047:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:13;;;:20;:24;;22935:14;23153:24;:::i;:::-;-1:-1:-1;;;;;23132:18:0;;;;;;:9;:18;;;;;:45;;;;23244:40;;23266:4;;23272:2;;23244:21;:40::i;19626:632::-;19729:6;:8;;-1:-1:-1;;19729:8:0;;;-1:-1:-1;;;;;19729:8:0;;;;;;;;;;;;;-1:-1:-1;19871:16:0;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;19871:21:0;-1:-1:-1;;;;;19871:21:0;;;;;;;;19966:13;;:9;:13;;;;;;:20;;19945:18;;;:9;:18;;;;;:41;;;20054:13;;;:27;;;;;;;;;;;;;;;;;;;;;;19729:8;20054:27;;;;;;;;;;;;;;;;;;20162:48;;19871:21;19729:8;20162:21;:48::i;:::-;19626:632;;;:::o;18519:1097::-;18598:6;18608:1;18598:11;18595:23;;18519:1097;;:::o;18595:23::-;18660:6;18670:1;18660:11;18657:105;;18720:9;18726:2;18720:5;:9::i;18657:105::-;18784:6;;-1:-1:-1;;;;;18855:13:0;;18772:9;18855:13;;;:9;:13;;;;;:20;-1:-1:-1;;;;;18784:6:0;;;;18855:20;18926:583;18946:6;18942:1;:10;18926:583;;;18999:4;;;;-1:-1:-1;;;;;19066:11:0;;;;;;;:7;:11;;;;;;;;:16;;-1:-1:-1;;;;;;19066:16:0;-1:-1:-1;;;;;19066:16:0;;;;;;;;19125:9;:13;;;;;:24;;;19208:13;;:9;:13;;;;:22;;;;;;;;;;;;;;;;;;;;;;;19066:16;19208:22;;;;;;;;;;;;;;;;;;18999:4;;19281:43;;19066:11;:16;;19281:21;:43::i;:::-;19397:10;;;;;19459:3;18926:583;;;-1:-1:-1;;19544:6:0;:24;;-1:-1:-1;;19544:24:0;;-1:-1:-1;;;;;19544:24:0;;;;;;;;;;;;;;;-1:-1:-1;;18519:1097:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:247::-;2256:6;2309:2;2297:9;2288:7;2284:23;2280:32;2277:52;;;2325:1;2322;2315:12;2277:52;2364:9;2351:23;2383:31;2408:5;2383:31;:::i;2631:127::-;2692:10;2687:3;2683:20;2680:1;2673:31;2723:4;2720:1;2713:15;2747:4;2744:1;2737:15;2763:275;2834:2;2828:9;2899:2;2880:13;;-1:-1:-1;;2876:27:1;2864:40;;-1:-1:-1;;;;;2919:34:1;;2955:22;;;2916:62;2913:88;;;2981:18;;:::i;:::-;3017:2;3010:22;2763:275;;-1:-1:-1;2763:275:1:o;3043:186::-;3091:4;-1:-1:-1;;;;;3116:6:1;3113:30;3110:56;;;3146:18;;:::i;:::-;-1:-1:-1;3212:2:1;3191:15;-1:-1:-1;;3187:29:1;3218:4;3183:40;;3043:186::o;3234:336::-;3298:5;3327:52;3343:35;3371:6;3343:35;:::i;:::-;3327:52;:::i;:::-;3318:61;;3402:6;3395:5;3388:21;3442:3;3433:6;3428:3;3424:16;3421:25;3418:45;;;3459:1;3456;3449:12;3418:45;3508:6;3503:3;3496:4;3489:5;3485:16;3472:43;3562:1;3555:4;3546:6;3539:5;3535:18;3531:29;3524:40;3234:336;;;;;:::o;3575:220::-;3617:5;3670:3;3663:4;3655:6;3651:17;3647:27;3637:55;;3688:1;3685;3678:12;3637:55;3710:79;3785:3;3776:6;3763:20;3756:4;3748:6;3744:17;3710:79;:::i;3800:665::-;3895:6;3903;3911;3919;3972:3;3960:9;3951:7;3947:23;3943:33;3940:53;;;3989:1;3986;3979:12;3940:53;4028:9;4015:23;4047:31;4072:5;4047:31;:::i;:::-;4097:5;-1:-1:-1;4154:2:1;4139:18;;4126:32;4167:33;4126:32;4167:33;:::i;:::-;4219:7;-1:-1:-1;4273:2:1;4258:18;;4245:32;;-1:-1:-1;4328:2:1;4313:18;;4300:32;-1:-1:-1;;;;;4344:30:1;;4341:50;;;4387:1;4384;4377:12;4341:50;4410:49;4451:7;4442:6;4431:9;4427:22;4410:49;:::i;:::-;4400:59;;;3800:665;;;;;;;:::o;4882:456::-;4959:6;4967;4975;5028:2;5016:9;5007:7;5003:23;4999:32;4996:52;;;5044:1;5041;5034:12;4996:52;5083:9;5070:23;5102:31;5127:5;5102:31;:::i;:::-;5152:5;-1:-1:-1;5209:2:1;5194:18;;5181:32;5222:33;5181:32;5222:33;:::i;:::-;4882:456;;5274:7;;-1:-1:-1;;;5328:2:1;5313:18;;;;5300:32;;4882:456::o;5343:320::-;5411:6;5464:2;5452:9;5443:7;5439:23;5435:32;5432:52;;;5480:1;5477;5470:12;5432:52;5520:9;5507:23;-1:-1:-1;;;;;5545:6:1;5542:30;5539:50;;;5585:1;5582;5575:12;5539:50;5608:49;5649:7;5640:6;5629:9;5625:22;5608:49;:::i;5668:450::-;5737:6;5790:2;5778:9;5769:7;5765:23;5761:32;5758:52;;;5806:1;5803;5796:12;5758:52;5846:9;5833:23;-1:-1:-1;;;;;5871:6:1;5868:30;5865:50;;;5911:1;5908;5901:12;5865:50;5934:22;;5987:4;5979:13;;5975:27;-1:-1:-1;5965:55:1;;6016:1;6013;6006:12;5965:55;6039:73;6104:7;6099:2;6086:16;6081:2;6077;6073:11;6039:73;:::i;6123:946::-;6207:6;6238:2;6281;6269:9;6260:7;6256:23;6252:32;6249:52;;;6297:1;6294;6287:12;6249:52;6337:9;6324:23;-1:-1:-1;;;;;6407:2:1;6399:6;6396:14;6393:34;;;6423:1;6420;6413:12;6393:34;6461:6;6450:9;6446:22;6436:32;;6506:7;6499:4;6495:2;6491:13;6487:27;6477:55;;6528:1;6525;6518:12;6477:55;6564:2;6551:16;6586:2;6582;6579:10;6576:36;;;6592:18;;:::i;:::-;6638:2;6635:1;6631:10;6621:20;;6661:28;6685:2;6681;6677:11;6661:28;:::i;:::-;6723:15;;;6793:11;;;6789:20;;;6754:12;;;;6821:19;;;6818:39;;;6853:1;6850;6843:12;6818:39;6877:11;;;;6897:142;6913:6;6908:3;6905:15;6897:142;;;6979:17;;6967:30;;6930:12;;;;7017;;;;6897:142;;;7058:5;6123:946;-1:-1:-1;;;;;;;;6123:946:1:o;7074:118::-;7160:5;7153:13;7146:21;7139:5;7136:32;7126:60;;7182:1;7179;7172:12;7197:241;7253:6;7306:2;7294:9;7285:7;7281:23;7277:32;7274:52;;;7322:1;7319;7312:12;7274:52;7361:9;7348:23;7380:28;7402:5;7380:28;:::i;7443:655::-;7612:2;7664:21;;;7734:13;;7637:18;;;7756:22;;;7583:4;;7612:2;7835:15;;;;7809:2;7794:18;;;7583:4;7878:194;7892:6;7889:1;7886:13;7878:194;;;7957:13;;-1:-1:-1;;;;;7953:38:1;7941:51;;8047:15;;;;8012:12;;;;7914:1;7907:9;7878:194;;;-1:-1:-1;8089:3:1;;7443:655;-1:-1:-1;;;;;;7443:655:1:o;8103:382::-;8168:6;8176;8229:2;8217:9;8208:7;8204:23;8200:32;8197:52;;;8245:1;8242;8235:12;8197:52;8284:9;8271:23;8303:31;8328:5;8303:31;:::i;:::-;8353:5;-1:-1:-1;8410:2:1;8395:18;;8382:32;8423:30;8382:32;8423:30;:::i;:::-;8472:7;8462:17;;;8103:382;;;;;:::o;8490:388::-;8558:6;8566;8619:2;8607:9;8598:7;8594:23;8590:32;8587:52;;;8635:1;8632;8625:12;8587:52;8674:9;8661:23;8693:31;8718:5;8693:31;:::i;:::-;8743:5;-1:-1:-1;8800:2:1;8785:18;;8772:32;8813:33;8772:32;8813:33;:::i;8883:380::-;8962:1;8958:12;;;;9005;;;9026:61;;9080:4;9072:6;9068:17;9058:27;;9026:61;9133:2;9125:6;9122:14;9102:18;9099:38;9096:161;;9179:10;9174:3;9170:20;9167:1;9160:31;9214:4;9211:1;9204:15;9242:4;9239:1;9232:15;9096:161;;8883:380;;;:::o;9623:354::-;9825:2;9807:21;;;9864:2;9844:18;;;9837:30;9903:32;9898:2;9883:18;;9876:60;9968:2;9953:18;;9623:354::o;9982:341::-;10184:2;10166:21;;;10223:2;10203:18;;;10196:30;-1:-1:-1;;;10257:2:1;10242:18;;10235:47;10314:2;10299:18;;9982:341::o;11098:249::-;11167:6;11220:2;11208:9;11199:7;11195:23;11191:32;11188:52;;;11236:1;11233;11226:12;11188:52;11268:9;11262:16;11287:30;11311:5;11287:30;:::i;11700:146::-;11787:13;;11809:31;11787:13;11809:31;:::i;11851:442::-;11905:5;11958:3;11951:4;11943:6;11939:17;11935:27;11925:55;;11976:1;11973;11966:12;11925:55;12005:6;11999:13;12036:48;12052:31;12080:2;12052:31;:::i;12036:48::-;12109:2;12100:7;12093:19;12155:3;12148:4;12143:2;12135:6;12131:15;12127:26;12124:35;12121:55;;;12172:1;12169;12162:12;12121:55;12185:77;12259:2;12252:4;12243:7;12239:18;12232:4;12224:6;12220:17;12185:77;:::i;12298:1321::-;12488:6;12496;12504;12512;12520;12528;12536;12544;12552;12605:3;12593:9;12584:7;12580:23;12576:33;12573:53;;;12622:1;12619;12612:12;12573:53;12651:9;12645:16;12635:26;;12680:57;12733:2;12722:9;12718:18;12680:57;:::i;:::-;12670:67;;12781:2;12770:9;12766:18;12760:25;-1:-1:-1;;;;;12845:2:1;12837:6;12834:14;12831:34;;;12861:1;12858;12851:12;12831:34;12884:61;12937:7;12928:6;12917:9;12913:22;12884:61;:::i;:::-;12874:71;;12991:2;12980:9;12976:18;12970:25;12954:41;;13020:2;13010:8;13007:16;13004:36;;;13036:1;13033;13026:12;13004:36;13059:63;13114:7;13103:8;13092:9;13088:24;13059:63;:::i;:::-;13049:73;;13162:3;13151:9;13147:19;13141:26;13131:36;;13213:3;13202:9;13198:19;13192:26;13176:42;;13243:2;13233:8;13230:16;13227:36;;;13259:1;13256;13249:12;13227:36;13282:63;13337:7;13326:8;13315:9;13311:24;13282:63;:::i;:::-;13272:73;;13391:3;13380:9;13376:19;13370:26;13354:42;;13421:2;13411:8;13408:16;13405:36;;;13437:1;13434;13427:12;13405:36;;13460:63;13515:7;13504:8;13493:9;13489:24;13460:63;:::i;:::-;13450:73;;;13563:3;13552:9;13548:19;13542:26;13532:36;;13608:3;13597:9;13593:19;13587:26;13577:36;;12298:1321;;;;;;;;;;;:::o;13750:518::-;13852:2;13847:3;13844:11;13841:421;;;13888:5;13885:1;13878:16;13932:4;13929:1;13919:18;14002:2;13990:10;13986:19;13983:1;13979:27;13973:4;13969:38;14038:4;14026:10;14023:20;14020:47;;;-1:-1:-1;14061:4:1;14020:47;14116:2;14111:3;14107:12;14104:1;14100:20;14094:4;14090:31;14080:41;;14171:81;14189:2;14182:5;14179:13;14171:81;;;14248:1;14234:16;;14215:1;14204:13;14171:81;;;14175:3;;13750:518;;;:::o;14444:1345::-;14570:3;14564:10;-1:-1:-1;;;;;14589:6:1;14586:30;14583:56;;;14619:18;;:::i;:::-;14648:97;14738:6;14698:38;14730:4;14724:11;14698:38;:::i;:::-;14692:4;14648:97;:::i;:::-;14800:4;;14857:2;14846:14;;14874:1;14869:663;;;;15576:1;15593:6;15590:89;;;-1:-1:-1;15645:19:1;;;15639:26;15590:89;-1:-1:-1;;14401:1:1;14397:11;;;14393:24;14389:29;14379:40;14425:1;14421:11;;;14376:57;15692:81;;14839:944;;14869:663;13697:1;13690:14;;;13734:4;13721:18;;-1:-1:-1;;14905:20:1;;;15023:236;15037:7;15034:1;15031:14;15023:236;;;15126:19;;;15120:26;15105:42;;15218:27;;;;15186:1;15174:14;;;;15053:19;;15023:236;;;15027:3;15287:6;15278:7;15275:19;15272:201;;;15348:19;;;15342:26;-1:-1:-1;;15431:1:1;15427:14;;;15443:3;15423:24;15419:37;15415:42;15400:58;15385:74;;15272:201;;;15519:1;15510:6;15507:1;15503:14;15499:22;15493:4;15486:36;14839:944;;;;;14444:1345;;:::o;16378:245::-;16445:6;16498:2;16486:9;16477:7;16473:23;16469:32;16466:52;;;16514:1;16511;16504:12;16466:52;16546:9;16540:16;16565:28;16587:5;16565:28;:::i;17452:127::-;17513:10;17508:3;17504:20;17501:1;17494:31;17544:4;17541:1;17534:15;17568:4;17565:1;17558:15;17584:416;17673:1;17710:5;17673:1;17724:270;17745:7;17735:8;17732:21;17724:270;;;17804:4;17800:1;17796:6;17792:17;17786:4;17783:27;17780:53;;;17813:18;;:::i;:::-;17863:7;17853:8;17849:22;17846:55;;;17883:16;;;;17846:55;17962:22;;;;17922:15;;;;17724:270;;;17728:3;17584:416;;;;;:::o;18005:806::-;18054:5;18084:8;18074:80;;-1:-1:-1;18125:1:1;18139:5;;18074:80;18173:4;18163:76;;-1:-1:-1;18210:1:1;18224:5;;18163:76;18255:4;18273:1;18268:59;;;;18341:1;18336:130;;18248:218;18336:130;18373:3;18363:8;18360:17;18357:43;;;18380:18;;:::i;:::-;-1:-1:-1;;18436:1:1;18422:16;;18451:5;;18248:218;;18550:2;18540:8;18537:16;18531:3;18525:4;18522:13;18518:36;18512:2;18502:8;18499:16;18494:2;18488:4;18485:12;18481:35;18478:77;18475:159;;;-1:-1:-1;18587:19:1;;;18619:5;;18475:159;18666:34;18691:8;18685:4;18666:34;:::i;:::-;18736:6;18732:1;18728:6;18724:19;18715:7;18712:32;18709:58;;;18747:18;;:::i;:::-;18785:20;;18005:806;-1:-1:-1;;;18005:806:1:o;18816:131::-;18876:5;18905:36;18932:8;18926:4;18905:36;:::i;18952:125::-;19017:9;;;19038:10;;;19035:36;;;19051:18;;:::i;19082:128::-;19149:9;;;19170:11;;;19167:37;;;19184:18;;:::i;19215:183::-;-1:-1:-1;;;;;19334:10:1;;;19322;;;19318:27;;19357:12;;;19354:38;;;19372:18;;:::i;:::-;19354:38;19215:183;;;;:::o;19403:184::-;19473:6;19526:2;19514:9;19505:7;19501:23;19497:32;19494:52;;;19542:1;19539;19532:12;19494:52;-1:-1:-1;19565:16:1;;19403:184;-1:-1:-1;19403:184:1:o;21379:127::-;21440:10;21435:3;21431:20;21428:1;21421:31;21471:4;21468:1;21461:15;21495:4;21492:1;21485:15;21511:251;21581:6;21634:2;21622:9;21613:7;21609:23;21605:32;21602:52;;;21650:1;21647;21640:12;21602:52;21682:9;21676:16;21701:31;21726:5;21701:31;:::i;21767:168::-;21840:9;;;21871;;21888:15;;;21882:22;;21868:37;21858:71;;21909:18;;:::i;21940:127::-;22001:10;21996:3;21992:20;21989:1;21982:31;22032:4;22029:1;22022:15;22056:4;22053:1;22046:15;22072:120;22112:1;22138;22128:35;;22143:18;;:::i;:::-;-1:-1:-1;22177:9:1;;22072:120::o;22996:703::-;23166:4;23214:2;23203:9;23199:18;23244:6;23233:9;23226:25;23270:2;23308;23303;23292:9;23288:18;23281:30;23331:6;23366;23360:13;23397:6;23389;23382:22;23435:2;23424:9;23420:18;23413:25;;23473:2;23465:6;23461:15;23447:29;;23494:1;23504:169;23518:6;23515:1;23512:13;23504:169;;;23579:13;;23567:26;;23648:15;;;;23613:12;;;;23540:1;23533:9;23504:169;;;-1:-1:-1;23690:3:1;;22996:703;-1:-1:-1;;;;;;;22996:703:1:o;24741:489::-;-1:-1:-1;;;;;25010:15:1;;;24992:34;;25062:15;;25057:2;25042:18;;25035:43;25109:2;25094:18;;25087:34;;;25157:3;25152:2;25137:18;;25130:31;;;24935:4;;25178:46;;25204:19;;25196:6;25178:46;:::i;:::-;25170:54;24741:489;-1:-1:-1;;;;;;24741:489:1:o;25580:723::-;25630:3;25671:5;25665:12;25700:36;25726:9;25700:36;:::i;:::-;25755:1;25772:17;;;25798:133;;;;25945:1;25940:357;;;;25765:532;;25798:133;-1:-1:-1;;25831:24:1;;25819:37;;25904:14;;25897:22;25885:35;;25876:45;;;-1:-1:-1;25798:133:1;;25940:357;25971:5;25968:1;25961:16;26000:4;26045;26042:1;26032:18;26072:1;26086:165;26100:6;26097:1;26094:13;26086:165;;;26178:14;;26165:11;;;26158:35;26221:16;;;;26115:10;;26086:165;;;26090:3;;;26280:6;26275:3;26271:16;26264:23;;25765:532;;;;;25580:723;;;;:::o;26308:469::-;26529:3;26557:38;26591:3;26583:6;26557:38;:::i;:::-;26624:6;26618:13;26640:65;26698:6;26694:2;26687:4;26679:6;26675:17;26640:65;:::i;:::-;26721:50;26763:6;26759:2;26755:15;26747:6;26721:50;:::i;:::-;26714:57;26308:469;-1:-1:-1;;;;;;;26308:469:1:o;27895:112::-;27927:1;27953;27943:35;;27958:18;;:::i;:::-;-1:-1:-1;27992:9:1;;27895:112::o;28012:135::-;28051:3;28072:17;;;28069:43;;28092:18;;:::i;:::-;-1:-1:-1;28139:1:1;28128:13;;28012:135::o;28152:148::-;28240:4;28219:12;;;28233;;;28215:31;;28258:13;;28255:39;;;28274:18;;:::i;28305:127::-;28366:10;28361:3;28357:20;28354:1;28347:31;28397:4;28394:1;28387:15;28421:4;28418:1;28411:15

Swarm Source

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