ETH Price: $2,646.89 (+1.78%)
Gas: 1 Gwei

Token

Crypto Tittiez (CTT)
 

Overview

Max Total Supply

85,807 CTT

Holders

26

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
obekt.eth
Balance
2 CTT
0x561a81a1d18b65b4207509d0d7ec12039129ace0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The crypto collectible art game raising awareness about breast cancer that allows users to collect and trade tens of thousands unique collectibles while portion from each transaction goes via smart contracts to support a NGO focused on education in the area of breast cancer prevention.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoTitties

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-11-07
*/

pragma solidity ^0.5.12;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}


/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids
 *
 * Include with `using Counter for Counter.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safeTransfer`. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

/**
 * @title CryptoTitties Implementation of ERC721
 * @dev ERC721, ERC721Meta plus custom market implementation.
 */
contract CryptoTitties {

    using SafeMath for uint;
    using Address for address;
    using Counters for Counters.Counter;
    
    // ----------------------------------------------------------------------------
    // Contract ownership
    // ----------------------------------------------------------------------------
    
    // - variables
    address public _ownershipOwner;
    address public _ownershipNewOwner;
    
    // - events
    event OwnershipTransferred(address indexed _from, address indexed _to);
    
    // - modifiers
    modifier onlyOwner {
        require(msg.sender == _ownershipOwner, "Only contract owner is allowed.");
        _;
    }

    // - functions


    /**
     * @notice Initialize contract ownership transfer
     * @dev This function can be called only by current contract owner, 
     * to initialize ownership transfer to other address.
     * @param newOwner The address of desired new owner
     */
    function ownershipTransfer(address newOwner) public onlyOwner {
        _ownershipNewOwner = newOwner;
    }

    /**
     * @notice Finish contract ownership transfer
     * @dev This function can be called only by new contract owner, 
     * to accept ownership transfer.
     */
    function ownershipAccept() public {
        require(msg.sender == _ownershipNewOwner, "Only new contract owner is allowed to accept.");
        emit OwnershipTransferred(_ownershipOwner, _ownershipNewOwner);
        _ownershipOwner = _ownershipNewOwner;
        _ownershipNewOwner = address(0);
    }
    
    
    
    // ----------------------------------------------------------------------------
    // ERC165
    // ----------------------------------------------------------------------------
    
    // - variables
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    mapping(bytes4 => bool) private _supportedInterfaces;
    
    // - functions
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff);
        _supportedInterfaces[interfaceId] = true;
    }
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }
    
    // ----------------------------------------------------------------------------
    // ERC721
    // based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
    // ----------------------------------------------------------------------------
   
    // - variables

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

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

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

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

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

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    

    // - events
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    

	// - functions

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0));
        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "Token does not exists.");
        return _ownerOf(tokenId);
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = _ownerOf(tokenId);
        require(to != owner);
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId));
        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender);
        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        require(_isApprovedOrOwner(msg.sender, tokenId));
		require(!_marketOfferExists(tokenId), "Token is offered on market can't be transfered.");
        require(!_marketAuctionExists(tokenId), "Token is in auction can't be transfered.");
        
        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data));
    }
    
    // ----------------------------------------------------------------------------
    // ERC721 Meta
    // based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721Metadata.sol
    // ----------------------------------------------------------------------------
    

    // - variables

    // Token name
    string private _name;
    
    // Token symbol
    string private _symbol;

    // Base uri to generate tokenURI
    string private _baseTokenURI;

    //hash to prove token images not changes in time
    string private _imagesJsonHash;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    

    // - functions 

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId));
        return string(abi.encodePacked(_baseTokenURI, uint2str(tokenId)));
    }
    
    /**
     * @dev Returns saved hash.
     * Throws if the token ID does not exist.
     */
    function imagesJsonHash() external view returns (string memory){
    	return _imagesJsonHash;
    }
    
    // ----------------------------------------------------------------------------
    // ERC721 Meta Total suply
    // added totalSuply functionality
    // ----------------------------------------------------------------------------
    
    // - vars

    //total suply
    uint256 private _totalSupply;
    
    // - functions

    /**
     * @dev Returns totalSupply.
     */
    function totalSupply() public view returns (uint256 _supply) {
        return _totalSupply;
    }
    
    // ----------------------------------------------------------------------------
    // Build In Market
    // ----------------------------------------------------------------------------    
    
    // - types     

    /**
    * @title MarketOffer
    * @dev Stores information about token market offer.
    */
    struct MarketOffer {
        bool isOffer;
        address owner;
        uint256 price;
    }

    /**
    * @title MarketAuction
    * @dev Stores information about token market auction.
    */
    struct MarketAuction {
        bool isAuction;
        address highestBidder;
        uint256 highestBid;
        uint256 initPrice;
        uint endTime;
    }
    
    // - variables

    // Mapping from token ID to MarketOffer
    mapping (uint256 => MarketOffer) private _marketOffers;

    // Mapping from token ID to MarketAuction
    mapping (uint256 => MarketAuction) private _marketAuctions;

    // Mapping from address to marketBalance (ETH)
    mapping (address => uint256) private _marketBalances;

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

    //Address allowed to place tokens owned by contract to auction
    address private _auctionsAddress;

    //Address allowed to gift (transfer) tokens owned by contract
    address private _giftsAddress;
    
    // - events 
    event MarketOfferCreated(address indexed _from, uint256 _tokenId, uint256 _price);
    event MarketOfferRemoved(address indexed _from, uint256 _tokenId);
    event MarketOfferSold(address indexed _owner, address indexed _buyer, uint256 _tokenId, uint256 _price);
    event MarketAuctionCreated(uint256 _tokenId, uint256 _initPrice, uint256 _starttime, uint256 _endtime);
    event MarketAuctionBid(uint256 _tokenId, uint256 _bid, address _bidder, address _old_bidder); 
    event MarketAuctionClaimed(uint256 _tokenId, uint256 _bid, address _bidder); 
    
    // - functions

    /**
     * @dev Sets new _auctionsAddress allowed to place tokens owned by 
     * contract to auction.
     * Requires the msg.sender to be the contract owner
     * @param auctionsAddress new _auctionsAddress
     */
    function setAuctionAddress(address auctionsAddress) public onlyOwner {
        _auctionsAddress = auctionsAddress;
    }

    /**
     * @dev Sets new _giftsAddress allowed to place tokens owned by 
     * contract to auction.
     * Requires the msg.sender to be the contract owner
     * @param giftsAddress new _giftsAddress
     */
    function setGiftsAddress(address giftsAddress) public onlyOwner {
        _giftsAddress = giftsAddress;
    }
    
    /**
     * @dev Gets token market price, returns 0 for tokens not on market.
     * Requires token existence
     * @param _tokenId uint256 ID of the token
     */
    function marketOfferGetTokenPrice(uint256 _tokenId) public view returns (uint256 _price) {
        require(_exists(_tokenId), "Token does not exists.");
        return _marketOfferGetTokenPrice(_tokenId);
    }
    
    /**
     * @dev Gets token market price, returns 0 for tokens not on market.
     * Internal implementation. For tokens owned by address(0), gets token 
     * not from price _marketOffers[_tokenId], but from function 
     * _countBasePrice(_tokenId)
     * @param _tokenId uint256 ID of the token
     */
    function _marketOfferGetTokenPrice(uint256 _tokenId) private view returns (uint256 _price) {
        if(_tokenOwner[_tokenId]==address(0)){
            return _countBasePrice(_tokenId);
        }
        return _marketOffers[_tokenId].price;
    }

    /**
     * @dev Returns whatever token is offered on market or not.
     * Requires token existence
     * @param _tokenId uint256 ID of the token
     */
    function marketOfferExists(uint256 _tokenId) public view returns (bool) {
        require(_exists(_tokenId), "Token does not exists.");
        
        return _marketOfferExists(_tokenId);
    }
    
    /**
     * @dev Returns whatever token is offered on market or not.
     * Internal implementation. For tokens owned by address(0), gets token 
     * not from price _marketOffers[_tokenId], but from function 
     * _baseIsOnMarket(_tokenId)
     * @param _tokenId uint256 ID of the token
     */
    function _marketOfferExists(uint256 _tokenId) private view returns (bool) {

        if(_tokenOwner[_tokenId]==address(0)){
            return _baseIsOnMarket(_tokenId);
        }

        return _marketOffers[_tokenId].isOffer;
    }

    /**
     * @dev Places token on internal market.
     * Requires token existence. Requires token not offered and not in auction.
     * Requires owner of token == msg.sender
     * @param _tokenId uint256 ID of the token
     * @param _price uint256 token price
     */
    function marketOfferCreate(uint256 _tokenId, uint256 _price) public {
        require(_exists(_tokenId), "Token does not exists.");
        require(!_marketOfferExists(_tokenId), "Token is allready offered.");
        require(!_marketAuctionExists(_tokenId), "Token is allready in auction.");

        address _owner = _ownerOf(_tokenId);

        require(_owner==msg.sender, "Sender is not authorized.");

        _marketOffers[_tokenId].isOffer = true;
        _marketOffers[_tokenId].owner = _owner;
        _marketOffers[_tokenId].price = _price;
        
        if(_tokenOwner[_tokenId]==address(0)){
        	_tokenOwner[_tokenId] = _owner;
        }

        emit MarketOfferCreated(_owner, _tokenId, _price);
    }

    /**
     * @dev Removes token from internal market.
     * Requires token existence. Requires token is offered .
     * Requires owner of token == msg.sender
     * @param _tokenId uint256 ID of the token
     */
    function marketOfferRemove(uint256 _tokenId) public {
        require(_exists(_tokenId), "Token does not exists.");

        address _owner = _ownerOf(_tokenId);

        require(_owner==msg.sender, "Sender is not authorized.");
        require(_marketOfferExists(_tokenId), "Token is not offered.");

        _marketOffers[_tokenId].isOffer = false;
        _marketOffers[_tokenId].owner = address(0);
        _marketOffers[_tokenId].price = 0;
        
        if(_tokenOwner[_tokenId]==address(0)){
        	_tokenOwner[_tokenId] = _owner;
        }

        //marketOffers[_tokenId] = MarketOffer(false, address(0),0);  
        emit MarketOfferRemoved(_owner, _tokenId);
    }

    /**
     * @dev Buy token from internal market.
     * Requires token existence. Requires token is offered.
     * Requires owner of msg.value >= token price. 
     * @param _tokenId uint256 ID of the token
     */
    function marketOfferBuy(uint256 _tokenId) public payable {
        require(_exists(_tokenId), "Token does not exists.");
        require(_marketOfferExists(_tokenId), "Token is not offered.");

        
        uint256 _price =  _marketOfferGetTokenPrice(_tokenId);
        uint256 _finalprice = _price;
        uint256 _payed = msg.value;
        address _buyer = msg.sender;
        address _owner = _ownerOf(_tokenId);
        uint256 fee_price = 0;
        uint256 charger_fee = 0;
        uint256 charity_fee = 0;
        uint256 charity_price = 0;

        require(_price<=_payed, "Payed price is lower than market price.");
        
        //return balance to buyer if send more than price
        if(_payed>_price){
            _marketBalances[_buyer] = _marketBalances[_buyer].add(_payed.sub(_price));
        }

        
        if((_tokenOwner[_tokenId]==address(0)) || (_tokenOwner[_tokenId]==_ownershipOwner)){
            // Primary market
            if(_isCharityToken(_tokenId)){
                //charity token
                
                //full price payed to _charityOwnerAddress
                charity_price = _price;

                //charity sets as first owner
                _tokenFirstOwner[_tokenId] = _charityOwnerAddress;
            }else{
                //contract token

                //10% to charity
                charity_fee = _price.div(10);

                //90% to charger
                charger_fee = _price.sub(charity_fee);
            }            
            
        }else{
            //Secondary market
            
            //calculate 1 %
            fee_price = _price.div(100);
            
            //1% to charity - final price subtracted by 1%
            charity_fee = fee_price;            
            _finalprice = _finalprice.sub(fee_price);
            
            //1% to first owner 
            if(_tokenFirstOwner[_tokenId]!=address(0)){ 
                //added 1% to first owner               
                _marketBalances[_tokenFirstOwner[_tokenId]] = _marketBalances[_tokenFirstOwner[_tokenId]].add(fee_price);
                
                //final price subtracted by 1%
                _finalprice = _finalprice.sub(fee_price);
            }
            
            //1% to charger - final price subtracted by 1%
            charger_fee = fee_price;
            _finalprice = _finalprice.sub(fee_price);
            
            //add final price to market balances of seller 97 or 98%
            _marketBalances[_owner] = _marketBalances[_owner].add(_finalprice);
        }

        //remove from market
        _marketOffers[_tokenId].isOffer = false;
        _marketOffers[_tokenId].owner = address(0);
        _marketOffers[_tokenId].price = 0;

        //actual token transfer
        _transferFrom(_owner, _buyer, _tokenId); 

        //eth transfers to _chargerAddress, _charityAddress, and _charityOwnerAddress
        _charityAddBalance(charity_fee);
        _chargerAddBalance(charger_fee);
        _charityOwnerAddBalance(charity_price);

        //emit market sold event
        emit MarketOfferSold(_owner, _buyer, _tokenId, _price);
    }

    /**
     * @dev Places token on internal auction.
     * Requires token existence. 
     * Requires token not offered and not in auction.
     * Requires owner of token == msg.sender or if contract token _auctionsAddress == msg.sender. 
     * Requires _initPrice > 0.
     * @param _tokenId uint256 ID of the token
     * @param _initPrice uint256 initial (minimal bid) price
     * @param _duration uint256 auction duration in secconds
     */
    function marketAuctionCreate(uint256 _tokenId, uint256 _initPrice, uint _duration) public {
        require(_exists(_tokenId), "Token does not exists.");
        require(!_marketOfferExists(_tokenId), "Token is allready offered.");
        require(!_marketAuctionExists(_tokenId), "Token is allready in auction.");

        address _owner = _ownerOf(_tokenId);

        //requre msg.sender to be owner
        if(_owner!=msg.sender){
            //OR require owner == _ownershipOwner
            require(_owner==_ownershipOwner, "Sender is not authorized.");    
            //AND msg.sender == _auctionsAddress        
            require(_auctionsAddress==msg.sender, "Sender is not authorized.");
        }

        require(_initPrice>0, "Auction Init price has to be bigger than 0.");
        
        //set auction parameters
        _marketAuctions[_tokenId].isAuction = true;
        _marketAuctions[_tokenId].highestBidder = address(0);
        _marketAuctions[_tokenId].highestBid = 0;
        _marketAuctions[_tokenId].initPrice = _initPrice;
        _marketAuctions[_tokenId].endTime = block.timestamp+_duration;

        //emits MarketAuctionCreated
        emit MarketAuctionCreated(_tokenId, _initPrice, block.timestamp, block.timestamp+_duration);
    }

    /**
     * @dev Bids on token in internal auction.
     * Requires token existence. 
     * Requires token in auction.
     * Requires bid >= _initPrice.
     * Requires bid > highestBid.
     * @param _tokenId uint256 ID of the token
     */
    function marketAuctionBid(uint256 _tokenId) public payable {
        require(_exists(_tokenId), "Token does not exists.");
        require(_marketAuctionExists(_tokenId), "Token is not in auction.");        
        require(_marketAuctions[_tokenId].highestBid < msg.value, "Bid has to be bigger than the current highest bid."); 
        require(_marketAuctions[_tokenId].initPrice <= msg.value, "Bid has to be at least initPrice value.");

        address oldBidder = _marketAuctions[_tokenId].highestBidder;
        address bidder = msg.sender;
        uint256 bidValue = msg.value;

        //return old bidder bid his to market balances
        if(oldBidder!=address(0)){
            _marketBalances[oldBidder] += _marketAuctions[_tokenId].highestBid;
        }

        //set new highest bid
        _marketAuctions[_tokenId].highestBidder = bidder;
        _marketAuctions[_tokenId].highestBid = bidValue;

        //emits MarketAuctionBid
        emit MarketAuctionBid(_tokenId, bidValue, bidder, oldBidder);        
    }   

    /**
     * @dev Resolved internal auction. Auction can not be resolved automatically after
     * duration expires. Transfer token to auction winner (if someone bids) and 
     * remove token from auction.
     * Requires token existence. 
     * Requires _marketAuctions[_tokenId].isAuction.
     * Requires _marketAuctions[_tokenId].endTime < block.timestamp - duration expired.
     * @param _tokenId uint256 ID of the token
     */
    function marketAuctionClaim(uint256 _tokenId) public {
        require(_exists(_tokenId), "Token does not exists.");
        require(_marketAuctions[_tokenId].isAuction, "Token is not in auction.");
        require(_marketAuctions[_tokenId].endTime < block.timestamp, "Auction not finished yet.");

        uint256 fee_price = 0;
        uint256 charger_fee = 0;
        uint256 charity_fee = 0;
        uint256 charity_price = 0;
        uint256 _price = _marketAuctions[_tokenId].highestBid;
        uint256 _finalprice = _price;
        address _buyer = _marketAuctions[_tokenId].highestBidder;
        address _owner = _ownerOf(_tokenId);
        
        // if winner exist (if someone bids)
        if(_buyer != address(0)){

            if(_tokenOwner[_tokenId]==address(0)){
                // Primary market
                if(_isCharityToken(_tokenId)){
                    //charity token
                
                    //full price payed to _charityOwnerAddress
                    charity_price = _price;

                    //charity sets as first owner
                    _tokenFirstOwner[_tokenId] = _charityOwnerAddress;
                }else{
                    //contract token 

                    //10% to charity
                    charity_fee = _price.div(10);

                    //90% to charger
                    charger_fee = _price.sub(charity_fee);
                }
            }else{
                //Secondary market
                
                //calculate 1 %
                fee_price = _price.div(100);
                
                //1% to charity - final price subtracted by 1%
                charity_fee = fee_price;
                _finalprice = _finalprice.sub(fee_price);
                
                //1% to first owner 
                if(_tokenFirstOwner[_tokenId]!=address(0)){
                    //added 1% to first owner 
                    _marketBalances[_tokenFirstOwner[_tokenId]] = _marketBalances[_tokenFirstOwner[_tokenId]].add(fee_price);
                    
                    //final price subtracted by 1%
                    _finalprice = _finalprice.sub(fee_price);
                }
                
                //1% to charger - final price subtracted by 1%
                charger_fee = fee_price;
                _finalprice = _finalprice.sub(fee_price);
                
                //add final price to market balances of seller 97 or 98%
                _marketBalances[_owner] = _marketBalances[_owner].add(_finalprice);
            }
               
            
            //actual transfer to winner
            _transferFrom(_owner, _buyer, _tokenId);

            //emit MarketAuctionClaimed
            emit MarketAuctionClaimed(_tokenId, _price, _buyer);
        }else{
            //emit MarketAuctionClaimed - when no bidder/winner
            emit MarketAuctionClaimed(_tokenId, 0, address(0));
        }

        //remove auction
        _marketAuctions[_tokenId].isAuction = false;
        _marketAuctions[_tokenId].highestBidder = address(0);
        _marketAuctions[_tokenId].highestBid = 0;

        //eth transfers to _chargerAddress, _charityAddress, and _charityOwnerAddress
        _charityAddBalance(charity_fee);
        _chargerAddBalance(charger_fee);
        _charityOwnerAddBalance(charity_price);
    } 

    /**
     * @dev Gets current highest bid, returns 0 for tokens not in auction.
     * Requires token existence
     * @param _tokenId uint256 ID of the token
     */
    function marketAuctionGetTokenPrice(uint256 _tokenId) public view returns (uint256 _price) {
        require(_exists(_tokenId), "Token does not exists.");

        return _marketAuctions[_tokenId].highestBid;
    }

    /**
     * @dev Gets address of current highest bidder, returns addres(0) for tokens not in auction.
     * Requires token existence
     * @param _tokenId uint256 ID of the token
     */
    function marketAuctionGetHighestBidder(uint256 _tokenId) public view returns (address _bidder) {
        require(_exists(_tokenId), "Token does not exists.");

        return _marketAuctions[_tokenId].highestBidder;
    }

    /**
     * @dev Returns whatever token is in auction or not.
     * @param _tokenId uint256 ID of the token
     */
    function marketAuctionExists(uint256 _tokenId) public view returns(bool _exists){
        return _marketAuctionExists(_tokenId);
    }  
    
    /**
     * @dev Returns whatever token is in auction or not.
     * Internal implementation. Check if endTime not expired.
     * @param _tokenId uint256 ID of the token
     */
    function _marketAuctionExists(uint256 _tokenId) private view returns(bool _exists){
        if(_marketAuctions[_tokenId].endTime < block.timestamp){
            return false;
        }
        return _marketAuctions[_tokenId].isAuction;
    }

    /**
     * @dev Transfers market balance of msg.sender.
     * Requires _marketBalances[msg.sender]>0
     */
    function marketWithdrawBalance() public {
        uint amount = _marketBalances[msg.sender];
        require(amount>0, "Sender has no market balance to withdraw.");

        _marketBalances[msg.sender] = 0;
        msg.sender.transfer(amount);
    }

    /**
     * @dev Get ammount of _owner.
     * @param _owner address Requested address;
     */
    function marketGetBalance(address _owner) public view returns(uint256 _balance){
        return _marketBalances[_owner];
    }

    /**
     * @dev Send/transfer token.
     * Requires token exist.
     * Requires token is not offered or in auction.
     * Requires token is owned by _ownershipOwner
     * Requires msq.sender==_giftsAddress
     * @param _tokenId uint256 ID of the token to send
     * @param _to address to send token
     */
    function marketSendGift(uint256 _tokenId, address _to) public {
        require(_exists(_tokenId), "Token does not exists.");
        require(!_marketOfferExists(_tokenId), "Token is offered.");
        require(!_marketAuctionExists(_tokenId), "Token is in auction.");

        require(_ownerOf(_tokenId)==_ownershipOwner, "Sender is not authorized.");            
        require(_giftsAddress==msg.sender, "Sender is not authorized.");

        _transferFrom(_ownerOf(_tokenId), _to, _tokenId);
    }


    // --------------------------
    // Safe transfers functions (transefer to kown adresses)
    // -------------------------
    
    address payable private _chargeAddress;
    address payable private _charityAddress;
    address payable private _charityOwnerAddress;

    /**
     * @dev Transfers eth to _charityAddress
     * @param _balance uint256 Ammount to transfer
     */
    function _charityAddBalance(uint256 _balance) internal {
        if(_balance>0){
            _charityAddress.transfer(_balance);
        }
    }

    /**
     * @dev Transfers eth to _charityOwnerAddress
     * @param _balance uint256 Ammount to transfer
     */
    function _charityOwnerAddBalance(uint256 _balance) internal {
        if(_balance>0){
            _charityOwnerAddress.transfer(_balance);
        }
    }

    /**
     * @dev Transfers eth to _chargeAddress
     * @param _balance uint256 Ammount to transfer
     */
    function _chargerAddBalance(uint256 _balance) internal {
        if(_balance>0){
            _chargeAddress.transfer(_balance);
        }
    }
    

	// --------------------------
    // Internal functions
    // -------------------------
	
    /**
     * @dev Internal function return owner of token _tokenOwner[_tokenId]. 
     * if _tokenOwner[_tokenId] == address(0), owner is _charityOwnerAddress 
     * OR _ownershipOwner (based on _isCharityToken(_tokenId))
     * @param _tokenId uint256 ID of the token
     */
    function _ownerOf(uint256 _tokenId) internal view returns (address _owner) {
        
        if(_tokenOwner[_tokenId]==address(0)){
            //token has no owner - owner is _charityOwnerAddress OR _ownershipOwner;
            if(_isCharityToken(_tokenId)){
                //owner is _charityOwnerAddress
                return _charityOwnerAddress;
            }
            //owner is _ownershipOwner
            return _ownershipOwner;
        }
        //owner is _tokenOwner[_tokenId]
        return _tokenOwner[_tokenId];
    }

    /**
     * @dev Returns whatever token is charity token or not
     * @param _tokenId uint256 ID of the token
     */
    function _isCharityToken(uint256 _tokenId) internal pure returns (bool _isCharity) {
        if(_tokenId>720 && _tokenId<=1320){
            return true;
        }
        return false;
    }
	
    /**
     * @dev Returns whether the specified token exists.
     * @param _tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 _tokenId) internal view returns(bool _tokenExistence) {
        //all tokens lower then supply exists
        return (_tokenId <= _totalSupply);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        address owner = _ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(_ownerOf(tokenId) == from);
        require(to != address(0));

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

		if(_tokenFirstOwner[tokenId]==address(0)){
			_tokenFirstOwner[tokenId] = to;
		}
        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    
    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This function is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
    
    /**
     * @dev Converts uint256 number to string
     * @param i uint256
     */
    function uint2str(uint256 i) internal pure returns (string memory){
        uint256 _tmpN = i;

        if (_tmpN == 0) {
            return "0";
        }

        uint256 j = _tmpN;
        uint256 length = 0;

        while (j != 0){
            length++;
            j /= 10;
        }

        bytes memory bstr = new bytes(length);
        uint256 k = length - 1;

        while (_tmpN != 0) {
            bstr[k--] = byte(uint8(48 + _tmpN % 10));
            _tmpN /= 10;
        }

        return string(bstr);
    }
    
    /**
     * @dev Returns market price of token based on its id. 
     * Only used if tokenOwner == address(0)
     * @param _tokenId uint256 id of token
     * @return uint256 marketPrice 
     */
    function _countBasePrice(uint256 _tokenId) internal pure returns (uint256 _price) {
      
        if(_tokenId<=720){
            //reserved for gifts and auctions
            return 0;
        }
        if(_tokenId>720 && _tokenId<=1320){
            //charity owned on market
            return 100 * (uint256(10) ** 15);
        }

        if(_tokenId>1320 && _tokenId<=8020){
            // price 5
            return 34 * (uint256(10) ** 15);
        }

        if(_tokenId>=8021 && _tokenId<10920){
            // price 6
            return 40 * (uint256(10) ** 15);
        }

        if(_tokenId>=10920 && _tokenId<17720){
            // price 7
            return 47 * (uint256(10) ** 15);
        }

        if(_tokenId>=17720 && _tokenId<22920){
            // price 8
            return 54* (uint256(10) ** 15);
        }

        if(_tokenId>=22920 && _tokenId<29470){
            // price 10
            return 67 * (uint256(10) ** 15);
        }

        if(_tokenId>=29470 && _tokenId<30320){
            // price 11
            return 74 * (uint256(10) ** 15);
        }

        if(_tokenId>=30320 && _tokenId<32470){
            // price 12
            return 80 * (uint256(10) ** 15);
        }

        if(_tokenId>=32470 && _tokenId<35120){
            // price 13
            return 87 * (uint256(10) ** 15);
        }

        if(_tokenId>=35120 && _tokenId<35520){
            // price 14
            return 94 * (uint256(10) ** 15);
        }

        if(_tokenId>=35520 && _tokenId<42370){
            // price 15
            return 100 * (uint256(10) ** 15);
        }

        if(_tokenId>=42370 && _tokenId<46370){
            // price 18
            return 120 * (uint256(10) ** 15);
        }

        if(_tokenId>=46370 && _tokenId<55920){
            // price 20
            return 134 * (uint256(10) ** 15);
        }

        if(_tokenId>=55920 && _tokenId<59820){
            // price 22
            return 147 * (uint256(10) ** 15);
        }

        if(_tokenId>=59820 && _tokenId<63120){
            // price 25
            return 167 * (uint256(10) ** 15);
        }

        if(_tokenId>=63120 && _tokenId<78870){
            // price 30
            return 200 * (uint256(10) ** 15);
        }

        if(_tokenId>=78870 && _tokenId<79010){
            // price 35
            return 234 * (uint256(10) ** 15);
        }

        if(_tokenId>=79010 && _tokenId<84505){
            // price 40
            return 267 * (uint256(10) ** 15);
        }

        if(_tokenId>=84505 && _tokenId<84645){
            // price 45
            return 300 * (uint256(10) ** 15);
        }

        if(_tokenId>=84645 && _tokenId<85100){
            // price 50
            return 334 * (uint256(10) ** 15);
        }

        if(_tokenId>=85100 && _tokenId<85165){
            // price 60
            return 400 * (uint256(10) ** 15);
        }

        if(_tokenId>=85165 && _tokenId<85175){
            // price 65
            return 434 * (uint256(10) ** 15);
        }

        if(_tokenId>=85175 && _tokenId<85205){
            // price 70
            return 467 * (uint256(10) ** 15);
        }

        if(_tokenId>=85205 && _tokenId<85235){
            // price 80
            return 534 * (uint256(10) ** 15);
        }

        if(_tokenId>=85235 && _tokenId<85319){
            // price 90
            return 600 * (uint256(10) ** 15);
        }

        if(_tokenId>=85319 && _tokenId<85427){
            // price 100
            return 667 * (uint256(10) ** 15);
        }

        if(_tokenId>=85427 && _tokenId<85441){
            // price 110
            return 734 * (uint256(10) ** 15);
        }

        if(_tokenId>=85441 && _tokenId<85457){
            // price 120
            return 800 * (uint256(10) ** 15);
        }

        if(_tokenId>=85457 && _tokenId<85464){
            // price 130
            return 867 * (uint256(10) ** 15);
        }

        if(_tokenId>=85464 && _tokenId<85465){
            // price 140
            return 934 * (uint256(10) ** 15);
        }

        if(_tokenId>=85465 && _tokenId<85502){
            // price 150
            return 1000 * (uint256(10) ** 15);
        }

        if(_tokenId>=85502 && _tokenId<85506){
            // price 160
            return 1067 * (uint256(10) ** 15);
        }

        if(_tokenId==85506){
            // price 170
            return 1134 * (uint256(10) ** 15);
        }

        if(_tokenId==85507){
            // price 180
            return 1200 * (uint256(10) ** 15);
        }

        if(_tokenId>=85508 && _tokenId<85516){
            // price 200
            return 1334 * (uint256(10) ** 15);
        }

        if(_tokenId>=85516 && _tokenId<85518){
            // price 230
            return 1534 * (uint256(10) ** 15);
        }

        if(_tokenId>=85518 && _tokenId<85571){
            // price 250
            return 1667 * (uint256(10) ** 15);
        }

        if(_tokenId>=85571 && _tokenId<85587){
            // price 300
            return 2000 * (uint256(10) ** 15);
        }

        if(_tokenId>=85587 && _tokenId<85594){
            // price 350
            return 2334 * (uint256(10) ** 15);
        }

        if(_tokenId>=85594 && _tokenId<85597){
            // price 400
            return 2667 * (uint256(10) ** 15);
        }

        if(_tokenId>=85597 && _tokenId<85687){
            // price 500
            return 3334 * (uint256(10) ** 15);
        }

        if(_tokenId==85687){
            // price 550
            return 3667 * (uint256(10) ** 15);
        }

        if(_tokenId>=85688 && _tokenId<85692){
            // price 600
            return 4000 * (uint256(10) ** 15);
        }

        if(_tokenId==85692){
            // price 680
            return 4534 * (uint256(10) ** 15);
        }

        if(_tokenId>=85693 && _tokenId<85698){
            // price 700
            return 4667 * (uint256(10) ** 15);
        }

        if(_tokenId>=85698 && _tokenId<85700){
            // price 750
            return 5000 * (uint256(10) ** 15);
        }

        if(_tokenId==85700){
            // price 800
            return 5334 * (uint256(10) ** 15);
        }

        if(_tokenId==85701){
            // price 900
            return 6000 * (uint256(10) ** 15);
        }

        if(_tokenId>=85702 && _tokenId<85776){
            // price 1000
            return 6667 * (uint256(10) ** 15);
        }

        if(_tokenId==85776){
            // price 1100
            return 7334 * (uint256(10) ** 15);
        }

        if(_tokenId>=85777 && _tokenId<85788){
            // price 1500
            return 10000 * (uint256(10) ** 15);
        }

        if(_tokenId>=85788 && _tokenId<85795){
            // price 2000
            return 13334 * (uint256(10) ** 15);
        }

        if(_tokenId>=85795 && _tokenId<85798){
            // price 2500
            return 16667 * (uint256(10) ** 15);
        }

        if(_tokenId>=85798 && _tokenId<85803){
            // price 3000
            return 20000 * (uint256(10) ** 15);
        }

        if(_tokenId>=85803 && _tokenId<85806){
            // price 5000
            return 33334 * (uint256(10) ** 15);
        }

        if(_tokenId>=85806 && _tokenId<85807){
            // price 10000
            return 66667 * (uint256(10) ** 15);
        }

        if(_tokenId==85807){
            // price 50000
            return 333334 * (uint256(10) ** 15);
        }
    }

    /**
     * @dev Returns whatever token is offerd on market. 
     * Only used if tokenOwner == address(0)
     * @param _tokenId uint256 id of token
     */
    function _baseIsOnMarket(uint256 _tokenId) internal pure returns (bool _isOnMarket) {
        if(_tokenId<=720){
            //reserved for gits and auctions
            return false;
        }
        if(_tokenId>720 && _tokenId<=1320){
            //charity owned on market
            return true;
        }

        if(_tokenId>1320){
            //other on market
            return true;
        }
    }

    /**
     * @dev Constructor
     */
    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
    	_registerInterface(_INTERFACE_ID_ERC165);
        _registerInterface(_INTERFACE_ID_ERC721);
        
        //set metadata values
        _name = "Crypto Tittiez";
        _symbol = "CTT";
        
        // register the supported interfaces to conform to ERC721 ERC721_METADATA
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        
        //set metadata values
        _baseTokenURI = "https://cryptotittiez.com/api/tokeninfo/";
        _totalSupply = 85807;

        //after tokens creation (allmost) all tokens pretends are owned by _ownershipOwner. Look at function _ownerOf
        _ownedTokensCount[msg.sender].set(85207);

        //sets known addresse
        _chargeAddress = address(0x03559A5AFC7F55F3d71619523d45889a6b0905c0);
        _charityAddress = address(0x40497Be989B8d6fb532a6A2f0Dbf759F5d644e76);
        _charityOwnerAddress = address(0x949577b216ee2D44d70d6DB210422275694cbA27);
        _auctionsAddress = address(0x6800B4f9A80a1fbA4674a5716A5554f3869b57Bf);
        _giftsAddress = address(0x3990e05DA96EFfF38b0aC9ddD495F41BB82Bf9a9);

        //after tokens creation 600 tokens pretends are owned by _charityOwnerAddress. Look at function _ownerOf
        _ownedTokensCount[_charityOwnerAddress].set(600);
        
        //sets json hash to prove images not change 
        _imagesJsonHash = "2485dabaebe62276c976e55b290438799f2b60cdb845c50053e2c2be43fa6fce";
       
        //set contract owner
        _ownershipOwner = msg.sender;
    }      
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"address","name":"_old_bidder","type":"address"}],"name":"MarketAuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"}],"name":"MarketAuctionClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_initPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_starttime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endtime","type":"uint256"}],"name":"MarketAuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"MarketOfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MarketOfferRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"MarketOfferSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"_ownershipNewOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_ownershipOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"imagesJsonHash","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionBid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_initPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"marketAuctionCreate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionExists","outputs":[{"internalType":"bool","name":"_exists","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionGetHighestBidder","outputs":[{"internalType":"address","name":"_bidder","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionGetTokenPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"marketGetBalance","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferBuy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"marketOfferCreate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferGetTokenPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferRemove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"marketSendGift","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"marketWithdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ownershipAccept","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"ownershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"auctionsAddress","type":"address"}],"name":"setAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"giftsAddress","type":"address"}],"name":"setGiftsAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506200002a6301ffc9a760e01b6200042c60201b60201c565b620000426380ac58cd60e01b6200042c60201b60201c565b6040518060400160405280600e81526020017f43727970746f205469747469657a000000000000000000000000000000000000815250600790805190602001906200008f929190620004de565b506040518060400160405280600381526020017f435454000000000000000000000000000000000000000000000000000000000081525060089080519060200190620000dd929190620004de565b50620000f6635b5e139f60e01b6200042c60201b60201c565b60405180606001604052806028815260200162005fc6602891396009908051906020019062000127929190620004de565b5062014f2f600b819055506200018d62014cd7600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004cd60201b6200584b1790919060201c565b507303559a5afc7f55f3d71619523d45889a6b0905c0601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507340497be989b8d6fb532a6a2f0dbf759f5d644e76601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073949577b216ee2d44d70d6db210422275694cba27601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736800b4f9a80a1fba4674a5716a5554f3869b57bf601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733990e05da96efff38b0ac9ddd495f41bb82bf9a9601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003b361025860056000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004cd60201b6200584b1790919060201c565b5060405180606001604052806040815260200162005f8660409139600a9080519060200190620003e5929190620004de565b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200058d565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200046057600080fd5b600160026000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600081836000018190555092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052157805160ff191683800117855562000552565b8280016001018555821562000552579182015b828111156200055157825182559160200191906001019062000534565b5b50905062000561919062000565565b5090565b6200058a91905b80821115620005865760008160009055506001016200056c565b5090565b90565b6159e9806200059d6000396000f3fe6080604052600436106102045760003560e01c8063642ca8a511610118578063a22cb465116100a0578063c8ab84d81161006f578063c8ab84d814610db1578063d1290c1614610df6578063d3a417a214610e0d578063e985e9c514610e5e578063fd353c7b14610ee757610204565b8063a22cb46514610b33578063b77568fb14610b90578063b88d4fde14610beb578063c87b56dd14610cfd57610204565b806393ac3638116100e757806393ac36381461099b57806393adac6e146109ec578063942cb80014610a3b57806395d89b4114610a52578063a064101e14610ae257610204565b8063642ca8a5146108045780636ab0704c1461089457806370a08231146108e757806386e7e3761461094c57610204565b8063277da51c1161019b57806332cf83301161016a57806332cf83301461060357806342842e0e146106685780634ec7c45b146106e357806358c612cb146107325780636352211e1461078957610204565b8063277da51c1461051557806327b3f0d81461056c5780632d8645861461059a5780633175a0e9146105d557610204565b8063095ea7b3116101d7578063095ea7b3146103c157806316ed488e1461041c57806318160ddd1461046f57806323b872dd1461049a57610204565b806301ffc9a71461020957806306fdde031461027b578063081812fc1461030b57806308b3036314610386575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f62565b604051808215151515815260200191505060405180910390f35b34801561028757600080fd5b50610290610fca565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102d05780820151818401526020810190506102b5565b50505050905090810190601f1680156102fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031757600080fd5b506103446004803603602081101561032e57600080fd5b810190808035906020019092919050505061106c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039257600080fd5b506103bf600480360360208110156103a957600080fd5b81019080803590602001909291905050506110bb565b005b3480156103cd57600080fd5b5061041a600480360360408110156103e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061183d565b005b34801561042857600080fd5b506104556004803603602081101561043f57600080fd5b810190808035906020019092919050505061197e565b604051808215151515815260200191505060405180910390f35b34801561047b57600080fd5b50610484611990565b6040518082815260200191505060405180910390f35b3480156104a657600080fd5b50610513600480360360608110156104bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061199a565b005b34801561052157600080fd5b5061052a611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105986004803603602081101561058257600080fd5b8101908080359060200190929190505050611aa1565b005b3480156105a657600080fd5b506105d3600480360360208110156105bd57600080fd5b810190808035906020019092919050505061221e565b005b610601600480360360208110156105eb57600080fd5b8101908080359060200190929190505050612570565b005b34801561060f57600080fd5b506106526004803603602081101561062657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b34801561067457600080fd5b506106e16004803603606081101561068b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612986565b005b3480156106ef57600080fd5b5061071c6004803603602081101561070657600080fd5b81019080803590602001909291905050506129a6565b6040518082815260200191505060405180910390f35b34801561073e57600080fd5b50610747612a41565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079557600080fd5b506107c2600480360360208110156107ac57600080fd5b8101908080359060200190929190505050612a66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561081057600080fd5b50610819612af3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561085957808201518184015260208101905061083e565b50505050905090810190601f1680156108865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a057600080fd5b506108cd600480360360208110156108b757600080fd5b8101908080359060200190929190505050612b95565b604051808215151515815260200191505060405180910390f35b3480156108f357600080fd5b506109366004803603602081101561090a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c22565b6040518082815260200191505060405180910390f35b34801561095857600080fd5b506109996004803603606081101561096f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612cab565b005b3480156109a757600080fd5b506109ea600480360360208110156109be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061316d565b005b3480156109f857600080fd5b50610a2560048036036020811015610a0f57600080fd5b8101908080359060200190929190505050613273565b6040518082815260200191505060405180910390f35b348015610a4757600080fd5b50610a50613300565b005b348015610a5e57600080fd5b50610a676134e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aa7578082015181840152602081019050610a8c565b50505050905090810190601f168015610ad45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610aee57600080fd5b50610b3160048036036020811015610b0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358b565b005b348015610b3f57600080fd5b50610b8e60048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613691565b005b348015610b9c57600080fd5b50610be960048036036040811015610bb357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137cb565b005b348015610bf757600080fd5b50610cfb60048036036080811015610c0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c7557600080fd5b820183602082011115610c8757600080fd5b80359060200191846001830284011164010000000083111715610ca957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613ae2565b005b348015610d0957600080fd5b50610d3660048036036020811015610d2057600080fd5b8101908080359060200190929190505050613b08565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d76578082015181840152602081019050610d5b565b50505050905090810190601f168015610da35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dbd57600080fd5b50610df460048036036040811015610dd457600080fd5b810190808035906020019092919080359060200190929190505050613bf2565b005b348015610e0257600080fd5b50610e0b613fc8565b005b348015610e1957600080fd5b50610e5c60048036036020811015610e3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140f4565b005b348015610e6a57600080fd5b50610ecd60048036036040811015610e8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141fa565b604051808215151515815260200191505060405180910390f35b348015610ef357600080fd5b50610f2060048036036020811015610f0a57600080fd5b810190808035906020019092919050505061428e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060026000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b600061107782614349565b61108057600080fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110c481614349565b611136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600082815260200190815260200160002060000160009054906101000a900460ff166111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b42600d60008381526020019081526020016000206003015410611257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41756374696f6e206e6f742066696e6973686564207965742e0000000000000081525060200191505060405180910390fd5b60008090506000809050600080905060008090506000600d600087815260200190815260200160002060010154905060008190506000600d600089815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006112d189614358565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461170157600073ffffffffffffffffffffffffffffffffffffffff16600360008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561142a576113788961445e565b156113f957839450601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611425565b61140d600a8561448b90919063ffffffff16565b955061142286856144b190919063ffffffff16565b96505b61167e565b61143e60648561448b90919063ffffffff16565b975087955061145688846144b190919063ffffffff16565b9250600073ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d05761154488600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cd88846144b190919063ffffffff16565b92505b8796506115e688846144b190919063ffffffff16565b925061163a83600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61168981838b6144f0565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d54898584604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1611776565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d5489600080604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a15b6000600d60008b815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d60008b815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008b8152602001908152602001600020600101819055506118208661476e565b611829876147e4565b6118328561485a565b505050505050505050565b600061184882614358565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561188357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118c357506118c281336141fa565b5b6118cc57600080fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611989826148d0565b9050919050565b6000600b54905090565b6119a43382614925565b6119ad57600080fd5b6119b6816149ba565b15611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615908602f913960400191505060405180910390fd5b611a15816148d0565b15611a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061598d6028913960400191505060405180910390fd5b611a768383836144f0565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aaa81614349565b611b1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b611b25816149ba565b611b97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000611ba282614a5f565b90506000819050600034905060003390506000611bbe86614358565b9050600080905060008090506000809050600080905086891115611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806158e16027913960400191505060405180910390fd5b88871115611cdd57611c99611c4b8a896144b190919063ffffffff16565b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600073ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611dca57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15611e8a57611dd88a61445e565b15611e5957889050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e85565b611e6d600a8a61448b90919063ffffffff16565b9150611e82828a6144b190919063ffffffff16565b92505b6120de565b611e9e60648a61448b90919063ffffffff16565b9350839150611eb684896144b190919063ffffffff16565b9750600073ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461203057611fa484600e6000600f60008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d84896144b190919063ffffffff16565b97505b83925061204684896144b190919063ffffffff16565b975061209a88600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600c60008c815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c60008c815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008c81526020019081526020016000206001018190555061218a85878c6144f0565b6121938261476e565b61219c836147e4565b6121a58161485a565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f093818ad4ae8e39f3d8eb90213f45dde273486ca619ccc887ae2c71dca97f8c68c8c604051808381526020018281526020019250505060405180910390a350505050505050505050565b61222781614349565b612299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b60006122a482614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b612350826149ba565b6123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000600c600084815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c600084815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c600084815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561251e57806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167f68668e20038684f5370d273dcbcfda23cca7fd1443999a51aabd7b97eff068f2836040518082815260200191505060405180910390a25050565b61257981614349565b6125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6125f4816148d0565b612666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b34600d600083815260200190815260200160002060010154106126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158846032913960400191505060405180910390fd5b34600d6000838152602001908152602001600020600201541115612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061585d6027913960400191505060405180910390fd5b6000600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060003390506000349050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461282057600d600085815260200190815260200160002060010154600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b81600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d6000868152602001908152602001600020600101819055507f2f2a2da0cd94316f3c2c6d23d063501f65cf91d4975931d95ac932ee88ba9aea84828486604051808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129a183838360405180602001604052806000815250613ae2565b505050565b60006129b182614349565b612a23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d6000838152602001908152602001600020600101549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a7182614349565b612ae3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612aec82614358565b9050919050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b8b5780601f10612b6057610100808354040283529160200191612b8b565b820191906000526020600020905b815481529060010190602001808311612b6e57829003601f168201915b5050505050905090565b6000612ba082614349565b612c12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612c1b826149ba565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5d57600080fd5b612ca4600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614af7565b9050919050565b612cb483614349565b612d26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612d2f836149ba565b15612da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b612dab836148d0565b15612e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000612e2984614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fe4576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b5b6000831161303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806158b6602b913960400191505060405180910390fd5b6001600d600086815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008681526020019081526020016000206001018190555082600d600086815260200190815260200160002060020181905550814201600d6000868152602001908152602001600020600301819055507f5819773cd5756d683b919e60b4b79368d9da2abe37cdd2d8ecb19eb3c1931c6a8484428542016040518085815260200184815260200183815260200182815260200194505050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061327e82614349565b6132f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6132f982614a5f565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615960602d913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135815780601f1061355657610100808354040283529160200191613581565b820191906000526020600020905b81548152906001019060200180831161356457829003601f168201915b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461364d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136ca57600080fd5b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6137d482614349565b613846576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b61384f826149ba565b156138c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6b656e206973206f6666657265642e00000000000000000000000000000081525060200191505060405180910390fd5b6138cb826148d0565b1561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20697320696e2061756374696f6e2e00000000000000000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661397f83614358565b73ffffffffffffffffffffffffffffffffffffffff1614613a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b613ade613ad783614358565b82846144f0565b5050565b613aed84848461199a565b613af984848484614b05565b613b0257600080fd5b50505050565b6060613b1382614349565b613b1c57600080fd5b6009613b2783614cee565b6040516020018083805460018160011615610100020316600290048015613b855780601f10613b63576101008083540402835291820191613b85565b820191906000526020600020905b815481529060010190602001808311613b71575b505082805190602001908083835b60208310613bb65780518252602082019150602081019050602083039250613b93565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b613bfb82614349565b613c6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b613c76826149ba565b15613ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b613cf2826148d0565b15613d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000613d7083614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b6001600c600085815260200190815260200160002060000160006101000a81548160ff02191690831515021790555080600c600085815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c600085815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613f6d57806003600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167fde2d7c25012eb9ea5d9068fde6060e7bee67f37bbd82c3233239a147d3ec4bc58484604051808381526020018281526020019250505060405180910390a2505050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111614065576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806159376029913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156140f0573d6000803e3d6000fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146141b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061429982614349565b61430b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b548211159050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614422576143ca8261445e565b156143f957601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b60006102d08211801561447357506105288211155b156144815760019050614486565b600090505b919050565b600080821161449957600080fd5b60008284816144a457fe5b0490508091505092915050565b6000828211156144c057600080fd5b600082840390508091505092915050565b6000808284019050838110156144e657600080fd5b8091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661451082614358565b73ffffffffffffffffffffffffffffffffffffffff161461453057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561456a57600080fd5b61457381614e25565b6145ba600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614ee3565b614601600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f06565b600073ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156146bc5781600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008111156147e157601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156147df573d6000803e3d6000fd5b505b50565b600081111561485757601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614855573d6000803e3d6000fd5b505b50565b60008111156148cd57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156148cb573d6000803e3d6000fd5b505b50565b600042600d60008481526020019081526020016000206003015410156148f95760009050614920565b600d600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008061493183614358565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806149a057508373ffffffffffffffffffffffffffffffffffffffff166149888461106c565b73ffffffffffffffffffffffffffffffffffffffff16145b806149b157506149b081856141fa565b5b91505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614a3357614a2c82614f1c565b9050614a5a565b600c600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614ad857614ad182614f6a565b9050614af2565b600c60008381526020019081526020016000206001015490505b919050565b600081600001549050919050565b6000614b268473ffffffffffffffffffffffffffffffffffffffff16615838565b614b335760019050614ce6565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c0e578082015181840152602081019050614bf3565b50505050905090810190601f168015614c3b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c5d57600080fd5b505af1158015614c71573d6000803e3d6000fd5b505050506040513d6020811015614c8757600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b606060008290506000811415614d3c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250915050614e20565b600081905060008090505b60008214614d69578080600101915050600a8281614d6157fe5b049150614d47565b6060816040519080825280601f01601f191660200182016040528015614d9e5781602001600182028038833980820191505090505b50905060006001830390505b60008514614e1757600a8581614dbc57fe5b0660300160f81b82828060019003935081518110614dd657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8581614e0f57fe5b049450614daa565b81955050505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614ee05760006004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b614efb600182600001546144b190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006102d08211614f305760009050614f65565b6102d082118015614f4357506105288211155b15614f515760019050614f65565b610528821115614f645760019050614f65565b5b919050565b60006102d08211614f7e5760009050615833565b6102d082118015614f9157506105288211155b15614fa557600f600a0a6064029050615833565b61052882118015614fb85750611f548211155b15614fcc57600f600a0a6022029050615833565b611f558210158015614fdf5750612aa882105b15614ff357600f600a0a6028029050615833565b612aa88210158015615006575061453882105b1561501a57600f600a0a602f029050615833565b614538821015801561502d575061598882105b1561504157600f600a0a6036029050615833565b6159888210158015615054575061731e82105b1561506857600f600a0a6043029050615833565b61731e821015801561507b575061767082105b1561508f57600f600a0a604a029050615833565b61767082101580156150a25750617ed682105b156150b657600f600a0a6050029050615833565b617ed682101580156150c9575061893082105b156150dd57600f600a0a6057029050615833565b61893082101580156150f05750618ac082105b1561510457600f600a0a605e029050615833565b618ac08210158015615117575061a58282105b1561512b57600f600a0a6064029050615833565b61a582821015801561513e575061b52282105b1561515257600f600a0a6078029050615833565b61b5228210158015615165575061da7082105b1561517957600f600a0a6086029050615833565b61da70821015801561518c575061e9ac82105b156151a057600f600a0a6093029050615833565b61e9ac82101580156151b3575061f69082105b156151c757600f600a0a60a7029050615833565b61f69082101580156151db57506201341682105b156151ef57600f600a0a60c8029050615833565b6201341682101580156152045750620134a282105b1561521857600f600a0a60ea029050615833565b620134a2821015801561522d575062014a1982105b1561524257600f600a0a61010b029050615833565b62014a198210158015615257575062014aa582105b1561526c57600f600a0a61012c029050615833565b62014aa58210158015615281575062014c6c82105b1561529657600f600a0a61014e029050615833565b62014c6c82101580156152ab575062014cad82105b156152c057600f600a0a610190029050615833565b62014cad82101580156152d5575062014cb782105b156152ea57600f600a0a6101b2029050615833565b62014cb782101580156152ff575062014cd582105b1561531457600f600a0a6101d3029050615833565b62014cd58210158015615329575062014cf382105b1561533e57600f600a0a610216029050615833565b62014cf38210158015615353575062014d4782105b1561536857600f600a0a610258029050615833565b62014d47821015801561537d575062014db382105b1561539257600f600a0a61029b029050615833565b62014db382101580156153a7575062014dc182105b156153bc57600f600a0a6102de029050615833565b62014dc182101580156153d1575062014dd182105b156153e657600f600a0a610320029050615833565b62014dd182101580156153fb575062014dd882105b1561541057600f600a0a610363029050615833565b62014dd88210158015615425575062014dd982105b1561543a57600f600a0a6103a6029050615833565b62014dd9821015801561544f575062014dfe82105b1561546457600f600a0a6103e8029050615833565b62014dfe8210158015615479575062014e0282105b1561548e57600f600a0a61042b029050615833565b62014e028214156154a957600f600a0a61046e029050615833565b62014e038214156154c457600f600a0a6104b0029050615833565b62014e0482101580156154d9575062014e0c82105b156154ee57600f600a0a610536029050615833565b62014e0c8210158015615503575062014e0e82105b1561551857600f600a0a6105fe029050615833565b62014e0e821015801561552d575062014e4382105b1561554257600f600a0a610683029050615833565b62014e438210158015615557575062014e5382105b1561556c57600f600a0a6107d0029050615833565b62014e538210158015615581575062014e5a82105b1561559657600f600a0a61091e029050615833565b62014e5a82101580156155ab575062014e5d82105b156155c057600f600a0a610a6b029050615833565b62014e5d82101580156155d5575062014eb782105b156155ea57600f600a0a610d06029050615833565b62014eb782141561560557600f600a0a610e53029050615833565b62014eb8821015801561561a575062014ebc82105b1561562f57600f600a0a610fa0029050615833565b62014ebc82141561564a57600f600a0a6111b6029050615833565b62014ebd821015801561565f575062014ec282105b1561567457600f600a0a61123b029050615833565b62014ec28210158015615689575062014ec482105b1561569e57600f600a0a611388029050615833565b62014ec48214156156b957600f600a0a6114d6029050615833565b62014ec58214156156d457600f600a0a611770029050615833565b62014ec682101580156156e9575062014f1082105b156156fe57600f600a0a611a0b029050615833565b62014f1082141561571957600f600a0a611ca6029050615833565b62014f11821015801561572e575062014f1c82105b1561574357600f600a0a612710029050615833565b62014f1c8210158015615758575062014f2382105b1561576d57600f600a0a613416029050615833565b62014f238210158015615782575062014f2682105b1561579757600f600a0a61411b029050615833565b62014f2682101580156157ac575062014f2b82105b156157c157600f600a0a614e20029050615833565b62014f2b82101580156157d6575062014f2e82105b156157eb57600f600a0a618236029050615833565b62014f2e8210158015615800575062014f2f82105b1561581657600f600a0a6201046b029050615833565b62014f2f82141561583257600f600a0a62051616029050615833565b5b919050565b600080823b905060008111915050919050565b60008183600001819055509291505056fe4269642068617320746f206265206174206c6561737420696e697450726963652076616c75652e4269642068617320746f20626520626967676572207468616e207468652063757272656e742068696768657374206269642e41756374696f6e20496e69742070726963652068617320746f20626520626967676572207468616e20302e5061796564207072696365206973206c6f776572207468616e206d61726b65742070726963652e546f6b656e206973206f666665726564206f6e206d61726b65742063616e2774206265207472616e7366657265642e53656e64657220686173206e6f206d61726b65742062616c616e636520746f2077697468647261772e4f6e6c79206e657720636f6e7472616374206f776e657220697320616c6c6f77656420746f206163636570742e546f6b656e20697320696e2061756374696f6e2063616e2774206265207472616e7366657265642ea265627a7a7231582015750935f59bf9a7781823efde62e214425dc257fb8701d412a4bf2cdc56454364736f6c634300050c00323234383564616261656265363232373663393736653535623239303433383739396632623630636462383435633530303533653263326265343366613666636568747470733a2f2f63727970746f7469747469657a2e636f6d2f6170692f746f6b656e696e666f2f

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063642ca8a511610118578063a22cb465116100a0578063c8ab84d81161006f578063c8ab84d814610db1578063d1290c1614610df6578063d3a417a214610e0d578063e985e9c514610e5e578063fd353c7b14610ee757610204565b8063a22cb46514610b33578063b77568fb14610b90578063b88d4fde14610beb578063c87b56dd14610cfd57610204565b806393ac3638116100e757806393ac36381461099b57806393adac6e146109ec578063942cb80014610a3b57806395d89b4114610a52578063a064101e14610ae257610204565b8063642ca8a5146108045780636ab0704c1461089457806370a08231146108e757806386e7e3761461094c57610204565b8063277da51c1161019b57806332cf83301161016a57806332cf83301461060357806342842e0e146106685780634ec7c45b146106e357806358c612cb146107325780636352211e1461078957610204565b8063277da51c1461051557806327b3f0d81461056c5780632d8645861461059a5780633175a0e9146105d557610204565b8063095ea7b3116101d7578063095ea7b3146103c157806316ed488e1461041c57806318160ddd1461046f57806323b872dd1461049a57610204565b806301ffc9a71461020957806306fdde031461027b578063081812fc1461030b57806308b3036314610386575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f62565b604051808215151515815260200191505060405180910390f35b34801561028757600080fd5b50610290610fca565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102d05780820151818401526020810190506102b5565b50505050905090810190601f1680156102fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031757600080fd5b506103446004803603602081101561032e57600080fd5b810190808035906020019092919050505061106c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039257600080fd5b506103bf600480360360208110156103a957600080fd5b81019080803590602001909291905050506110bb565b005b3480156103cd57600080fd5b5061041a600480360360408110156103e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061183d565b005b34801561042857600080fd5b506104556004803603602081101561043f57600080fd5b810190808035906020019092919050505061197e565b604051808215151515815260200191505060405180910390f35b34801561047b57600080fd5b50610484611990565b6040518082815260200191505060405180910390f35b3480156104a657600080fd5b50610513600480360360608110156104bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061199a565b005b34801561052157600080fd5b5061052a611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105986004803603602081101561058257600080fd5b8101908080359060200190929190505050611aa1565b005b3480156105a657600080fd5b506105d3600480360360208110156105bd57600080fd5b810190808035906020019092919050505061221e565b005b610601600480360360208110156105eb57600080fd5b8101908080359060200190929190505050612570565b005b34801561060f57600080fd5b506106526004803603602081101561062657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b34801561067457600080fd5b506106e16004803603606081101561068b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612986565b005b3480156106ef57600080fd5b5061071c6004803603602081101561070657600080fd5b81019080803590602001909291905050506129a6565b6040518082815260200191505060405180910390f35b34801561073e57600080fd5b50610747612a41565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079557600080fd5b506107c2600480360360208110156107ac57600080fd5b8101908080359060200190929190505050612a66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561081057600080fd5b50610819612af3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561085957808201518184015260208101905061083e565b50505050905090810190601f1680156108865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a057600080fd5b506108cd600480360360208110156108b757600080fd5b8101908080359060200190929190505050612b95565b604051808215151515815260200191505060405180910390f35b3480156108f357600080fd5b506109366004803603602081101561090a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c22565b6040518082815260200191505060405180910390f35b34801561095857600080fd5b506109996004803603606081101561096f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612cab565b005b3480156109a757600080fd5b506109ea600480360360208110156109be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061316d565b005b3480156109f857600080fd5b50610a2560048036036020811015610a0f57600080fd5b8101908080359060200190929190505050613273565b6040518082815260200191505060405180910390f35b348015610a4757600080fd5b50610a50613300565b005b348015610a5e57600080fd5b50610a676134e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aa7578082015181840152602081019050610a8c565b50505050905090810190601f168015610ad45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610aee57600080fd5b50610b3160048036036020811015610b0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358b565b005b348015610b3f57600080fd5b50610b8e60048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613691565b005b348015610b9c57600080fd5b50610be960048036036040811015610bb357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137cb565b005b348015610bf757600080fd5b50610cfb60048036036080811015610c0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c7557600080fd5b820183602082011115610c8757600080fd5b80359060200191846001830284011164010000000083111715610ca957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613ae2565b005b348015610d0957600080fd5b50610d3660048036036020811015610d2057600080fd5b8101908080359060200190929190505050613b08565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d76578082015181840152602081019050610d5b565b50505050905090810190601f168015610da35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dbd57600080fd5b50610df460048036036040811015610dd457600080fd5b810190808035906020019092919080359060200190929190505050613bf2565b005b348015610e0257600080fd5b50610e0b613fc8565b005b348015610e1957600080fd5b50610e5c60048036036020811015610e3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140f4565b005b348015610e6a57600080fd5b50610ecd60048036036040811015610e8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141fa565b604051808215151515815260200191505060405180910390f35b348015610ef357600080fd5b50610f2060048036036020811015610f0a57600080fd5b810190808035906020019092919050505061428e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060026000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b600061107782614349565b61108057600080fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110c481614349565b611136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600082815260200190815260200160002060000160009054906101000a900460ff166111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b42600d60008381526020019081526020016000206003015410611257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41756374696f6e206e6f742066696e6973686564207965742e0000000000000081525060200191505060405180910390fd5b60008090506000809050600080905060008090506000600d600087815260200190815260200160002060010154905060008190506000600d600089815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006112d189614358565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461170157600073ffffffffffffffffffffffffffffffffffffffff16600360008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561142a576113788961445e565b156113f957839450601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611425565b61140d600a8561448b90919063ffffffff16565b955061142286856144b190919063ffffffff16565b96505b61167e565b61143e60648561448b90919063ffffffff16565b975087955061145688846144b190919063ffffffff16565b9250600073ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d05761154488600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cd88846144b190919063ffffffff16565b92505b8796506115e688846144b190919063ffffffff16565b925061163a83600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61168981838b6144f0565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d54898584604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1611776565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d5489600080604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a15b6000600d60008b815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d60008b815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008b8152602001908152602001600020600101819055506118208661476e565b611829876147e4565b6118328561485a565b505050505050505050565b600061184882614358565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561188357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118c357506118c281336141fa565b5b6118cc57600080fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611989826148d0565b9050919050565b6000600b54905090565b6119a43382614925565b6119ad57600080fd5b6119b6816149ba565b15611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615908602f913960400191505060405180910390fd5b611a15816148d0565b15611a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061598d6028913960400191505060405180910390fd5b611a768383836144f0565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aaa81614349565b611b1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b611b25816149ba565b611b97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000611ba282614a5f565b90506000819050600034905060003390506000611bbe86614358565b9050600080905060008090506000809050600080905086891115611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806158e16027913960400191505060405180910390fd5b88871115611cdd57611c99611c4b8a896144b190919063ffffffff16565b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600073ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611dca57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15611e8a57611dd88a61445e565b15611e5957889050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e85565b611e6d600a8a61448b90919063ffffffff16565b9150611e82828a6144b190919063ffffffff16565b92505b6120de565b611e9e60648a61448b90919063ffffffff16565b9350839150611eb684896144b190919063ffffffff16565b9750600073ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461203057611fa484600e6000600f60008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d84896144b190919063ffffffff16565b97505b83925061204684896144b190919063ffffffff16565b975061209a88600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600c60008c815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c60008c815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008c81526020019081526020016000206001018190555061218a85878c6144f0565b6121938261476e565b61219c836147e4565b6121a58161485a565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f093818ad4ae8e39f3d8eb90213f45dde273486ca619ccc887ae2c71dca97f8c68c8c604051808381526020018281526020019250505060405180910390a350505050505050505050565b61222781614349565b612299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b60006122a482614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b612350826149ba565b6123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000600c600084815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c600084815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c600084815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561251e57806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167f68668e20038684f5370d273dcbcfda23cca7fd1443999a51aabd7b97eff068f2836040518082815260200191505060405180910390a25050565b61257981614349565b6125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6125f4816148d0565b612666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b34600d600083815260200190815260200160002060010154106126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158846032913960400191505060405180910390fd5b34600d6000838152602001908152602001600020600201541115612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061585d6027913960400191505060405180910390fd5b6000600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060003390506000349050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461282057600d600085815260200190815260200160002060010154600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b81600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d6000868152602001908152602001600020600101819055507f2f2a2da0cd94316f3c2c6d23d063501f65cf91d4975931d95ac932ee88ba9aea84828486604051808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129a183838360405180602001604052806000815250613ae2565b505050565b60006129b182614349565b612a23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d6000838152602001908152602001600020600101549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a7182614349565b612ae3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612aec82614358565b9050919050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b8b5780601f10612b6057610100808354040283529160200191612b8b565b820191906000526020600020905b815481529060010190602001808311612b6e57829003601f168201915b5050505050905090565b6000612ba082614349565b612c12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612c1b826149ba565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5d57600080fd5b612ca4600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614af7565b9050919050565b612cb483614349565b612d26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612d2f836149ba565b15612da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b612dab836148d0565b15612e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000612e2984614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fe4576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b5b6000831161303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806158b6602b913960400191505060405180910390fd5b6001600d600086815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008681526020019081526020016000206001018190555082600d600086815260200190815260200160002060020181905550814201600d6000868152602001908152602001600020600301819055507f5819773cd5756d683b919e60b4b79368d9da2abe37cdd2d8ecb19eb3c1931c6a8484428542016040518085815260200184815260200183815260200182815260200194505050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061327e82614349565b6132f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6132f982614a5f565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615960602d913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135815780601f1061355657610100808354040283529160200191613581565b820191906000526020600020905b81548152906001019060200180831161356457829003601f168201915b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461364d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136ca57600080fd5b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6137d482614349565b613846576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b61384f826149ba565b156138c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6b656e206973206f6666657265642e00000000000000000000000000000081525060200191505060405180910390fd5b6138cb826148d0565b1561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20697320696e2061756374696f6e2e00000000000000000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661397f83614358565b73ffffffffffffffffffffffffffffffffffffffff1614613a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b613ade613ad783614358565b82846144f0565b5050565b613aed84848461199a565b613af984848484614b05565b613b0257600080fd5b50505050565b6060613b1382614349565b613b1c57600080fd5b6009613b2783614cee565b6040516020018083805460018160011615610100020316600290048015613b855780601f10613b63576101008083540402835291820191613b85565b820191906000526020600020905b815481529060010190602001808311613b71575b505082805190602001908083835b60208310613bb65780518252602082019150602081019050602083039250613b93565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b613bfb82614349565b613c6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b613c76826149ba565b15613ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b613cf2826148d0565b15613d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000613d7083614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b6001600c600085815260200190815260200160002060000160006101000a81548160ff02191690831515021790555080600c600085815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c600085815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613f6d57806003600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167fde2d7c25012eb9ea5d9068fde6060e7bee67f37bbd82c3233239a147d3ec4bc58484604051808381526020018281526020019250505060405180910390a2505050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111614065576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806159376029913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156140f0573d6000803e3d6000fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146141b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061429982614349565b61430b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b548211159050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614422576143ca8261445e565b156143f957601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b60006102d08211801561447357506105288211155b156144815760019050614486565b600090505b919050565b600080821161449957600080fd5b60008284816144a457fe5b0490508091505092915050565b6000828211156144c057600080fd5b600082840390508091505092915050565b6000808284019050838110156144e657600080fd5b8091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661451082614358565b73ffffffffffffffffffffffffffffffffffffffff161461453057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561456a57600080fd5b61457381614e25565b6145ba600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614ee3565b614601600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f06565b600073ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156146bc5781600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008111156147e157601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156147df573d6000803e3d6000fd5b505b50565b600081111561485757601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614855573d6000803e3d6000fd5b505b50565b60008111156148cd57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156148cb573d6000803e3d6000fd5b505b50565b600042600d60008481526020019081526020016000206003015410156148f95760009050614920565b600d600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008061493183614358565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806149a057508373ffffffffffffffffffffffffffffffffffffffff166149888461106c565b73ffffffffffffffffffffffffffffffffffffffff16145b806149b157506149b081856141fa565b5b91505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614a3357614a2c82614f1c565b9050614a5a565b600c600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614ad857614ad182614f6a565b9050614af2565b600c60008381526020019081526020016000206001015490505b919050565b600081600001549050919050565b6000614b268473ffffffffffffffffffffffffffffffffffffffff16615838565b614b335760019050614ce6565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c0e578082015181840152602081019050614bf3565b50505050905090810190601f168015614c3b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c5d57600080fd5b505af1158015614c71573d6000803e3d6000fd5b505050506040513d6020811015614c8757600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b606060008290506000811415614d3c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250915050614e20565b600081905060008090505b60008214614d69578080600101915050600a8281614d6157fe5b049150614d47565b6060816040519080825280601f01601f191660200182016040528015614d9e5781602001600182028038833980820191505090505b50905060006001830390505b60008514614e1757600a8581614dbc57fe5b0660300160f81b82828060019003935081518110614dd657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8581614e0f57fe5b049450614daa565b81955050505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614ee05760006004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b614efb600182600001546144b190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006102d08211614f305760009050614f65565b6102d082118015614f4357506105288211155b15614f515760019050614f65565b610528821115614f645760019050614f65565b5b919050565b60006102d08211614f7e5760009050615833565b6102d082118015614f9157506105288211155b15614fa557600f600a0a6064029050615833565b61052882118015614fb85750611f548211155b15614fcc57600f600a0a6022029050615833565b611f558210158015614fdf5750612aa882105b15614ff357600f600a0a6028029050615833565b612aa88210158015615006575061453882105b1561501a57600f600a0a602f029050615833565b614538821015801561502d575061598882105b1561504157600f600a0a6036029050615833565b6159888210158015615054575061731e82105b1561506857600f600a0a6043029050615833565b61731e821015801561507b575061767082105b1561508f57600f600a0a604a029050615833565b61767082101580156150a25750617ed682105b156150b657600f600a0a6050029050615833565b617ed682101580156150c9575061893082105b156150dd57600f600a0a6057029050615833565b61893082101580156150f05750618ac082105b1561510457600f600a0a605e029050615833565b618ac08210158015615117575061a58282105b1561512b57600f600a0a6064029050615833565b61a582821015801561513e575061b52282105b1561515257600f600a0a6078029050615833565b61b5228210158015615165575061da7082105b1561517957600f600a0a6086029050615833565b61da70821015801561518c575061e9ac82105b156151a057600f600a0a6093029050615833565b61e9ac82101580156151b3575061f69082105b156151c757600f600a0a60a7029050615833565b61f69082101580156151db57506201341682105b156151ef57600f600a0a60c8029050615833565b6201341682101580156152045750620134a282105b1561521857600f600a0a60ea029050615833565b620134a2821015801561522d575062014a1982105b1561524257600f600a0a61010b029050615833565b62014a198210158015615257575062014aa582105b1561526c57600f600a0a61012c029050615833565b62014aa58210158015615281575062014c6c82105b1561529657600f600a0a61014e029050615833565b62014c6c82101580156152ab575062014cad82105b156152c057600f600a0a610190029050615833565b62014cad82101580156152d5575062014cb782105b156152ea57600f600a0a6101b2029050615833565b62014cb782101580156152ff575062014cd582105b1561531457600f600a0a6101d3029050615833565b62014cd58210158015615329575062014cf382105b1561533e57600f600a0a610216029050615833565b62014cf38210158015615353575062014d4782105b1561536857600f600a0a610258029050615833565b62014d47821015801561537d575062014db382105b1561539257600f600a0a61029b029050615833565b62014db382101580156153a7575062014dc182105b156153bc57600f600a0a6102de029050615833565b62014dc182101580156153d1575062014dd182105b156153e657600f600a0a610320029050615833565b62014dd182101580156153fb575062014dd882105b1561541057600f600a0a610363029050615833565b62014dd88210158015615425575062014dd982105b1561543a57600f600a0a6103a6029050615833565b62014dd9821015801561544f575062014dfe82105b1561546457600f600a0a6103e8029050615833565b62014dfe8210158015615479575062014e0282105b1561548e57600f600a0a61042b029050615833565b62014e028214156154a957600f600a0a61046e029050615833565b62014e038214156154c457600f600a0a6104b0029050615833565b62014e0482101580156154d9575062014e0c82105b156154ee57600f600a0a610536029050615833565b62014e0c8210158015615503575062014e0e82105b1561551857600f600a0a6105fe029050615833565b62014e0e821015801561552d575062014e4382105b1561554257600f600a0a610683029050615833565b62014e438210158015615557575062014e5382105b1561556c57600f600a0a6107d0029050615833565b62014e538210158015615581575062014e5a82105b1561559657600f600a0a61091e029050615833565b62014e5a82101580156155ab575062014e5d82105b156155c057600f600a0a610a6b029050615833565b62014e5d82101580156155d5575062014eb782105b156155ea57600f600a0a610d06029050615833565b62014eb782141561560557600f600a0a610e53029050615833565b62014eb8821015801561561a575062014ebc82105b1561562f57600f600a0a610fa0029050615833565b62014ebc82141561564a57600f600a0a6111b6029050615833565b62014ebd821015801561565f575062014ec282105b1561567457600f600a0a61123b029050615833565b62014ec28210158015615689575062014ec482105b1561569e57600f600a0a611388029050615833565b62014ec48214156156b957600f600a0a6114d6029050615833565b62014ec58214156156d457600f600a0a611770029050615833565b62014ec682101580156156e9575062014f1082105b156156fe57600f600a0a611a0b029050615833565b62014f1082141561571957600f600a0a611ca6029050615833565b62014f11821015801561572e575062014f1c82105b1561574357600f600a0a612710029050615833565b62014f1c8210158015615758575062014f2382105b1561576d57600f600a0a613416029050615833565b62014f238210158015615782575062014f2682105b1561579757600f600a0a61411b029050615833565b62014f2682101580156157ac575062014f2b82105b156157c157600f600a0a614e20029050615833565b62014f2b82101580156157d6575062014f2e82105b156157eb57600f600a0a618236029050615833565b62014f2e8210158015615800575062014f2f82105b1561581657600f600a0a6201046b029050615833565b62014f2f82141561583257600f600a0a62051616029050615833565b5b919050565b600080823b905060008111915050919050565b60008183600001819055509291505056fe4269642068617320746f206265206174206c6561737420696e697450726963652076616c75652e4269642068617320746f20626520626967676572207468616e207468652063757272656e742068696768657374206269642e41756374696f6e20496e69742070726963652068617320746f20626520626967676572207468616e20302e5061796564207072696365206973206c6f776572207468616e206d61726b65742070726963652e546f6b656e206973206f666665726564206f6e206d61726b65742063616e2774206265207472616e7366657265642e53656e64657220686173206e6f206d61726b65742062616c616e636520746f2077697468647261772e4f6e6c79206e657720636f6e7472616374206f776e657220697320616c6c6f77656420746f206163636570742e546f6b656e20697320696e2061756374696f6e2063616e2774206265207472616e7366657265642ea265627a7a7231582015750935f59bf9a7781823efde62e214425dc257fb8701d412a4bf2cdc56454364736f6c634300050c0032

Deployed Bytecode Sourcemap

5828:49013:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7971:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7971:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7971:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17028:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17028:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17028:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12203:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12203:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12203:154:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32003:3420;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32003:3420:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32003:3420:0;;;;;;;;;;;;;;;;;:::i;:::-;;11610:300;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11610:300:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11610:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36387:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36387:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36387:136:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18310:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18310:99:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13799:379;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13799:379:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13799:379:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6230:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6230:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25230:3238;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25230:3238:0;;;;;;;;;;;;;;;;;:::i;:::-;;24298:699;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24298:699:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24298:699:0;;;;;;;;;;;;;;;;;:::i;:::-;;30493:1050;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30493:1050:0;;;;;;;;;;;;;;;;;:::i;:::-;;37463:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37463:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37463:128:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14840:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14840:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14840:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35607:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35607:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35607:218:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6193:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6193:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11010:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11010:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11010:169:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17799:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17799:101:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17799:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22276:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22276:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22276:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10621:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10621:163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10621:163:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28936:1294;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28936:1294:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28936:1294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20663:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20663:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20663:122:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21309:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21309:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21309:213:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7109:305;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7109:305:0;;;:::i;:::-;;17228:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17228:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17228:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21013:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21013:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21013:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;12658:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12658:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12658:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37925:511;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37925:511:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37925:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15711:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15711:214:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;15711:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15711:214:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15711:214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15711:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15711:214:0;;;;;;;;;;;;;;;:::i;:::-;;17496:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17496:193:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17496:193:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17496:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23326:741;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23326:741:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23326:741:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37097:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37097:255:0;;;:::i;:::-;;6814:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6814:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6814:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13205:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13205:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13205:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36030:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36030:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36030:225:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7971:135;8041:4;8065:20;:33;8086:11;8065:33;;;;;;;;;;;;;;;;;;;;;;;;;;;8058:40;;7971:135;;;:::o;17028:85::-;17067:13;17100:5;17093:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17028:85;:::o;12203:154::-;12262:7;12290:16;12298:7;12290;:16::i;:::-;12282:25;;;;;;12325:15;:24;12341:7;12325:24;;;;;;;;;;;;;;;;;;;;;12318:31;;12203:154;;;:::o;32003:3420::-;32075:17;32083:8;32075:7;:17::i;:::-;32067:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32138:15;:25;32154:8;32138:25;;;;;;;;;;;:35;;;;;;;;;;;;32130:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32257:15;32221;:25;32237:8;32221:25;;;;;;;;;;;:33;;;:51;32213:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32315:17;32335:1;32315:21;;32347:19;32369:1;32347:23;;32381:19;32403:1;32381:23;;32415:21;32439:1;32415:25;;32451:14;32468:15;:25;32484:8;32468:25;;;;;;;;;;;:36;;;32451:53;;32515:19;32537:6;32515:28;;32554:14;32571:15;:25;32587:8;32571:25;;;;;;;;;;;:39;;;;;;;;;;;;32554:56;;32621:14;32638:18;32647:8;32638;:18::i;:::-;32621:35;;32744:1;32726:20;;:6;:20;;;32723:2275;;32798:1;32767:33;;:11;:21;32779:8;32767:21;;;;;;;;;;;;;;;;;;;;;:33;;;32764:1842;;;32858:25;32874:8;32858:15;:25::i;:::-;32855:592;;;33042:6;33026:22;;33153:20;;;;;;;;;;;33124:16;:26;33141:8;33124:26;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;32855:592;;;33313:14;33324:2;33313:6;:10;;:14;;;;:::i;:::-;33299:28;;33404:23;33415:11;33404:6;:10;;:23;;;;:::i;:::-;33390:37;;32855:592;32764:1842;;;33584:15;33595:3;33584:6;:10;;:15;;;;:::i;:::-;33572:27;;33714:9;33700:23;;33756:26;33772:9;33756:11;:15;;:26;;;;:::i;:::-;33742:40;;33896:1;33860:38;;:16;:26;33877:8;33860:26;;;;;;;;;;;;;;;;;;;;;:38;;;33857:374;;34016:58;34064:9;34016:15;:43;34032:16;:26;34049:8;34032:26;;;;;;;;;;;;;;;;;;;;;34016:43;;;;;;;;;;;;;;;;:47;;:58;;;;:::i;:::-;33970:15;:43;33986:16;:26;34003:8;33986:26;;;;;;;;;;;;;;;;;;;;;33970:43;;;;;;;;;;;;;;;:104;;;;34185:26;34201:9;34185:11;:15;;:26;;;;:::i;:::-;34171:40;;33857:374;34345:9;34331:23;;34387:26;34403:9;34387:11;:15;;:26;;;;:::i;:::-;34373:40;;34550;34578:11;34550:15;:23;34566:6;34550:23;;;;;;;;;;;;;;;;:27;;:40;;;;:::i;:::-;34524:15;:23;34540:6;34524:23;;;;;;;;;;;;;;;:66;;;;32764:1842;34692:39;34706:6;34714;34722:8;34692:13;:39::i;:::-;34794:46;34815:8;34825:6;34833;34794:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32723:2275;;;34941:45;34962:8;34972:1;34983;34941:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32723:2275;35074:5;35036:15;:25;35052:8;35036:25;;;;;;;;;;;:35;;;:43;;;;;;;;;;;;;;;;;;35140:1;35090:15;:25;35106:8;35090:25;;;;;;;;;;;:39;;;:52;;;;;;;;;;;;;;;;;;35192:1;35153:15;:25;35169:8;35153:25;;;;;;;;;;;:36;;:40;;;;35293:31;35312:11;35293:18;:31::i;:::-;35335;35354:11;35335:18;:31::i;:::-;35377:38;35401:13;35377:23;:38::i;:::-;32003:3420;;;;;;;;;:::o;11610:300::-;11674:13;11690:17;11699:7;11690:8;:17::i;:::-;11674:33;;11732:5;11726:11;;:2;:11;;;;11718:20;;;;;;11771:5;11757:19;;:10;:19;;;:58;;;;11780:35;11797:5;11804:10;11780:16;:35::i;:::-;11757:58;11749:67;;;;;;11856:2;11829:15;:24;11845:7;11829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11894:7;11890:2;11874:28;;11883:5;11874:28;;;;;;;;;;;;11610:300;;;:::o;36387:136::-;36454:12;36485:30;36506:8;36485:20;:30::i;:::-;36478:37;;36387:136;;;:::o;18310:99::-;18354:15;18389:12;;18382:19;;18310:99;:::o;13799:379::-;13890:39;13909:10;13921:7;13890:18;:39::i;:::-;13882:48;;;;;;13944:27;13963:7;13944:18;:27::i;:::-;13943:28;13935:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14043:29;14064:7;14043:20;:29::i;:::-;14042:30;14034:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14138:32;14152:4;14158:2;14162:7;14138:13;:32::i;:::-;13799:379;;;:::o;6230:33::-;;;;;;;;;;;;;:::o;25230:3238::-;25306:17;25314:8;25306:7;:17::i;:::-;25298:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25369:28;25388:8;25369:18;:28::i;:::-;25361:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25446:14;25464:35;25490:8;25464:25;:35::i;:::-;25446:53;;25510:19;25532:6;25510:28;;25549:14;25566:9;25549:26;;25586:14;25603:10;25586:27;;25624:14;25641:18;25650:8;25641;:18::i;:::-;25624:35;;25670:17;25690:1;25670:21;;25702:19;25724:1;25702:23;;25736:19;25758:1;25736:23;;25770:21;25794:1;25770:25;;25824:6;25816;:14;;25808:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25964:6;25957;:13;25954:117;;;26012:47;26040:18;26051:6;26040;:10;;:18;;;;:::i;:::-;26012:15;:23;26028:6;26012:23;;;;;;;;;;;;;;;;:27;;:47;;;;:::i;:::-;25986:15;:23;26002:6;25986:23;;;;;;;;;;;;;;;:73;;;;25954:117;26128:1;26097:33;;:11;:21;26109:8;26097:21;;;;;;;;;;;;;;;;;;;;;:33;;;26096:79;;;;26159:15;;;;;;;;;;;26136:38;;:11;:21;26148:8;26136:21;;;;;;;;;;;;;;;;;;;;;:38;;;26096:79;26093:1780;;;26225:25;26241:8;26225:15;:25::i;:::-;26222:543;;;26397:6;26381:22;;26500:20;;;;;;;;;;;26471:16;:26;26488:8;26471:26;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;26222:543;;;26643:14;26654:2;26643:6;:10;;:14;;;;:::i;:::-;26629:28;;26726:23;26737:11;26726:6;:10;;:23;;;;:::i;:::-;26712:37;;26222:543;26093:1780;;;26908:15;26919:3;26908:6;:10;;:15;;;;:::i;:::-;26896:27;;27026:9;27012:23;;27076:26;27092:9;27076:11;:15;;:26;;;;:::i;:::-;27062:40;;27204:1;27168:38;;:16;:26;27185:8;27168:26;;;;;;;;;;;;;;;;;;;;;:38;;;27165:365;;27331:58;27379:9;27331:15;:43;27347:16;:26;27364:8;27347:26;;;;;;;;;;;;;;;;;;;;;27331:43;;;;;;;;;;;;;;;;:47;;:58;;;;:::i;:::-;27285:15;:43;27301:16;:26;27318:8;27301:26;;;;;;;;;;;;;;;;;;;;;27285:43;;;;;;;;;;;;;;;:104;;;;27488:26;27504:9;27488:11;:15;;:26;;;;:::i;:::-;27474:40;;27165:365;27632:9;27618:23;;27670:26;27686:9;27670:11;:15;;:26;;;;:::i;:::-;27656:40;;27821;27849:11;27821:15;:23;27837:6;27821:23;;;;;;;;;;;;;;;;:27;;:40;;;;:::i;:::-;27795:15;:23;27811:6;27795:23;;;;;;;;;;;;;;;:66;;;;26093:1780;27949:5;27915:13;:23;27929:8;27915:23;;;;;;;;;;;:31;;;:39;;;;;;;;;;;;;;;;;;28005:1;27965:13;:23;27979:8;27965:23;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;28050:1;28018:13;:23;28032:8;28018:23;;;;;;;;;;;:29;;:33;;;;28097:39;28111:6;28119;28127:8;28097:13;:39::i;:::-;28237:31;28256:11;28237:18;:31::i;:::-;28279;28298:11;28279:18;:31::i;:::-;28321:38;28345:13;28321:23;:38::i;:::-;28435:6;28411:49;;28427:6;28411:49;;;28443:8;28453:6;28411:49;;;;;;;;;;;;;;;;;;;;;;;;25230:3238;;;;;;;;;;:::o;24298:699::-;24369:17;24377:8;24369:7;:17::i;:::-;24361:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24426:14;24443:18;24452:8;24443;:18::i;:::-;24426:35;;24490:10;24482:18;;:6;:18;;;24474:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24549:28;24568:8;24549:18;:28::i;:::-;24541:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24650:5;24616:13;:23;24630:8;24616:23;;;;;;;;;;;:31;;;:39;;;;;;;;;;;;;;;;;;24706:1;24666:13;:23;24680:8;24666:23;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;24751:1;24719:13;:23;24733:8;24719:23;;;;;;;;;;;:29;;:33;;;;24807:1;24776:33;;:11;:21;24788:8;24776:21;;;;;;;;;;;;;;;;;;;;;:33;;;24773:91;;;24846:6;24822:11;:21;24834:8;24822:21;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;24773:91;24972:6;24953:36;;;24980:8;24953:36;;;;;;;;;;;;;;;;;;24298:699;;:::o;30493:1050::-;30571:17;30579:8;30571:7;:17::i;:::-;30563:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30634:30;30655:8;30634:20;:30::i;:::-;30626:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30759:9;30720:15;:25;30736:8;30720:25;;;;;;;;;;;:36;;;:48;30712:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30882:9;30843:15;:25;30859:8;30843:25;;;;;;;;;;;:35;;;:48;;30835:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30948:17;30968:15;:25;30984:8;30968:25;;;;;;;;;;;:39;;;;;;;;;;;;30948:59;;31018:14;31035:10;31018:27;;31056:16;31075:9;31056:28;;31175:1;31156:21;;:9;:21;;;31153:118;;31223:15;:25;31239:8;31223:25;;;;;;;;;;;:36;;;31193:15;:26;31209:9;31193:26;;;;;;;;;;;;;;;;:66;;;;;;;;;;;31153:118;31356:6;31314:15;:25;31330:8;31314:25;;;;;;;;;;;:39;;;:48;;;;;;;;;;;;;;;;;;31412:8;31373:15;:25;31389:8;31373:25;;;;;;;;;;;:36;;:47;;;;31472:55;31489:8;31499;31509:6;31517:9;31472:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30493:1050;;;;:::o;37463:128::-;37525:16;37560:15;:23;37576:6;37560:23;;;;;;;;;;;;;;;;37553:30;;37463:128;;;:::o;14840:134::-;14927:39;14944:4;14950:2;14954:7;14927:39;;;;;;;;;;;;:16;:39::i;:::-;14840:134;;;:::o;35607:218::-;35682:14;35717:17;35725:8;35717:7;:17::i;:::-;35709:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35781:15;:25;35797:8;35781:25;;;;;;;;;;;:36;;;35774:43;;35607:218;;;:::o;6193:30::-;;;;;;;;;;;;;:::o;11010:169::-;11065:7;11093:16;11101:7;11093;:16::i;:::-;11085:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11154:17;11163:7;11154:8;:17::i;:::-;11147:24;;11010:169;;;:::o;17799:101::-;17848:13;17877:15;17870:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17799:101;:::o;22276:199::-;22342:4;22367:17;22375:8;22367:7;:17::i;:::-;22359:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22439:28;22458:8;22439:18;:28::i;:::-;22432:35;;22276:199;;;:::o;10621:163::-;10676:7;10721:1;10704:19;;:5;:19;;;;10696:28;;;;;;10742:34;:17;:24;10760:5;10742:24;;;;;;;;;;;;;;;:32;:34::i;:::-;10735:41;;10621:163;;;:::o;28936:1294::-;29045:17;29053:8;29045:7;:17::i;:::-;29037:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29109:28;29128:8;29109:18;:28::i;:::-;29108:29;29100:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29188:30;29209:8;29188:20;:30::i;:::-;29187:31;29179:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29265:14;29282:18;29291:8;29282;:18::i;:::-;29265:35;;29365:10;29357:18;;:6;:18;;;29354:304;;29458:15;;;;;;;;;;;29450:23;;:6;:23;;;29442:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29606:10;29588:28;;:16;;;;;;;;;;;:28;;;29580:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29354:304;29689:1;29678:10;:12;29670:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29831:4;29793:15;:25;29809:8;29793:25;;;;;;;;;;;:35;;;:42;;;;;;;;;;;;;;;;;;29896:1;29846:15;:25;29862:8;29846:25;;;;;;;;;;;:39;;;:52;;;;;;;;;;;;;;;;;;29948:1;29909:15;:25;29925:8;29909:25;;;;;;;;;;;:36;;:40;;;;29998:10;29960:15;:25;29976:8;29960:25;;;;;;;;;;;:35;;:48;;;;30071:9;30055:15;:25;30019:15;:25;30035:8;30019:25;;;;;;;;;;;:33;;:61;;;;30136:86;30157:8;30167:10;30179:15;30212:9;30196:15;:25;30136:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28936:1294;;;;:::o;20663:122::-;6448:15;;;;;;;;;;;6434:29;;:10;:29;;;6426:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20762:15;20743:16;;:34;;;;;;;;;;;;;;;;;;20663:122;:::o;21309:213::-;21382:14;21417:17;21425:8;21417:7;:17::i;:::-;21409:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21479:35;21505:8;21479:25;:35::i;:::-;21472:42;;21309:213;;;:::o;7109:305::-;7176:18;;;;;;;;;;;7162:32;;:10;:32;;;7154:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7298:18;;;;;;;;;;;7260:57;;7281:15;;;;;;;;;;;7260:57;;;;;;;;;;;;7346:18;;;;;;;;;;;7328:15;;:36;;;;;;;;;;;;;;;;;;7404:1;7375:18;;:31;;;;;;;;;;;;;;;;;;7109:305::o;17228:89::-;17269:13;17302:7;17295:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17228:89;:::o;21013:111::-;6448:15;;;;;;;;;;;6434:29;;:10;:29;;;6426:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21104:12;21088:13;;:28;;;;;;;;;;;;;;;;;;21013:111;:::o;12658:217::-;12744:10;12738:16;;:2;:16;;;;12730:25;;;;;;12803:8;12766:18;:30;12785:10;12766:30;;;;;;;;;;;;;;;:34;12797:2;12766:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;12854:2;12827:40;;12842:10;12827:40;;;12858:8;12827:40;;;;;;;;;;;;;;;;;;;;;;12658:217;;:::o;37925:511::-;38006:17;38014:8;38006:7;:17::i;:::-;37998:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38070:28;38089:8;38070:18;:28::i;:::-;38069:29;38061:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38140:30;38161:8;38140:20;:30::i;:::-;38139:31;38131:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38236:15;;;;;;;;;;;38216:35;;:18;38225:8;38216;:18::i;:::-;:35;;;38208:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38327:10;38312:25;;:13;;;;;;;;;;;:25;;;38304:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38380:48;38394:18;38403:8;38394;:18::i;:::-;38414:3;38419:8;38380:13;:48::i;:::-;37925:511;;:::o;15711:214::-;15818:31;15831:4;15837:2;15841:7;15818:12;:31::i;:::-;15868:48;15891:4;15897:2;15901:7;15910:5;15868:22;:48::i;:::-;15860:57;;;;;;15711:214;;;;:::o;17496:193::-;17554:13;17588:16;17596:7;17588;:16::i;:::-;17580:25;;;;;;17647:13;17662:17;17671:7;17662:8;:17::i;:::-;17630:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17630:50:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17630:50:0;;;17616:65;;17496:193;;;:::o;23326:741::-;23413:17;23421:8;23413:7;:17::i;:::-;23405:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23477:28;23496:8;23477:18;:28::i;:::-;23476:29;23468:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23556:30;23577:8;23556:20;:30::i;:::-;23555:31;23547:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23633:14;23650:18;23659:8;23650;:18::i;:::-;23633:35;;23697:10;23689:18;;:6;:18;;;23681:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23784:4;23750:13;:23;23764:8;23750:23;;;;;;;;;;;:31;;;:38;;;;;;;;;;;;;;;;;;23831:6;23799:13;:23;23813:8;23799:23;;;;;;;;;;;:29;;;:38;;;;;;;;;;;;;;;;;;23880:6;23848:13;:23;23862:8;23848:23;;;;;;;;;;;:29;;:38;;;;23941:1;23910:33;;:11;:21;23922:8;23910:21;;;;;;;;;;;;;;;;;;;;;:33;;;23907:91;;;23980:6;23956:11;:21;23968:8;23956:21;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;23907:91;24034:6;24015:44;;;24042:8;24052:6;24015:44;;;;;;;;;;;;;;;;;;;;;;;;23326:741;;;:::o;37097:255::-;37148:11;37162:15;:27;37178:10;37162:27;;;;;;;;;;;;;;;;37148:41;;37215:1;37208:6;:8;37200:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37305:1;37275:15;:27;37291:10;37275:27;;;;;;;;;;;;;;;:31;;;;37317:10;:19;;:27;37337:6;37317:27;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37317:27:0;37097:255;:::o;6814:110::-;6448:15;;;;;;;;;;;6434:29;;:10;:29;;;6426:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6908:8;6887:18;;:29;;;;;;;;;;;;;;;;;;6814:110;:::o;13205:147::-;13285:4;13309:18;:25;13328:5;13309:25;;;;;;;;;;;;;;;:35;13335:8;13309:35;;;;;;;;;;;;;;;;;;;;;;;;;13302:42;;13205:147;;;;:::o;36030:225::-;36108:15;36144:17;36152:8;36144:7;:17::i;:::-;36136:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36208:15;:25;36224:8;36208:25;;;;;;;;;;;:39;;;;;;;;;;;;36201:46;;36030:225;;;:::o;41028:178::-;41085:20;41185:12;;41173:8;:24;;41165:33;;41028:178;;;:::o;39944:550::-;40003:14;40074:1;40043:33;;:11;:21;40055:8;40043:21;;;;;;;;;;;;;;;;;;;;;:33;;;40040:366;;;40181:25;40197:8;40181:15;:25::i;:::-;40178:140;;;40282:20;;;;;;;;;;;40275:27;;;;40178:140;40379:15;;;;;;;;;;;40372:22;;;;40040:366;40465:11;:21;40477:8;40465:21;;;;;;;;;;;;;;;;;;;;;40458:28;;39944:550;;;;:::o;40628:196::-;40694:15;40734:3;40725:8;:12;:30;;;;;40751:4;40741:8;:14;;40725:30;40722:72;;;40778:4;40771:11;;;;40722:72;40811:5;40804:12;;40628:196;;;;:::o;810:303::-;868:7;967:1;963;:5;955:14;;;;;;980:9;996:1;992;:5;;;;;;980:17;;1104:1;1097:8;;;810:303;;;;:::o;1251:150::-;1309:7;1342:1;1337;:6;;1329:15;;;;;;1355:9;1371:1;1367;:5;1355:17;;1392:1;1385:8;;;1251:150;;;;:::o;1489:::-;1547:7;1567:9;1583:1;1579;:5;1567:17;;1608:1;1603;:6;;1595:15;;;;;;1630:1;1623:8;;;1489:150;;;;:::o;42212:462::-;42327:4;42306:25;;:17;42315:7;42306:8;:17::i;:::-;:25;;;42298:34;;;;;;42365:1;42351:16;;:2;:16;;;;42343:25;;;;;;42381:23;42396:7;42381:14;:23::i;:::-;42417:35;:17;:23;42435:4;42417:23;;;;;;;;;;;;;;;:33;:35::i;:::-;42463:33;:17;:21;42481:2;42463:21;;;;;;;;;;;;;;;:31;:33::i;:::-;42541:1;42506:37;;:16;:25;42523:7;42506:25;;;;;;;;;;;;;;;;;;;;;:37;;;42503:83;;;42578:2;42550:16;:25;42567:7;42550:25;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;42503:83;42619:2;42596:11;:20;42608:7;42596:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;42658:7;42654:2;42639:27;;42648:4;42639:27;;;;;;;;;;;;42212:462;;;:::o;38843:148::-;38921:1;38912:8;:10;38909:75;;;38938:15;;;;;;;;;;;:24;;:34;38963:8;38938:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38938:34:0;38909:75;38843:148;:::o;39401:147::-;39479:1;39470:8;:10;39467:74;;;39496:14;;;;;;;;;;;:23;;:33;39520:8;39496:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39496:33:0;39467:74;39401:147;:::o;39120:158::-;39203:1;39194:8;:10;39191:80;;;39220:20;;;;;;;;;;;:29;;:39;39250:8;39220:39;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39220:39:0;39191:80;39120:158;:::o;36724:247::-;36793:12;36856:15;36820;:25;36836:8;36820:25;;;;;;;;;;;:33;;;:51;36817:94;;;36894:5;36887:12;;;;36817:94;36928:15;:25;36944:8;36928:25;;;;;;;;;;;:35;;;;;;;;;;;;36921:42;;36724:247;;;;:::o;41576:250::-;41661:4;41678:13;41694:17;41703:7;41694:8;:17::i;:::-;41678:33;;41741:5;41730:16;;:7;:16;;;:51;;;;41774:7;41750:31;;:20;41762:7;41750:11;:20::i;:::-;:31;;;41730:51;:87;;;;41785:32;41802:5;41809:7;41785:16;:32::i;:::-;41730:87;41722:96;;;41576:250;;;;:::o;22796:241::-;22864:4;22917:1;22886:33;;:11;:21;22898:8;22886:21;;;;;;;;;;;;;;;;;;;;;:33;;;22883:96;;;22942:25;22958:8;22942:15;:25::i;:::-;22935:32;;;;22883:96;22998:13;:23;23012:8;22998:23;;;;;;;;;;;:31;;;;;;;;;;;;22991:38;;22796:241;;;;:::o;21852:252::-;21927:14;21988:1;21957:33;;:11;:21;21969:8;21957:21;;;;;;;;;;;;;;;;;;;;;:33;;;21954:96;;;22013:25;22029:8;22013:15;:25::i;:::-;22006:32;;;;21954:96;22067:13;:23;22081:8;22067:23;;;;;;;;;;;:29;;;22060:36;;21852:252;;;;:::o;4042:114::-;4107:7;4134;:14;;;4127:21;;4042:114;;;:::o;43280:356::-;43402:4;43429:15;:2;:13;;;:15::i;:::-;43424:60;;43468:4;43461:11;;;;43424:60;43496:13;43528:2;43512:36;;;43549:10;43561:4;43567:7;43576:5;43512:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43512:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43512:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43512:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43512:70:0;;;;;;;;;;;;;;;;43496:86;;8665:10;43611:16;;43601:26;;;:6;:26;;;;43593:35;;;43280:356;;;;;;;:::o;44081:548::-;44133:13;44158;44174:1;44158:17;;44201:1;44192:5;:10;44188:53;;;44219:10;;;;;;;;;;;;;;;;;;;;;;44188:53;44253:9;44265:5;44253:17;;44281:14;44298:1;44281:18;;44312:71;44324:1;44319;:6;44312:71;;44341:8;;;;;;;44369:2;44364:7;;;;;;;;;44312:71;;;44395:17;44425:6;44415:17;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;44415:17:0;;;;44395:37;;44443:9;44464:1;44455:6;:10;44443:22;;44478:112;44494:1;44485:5;:10;44478:112;;44548:2;44540:5;:10;;;;;;44535:2;:15;44524:28;;44512:4;44517:3;;;;;;;44512:9;;;;;;;;;;;:40;;;;;;;;;;;44576:2;44567:11;;;;;;;;;44478:112;;;44616:4;44602:19;;;;;;;44081:548;;;;:::o;43804:175::-;43904:1;43868:38;;:15;:24;43884:7;43868:24;;;;;;;;;;;;;;;;;;;;;:38;;;43864:108;;43958:1;43923:15;:24;43939:7;43923:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43864:108;43804:175;:::o;4396:110::-;4477:21;4496:1;4477:7;:14;;;:18;;:21;;;;:::i;:::-;4460:7;:14;;:38;;;;4396:110;:::o;4297:91::-;4379:1;4361:7;:14;;;:19;;;;;;;;;;;4297:91;:::o;52735:423::-;52801:16;52843:3;52833:8;:13;52830:102;;52915:5;52908:12;;;;52830:102;52954:3;52945:8;:12;:30;;;;;52971:4;52961:8;:14;;52945:30;52942:111;;;53037:4;53030:11;;;;52942:111;53077:4;53068:8;:13;53065:86;;;53135:4;53128:11;;;;53065:86;52735:423;;;;:::o;44847:7714::-;44913:14;44961:3;44951:8;:13;44948:99;;45034:1;45027:8;;;;44948:99;45069:3;45060:8;:12;:30;;;;;45086:4;45076:8;:14;;45060:30;45057:132;;;45174:2;45167;45159:17;45152:3;:25;45145:32;;;;45057:132;45213:4;45204:8;:13;:31;;;;;45231:4;45221:8;:14;;45204:31;45201:117;;;45303:2;45296;45288:17;45282:2;:24;45275:31;;;;45201:117;45343:4;45333:8;:14;;:32;;;;;45360:5;45351:8;:14;45333:32;45330:118;;;45433:2;45426;45418:17;45412:2;:24;45405:31;;;;45330:118;45473:5;45463:8;:15;;:33;;;;;45491:5;45482:8;:14;45463:33;45460:119;;;45564:2;45557;45549:17;45543:2;:24;45536:31;;;;45460:119;45604:5;45594:8;:15;;:33;;;;;45622:5;45613:8;:14;45594:33;45591:118;;;45694:2;45687;45679:17;45674:2;:23;45667:30;;;;45591:118;45734:5;45724:8;:15;;:33;;;;;45752:5;45743:8;:14;45724:33;45721:120;;;45826:2;45819;45811:17;45805:2;:24;45798:31;;;;45721:120;45866:5;45856:8;:15;;:33;;;;;45884:5;45875:8;:14;45856:33;45853:120;;;45958:2;45951;45943:17;45937:2;:24;45930:31;;;;45853:120;45998:5;45988:8;:15;;:33;;;;;46016:5;46007:8;:14;45988:33;45985:120;;;46090:2;46083;46075:17;46069:2;:24;46062:31;;;;45985:120;46130:5;46120:8;:15;;:33;;;;;46148:5;46139:8;:14;46120:33;46117:120;;;46222:2;46215;46207:17;46201:2;:24;46194:31;;;;46117:120;46262:5;46252:8;:15;;:33;;;;;46280:5;46271:8;:14;46252:33;46249:120;;;46354:2;46347;46339:17;46333:2;:24;46326:31;;;;46249:120;46394:5;46384:8;:15;;:33;;;;;46412:5;46403:8;:14;46384:33;46381:121;;;46487:2;46480;46472:17;46465:3;:25;46458:32;;;;46381:121;46527:5;46517:8;:15;;:33;;;;;46545:5;46536:8;:14;46517:33;46514:121;;;46620:2;46613;46605:17;46598:3;:25;46591:32;;;;46514:121;46660:5;46650:8;:15;;:33;;;;;46678:5;46669:8;:14;46650:33;46647:121;;;46753:2;46746;46738:17;46731:3;:25;46724:32;;;;46647:121;46793:5;46783:8;:15;;:33;;;;;46811:5;46802:8;:14;46783:33;46780:121;;;46886:2;46879;46871:17;46864:3;:25;46857:32;;;;46780:121;46926:5;46916:8;:15;;:33;;;;;46944:5;46935:8;:14;46916:33;46913:121;;;47019:2;47012;47004:17;46997:3;:25;46990:32;;;;46913:121;47059:5;47049:8;:15;;:33;;;;;47077:5;47068:8;:14;47049:33;47046:121;;;47152:2;47145;47137:17;47130:3;:25;47123:32;;;;47046:121;47192:5;47182:8;:15;;:33;;;;;47210:5;47201:8;:14;47182:33;47179:121;;;47285:2;47278;47270:17;47263:3;:25;47256:32;;;;47179:121;47325:5;47315:8;:15;;:33;;;;;47343:5;47334:8;:14;47315:33;47312:121;;;47418:2;47411;47403:17;47396:3;:25;47389:32;;;;47312:121;47458:5;47448:8;:15;;:33;;;;;47476:5;47467:8;:14;47448:33;47445:121;;;47551:2;47544;47536:17;47529:3;:25;47522:32;;;;47445:121;47591:5;47581:8;:15;;:33;;;;;47609:5;47600:8;:14;47581:33;47578:121;;;47684:2;47677;47669:17;47662:3;:25;47655:32;;;;47578:121;47724:5;47714:8;:15;;:33;;;;;47742:5;47733:8;:14;47714:33;47711:121;;;47817:2;47810;47802:17;47795:3;:25;47788:32;;;;47711:121;47857:5;47847:8;:15;;:33;;;;;47875:5;47866:8;:14;47847:33;47844:121;;;47950:2;47943;47935:17;47928:3;:25;47921:32;;;;47844:121;47990:5;47980:8;:15;;:33;;;;;48008:5;47999:8;:14;47980:33;47977:121;;;48083:2;48076;48068:17;48061:3;:25;48054:32;;;;47977:121;48123:5;48113:8;:15;;:33;;;;;48141:5;48132:8;:14;48113:33;48110:121;;;48216:2;48209;48201:17;48194:3;:25;48187:32;;;;48110:121;48256:5;48246:8;:15;;:33;;;;;48274:5;48265:8;:14;48246:33;48243:121;;;48349:2;48342;48334:17;48327:3;:25;48320:32;;;;48243:121;48389:5;48379:8;:15;;:33;;;;;48407:5;48398:8;:14;48379:33;48376:122;;;48483:2;48476;48468:17;48461:3;:25;48454:32;;;;48376:122;48523:5;48513:8;:15;;:33;;;;;48541:5;48532:8;:14;48513:33;48510:122;;;48617:2;48610;48602:17;48595:3;:25;48588:32;;;;48510:122;48657:5;48647:8;:15;;:33;;;;;48675:5;48666:8;:14;48647:33;48644:122;;;48751:2;48744;48736:17;48729:3;:25;48722:32;;;;48644:122;48791:5;48781:8;:15;;:33;;;;;48809:5;48800:8;:14;48781:33;48778:122;;;48885:2;48878;48870:17;48863:3;:25;48856:32;;;;48778:122;48925:5;48915:8;:15;;:33;;;;;48943:5;48934:8;:14;48915:33;48912:122;;;49019:2;49012;49004:17;48997:3;:25;48990:32;;;;48912:122;49059:5;49049:8;:15;;:33;;;;;49077:5;49068:8;:14;49049:33;49046:123;;;49154:2;49147;49139:17;49131:4;:26;49124:33;;;;49046:123;49194:5;49184:8;:15;;:33;;;;;49212:5;49203:8;:14;49184:33;49181:123;;;49289:2;49282;49274:17;49266:4;:26;49259:33;;;;49181:123;49329:5;49319:8;:15;49316:105;;;49406:2;49399;49391:17;49383:4;:26;49376:33;;;;49316:105;49446:5;49436:8;:15;49433:105;;;49523:2;49516;49508:17;49500:4;:26;49493:33;;;;49433:105;49563:5;49553:8;:15;;:33;;;;;49581:5;49572:8;:14;49553:33;49550:123;;;49658:2;49651;49643:17;49635:4;:26;49628:33;;;;49550:123;49698:5;49688:8;:15;;:33;;;;;49716:5;49707:8;:14;49688:33;49685:123;;;49793:2;49786;49778:17;49770:4;:26;49763:33;;;;49685:123;49833:5;49823:8;:15;;:33;;;;;49851:5;49842:8;:14;49823:33;49820:123;;;49928:2;49921;49913:17;49905:4;:26;49898:33;;;;49820:123;49968:5;49958:8;:15;;:33;;;;;49986:5;49977:8;:14;49958:33;49955:123;;;50063:2;50056;50048:17;50040:4;:26;50033:33;;;;49955:123;50103:5;50093:8;:15;;:33;;;;;50121:5;50112:8;:14;50093:33;50090:123;;;50198:2;50191;50183:17;50175:4;:26;50168:33;;;;50090:123;50238:5;50228:8;:15;;:33;;;;;50256:5;50247:8;:14;50228:33;50225:123;;;50333:2;50326;50318:17;50310:4;:26;50303:33;;;;50225:123;50373:5;50363:8;:15;;:33;;;;;50391:5;50382:8;:14;50363:33;50360:123;;;50468:2;50461;50453:17;50445:4;:26;50438:33;;;;50360:123;50508:5;50498:8;:15;50495:105;;;50585:2;50578;50570:17;50562:4;:26;50555:33;;;;50495:105;50625:5;50615:8;:15;;:33;;;;;50643:5;50634:8;:14;50615:33;50612:123;;;50720:2;50713;50705:17;50697:4;:26;50690:33;;;;50612:123;50760:5;50750:8;:15;50747:105;;;50837:2;50830;50822:17;50814:4;:26;50807:33;;;;50747:105;50877:5;50867:8;:15;;:33;;;;;50895:5;50886:8;:14;50867:33;50864:123;;;50972:2;50965;50957:17;50949:4;:26;50942:33;;;;50864:123;51012:5;51002:8;:15;;:33;;;;;51030:5;51021:8;:14;51002:33;50999:123;;;51107:2;51100;51092:17;51084:4;:26;51077:33;;;;50999:123;51147:5;51137:8;:15;51134:105;;;51224:2;51217;51209:17;51201:4;:26;51194:33;;;;51134:105;51264:5;51254:8;:15;51251:105;;;51341:2;51334;51326:17;51318:4;:26;51311:33;;;;51251:105;51381:5;51371:8;:15;;:33;;;;;51399:5;51390:8;:14;51371:33;51368:124;;;51477:2;51470;51462:17;51454:4;:26;51447:33;;;;51368:124;51517:5;51507:8;:15;51504:106;;;51595:2;51588;51580:17;51572:4;:26;51565:33;;;;51504:106;51635:5;51625:8;:15;;:33;;;;;51653:5;51644:8;:14;51625:33;51622:125;;;51732:2;51725;51717:17;51708:5;:27;51701:34;;;;51622:125;51772:5;51762:8;:15;;:33;;;;;51790:5;51781:8;:14;51762:33;51759:125;;;51869:2;51862;51854:17;51845:5;:27;51838:34;;;;51759:125;51909:5;51899:8;:15;;:33;;;;;51927:5;51918:8;:14;51899:33;51896:125;;;52006:2;51999;51991:17;51982:5;:27;51975:34;;;;51896:125;52046:5;52036:8;:15;;:33;;;;;52064:5;52055:8;:14;52036:33;52033:125;;;52143:2;52136;52128:17;52119:5;:27;52112:34;;;;52033:125;52183:5;52173:8;:15;;:33;;;;;52201:5;52192:8;:14;52173:33;52170:125;;;52280:2;52273;52265:17;52256:5;:27;52249:34;;;;52170:125;52320:5;52310:8;:15;;:33;;;;;52338:5;52329:8;:14;52310:33;52307:126;;;52418:2;52411;52403:17;52394:5;:27;52387:34;;;;52307:126;52458:5;52448:8;:15;52445:109;;;52539:2;52532;52524:17;52514:6;:28;52507:35;;;;52445:109;44847:7714;;;;:::o;2382:627::-;2442:4;2459:12;2966:7;2954:20;2946:28;;3000:1;2993:4;:8;2986:15;;;2382:627;;;:::o;4168:121::-;4239:7;4276:5;4259:7;:14;;:22;;;;4168:121;;;;:::o

Swarm Source

bzzr://15750935f59bf9a7781823efde62e214425dc257fb8701d412a4bf2cdc564543
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.