ETH Price: $3,241.42 (+2.79%)
Gas: 2 Gwei

Contract

0xf34f03BC32F1D908327646DD0D5939Ccb4cD3Bc7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Proxy Initialize155981112022-09-23 19:23:35671 days ago1663961015IN
0xf34f03BC...cb4cD3Bc7
0 ETH0.000616358.35486644
0x60c06040155981082022-09-23 19:22:59671 days ago1663960979IN
 Create: GangsterAllStarEvolutionV2_1
0 ETH0.02291458.28394663

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GangsterAllStarEvolutionV2_1

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-23
*/

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

abstract contract Ownable {
    address public owner; 
    /// @dev This emits when ownership of a contract changes.
    event OwnershipTransferred(address indexed _previousOwner, address indexed _newOwner);
    // constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; }
    function transferOwnership(address new_) external onlyOwner { 
        address oldOwner = owner;
        owner = new_;
        emit OwnershipTransferred(oldOwner, new_);
    }
    function mockTransferOwnership(address old_, address new_) external onlyOwner {
        // only a mock transfer event
        emit OwnershipTransferred(old_, new_);
    }
}

abstract contract ERC721G {

    // Standard ERC721 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);

    // // ERC721G Events
    // event TokenStaked(uint256 indexed tokenId_, address indexed staker,
    //     uint256 timestamp_);
    // event TokenUnstaked(uint256 indexed tokenid_, address indexed staker,
    //     uint256 timestamp_, uint256 totalTimeStaked_);
    
    // Standard ERC721 Global Variables
    string public name; // Token Name
    string public symbol; // Token Symbol

    // ERC721G Global Variables
    uint256 public tokenIndex; // The running index for the next TokenId
    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable
    uint256 public immutable startTokenId; // Bytes Storage for the starting TokenId
    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable
    uint256 public immutable maxBatchSize;

    // Staking Address supports Proxy
    // address public immutable stakingAddress = address(this); // The staking address
    function stakingAddress() public view returns (address) {
        return address(this);
    }

    /** @dev instructions:
     *  name_ sets the token name
     *  symbol_ sets the token symbol
     *  startId_ sets the starting tokenId (recommended 0-1)
     *  maxBatchSize_ sets the maximum batch size for each mint (recommended 5-20)
     */
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor(
    string memory name_, string memory symbol_, 
    uint256 startId_, uint256 maxBatchSize_) {
        name = name_;
        symbol = symbol_;
        tokenIndex = startId_;
        startTokenId = startId_;
        maxBatchSize = maxBatchSize_;
    }

    // ERC721G Structs
    struct OwnerStruct {
        address owner; // stores owner address for OwnerOf
        uint32 lastTransfer; // stores the last transfer of the token
        uint32 stakeTimestamp; // stores the stake timestamp in _setStakeTimestamp()
        uint32 totalTimeStaked; // stores the total time staked accumulated
    }

    struct BalanceStruct {
        uint32 balance; // stores the token balance of the address
        uint32 mintedAmount; // stores the minted amount of the address on mint
        // 24 Free Bytes
    }

    // ERC721G Mappings
    mapping(uint256 => OwnerStruct) public _tokenData; // ownerOf replacement
    mapping(address => BalanceStruct) public _balanceData; // balanceOf replacement
    mapping(uint256 => OwnerStruct) public mintIndex; // uninitialized ownerOf pointer

    // ERC721 Mappings
    mapping(uint256 => address) public getApproved; // for single token approvals
    mapping(address => mapping(address => bool)) public isApprovedForAll; // approveall

    // TIME by 0xInuarashi 
    function _getBlockTimestampCompressed() public virtual view returns (uint32) {
        return uint32(block.timestamp / 10);
    }
    function _compressTimestamp(uint256 timestamp_) public virtual view
    returns (uint32) {
        return uint32(timestamp_ / 10);
    }
    function _expandTimestamp(uint32 timestamp_) public virtual view
    returns (uint256) {
        return uint256(timestamp_) * 10;
    }
    
    function getLastTransfer(uint256 tokenId_) public virtual view
    returns (uint256) {
        return _expandTimestamp(_getTokenDataOf(tokenId_).lastTransfer);
    }
    function getStakeTimestamp(uint256 tokenId_) public virtual view
    returns (uint256) {
        return _expandTimestamp(_getTokenDataOf(tokenId_).stakeTimestamp);
    }
    function getTotalTimeStaked(uint256 tokenId_) public virtual view
    returns (uint256) {
        return _expandTimestamp(_getTokenDataOf(tokenId_).totalTimeStaked);
    }

    ///// ERC721G: ERC721-Like Simple Read Outputs /////
    function totalSupply() public virtual view returns (uint256) {
        return tokenIndex - startTokenId;
    }
    function balanceOf(address address_) public virtual view returns (uint256) {
        return _balanceData[address_].balance;
    }

    ///// ERC721G: Range-Based Logic /////
    
    /** @dev explanation:
     *  _getTokenDataOf() finds and returns either the (and in priority)
     *      - the initialized storage pointer from _tokenData
     *      - the uninitialized storage pointer from mintIndex
     * 
     *  if the _tokenData storage slot is populated, return it
     *  otherwise, do a reverse-lookup to find the uninitialized pointer from mintIndex
     */
    function _getTokenDataOf(uint256 tokenId_) public virtual view
    returns (OwnerStruct memory) {
        // The tokenId must be above startTokenId only
        require(tokenId_ >= startTokenId, "TokenId below starting Id!");
        
        // If the _tokenData is initialized (not 0x0), return the _tokenData
        if (_tokenData[tokenId_].owner != address(0)
            || tokenId_ >= tokenIndex) {
            return _tokenData[tokenId_];
        }

        // Else, do a reverse-lookup to find  the corresponding uninitialized pointer
        else { unchecked {
            uint256 _lowerRange = tokenId_;
            while (mintIndex[_lowerRange].owner == address(0)) { _lowerRange--; }
            return mintIndex[_lowerRange];
        }}
    }

    /** @dev explanation: 
     *  ownerOf calls _getTokenDataOf() which returns either the initialized or 
     *  uninitialized pointer. 
     *  Then, it checks if the token is staked or not through stakeTimestamp.
     *  If the token is staked, return the stakingAddress, otherwise, return the owner.
     */
    function ownerOf(uint256 tokenId_) public virtual view returns (address) {
        OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_);
        return _OwnerStruct.stakeTimestamp == 0 ? _OwnerStruct.owner : stakingAddress();
    }

    /** @dev explanation:
     *  _trueOwnerOf() calls _getTokenDataOf() which returns either the initialized or
     *  uninitialized pointer.
     *  It returns the owner directly without any checks. 
     *  Used internally for proving the staker address on unstake.
     */
    function _trueOwnerOf(uint256 tokenId_) public virtual view returns (address) {
        return _getTokenDataOf(tokenId_).owner;
    }

    ///// ERC721G: Internal Single-Contract Staking Logic /////
    
    /** @dev explanation:
     *  _initializeTokenIf() is used as a beginning-hook to functions that require
     *  that the token is explicitly INITIALIZED before the function is able to be used.
     *  It will check if the _tokenData slot is initialized or not. 
     *  If it is not, it will initialize it.
     *  Used internally for staking logic.
     */
    function _initializeTokenIf(uint256 tokenId_, OwnerStruct memory _OwnerStruct) 
    internal virtual {
        // If the target _tokenData is not initialized, initialize it.
        if (_tokenData[tokenId_].owner == address(0)) {
            _tokenData[tokenId_] = _OwnerStruct;
        }
    }

    /** @dev explanation:
     *  _setStakeTimestamp() is our staking / unstaking logic.
     *  If timestamp_ is > 0, the action is "stake"
     *  If timestamp_ is == 0, the action is "unstake"
     * 
     *  We grab the tokenData using _getTokenDataOf and then read its values.
     *  As this function requires INITIALIZED tokens only, we call _initializeTokenIf()
     *  to initialize any token using this function first.
     * 
     *  Processing of the function is explained in in-line comments.
     */
    function _setStakeTimestamp(uint256 tokenId_, uint256 timestamp_)
    internal virtual returns (address) {
        // First, call _getTokenDataOf and grab the relevant tokenData
        OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_);
        address _owner = _OwnerStruct.owner;
        uint32 _stakeTimestamp = _OwnerStruct.stakeTimestamp;

        // _setStakeTimestamp requires initialization
        _initializeTokenIf(tokenId_, _OwnerStruct);

        // Clear any token approvals
        delete getApproved[tokenId_];

        // if timestamp_ > 0, the action is "stake"
        if (timestamp_ > 0) {
            // Make sure that the token is not staked already
            require(_stakeTimestamp == 0,
                "ERC721G: _setStakeTimestamp() already staked");
            
            // Callbrate balances between staker and stakingAddress
            unchecked { 
                _balanceData[_owner].balance--;
                _balanceData[stakingAddress()].balance++;
            }

            // Emit Transfer event from trueOwner
            emit Transfer(_owner, stakingAddress(), tokenId_);
        }

        // if timestamp_ == 0, the action is "unstake"
        else {
            // Make sure the token is not staked
            require(_stakeTimestamp != 0,
                "ERC721G: _setStakeTimestamp() already unstaked");
            
            // Callibrate balances between stakingAddress and staker
            unchecked {
                _balanceData[_owner].balance++;
                _balanceData[stakingAddress()].balance--;
            }
            
            // we add total time staked to the token on unstake
            uint32 _timeStaked = _getBlockTimestampCompressed() - _stakeTimestamp;
            _tokenData[tokenId_].totalTimeStaked += _timeStaked;

            // Emit Transfer event to trueOwner
            emit Transfer(stakingAddress(), _owner, tokenId_);
        }

        // Set the stakeTimestamp to timestamp_
        _tokenData[tokenId_].stakeTimestamp = _compressTimestamp(timestamp_);

        // We save internal gas by returning the owner for a follow-up function
        return _owner;
    }

    /** @dev explanation:
     *  _stake() works like an extended function of _setStakeTimestamp()
     *  where the logic of _setStakeTimestamp() runs and returns the _owner address
     *  afterwards, we do the post-hook required processing to finish the staking logic 
     *  in this function.
     * 
     *  Processing logic explained in in-line comments.
     */
    function _stake(uint256 tokenId_) internal virtual returns (address) {
        // set the stakeTimestamp to block.timestamp and return the owner
        return _setStakeTimestamp(tokenId_, block.timestamp);
    }

    /** @dev explanation:
     *  _unstake() works like an extended unction of _setStakeTimestamp()
     *  where the logic of _setStakeTimestamp() runs and returns the _owner address
     *  afterwards, we do the post-hook required processing to finish the unstaking logic
     *  in this function.
     * 
     *  Processing logic explained in in-line comments.
     */
    function _unstake(uint256 tokenId_) internal virtual returns(address) {
        // set the stakeTimestamp to 0 and return the owner
        return _setStakeTimestamp(tokenId_, 0);
    }

    /** @dev explanation:
     *  _mintAndStakeInternal() is the internal mintAndStake function that is called
     *  to mintAndStake tokens to users. 
     * 
     *  It populates mintIndex with the phantom-mint data (owner, lastTransferTime)
     *  as well as the phantom-stake data (stakeTimestamp)
     * 
     *  Then, it emits the necessary phantom events to replicate the behavior as canon.
     * 
     *  Further logic explained in in-line comments.
     */
    function _mintAndStakeInternal(address to_, uint256 amount_) internal virtual {
        // we cannot mint to 0x0
        require(to_ != address(0), "ERC721G: _mintAndStakeInternal to 0x0");

        // we limit max mints per SSTORE to prevent expensive gas lookup
        require(amount_ <= maxBatchSize, 
            "ERC721G: _mintAndStakeInternal over maxBatchSize");

        // process the required variables to write to mintIndex 
        uint256 _startId = tokenIndex;
        uint256 _endId = _startId + amount_;
        uint32 _currentTime = _getBlockTimestampCompressed();

        // write to the mintIndex to store the OwnerStruct for uninitialized tokenData
        mintIndex[_startId] = OwnerStruct(
            to_, // the address the token is minted to
            _currentTime, // the last transfer time
            _currentTime, // the curent time of staking
            0 // the accumulated time staked
        );

        unchecked { 
            // we add the balance to the stakingAddress through our staking logic
            _balanceData[stakingAddress()].balance += uint32(amount_);

            // we add the mintedAmount to the to_ through our minting logic
            _balanceData[to_].mintedAmount += uint32(amount_);

            // emit phantom mint to to_, then emit a staking transfer
            do { 
                emit Transfer(address(0), to_, _startId);
                emit Transfer(to_, stakingAddress(), _startId);

                // /** @dev testing:
                // *  emitting a TokenStaked event for testing
                // */
                // emit TokenStaked(_startId, to_, _currentTime);

            } while (++_startId < _endId);
        }

        // set the new tokenIndex to the _endId
        tokenIndex = _endId;
    }

    /** @dev explanation: 
     *  _mintAndStake() calls _mintAndStakeInternal() but calls it using a while-loop
     *  based on the required minting amount to stay within the bounds of 
     *  max mints per batch (maxBatchSize)
     */
    function _mintAndStake(address to_, uint256 amount_) internal virtual {
        uint256 _amountToMint = amount_;
        while (_amountToMint > maxBatchSize) {
            _amountToMint -= maxBatchSize;
            _mintAndStakeInternal(to_, maxBatchSize);
        }
        _mintAndStakeInternal(to_, _amountToMint);
    }

    ///// ERC721G Range-Based Internal Minting Logic /////
    
    /** @dev explanation:
     *  _mintInternal() is our internal batch minting logic. 
     *  First, we store the uninitialized pointer at mintIndex of _startId
     *  Then, we process the balances changes
     *  Finally, we phantom-mint the tokens using Transfer events loop.
     */
    function _mintInternal(address to_, uint256 amount_) internal virtual {
        // cannot mint to 0x0
        require(to_ != address(0), "ERC721G: _mintInternal to 0x0");

        // we limit max mints to prevent expensive gas lookup
        require(amount_ <= maxBatchSize, 
            "ERC721G: _mintInternal over maxBatchSize");

        // process the token id data
        uint256 _startId = tokenIndex;
        uint256 _endId = _startId + amount_;

        // push the required phantom mint data to mintIndex
        mintIndex[_startId].owner = to_;
        mintIndex[_startId].lastTransfer = _getBlockTimestampCompressed();

        // process the balance changes and do a loop to phantom-mint the tokens to to_
        unchecked { 
            _balanceData[to_].balance += uint32(amount_);
            _balanceData[to_].mintedAmount += uint32(amount_);

            do { emit Transfer(address(0), to_, _startId); } while (++_startId < _endId);
        }

        // set the new token index
        tokenIndex = _endId;
    }

    /** @dev explanation:
     *  _mint() is the function that calls _mintInternal() using a while-loop
     *  based on the maximum batch size (maxBatchSize)
     */
    function _mint(address to_, uint256 amount_) internal virtual {
        uint256 _amountToMint = amount_;
        while (_amountToMint > maxBatchSize) {
            _amountToMint -= maxBatchSize;
            _mintInternal(to_, maxBatchSize);
        }
        _mintInternal(to_, _amountToMint);
    }

    /** @dev explanation:
     *  _transfer() is the internal function that transfers the token from_ to to_
     *  it has ERC721-standard require checks
     *  and then uses solmate-style approval clearing
     * 
     *  afterwards, it sets the _tokenData to the data of the to_ (transferee) as well as
     *  set the balanceData.
     *  
     *  this results in INITIALIZATION of the token, if it has not been initialized yet. 
     */
    function _transfer(address from_, address to_, uint256 tokenId_) internal virtual {
        // the from_ address must be the ownerOf
        require(from_ == ownerOf(tokenId_), "ERC721G: _transfer != ownerOf");
        // cannot transfer to 0x0
        require(to_ != address(0), "ERC721G: _transfer to 0x0");

        // delete any approvals
        delete getApproved[tokenId_];

        // set _tokenData to to_
        _tokenData[tokenId_].owner = to_;
        _tokenData[tokenId_].lastTransfer = _getBlockTimestampCompressed();

        // update the balance data
        unchecked { 
            _balanceData[from_].balance--;
            _balanceData[to_].balance++;
        }

        // emit a standard Transfer
        emit Transfer(from_, to_, tokenId_);
    }

    ///// ERC721G: User-Enabled Out-of-the-box Staking Functionality /////
    /** @dev clarification:
     *  As a developer, you DO NOT have to enable these functions, or use them
     *  in the way defined in this section. 
     * 
     *  The functions in this section are just out-of-the-box plug-and-play staking
     *  which is enabled IMMEDIATELY.
     *  (As well as some useful view-functions)
     * 
     *  You can choose to call the internal staking functions yourself, to create 
     *  custom staking logic based on the section (n-2) above.
     */

    /** @dev explanation:
     *  this is a staking function that receives calldata tokenIds_ array
     *  and loops to call internal _stake in a gas-efficient way 
     *  written in a shorthand-style syntax
     */
    function stake(uint256[] calldata tokenIds_) public virtual {
        uint256 i;
        uint256 l = tokenIds_.length;
        while (i < l) { 
            // stake and return the owner's address
            address _owner = _stake(tokenIds_[i]); 
            // make sure the msg.sender is the owner
            require(msg.sender == _owner, "You are not the owner!");
            unchecked {++i;}
        }
    }
    /** @dev explanation:
     *  this is an unstaking function that receives calldata tokenIds_ array
     *  and loops to call internal _unstake in a gas-efficient way 
     *  written in a shorthand-style syntax
     */
    function unstake(uint256[] calldata tokenIds_) public virtual {
        uint256 i;
        uint256 l = tokenIds_.length;
        while (i < l) { 
            // unstake and return the owner's address
            address _owner = _unstake(tokenIds_[i]); 
            // make sure the msg.sender is the owner
            require(msg.sender == _owner, "You are not the owner!");
            unchecked {++i;}
        }
    }

    ///// ERC721G: User-Enabled Out-of-the-box Staking View Functions /////
    /** @dev explanation:
     *  balanceOfStaked loops through the entire tokens using 
     *  startTokenId as the start pointer, and 
     *  tokenIndex (current-next tokenId) as the end pointer
     * 
     *  it checks if the _trueOwnerOf() is the address_ or not
     *  and if the owner() is not the address, indicating the 
     *  state that the token is staked.
     * 
     *  if so, it increases the balance. after the loop, it returns the balance.
     * 
     *  this is mainly for external view only. 
     *  !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER.
     */
    function balanceOfStaked(address address_) public virtual view 
    returns (uint256) {
        uint256 _balance;
        uint256 i = startTokenId;
        uint256 max = tokenIndex;
        while (i < max) {
            if (ownerOf(i) != address_ && _trueOwnerOf(i) == address_) {
                _balance++;
            }
            unchecked { ++i; }
        }
        return _balance;
    }

    /** @dev explanation:
     *  walletOfOwnerStaked calls balanceOfStaked to get the staked 
     *  balance of a user. Afterwards, it runs staked-checking logic
     *  to figure out the tokenIds that the user has staked
     *  and then returns it in walletOfOwner fashion.
     * 
     *  this is mainly for external view only.
     *  !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER.
     */
    function walletOfOwnerStaked(address address_) public virtual view
    returns (uint256[] memory) {
        uint256 _balance = balanceOfStaked(address_);
        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _currentIndex;
        uint256 i = startTokenId;
        while (_currentIndex < _balance) {
            if (ownerOf(i) != address_ && _trueOwnerOf(i) == address_) {
                _tokens[_currentIndex++] = i;
            }
            unchecked { ++i; }
        }
        return _tokens;
    }

    /** @dev explanation:
     *  balanceOf of the address returns UNSTAKED tokens only.
     *  to get the total balance of the user containing both STAKED and UNSTAKED tokens,
     *  we use this function. 
     * 
     *  this is mainly for external view only.
     *  !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER.
     */
    function totalBalanceOf(address address_) public virtual view returns (uint256) {
        return balanceOf(address_) + balanceOfStaked(address_);
    }

    /** @dev explanation:
     *  totalTimeStakedOfToken returns the accumulative total time staked of a tokenId
     *  it reads from the totalTimeStaked of the tokenId_ and adds it with 
     *  a calculation of pending time staked and returns the sum of both values.
     * 
     *  this is mainly for external view / use only.
     *  this function can be interfaced with contract writes.
     */
    function totalTimeStakedOfToken(uint256 tokenId_) public virtual view 
    returns (uint256) {
        OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_);
        uint256 _totalTimeStakedOnToken = _expandTimestamp(_OwnerStruct.totalTimeStaked);
        uint256 _totalTimeStakedPending = 
            _OwnerStruct.stakeTimestamp > 0 ?
            _expandTimestamp(
                _getBlockTimestampCompressed() - _OwnerStruct.stakeTimestamp) : 
                0;

        return _totalTimeStakedOnToken + _totalTimeStakedPending;
    }

    /** @dev explanation:
     *  totalTimeStakedOfTokens just returns an array of totalTimeStakedOfToken
     *  based on tokenIds_ calldata.
     *  
     *  this is mainly for external view / use only.
     *  this function can be interfaced with contract writes... however
     *  BE CAREFUL and USE IT CORRECTLY. 
     *  (dont pass in 5000 tokenIds_ in a write function)
     */
    function totalTimeStakedOfTokens(uint256[] calldata tokenIds_) public
    virtual view returns (uint256[] memory) {
        uint256 i;
        uint256 l = tokenIds_.length;
        uint256[] memory _totalTimeStakeds = new uint256[] (l);
        while (i < l) {
            _totalTimeStakeds[i] = totalTimeStakedOfToken(tokenIds_[i]);
            unchecked { ++i; }
        }
        return _totalTimeStakeds;
    }

    ///// ERC721G: ERC721 Standard Logic /////
    /** @dev clarification:
     *  no explanations here as these are standard ERC721 logics.
     *  the reason that we can use standard ERC721 logics is because
     *  the ERC721G logic is compartmentalized and supports internally 
     *  these ERC721 logics without any need of modification.
     */
    function _isApprovedOrOwner(address spender_, uint256 tokenId_) internal 
    view virtual returns (bool) {
        address _owner = ownerOf(tokenId_);
        return (
            // "i am the owner of the token, and i am transferring it"
            _owner == spender_
            // "the token's approved spender is me"
            || getApproved[tokenId_] == spender_
            // "the owner has approved me to spend all his tokens"
            || isApprovedForAll[_owner][spender_]);
    }
    
    /** @dev clarification:
     *  sets a specific address to be able to spend a specific token.
     */
    function _approve(address to_, uint256 tokenId_) internal virtual {
        getApproved[tokenId_] = to_;
        emit Approval(ownerOf(tokenId_), to_, tokenId_);
    }

    function approve(address to_, uint256 tokenId_) public virtual {
        address _owner = ownerOf(tokenId_);
        require(
            // "i am the owner, and i am approving this token."
            _owner == msg.sender 
            // "i am isApprovedForAll, so i can approve this token too."
            || isApprovedForAll[_owner][msg.sender],
            "ERC721G: approve not authorized");

        _approve(to_, tokenId_);
    }

    function _setApprovalForAll(address owner_, address operator_, bool approved_) 
    internal virtual {
        isApprovedForAll[owner_][operator_] = approved_;
        emit ApprovalForAll(owner_, operator_, approved_);
    }
    function setApprovalForAll(address operator_, bool approved_) public virtual {
        // this function can only be used as self-approvalforall for others. 
        _setApprovalForAll(msg.sender, operator_, approved_);
    }

    function _exists(uint256 tokenId_) internal virtual view returns (bool) {
        return ownerOf(tokenId_) != address(0);
    }

    function transferFrom(address from_, address to_, uint256 tokenId_) public virtual {
        require(_isApprovedOrOwner(msg.sender, tokenId_),
            "ERC721G: transferFrom unauthorized");
        _transfer(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_,
    bytes memory data_) public virtual {
        transferFrom(from_, to_, tokenId_);
        if (to_.code.length != 0) {
            (, bytes memory _returned) = to_.call(abi.encodeWithSelector(
                0x150b7a02, msg.sender, from_, tokenId_, data_));
            bytes4 _selector = abi.decode(_returned, (bytes4));
            require(_selector == 0x150b7a02, 
                "ERC721G: safeTransferFrom to_ non-ERC721Receivable!");
        }
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_) 
    public virtual {
        safeTransferFrom(from_, to_, tokenId_, "");
    }

    function supportsInterface(bytes4 iid_) public virtual view returns (bool) {
        return iid_ == 0x01ffc9a7 || iid_ == 0x80ac58cd || iid_ == 0x5b5e139f || iid_ == 0x7f5828d0; 
    }

    function walletOfOwner(address address_) public virtual view 
    returns (uint256[] memory) {
        uint256 _balance = balanceOf(address_);
        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _currentIndex;
        uint256 i = startTokenId;
        while (_currentIndex < _balance) {
            if (ownerOf(i) == address_) { _tokens[_currentIndex++] = i; }
            unchecked { ++i; }
        }
        return _tokens;
    }

    function tokenURI(uint256 tokenId_) public virtual view returns (string memory) {}

    // Proxy Padding
    bytes32[50] private proxyPadding;

}

abstract contract Minterable is Ownable {
    mapping(address => bool) public minters;
    modifier onlyMinter { require(minters[msg.sender], "Not Minter!"); _; }
    event MinterSet(address newMinter, bool status);
    function setMinter(address address_, bool bool_) external onlyOwner {
        minters[address_] = bool_;
        emit MinterSet(address_, bool_);
    }
}

contract GangsterAllStarEvolutionV2_1 is ERC721G, Ownable, Minterable {

    // Set the base ERC721G Constructor
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() ERC721G("Gangster All Star: Evolution", "GAS:EVO", 1, 20) {}

    // Proxy Initializer Logic
    bool proxyIsInitialized;
    function proxyInitialize(address newOwner) external {
        require(!proxyIsInitialized);
        proxyIsInitialized = true;
        
        // Hardcode
        owner = newOwner;
        name = "Gangster All Star: Evolution";
        symbol = "GAS:EVO";
        tokenIndex = 1;
    }

    // On-Chain Generation Seed for Generative Art Generation
    bytes32 public generationSeed;
    function pullGenerationSeed() external onlyOwner {
        generationSeed = keccak256(abi.encodePacked(
            block.timestamp, block.number, block.difficulty,
            block.coinbase, block.gaslimit, blockhash(block.number)
        ));
    }

    // Define the NFT Constant Params
    uint256 public constant maxSupply = 7777;

    // Define NFT Global Params
    bool public stakingIsEnabled;
    bool public unstakingIsEnabled;
    function O_setStakingIsEnabled(bool bool_) external onlyOwner {
        stakingIsEnabled = bool_; }
    function O_setUnstakingIsEnabled(bool bool_) external onlyOwner {
        unstakingIsEnabled = bool_; }

    // Internal Overrides
    function _mint(address address_, uint256 amount_) internal override {
        require(maxSupply >= (totalSupply() + amount_),
            "ERC721G: _mint(): exceeds maxSupply");
        ERC721G._mint(address_, amount_);
    }

    // Stake / Unstake Overrides for Future Compatibility
    function stake(uint256[] calldata tokenIds_) public override {
        require(stakingIsEnabled, "Staking functionality not enabled yet!");
        ERC721G.stake(tokenIds_);
    }
    function unstake(uint256[] calldata tokenIds_) public override {
        require(unstakingIsEnabled, "Unstaking functionality not enabled yet!");
        ERC721G.unstake(tokenIds_);
    }

    // Internal Functions
    function _mintMany(address[] memory addresses_, uint256[] memory amounts_)
    internal {
        require(addresses_.length == amounts_.length, "Array lengths mismatch!");
        for (uint256 i = 0; i < addresses_.length;) {
            _mint(addresses_[i], amounts_[i]);
            unchecked { ++i; }
        }
    }

    // Controllerable Minting
    function mintAsController(address to_, uint256 amount_) external onlyMinter {
        _mint(to_, amount_);
    }
    function mintAsControllerMany(address[] calldata tos_, uint256[] calldata amounts_)
    external onlyMinter {
        _mintMany(tos_, amounts_);
    }

    // Token URI Configurations
    string internal baseURI;
    string internal baseURI_EXT; 

    function O_setBaseURI(string calldata uri_) external onlyOwner {
        baseURI = uri_; 
    }
    function O_setBaseURI_EXT(string calldata ext_) external onlyOwner {
        baseURI_EXT = ext_; 
    }
    function _toString(uint256 value_) internal pure returns (string memory) {
        if (value_ == 0) { return "0"; }
        uint256 _iterate = value_; uint256 _digits;
        while (_iterate != 0) { _digits++; _iterate /= 10; }
        bytes memory _buffer = new bytes(_digits);
        while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8(
            48 + uint256(value_ % 10 ))); value_ /= 10; }
        return string(_buffer); 
    }
    function tokenURI(uint256 tokenId_) public view override returns (string memory) {
        // PoS Merge-Safe
        if (block.chainid != 1) return "";
        return string(abi.encodePacked(baseURI, _toString(tokenId_), baseURI_EXT));
    }

    ///// Additional Helper Functions /////
    function isOwnerOfAll(address owner, uint256[] calldata tokenIds_) 
    external view returns (bool) {
        // Patch 2.1
        uint256 i;
        uint256 l = tokenIds_.length;
        unchecked { do {
            if (ownerOf(tokenIds_[i]) != owner) return false;
        } while (++i < l); }
        return true;
    }
    function isTrueOwnerOfAll(address owner, uint256[] calldata tokenIds_) 
    external view returns (bool) {
        // Patch 2.1
        uint256 i;
        uint256 l = tokenIds_.length;
        unchecked { do {
            if (_trueOwnerOf(tokenIds_[i]) != owner) return false;
        } while (++i < l); }
        return true;
    }

    // Proxy Padding
    bytes32[50] private proxyPadding;

}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"address","name":"newMinter","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"MinterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"O_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ext_","type":"string"}],"name":"O_setBaseURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"O_setStakingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"O_setUnstakingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balanceData","outputs":[{"internalType":"uint32","name":"balance","type":"uint32"},{"internalType":"uint32","name":"mintedAmount","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp_","type":"uint256"}],"name":"_compressTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp_","type":"uint32"}],"name":"_expandTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getBlockTimestampCompressed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_getTokenDataOf","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"internalType":"struct ERC721G.OwnerStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenData","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_trueOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generationSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getStakeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getTotalTimeStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"isOwnerOfAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"isTrueOwnerOfAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mintAsController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"mintAsControllerMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintIndex","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"old_","type":"address"},{"internalType":"address","name":"new_","type":"address"}],"name":"mockTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"proxyInitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullGenerationSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"iid_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"totalTimeStakedOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"totalTimeStakedOfTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwnerStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b506040518060400160405280601c81526020017f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000815250604051806040016040528060078152602001664741533a45564f60c81b8152506001601483600090816200007d919062000149565b5060016200008c848262000149565b50600282905560809190915260a05250620002159050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000cf57607f821691505b602082108103620000f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200014457600081815260208120601f850160051c810160208610156200011f5750805b601f850160051c820191505b8181101562000140578281556001016200012b565b5050505b505050565b81516001600160401b03811115620001655762000165620000a4565b6200017d81620001768454620000ba565b84620000f6565b602080601f831160018114620001b557600084156200019c5750858301515b600019600386901b1c1916600185901b17855562000140565b600085815260208120601f198616915b82811015620001e657888601518255948401946001909101908401620001c5565b5085821015620002055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612fc36200027a6000396000818161049d01528181612046015281816120710152818161209e01526124090152600081816108b401528181610c4801528181610d8a01528181610ec1015281816110d2015261148d0152612fc36000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806388895767116101d3578063c969a5ab11610104578063e6798baa116100a2578063f16dc57d1161007c578063f16dc57d14610917578063f2fde38b1461091f578063f46eccc414610932578063f65982951461095557600080fd5b8063e6798baa146108af578063e985e9c5146108d6578063f0e56f0d1461090457600080fd5b8063d55f9273116100de578063d55f927314610884578063d5abeb011461088d578063d7b4be2414610896578063e449f3411461089c57600080fd5b8063c969a5ab1461084b578063ced74b501461085e578063cf456ae71461087157600080fd5b8063a713e45b11610171578063b88d4fde1161014b578063b88d4fde146107b5578063ba745f2e146107c8578063bd5404a814610825578063c87b56dd1461083857600080fd5b8063a713e45b14610743578063b0b50ed514610756578063b4bd7c32146107a357600080fd5b8063993568c1116101ad578063993568c1146106fd5780639b10b771146107105780639ee0bcbc1461071d578063a22cb4651461073057600080fd5b806388895767146106ba5780638da5cb5b146106e257806395d89b41146106f557600080fd5b80633455f41e116102ad5780635266069d1161024b5780636352211e116102255780636352211e1461065c57806370a082311461066f5780637b2cbd2d1461069e57806384023454146106a757600080fd5b80635266069d146105e75780635aea7ec1146106365780635e7676e11461064957600080fd5b8063438b630011610287578063438b63001461058e578063470f2c1f146105ae5780634749900a146105c15780634b0ee02a146105d457600080fd5b80633455f41e14610555578063403082f21461056857806342842e0e1461057b57600080fd5b8063153db98a1161031a57806323b872dd116102f457806323b872dd146104855780632913daa0146104985780632c2cdd60146104bf57806332e30f511461054257600080fd5b8063153db98a1461044957806318160ddd1461045c5780631c08c6b71461047257600080fd5b8063081812fc11610356578063081812fc146103cf578063095ea7b3146104105780630fbf0a93146104235780630ffdf2681461043657600080fd5b806301ffc9a71461037d578063021bcdcf146103a557806306fdde03146103ba575b600080fd5b61039061038b366004612638565b61095d565b60405190151581526020015b60405180910390f35b6103b86103b3366004612655565b6109ca565b005b6103c2610a0f565b60405161039c9190612717565b6103f86103dd36600461272a565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161039c565b6103b861041e36600461275a565b610a9d565b6103b86104313660046127d0565b610b3a565b6103b8610444366004612822565b610ba9565b6103b861045736600461275a565b610bed565b610464610c44565b60405190815260200161039c565b6103b8610480366004612655565b610c79565b6103b861049336600461283d565b610cb0565b6104647f000000000000000000000000000000000000000000000000000000000000000081565b61050c6104cd36600461272a565b6003602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff93841660208601529183169184019190915216606082015260800161039c565b610390610550366004612879565b610d1c565b6104646105633660046128cc565b610d80565b6104646105763660046128e7565b610e1d565b6103b861058936600461283d565b610e30565b6105a161059c3660046128cc565b610e4b565b60405161039c919061290d565b6103b86105bc366004612951565b610f47565b6103b86105cf366004612822565b611007565b6104646105e23660046128cc565b611044565b6106196105f53660046128cc565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff93841681529290911660208301520161039c565b6105a16106443660046128cc565b611078565b6103f861065736600461272a565b611175565b6103f861066a36600461272a565b611187565b61046461067d3660046128cc565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b610464603d5481565b6105a16106b53660046127d0565b6111ad565b6106cd6106c836600461272a565b611254565b60405163ffffffff909116815260200161039c565b603a546103f8906001600160a01b031681565b6103c2611261565b61046461070b36600461272a565b61126e565b603e546103909060ff1681565b61046461072b36600461272a565b611285565b6103b861073e3660046129bd565b61129c565b610390610751366004612879565b6112a7565b61050c61076436600461272a565b6005602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e5461039090610100900460ff1681565b6103b86107c3366004612a06565b611309565b6107db6107d636600461272a565b611467565b60405161039c919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103b86108333660046128cc565b611613565b6103c261084636600461272a565b6116c3565b6103b8610859366004612ae2565b611715565b61046461086c36600461272a565b611783565b6103b861087f3660046129bd565b6117e2565b61046460025481565b610464611e6181565b306103f8565b6103b86108aa3660046127d0565b61186f565b6104647f000000000000000000000000000000000000000000000000000000000000000081565b6103906108e4366004612ae2565b600760209081526000928352604080842090915290825290205460ff1681565b61046461091236600461272a565b6118e1565b6106cd6118f8565b6103b861092d3660046128cc565b611905565b6103906109403660046128cc565b603b6020526000908152604090205460ff1681565b6103b8611981565b60006301ffc9a760e01b6001600160e01b03198316148061098e57506380ac58cd60e01b6001600160e01b03198316145b806109a95750635b5e139f60e01b6001600160e01b03198316145b806109c457506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b031633146109fd5760405162461bcd60e51b81526004016109f490612b0c565b60405180910390fd5b603f610a0a828483612bb0565b505050565b60008054610a1c90612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890612b30565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b505050505081565b6000610aa882611187565b90506001600160a01b038116331480610ae457506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610b305760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a65640060448201526064016109f4565b610a0a8383611a0a565b603e5460ff16610b9b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b60648201526084016109f4565b610ba58282611a78565b5050565b603a546001600160a01b03163314610bd35760405162461bcd60e51b81526004016109f490612b0c565b603e80549115156101000261ff0019909216919091179055565b336000908152603b602052604090205460ff16610c3a5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b610ba58282611b06565b60007f0000000000000000000000000000000000000000000000000000000000000000600254610c749190612c87565b905090565b603a546001600160a01b03163314610ca35760405162461bcd60e51b81526004016109f490612b0c565b6040610a0a828483612bb0565b610cba3382611b80565b610d115760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b60648201526084016109f4565b610a0a838383611bff565b600080825b856001600160a01b0316610d4c868685818110610d4057610d40612c9a565b90506020020135611175565b6001600160a01b031614610d6557600092505050610d79565b808260010192508210610d21576001925050505b9392505050565b60025460009081907f0000000000000000000000000000000000000000000000000000000000000000905b80821015610e1457846001600160a01b0316610dc683611187565b6001600160a01b031614158015610df65750846001600160a01b0316610deb83611175565b6001600160a01b0316145b15610e095782610e0581612cb0565b9350505b816001019150610dab565b50909392505050565b60006109c463ffffffff8316600a612cc9565b610a0a83838360405180602001604052806000815250611309565b60606000610e74836001600160a01b031660009081526004602052604090205463ffffffff1690565b905060008167ffffffffffffffff811115610e9157610e916129f0565b604051908082528060200260200182016040528015610eba578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b83821015610f3d57856001600160a01b0316610efc82611187565b6001600160a01b031603610f3557808383610f1681612cb0565b945081518110610f2857610f28612c9a565b6020026020010181815250505b600101610ee1565b5090949350505050565b336000908152603b602052604090205460ff16610f945760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b61100184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611d9892505050565b50505050565b603a546001600160a01b031633146110315760405162461bcd60e51b81526004016109f490612b0c565b603e805460ff1916911515919091179055565b600061104f82610d80565b6001600160a01b03831660009081526004602052604090205463ffffffff166109c49190612ce8565b6060600061108583610d80565b905060008167ffffffffffffffff8111156110a2576110a26129f0565b6040519080825280602002602001820160405280156110cb578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b83821015610f3d57856001600160a01b031661110d82611187565b6001600160a01b03161415801561113d5750856001600160a01b031661113282611175565b6001600160a01b0316145b1561116d5780838361114e81612cb0565b94508151811061116057611160612c9a565b6020026020010181815250505b6001016110f2565b600061118082611467565b5192915050565b60008061119383611467565b9050806040015163ffffffff166000146111805730610d79565b6060600082818167ffffffffffffffff8111156111cc576111cc6129f0565b6040519080825280602002602001820160405280156111f5578160200160208202803683370190505b5090505b8183101561124b5761122286868581811061121657611216612c9a565b90506020020135611783565b81848151811061123457611234612c9a565b6020026020010181815250508260010192506111f9565b95945050505050565b60006109c4600a83612d11565b60018054610a1c90612b30565b60006109c461127c83611467565b60600151610e1d565b60006109c461129383611467565b60400151610e1d565b610ba5338383611e39565b600080825b856001600160a01b03166112d78686858181106112cb576112cb612c9a565b90506020020135611187565b6001600160a01b0316146112f057600092505050610d79565b8082600101925082106112ac5750600195945050505050565b611314848484610cb0565b6001600160a01b0383163b15611001576000836001600160a01b031663150b7a023387868660405160240161134c9493929190612d25565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516113859190612d62565b6000604051808303816000865af19150503d80600081146113c2576040519150601f19603f3d011682016040523d82523d6000602084013e6113c7565b606091505b509150506000818060200190518101906113e19190612d7e565b9050630a85bd0160e11b6001600160e01b031982161461145f5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b60648201526084016109f4565b505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000008210156114fb5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e672049642100000000000060448201526064016109f4565b6000828152600360205260409020546001600160a01b031615158061152257506002548210155b156115865750600090815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b6000818152600560205260409020546001600160a01b03166115ad5760001901611588565b600090815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b603c5460ff161561162357600080fd5b603c805460ff19166001179055603a80546001600160a01b0383166001600160a01b031990911617905560408051808201909152601c81527f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000602082015260009061168e9082612d9b565b506040805180820190915260078152664741533a45564f60c81b60208201526001906116ba9082612d9b565b50506001600255565b6060466001146116e157505060408051602081019091526000815290565b603f6116ec83611ea6565b604080516020016116ff93929190612ece565b6040516020818303038152906040529050919050565b603a546001600160a01b0316331461173f5760405162461bcd60e51b81526004016109f490612b0c565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061178f83611467565b905060006117a08260600151610e1d565b9050600080836040015163ffffffff16116117bc5760006117d6565b6117d683604001516117cc6118f8565b6105769190612f01565b905061124b8183612ce8565b603a546001600160a01b0316331461180c5760405162461bcd60e51b81526004016109f490612b0c565b6001600160a01b0382166000818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166118d75760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b60648201526084016109f4565b610ba58282611fa8565b60006109c46118ef83611467565b60200151610e1d565b6000610c74600a42612d11565b603a546001600160a01b0316331461192f5760405162461bcd60e51b81526004016109f490612b0c565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b603a546001600160a01b031633146119ab5760405162461bcd60e51b81526004016109f490612b0c565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a3f82611187565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815b80821015611001576000611aa7858585818110611a9b57611a9b612c9a565b90506020020135612036565b9050336001600160a01b03821614611afa5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611a7c565b80611b0f610c44565b611b199190612ce8565b611e611015611b765760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b60648201526084016109f4565b610ba58282612042565b600080611b8c83611187565b9050836001600160a01b0316816001600160a01b03161480611bc757506000838152600660205260409020546001600160a01b038581169116145b80611bf757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b611c0881611187565b6001600160a01b0316836001600160a01b031614611c685760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f6600000060448201526064016109f4565b6001600160a01b038216611cbe5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f203078300000000000000060448201526064016109f4565b600081815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b038416179055611d026118f8565b6000828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b038088168085526004909352818420805460001981881601871663ffffffff199182161790915590871680855282852080548088166001019097169690921695909517905551849392600080516020612f6e83398151915291a4505050565b8051825114611de95760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d617463682100000000000000000060448201526064016109f4565b60005b8251811015610a0a57611e31838281518110611e0a57611e0a612c9a565b6020026020010151838381518110611e2457611e24612c9a565b6020026020010151611b06565b600101611dec565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003611ecd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef75780611ee181612cb0565b9150611ef09050600a83612d11565b9150611ed1565b60008167ffffffffffffffff811115611f1257611f126129f0565b6040519080825280601f01601f191660200182016040528015611f3c576020820181803683370190505b5090505b8415611bf75781611f5081612f25565b9250611f5f9050600a86612f3c565b611f6a906030612ce8565b60f81b818381518110611f7f57611f7f612c9a565b60200101906001600160f81b031916908160001a905350611fa1600a86612d11565b9450611f40565b6000815b80821015611001576000611fd7858585818110611fcb57611fcb612c9a565b905060200201356120d1565b9050336001600160a01b0382161461202a5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611fac565b60006109c482426120da565b805b7f00000000000000000000000000000000000000000000000000000000000000008111156120c7576120967f000000000000000000000000000000000000000000000000000000000000000082612c87565b90506120c2837f00000000000000000000000000000000000000000000000000000000000000006123b1565b612044565b610a0a83826123b1565b60006109c48260005b6000806120e684611467565b80516040820151919250906120fb8684612580565b600086815260066020526040902080546001600160a01b031916905584156121f55763ffffffff8116156121865760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b60648201526084016109f4565b6001600160a01b038216600081815260046020526040808220805463ffffffff1980821663ffffffff928316600019018316179092553080855283852080548084166001019093169290931691909117909155905189939192600080516020612f6e83398151915291a461236d565b8063ffffffff166000036122625760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b60648201526084016109f4565b6001600160a01b03821660009081526004602081905260408220805463ffffffff8082166001011663ffffffff199091161790559061229e3090565b6001600160a01b0316815260208101919091526040016000908120805463ffffffff19811663ffffffff91821660001901909116179055816122de6118f8565b6122e89190612f01565b600088815260036020526040902080549192508291601c90612318908490600160e01b900463ffffffff16612f50565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b03166123483090565b6001600160a01b0316600080516020612f6e83398151915260405160405180910390a4505b61237685611254565b6000878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166124075760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f2030783000000060448201526064016109f4565b7f00000000000000000000000000000000000000000000000000000000000000008111156124885760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b60648201526084016109f4565b60025460006124978383612ce8565b600083815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506124c86118f8565b6000838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b03861690600090600080516020612f6e833981519152908290a480826001019250821061254557600255505050565b6000828152600360205260409020546001600160a01b0316610ba557600082815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b03198116811461263557600080fd5b50565b60006020828403121561264a57600080fd5b8135610d798161261f565b6000806020838503121561266857600080fd5b823567ffffffffffffffff8082111561268057600080fd5b818501915085601f83011261269457600080fd5b8135818111156126a357600080fd5b8660208285010111156126b557600080fd5b60209290920196919550909350505050565b60005b838110156126e25781810151838201526020016126ca565b50506000910152565b600081518084526127038160208601602086016126c7565b601f01601f19169290920160200192915050565b602081526000610d7960208301846126eb565b60006020828403121561273c57600080fd5b5035919050565b80356001600160a01b038116811461160e57600080fd5b6000806040838503121561276d57600080fd5b61277683612743565b946020939093013593505050565b60008083601f84011261279657600080fd5b50813567ffffffffffffffff8111156127ae57600080fd5b6020830191508360208260051b85010111156127c957600080fd5b9250929050565b600080602083850312156127e357600080fd5b823567ffffffffffffffff8111156127fa57600080fd5b61280685828601612784565b90969095509350505050565b8035801515811461160e57600080fd5b60006020828403121561283457600080fd5b610d7982612812565b60008060006060848603121561285257600080fd5b61285b84612743565b925061286960208501612743565b9150604084013590509250925092565b60008060006040848603121561288e57600080fd5b61289784612743565b9250602084013567ffffffffffffffff8111156128b357600080fd5b6128bf86828701612784565b9497909650939450505050565b6000602082840312156128de57600080fd5b610d7982612743565b6000602082840312156128f957600080fd5b813563ffffffff81168114610d7957600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561294557835183529284019291840191600101612929565b50909695505050505050565b6000806000806040858703121561296757600080fd5b843567ffffffffffffffff8082111561297f57600080fd5b61298b88838901612784565b909650945060208701359150808211156129a457600080fd5b506129b187828801612784565b95989497509550505050565b600080604083850312156129d057600080fd5b6129d983612743565b91506129e760208401612812565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a1c57600080fd5b612a2585612743565b9350612a3360208601612743565b925060408501359150606085013567ffffffffffffffff80821115612a5757600080fd5b818701915087601f830112612a6b57600080fd5b813581811115612a7d57612a7d6129f0565b604051601f8201601f19908116603f01168101908382118183101715612aa557612aa56129f0565b816040528281528a6020848701011115612abe57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612af557600080fd5b612afe83612743565b91506129e760208401612743565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c90821680612b4457607f821691505b602082108103612b6457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0a57600081815260208120601f850160051c81016020861015612b915750805b601f850160051c820191505b8181101561145f57828155600101612b9d565b67ffffffffffffffff831115612bc857612bc86129f0565b612bdc83612bd68354612b30565b83612b6a565b6000601f841160018114612c105760008515612bf85750838201355b600019600387901b1c1916600186901b178355612c6a565b600083815260209020601f19861690835b82811015612c415786850135825560209485019460019092019101612c21565b5086821015612c5e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109c4576109c4612c71565b634e487b7160e01b600052603260045260246000fd5b600060018201612cc257612cc2612c71565b5060010190565b6000816000190483118215151615612ce357612ce3612c71565b500290565b808201808211156109c4576109c4612c71565b634e487b7160e01b600052601260045260246000fd5b600082612d2057612d20612cfb565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d58908301846126eb565b9695505050505050565b60008251612d748184602087016126c7565b9190910192915050565b600060208284031215612d9057600080fd5b8151610d798161261f565b815167ffffffffffffffff811115612db557612db56129f0565b612dc981612dc38454612b30565b84612b6a565b602080601f831160018114612dfe5760008415612de65750858301515b600019600386901b1c1916600185901b17855561145f565b600085815260208120601f198616915b82811015612e2d57888601518255948401946001909101908401612e0e565b5085821015612e4b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612e6881612b30565b60018281168015612e805760018114612e9557612ec4565b60ff1984168752821515830287019450612ec4565b8560005260208060002060005b85811015612ebb5781548a820152908401908201612ea2565b50505082870194505b5050505092915050565b6000612eda8286612e5b565b8451612eea8183602089016126c7565b612ef681830186612e5b565b979650505050505050565b63ffffffff828116828216039080821115612f1e57612f1e612c71565b5092915050565b600081612f3457612f34612c71565b506000190190565b600082612f4b57612f4b612cfb565b500690565b63ffffffff818116838216019080821115612f1e57612f1e612c7156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204c1628d6160e2b92999a30d3a8edef811363fe11c3a9e67024315442cce1bbec64736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103785760003560e01c806388895767116101d3578063c969a5ab11610104578063e6798baa116100a2578063f16dc57d1161007c578063f16dc57d14610917578063f2fde38b1461091f578063f46eccc414610932578063f65982951461095557600080fd5b8063e6798baa146108af578063e985e9c5146108d6578063f0e56f0d1461090457600080fd5b8063d55f9273116100de578063d55f927314610884578063d5abeb011461088d578063d7b4be2414610896578063e449f3411461089c57600080fd5b8063c969a5ab1461084b578063ced74b501461085e578063cf456ae71461087157600080fd5b8063a713e45b11610171578063b88d4fde1161014b578063b88d4fde146107b5578063ba745f2e146107c8578063bd5404a814610825578063c87b56dd1461083857600080fd5b8063a713e45b14610743578063b0b50ed514610756578063b4bd7c32146107a357600080fd5b8063993568c1116101ad578063993568c1146106fd5780639b10b771146107105780639ee0bcbc1461071d578063a22cb4651461073057600080fd5b806388895767146106ba5780638da5cb5b146106e257806395d89b41146106f557600080fd5b80633455f41e116102ad5780635266069d1161024b5780636352211e116102255780636352211e1461065c57806370a082311461066f5780637b2cbd2d1461069e57806384023454146106a757600080fd5b80635266069d146105e75780635aea7ec1146106365780635e7676e11461064957600080fd5b8063438b630011610287578063438b63001461058e578063470f2c1f146105ae5780634749900a146105c15780634b0ee02a146105d457600080fd5b80633455f41e14610555578063403082f21461056857806342842e0e1461057b57600080fd5b8063153db98a1161031a57806323b872dd116102f457806323b872dd146104855780632913daa0146104985780632c2cdd60146104bf57806332e30f511461054257600080fd5b8063153db98a1461044957806318160ddd1461045c5780631c08c6b71461047257600080fd5b8063081812fc11610356578063081812fc146103cf578063095ea7b3146104105780630fbf0a93146104235780630ffdf2681461043657600080fd5b806301ffc9a71461037d578063021bcdcf146103a557806306fdde03146103ba575b600080fd5b61039061038b366004612638565b61095d565b60405190151581526020015b60405180910390f35b6103b86103b3366004612655565b6109ca565b005b6103c2610a0f565b60405161039c9190612717565b6103f86103dd36600461272a565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161039c565b6103b861041e36600461275a565b610a9d565b6103b86104313660046127d0565b610b3a565b6103b8610444366004612822565b610ba9565b6103b861045736600461275a565b610bed565b610464610c44565b60405190815260200161039c565b6103b8610480366004612655565b610c79565b6103b861049336600461283d565b610cb0565b6104647f000000000000000000000000000000000000000000000000000000000000001481565b61050c6104cd36600461272a565b6003602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff93841660208601529183169184019190915216606082015260800161039c565b610390610550366004612879565b610d1c565b6104646105633660046128cc565b610d80565b6104646105763660046128e7565b610e1d565b6103b861058936600461283d565b610e30565b6105a161059c3660046128cc565b610e4b565b60405161039c919061290d565b6103b86105bc366004612951565b610f47565b6103b86105cf366004612822565b611007565b6104646105e23660046128cc565b611044565b6106196105f53660046128cc565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff93841681529290911660208301520161039c565b6105a16106443660046128cc565b611078565b6103f861065736600461272a565b611175565b6103f861066a36600461272a565b611187565b61046461067d3660046128cc565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b610464603d5481565b6105a16106b53660046127d0565b6111ad565b6106cd6106c836600461272a565b611254565b60405163ffffffff909116815260200161039c565b603a546103f8906001600160a01b031681565b6103c2611261565b61046461070b36600461272a565b61126e565b603e546103909060ff1681565b61046461072b36600461272a565b611285565b6103b861073e3660046129bd565b61129c565b610390610751366004612879565b6112a7565b61050c61076436600461272a565b6005602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e5461039090610100900460ff1681565b6103b86107c3366004612a06565b611309565b6107db6107d636600461272a565b611467565b60405161039c919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103b86108333660046128cc565b611613565b6103c261084636600461272a565b6116c3565b6103b8610859366004612ae2565b611715565b61046461086c36600461272a565b611783565b6103b861087f3660046129bd565b6117e2565b61046460025481565b610464611e6181565b306103f8565b6103b86108aa3660046127d0565b61186f565b6104647f000000000000000000000000000000000000000000000000000000000000000181565b6103906108e4366004612ae2565b600760209081526000928352604080842090915290825290205460ff1681565b61046461091236600461272a565b6118e1565b6106cd6118f8565b6103b861092d3660046128cc565b611905565b6103906109403660046128cc565b603b6020526000908152604090205460ff1681565b6103b8611981565b60006301ffc9a760e01b6001600160e01b03198316148061098e57506380ac58cd60e01b6001600160e01b03198316145b806109a95750635b5e139f60e01b6001600160e01b03198316145b806109c457506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b031633146109fd5760405162461bcd60e51b81526004016109f490612b0c565b60405180910390fd5b603f610a0a828483612bb0565b505050565b60008054610a1c90612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890612b30565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b505050505081565b6000610aa882611187565b90506001600160a01b038116331480610ae457506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610b305760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a65640060448201526064016109f4565b610a0a8383611a0a565b603e5460ff16610b9b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b60648201526084016109f4565b610ba58282611a78565b5050565b603a546001600160a01b03163314610bd35760405162461bcd60e51b81526004016109f490612b0c565b603e80549115156101000261ff0019909216919091179055565b336000908152603b602052604090205460ff16610c3a5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b610ba58282611b06565b60007f0000000000000000000000000000000000000000000000000000000000000001600254610c749190612c87565b905090565b603a546001600160a01b03163314610ca35760405162461bcd60e51b81526004016109f490612b0c565b6040610a0a828483612bb0565b610cba3382611b80565b610d115760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b60648201526084016109f4565b610a0a838383611bff565b600080825b856001600160a01b0316610d4c868685818110610d4057610d40612c9a565b90506020020135611175565b6001600160a01b031614610d6557600092505050610d79565b808260010192508210610d21576001925050505b9392505050565b60025460009081907f0000000000000000000000000000000000000000000000000000000000000001905b80821015610e1457846001600160a01b0316610dc683611187565b6001600160a01b031614158015610df65750846001600160a01b0316610deb83611175565b6001600160a01b0316145b15610e095782610e0581612cb0565b9350505b816001019150610dab565b50909392505050565b60006109c463ffffffff8316600a612cc9565b610a0a83838360405180602001604052806000815250611309565b60606000610e74836001600160a01b031660009081526004602052604090205463ffffffff1690565b905060008167ffffffffffffffff811115610e9157610e916129f0565b604051908082528060200260200182016040528015610eba578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000015b83821015610f3d57856001600160a01b0316610efc82611187565b6001600160a01b031603610f3557808383610f1681612cb0565b945081518110610f2857610f28612c9a565b6020026020010181815250505b600101610ee1565b5090949350505050565b336000908152603b602052604090205460ff16610f945760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b61100184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611d9892505050565b50505050565b603a546001600160a01b031633146110315760405162461bcd60e51b81526004016109f490612b0c565b603e805460ff1916911515919091179055565b600061104f82610d80565b6001600160a01b03831660009081526004602052604090205463ffffffff166109c49190612ce8565b6060600061108583610d80565b905060008167ffffffffffffffff8111156110a2576110a26129f0565b6040519080825280602002602001820160405280156110cb578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000015b83821015610f3d57856001600160a01b031661110d82611187565b6001600160a01b03161415801561113d5750856001600160a01b031661113282611175565b6001600160a01b0316145b1561116d5780838361114e81612cb0565b94508151811061116057611160612c9a565b6020026020010181815250505b6001016110f2565b600061118082611467565b5192915050565b60008061119383611467565b9050806040015163ffffffff166000146111805730610d79565b6060600082818167ffffffffffffffff8111156111cc576111cc6129f0565b6040519080825280602002602001820160405280156111f5578160200160208202803683370190505b5090505b8183101561124b5761122286868581811061121657611216612c9a565b90506020020135611783565b81848151811061123457611234612c9a565b6020026020010181815250508260010192506111f9565b95945050505050565b60006109c4600a83612d11565b60018054610a1c90612b30565b60006109c461127c83611467565b60600151610e1d565b60006109c461129383611467565b60400151610e1d565b610ba5338383611e39565b600080825b856001600160a01b03166112d78686858181106112cb576112cb612c9a565b90506020020135611187565b6001600160a01b0316146112f057600092505050610d79565b8082600101925082106112ac5750600195945050505050565b611314848484610cb0565b6001600160a01b0383163b15611001576000836001600160a01b031663150b7a023387868660405160240161134c9493929190612d25565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516113859190612d62565b6000604051808303816000865af19150503d80600081146113c2576040519150601f19603f3d011682016040523d82523d6000602084013e6113c7565b606091505b509150506000818060200190518101906113e19190612d7e565b9050630a85bd0160e11b6001600160e01b031982161461145f5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b60648201526084016109f4565b505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000018210156114fb5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e672049642100000000000060448201526064016109f4565b6000828152600360205260409020546001600160a01b031615158061152257506002548210155b156115865750600090815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b6000818152600560205260409020546001600160a01b03166115ad5760001901611588565b600090815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b603c5460ff161561162357600080fd5b603c805460ff19166001179055603a80546001600160a01b0383166001600160a01b031990911617905560408051808201909152601c81527f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000602082015260009061168e9082612d9b565b506040805180820190915260078152664741533a45564f60c81b60208201526001906116ba9082612d9b565b50506001600255565b6060466001146116e157505060408051602081019091526000815290565b603f6116ec83611ea6565b604080516020016116ff93929190612ece565b6040516020818303038152906040529050919050565b603a546001600160a01b0316331461173f5760405162461bcd60e51b81526004016109f490612b0c565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061178f83611467565b905060006117a08260600151610e1d565b9050600080836040015163ffffffff16116117bc5760006117d6565b6117d683604001516117cc6118f8565b6105769190612f01565b905061124b8183612ce8565b603a546001600160a01b0316331461180c5760405162461bcd60e51b81526004016109f490612b0c565b6001600160a01b0382166000818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166118d75760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b60648201526084016109f4565b610ba58282611fa8565b60006109c46118ef83611467565b60200151610e1d565b6000610c74600a42612d11565b603a546001600160a01b0316331461192f5760405162461bcd60e51b81526004016109f490612b0c565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b603a546001600160a01b031633146119ab5760405162461bcd60e51b81526004016109f490612b0c565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a3f82611187565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815b80821015611001576000611aa7858585818110611a9b57611a9b612c9a565b90506020020135612036565b9050336001600160a01b03821614611afa5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611a7c565b80611b0f610c44565b611b199190612ce8565b611e611015611b765760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b60648201526084016109f4565b610ba58282612042565b600080611b8c83611187565b9050836001600160a01b0316816001600160a01b03161480611bc757506000838152600660205260409020546001600160a01b038581169116145b80611bf757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b611c0881611187565b6001600160a01b0316836001600160a01b031614611c685760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f6600000060448201526064016109f4565b6001600160a01b038216611cbe5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f203078300000000000000060448201526064016109f4565b600081815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b038416179055611d026118f8565b6000828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b038088168085526004909352818420805460001981881601871663ffffffff199182161790915590871680855282852080548088166001019097169690921695909517905551849392600080516020612f6e83398151915291a4505050565b8051825114611de95760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d617463682100000000000000000060448201526064016109f4565b60005b8251811015610a0a57611e31838281518110611e0a57611e0a612c9a565b6020026020010151838381518110611e2457611e24612c9a565b6020026020010151611b06565b600101611dec565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003611ecd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef75780611ee181612cb0565b9150611ef09050600a83612d11565b9150611ed1565b60008167ffffffffffffffff811115611f1257611f126129f0565b6040519080825280601f01601f191660200182016040528015611f3c576020820181803683370190505b5090505b8415611bf75781611f5081612f25565b9250611f5f9050600a86612f3c565b611f6a906030612ce8565b60f81b818381518110611f7f57611f7f612c9a565b60200101906001600160f81b031916908160001a905350611fa1600a86612d11565b9450611f40565b6000815b80821015611001576000611fd7858585818110611fcb57611fcb612c9a565b905060200201356120d1565b9050336001600160a01b0382161461202a5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611fac565b60006109c482426120da565b805b7f00000000000000000000000000000000000000000000000000000000000000148111156120c7576120967f000000000000000000000000000000000000000000000000000000000000001482612c87565b90506120c2837f00000000000000000000000000000000000000000000000000000000000000146123b1565b612044565b610a0a83826123b1565b60006109c48260005b6000806120e684611467565b80516040820151919250906120fb8684612580565b600086815260066020526040902080546001600160a01b031916905584156121f55763ffffffff8116156121865760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b60648201526084016109f4565b6001600160a01b038216600081815260046020526040808220805463ffffffff1980821663ffffffff928316600019018316179092553080855283852080548084166001019093169290931691909117909155905189939192600080516020612f6e83398151915291a461236d565b8063ffffffff166000036122625760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b60648201526084016109f4565b6001600160a01b03821660009081526004602081905260408220805463ffffffff8082166001011663ffffffff199091161790559061229e3090565b6001600160a01b0316815260208101919091526040016000908120805463ffffffff19811663ffffffff91821660001901909116179055816122de6118f8565b6122e89190612f01565b600088815260036020526040902080549192508291601c90612318908490600160e01b900463ffffffff16612f50565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b03166123483090565b6001600160a01b0316600080516020612f6e83398151915260405160405180910390a4505b61237685611254565b6000878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166124075760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f2030783000000060448201526064016109f4565b7f00000000000000000000000000000000000000000000000000000000000000148111156124885760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b60648201526084016109f4565b60025460006124978383612ce8565b600083815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506124c86118f8565b6000838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b03861690600090600080516020612f6e833981519152908290a480826001019250821061254557600255505050565b6000828152600360205260409020546001600160a01b0316610ba557600082815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b03198116811461263557600080fd5b50565b60006020828403121561264a57600080fd5b8135610d798161261f565b6000806020838503121561266857600080fd5b823567ffffffffffffffff8082111561268057600080fd5b818501915085601f83011261269457600080fd5b8135818111156126a357600080fd5b8660208285010111156126b557600080fd5b60209290920196919550909350505050565b60005b838110156126e25781810151838201526020016126ca565b50506000910152565b600081518084526127038160208601602086016126c7565b601f01601f19169290920160200192915050565b602081526000610d7960208301846126eb565b60006020828403121561273c57600080fd5b5035919050565b80356001600160a01b038116811461160e57600080fd5b6000806040838503121561276d57600080fd5b61277683612743565b946020939093013593505050565b60008083601f84011261279657600080fd5b50813567ffffffffffffffff8111156127ae57600080fd5b6020830191508360208260051b85010111156127c957600080fd5b9250929050565b600080602083850312156127e357600080fd5b823567ffffffffffffffff8111156127fa57600080fd5b61280685828601612784565b90969095509350505050565b8035801515811461160e57600080fd5b60006020828403121561283457600080fd5b610d7982612812565b60008060006060848603121561285257600080fd5b61285b84612743565b925061286960208501612743565b9150604084013590509250925092565b60008060006040848603121561288e57600080fd5b61289784612743565b9250602084013567ffffffffffffffff8111156128b357600080fd5b6128bf86828701612784565b9497909650939450505050565b6000602082840312156128de57600080fd5b610d7982612743565b6000602082840312156128f957600080fd5b813563ffffffff81168114610d7957600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561294557835183529284019291840191600101612929565b50909695505050505050565b6000806000806040858703121561296757600080fd5b843567ffffffffffffffff8082111561297f57600080fd5b61298b88838901612784565b909650945060208701359150808211156129a457600080fd5b506129b187828801612784565b95989497509550505050565b600080604083850312156129d057600080fd5b6129d983612743565b91506129e760208401612812565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a1c57600080fd5b612a2585612743565b9350612a3360208601612743565b925060408501359150606085013567ffffffffffffffff80821115612a5757600080fd5b818701915087601f830112612a6b57600080fd5b813581811115612a7d57612a7d6129f0565b604051601f8201601f19908116603f01168101908382118183101715612aa557612aa56129f0565b816040528281528a6020848701011115612abe57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612af557600080fd5b612afe83612743565b91506129e760208401612743565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c90821680612b4457607f821691505b602082108103612b6457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0a57600081815260208120601f850160051c81016020861015612b915750805b601f850160051c820191505b8181101561145f57828155600101612b9d565b67ffffffffffffffff831115612bc857612bc86129f0565b612bdc83612bd68354612b30565b83612b6a565b6000601f841160018114612c105760008515612bf85750838201355b600019600387901b1c1916600186901b178355612c6a565b600083815260209020601f19861690835b82811015612c415786850135825560209485019460019092019101612c21565b5086821015612c5e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109c4576109c4612c71565b634e487b7160e01b600052603260045260246000fd5b600060018201612cc257612cc2612c71565b5060010190565b6000816000190483118215151615612ce357612ce3612c71565b500290565b808201808211156109c4576109c4612c71565b634e487b7160e01b600052601260045260246000fd5b600082612d2057612d20612cfb565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d58908301846126eb565b9695505050505050565b60008251612d748184602087016126c7565b9190910192915050565b600060208284031215612d9057600080fd5b8151610d798161261f565b815167ffffffffffffffff811115612db557612db56129f0565b612dc981612dc38454612b30565b84612b6a565b602080601f831160018114612dfe5760008415612de65750858301515b600019600386901b1c1916600185901b17855561145f565b600085815260208120601f198616915b82811015612e2d57888601518255948401946001909101908401612e0e565b5085821015612e4b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612e6881612b30565b60018281168015612e805760018114612e9557612ec4565b60ff1984168752821515830287019450612ec4565b8560005260208060002060005b85811015612ebb5781548a820152908401908201612ea2565b50505082870194505b5050505092915050565b6000612eda8286612e5b565b8451612eea8183602089016126c7565b612ef681830186612e5b565b979650505050505050565b63ffffffff828116828216039080821115612f1e57612f1e612c71565b5092915050565b600081612f3457612f34612c71565b506000190190565b600082612f4b57612f4b612cfb565b500690565b63ffffffff818116838216019080821115612f1e57612f1e612c7156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204c1628d6160e2b92999a30d3a8edef811363fe11c3a9e67024315442cce1bbec64736f6c63430008100033

Deployed Bytecode Sourcemap

28714:4599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27506:186;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27506:186:0;;;;;;;;31590:97;;;;;;:::i;:::-;;:::i;:::-;;1442:18;;;:::i;:::-;;;;;;;:::i;3588:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3588:46:0;;;;;;-1:-1:-1;;;;;2294:32:1;;;2276:51;;2264:2;2249:18;3588:46:0;2130:203:1;25487:447:0;;;;;;:::i;:::-;;:::i;30431:182::-;;;;;;:::i;:::-;;:::i;29996:104::-;;;;;;:::i;:::-;;:::i;31209:114::-;;;;;;:::i;:::-;;:::i;4815:112::-;;;:::i;:::-;;;4085:25:1;;;4073:2;4058:18;4815:112:0;3939:177:1;31693:105:0;;;;;;:::i;:::-;;:::i;26548:244::-;;;;;;:::i;:::-;;:::i;1853:37::-;;;;;3310:49;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3310:49:0;;;;-1:-1:-1;;;3310:49:0;;;;;-1:-1:-1;;;3310:49:0;;;;;-1:-1:-1;;;3310:49:0;;;;;;;;;;-1:-1:-1;;;;;4697:32:1;;;4679:51;;4749:10;4795:15;;;4790:2;4775:18;;4768:43;4847:15;;;4827:18;;;4820:43;;;;4899:15;4894:2;4879:18;;4872:43;4666:3;4651:19;3310:49:0;4454:467:1;32904:341:0;;;;;;:::i;:::-;;:::i;20636:406::-;;;;;;:::i;:::-;;:::i;4073:138::-;;;;;;:::i;:::-;;:::i;27344:154::-;;;;;;:::i;:::-;;:::i;27700:467::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31329:153::-;;;;;;:::i;:::-;;:::i;29890:100::-;;;;;;:::i;:::-;;:::i;22363:153::-;;;;;;:::i;:::-;;:::i;3389:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;7509:10:1;7546:15;;;7528:34;;7598:15;;;;7593:2;7578:18;;7571:43;7472:18;3389:53:0;7329:291:1;21468:539:0;;;;;;:::i;:::-;;:::i;7155:135::-;;;;;;:::i;:::-;;:::i;6622:241::-;;;;;;:::i;:::-;;:::i;4933:131::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5026:22:0;4999:7;5026:22;;;:12;:22;;;;;:30;;;;4933:131;29398:29;;;;;;23891:424;;;;;;:::i;:::-;;:::i;3928:139::-;;;;;;:::i;:::-;;:::i;:::-;;;7981:10:1;7969:23;;;7951:42;;7939:2;7924:18;3928:139:0;7807:192:1;94:20:0;;;;;-1:-1:-1;;;;;94:20:0;;;1481;;;:::i;4575:174::-;;;;;;:::i;:::-;;:::i;29818:28::-;;;;;;;;;4397:172;;;;;;:::i;:::-;;:::i;26176:227::-;;;;;;:::i;:::-;;:::i;32566:332::-;;;;;;:::i;:::-;;:::i;3474:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3474:48:0;;;;-1:-1:-1;;;3474:48:0;;;;;-1:-1:-1;;;3474:48:0;;;;;-1:-1:-1;;;3474:48:0;;;;;;29853:30;;;;;;;;;;;;26798:540;;;;;;:::i;:::-;;:::i;5521:773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;9763:13:1;;-1:-1:-1;;;;;9759:39:1;9741:58;;9846:4;9834:17;;;9828:24;9871:10;9919:21;;;9897:20;;;9890:51;;;;10001:4;9989:17;;;9983:24;9979:33;;9957:20;;;9950:63;10073:4;10061:17;;;10055:24;10051:33;10029:20;;;10022:63;;;;9728:3;9713:19;;9538:553;29032:295:0;;;;;;:::i;:::-;;:::i;32268:245::-;;;;;;:::i;:::-;;:::i;583:173::-;;;;;;:::i;:::-;;:::i;22933:556::-;;;;;;:::i;:::-;;:::i;28553:154::-;;;;;;:::i;:::-;;:::i;1559:25::-;;;;;;29736:40;;29772:4;29736:40;;2026:95;2108:4;2026:95;;30619:190;;;;;;:::i;:::-;;:::i;1700:37::-;;;;;3671:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4223:168;;;;;;:::i;:::-;;:::i;3791:131::-;;;:::i;398:179::-;;;;;;:::i;:::-;;:::i;28376:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29434:255;;;:::i;27506:186::-;27575:4;-1:-1:-1;;;;;;;;;27599:18:0;;;;:40;;-1:-1:-1;;;;;;;;;;27621:18:0;;;27599:40;:62;;;-1:-1:-1;;;;;;;;;;27643:18:0;;;27599:62;:84;;;-1:-1:-1;;;;;;;;;;27665:18:0;;;27599:84;27592:91;27506:186;-1:-1:-1;;27506:186:0:o;31590:97::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;;;;;;;;;31664:7:::1;:14;31674:4:::0;;31664:7;:14:::1;:::i;:::-;;31590:97:::0;;:::o;1442:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25487:447::-;25561:14;25578:17;25586:8;25578:7;:17::i;:::-;25561:34;-1:-1:-1;;;;;;25693:20:0;;25703:10;25693:20;;:148;;-1:-1:-1;;;;;;25805:24:0;;;;;;:16;:24;;;;;;;;25830:10;25805:36;;;;;;;;;;25693:148;25606:284;;;;-1:-1:-1;;;25606:284:0;;13345:2:1;25606:284:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:33;13403:18;;;13396:61;13474:18;;25606:284:0;13143:355:1;25606:284:0;25903:23;25912:3;25917:8;25903;:23::i;30431:182::-;30511:16;;;;30503:67;;;;-1:-1:-1;;;30503:67:0;;13705:2:1;30503:67:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;-1:-1:-1;;;13834:18:1;;;13827:36;13880:19;;30503:67:0;13503:402:1;30503:67:0;30581:24;30595:9;;30581:13;:24::i;:::-;30431:182;;:::o;29996:104::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;30071:18:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;30071:26:0;;::::1;::::0;;;::::1;::::0;;29996:104::o;31209:114::-;28460:10;28452:19;;;;:7;:19;;;;;;;;28444:43;;;;-1:-1:-1;;;28444:43:0;;14112:2:1;28444:43:0;;;14094:21:1;14151:2;14131:18;;;14124:30;-1:-1:-1;;;14170:18:1;;;14163:41;14221:18;;28444:43:0;13910:335:1;28444:43:0;31296:19:::1;31302:3;31307:7;31296:5;:19::i;4815:112::-:0;4867:7;4907:12;4894:10;;:25;;;;:::i;:::-;4887:32;;4815:112;:::o;31693:105::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;31771:11:::1;:18;31785:4:::0;;31771:11;:18:::1;:::i;26548:244::-:0;26650:40;26669:10;26681:8;26650:18;:40::i;:::-;26642:100;;;;-1:-1:-1;;;26642:100:0;;14717:2:1;26642:100:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:34;14775:18;;;14768:62;-1:-1:-1;;;14846:18:1;;;14839:32;14888:19;;26642:100:0;14515:398:1;26642:100:0;26753:31;26763:5;26770:3;26775:8;26753:9;:31::i;32904:341::-;33004:4;;33075:9;33114:100;33166:5;-1:-1:-1;;;;;33136:35:0;:26;33149:9;;33159:1;33149:12;;;;;;;:::i;:::-;;;;;;;33136;:26::i;:::-;-1:-1:-1;;;;;33136:35:0;;33132:53;;33180:5;33173:12;;;;;;33132:53;33211:1;33205:3;;;;;;:7;33114:100;;33233:4;33226:11;;;;32904:341;;;;;;:::o;20636:406::-;20810:10;;20714:7;;;;20773:12;;20831:178;20842:3;20838:1;:7;20831:178;;;20880:8;-1:-1:-1;;;;;20866:22:0;:10;20874:1;20866:7;:10::i;:::-;-1:-1:-1;;;;;20866:22:0;;;:53;;;;;20911:8;-1:-1:-1;;;;;20892:27:0;:15;20905:1;20892:12;:15::i;:::-;-1:-1:-1;;;;;20892:27:0;;20866:53;20862:104;;;20940:10;;;;:::i;:::-;;;;20862:104;20992:3;;;;;20831:178;;;-1:-1:-1;21026:8:0;;20636:406;-1:-1:-1;;;20636:406:0:o;4073:138::-;4152:7;4179:24;:19;;;4201:2;4179:24;:::i;27344:154::-;27448:42;27465:5;27472:3;27477:8;27448:42;;;;;;;;;;;;:16;:42::i;27700:467::-;27776:16;27805;27824:19;27834:8;-1:-1:-1;;;;;5026:22:0;4999:7;5026:22;;;:12;:22;;;;;:30;;;;4933:131;27824:19;27805:38;;27854:24;27896:8;27881:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27881:24:0;-1:-1:-1;27854:51:0;-1:-1:-1;27916:21:0;27960:12;27983:152;28006:8;27990:13;:24;27983:152;;;28049:8;-1:-1:-1;;;;;28035:22:0;:10;28043:1;28035:7;:10::i;:::-;-1:-1:-1;;;;;28035:22:0;;28031:61;;28088:1;28061:7;28069:15;;;;:::i;:::-;;;28061:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;28031:61;28118:3;;27983:152;;;-1:-1:-1;28152:7:0;;27700:467;-1:-1:-1;;;;27700:467:0:o;31329:153::-;28460:10;28452:19;;;;:7;:19;;;;;;;;28444:43;;;;-1:-1:-1;;;28444:43:0;;14112:2:1;28444:43:0;;;14094:21:1;14151:2;14131:18;;;14124:30;-1:-1:-1;;;14170:18:1;;;14163:41;14221:18;;28444:43:0;13910:335:1;28444:43:0;31449:25:::1;31459:4;;31449:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;31449:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;31465:8:0;;-1:-1:-1;31465:8:0;;;;31449:25;::::1;::::0;31465:8;;31449:25;31465:8;31449:25;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31449:9:0::1;::::0;-1:-1:-1;;;31449:25:0:i:1;:::-;31329:153:::0;;;;:::o;29890:100::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;29963:16:::1;:24:::0;;-1:-1:-1;;29963:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29890:100::o;22363:153::-;22434:7;22483:25;22499:8;22483:15;:25::i;:::-;-1:-1:-1;;;;;5026:22:0;;4999:7;5026:22;;;:12;:22;;;;;:30;;;22461:47;;;;:::i;21468:539::-;21549:16;21578;21597:25;21613:8;21597:15;:25::i;:::-;21578:44;;21633:24;21675:8;21660:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21660:24:0;-1:-1:-1;21633:51:0;-1:-1:-1;21695:21:0;21739:12;21762:213;21785:8;21769:13;:24;21762:213;;;21828:8;-1:-1:-1;;;;;21814:22:0;:10;21822:1;21814:7;:10::i;:::-;-1:-1:-1;;;;;21814:22:0;;;:53;;;;;21859:8;-1:-1:-1;;;;;21840:27:0;:15;21853:1;21840:12;:15::i;:::-;-1:-1:-1;;;;;21840:27:0;;21814:53;21810:122;;;21915:1;21888:7;21896:15;;;;:::i;:::-;;;21888:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;21810:122;21958:3;;21762:213;;7155:135;7224:7;7251:25;7267:8;7251:15;:25::i;:::-;:31;;7155:135;-1:-1:-1;;7155:135:0:o;6622:241::-;6686:7;6706:31;6740:25;6756:8;6740:15;:25::i;:::-;6706:59;;6783:12;:27;;;:32;;6814:1;6783:32;:72;;2108:4;6783:72;;23891:424;23988:16;24017:9;24049;24017;24049;24113:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24113:17:0;;24076:54;;24141:132;24152:1;24148;:5;24141:132;;;24193:36;24216:9;;24226:1;24216:12;;;;;;;:::i;:::-;;;;;;;24193:22;:36::i;:::-;24170:17;24188:1;24170:20;;;;;;;;:::i;:::-;;;;;;:59;;;;;24256:3;;;;;24141:132;;;24290:17;23891:424;-1:-1:-1;;;;;23891:424:0:o;3928:139::-;4010:6;4043:15;4056:2;4043:10;:15;:::i;1481:20::-;;;;;;;:::i;4575:174::-;4655:7;4682:59;4699:25;4715:8;4699:15;:25::i;:::-;:41;;;4682:16;:59::i;4397:172::-;4476:7;4503:58;4520:25;4536:8;4520:15;:25::i;:::-;:40;;;4503:16;:58::i;26176:227::-;26343:52;26362:10;26374:9;26385;26343:18;:52::i;32566:332::-;32662:4;;32733:9;32772:95;32819:5;-1:-1:-1;;;;;32794:30:0;:21;32802:9;;32812:1;32802:12;;;;;;;:::i;:::-;;;;;;;32794:7;:21::i;:::-;-1:-1:-1;;;;;32794:30:0;;32790:48;;32833:5;32826:12;;;;;;32790:48;32864:1;32858:3;;;;;;:7;32772:95;;-1:-1:-1;32886:4:0;;32566:332;-1:-1:-1;;;;;32566:332:0:o;26798:540::-;26921:34;26934:5;26941:3;26946:8;26921:12;:34::i;:::-;-1:-1:-1;;;;;26970:15:0;;;:20;26966:365;;27010:22;27036:3;-1:-1:-1;;;;;27036:8:0;27086:10;27098;27110:5;27117:8;27127:5;27045:88;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27045:88:0;;;;;;;;;;;27036:98;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27007:127;;;27149:16;27179:9;27168:31;;;;;;;;;;;;:::i;:::-;27149:50;-1:-1:-1;;;;;;;;;;27222:23:0;;;27214:105;;;;-1:-1:-1;;;27214:105:0;;16992:2:1;27214:105:0;;;16974:21:1;17031:2;17011:18;;;17004:30;17070:34;17050:18;;;17043:62;-1:-1:-1;;;17121:18:1;;;17114:49;17180:19;;27214:105:0;16790:415:1;27214:105:0;26992:339;;26798:540;;;;:::o;5521:773::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5705:12:0;5693:8;:24;;5685:63;;;;-1:-1:-1;;;5685:63:0;;17412:2:1;5685:63:0;;;17394:21:1;17451:2;17431:18;;;17424:30;17490:28;17470:18;;;17463:56;17536:18;;5685:63:0;17210:350:1;5685:63:0;5889:1;5851:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;5851:26:0;:40;;;:79;;;5920:10;;5908:8;:22;;5851:79;5847:440;;;-1:-1:-1;5954:20:0;;;;:10;:20;;;;;;;;;5947:27;;;;;;;;;-1:-1:-1;;;;;5947:27:0;;;;;-1:-1:-1;;;5947:27:0;;;;;;;;;;;-1:-1:-1;;;5947:27:0;;;;;;;;;;;-1:-1:-1;;;5947:27:0;;;;;;;;;5521:773::o;5847:440::-;6139:8;6162:69;6209:1;6169:22;;;:9;:22;;;;;:28;-1:-1:-1;;;;;6169:28:0;6162:69;;-1:-1:-1;;6215:13:0;6162:69;;;6252:22;;;;:9;:22;;;;;;;;;6245:29;;;;;;;;;-1:-1:-1;;;;;6245:29:0;;;;;-1:-1:-1;;;6245:29:0;;;;;;;;;;;-1:-1:-1;;;6245:29:0;;;;;;;;;;;-1:-1:-1;;;6245:29:0;;;;;;;;;5521:773;-1:-1:-1;;5521:773:0:o;5847:440::-;5521:773;;;:::o;29032:295::-;29104:18;;;;29103:19;29095:28;;;;;;29134:18;:25;;-1:-1:-1;;29134:25:0;29155:4;29134:25;;;29201:5;:16;;-1:-1:-1;;;;;29201:16:0;;-1:-1:-1;;;;;;29201:16:0;;;;;;29228:37;;;;;;;;;;;;;;;;;29134:18;;29228:37;;29134:18;29228:37;:::i;:::-;-1:-1:-1;29276:18:0;;;;;;;;;;;;-1:-1:-1;;;29276:18:0;;;;:6;;:18;;:6;:18;:::i;:::-;-1:-1:-1;;29318:1:0;29305:10;:14;29032:295::o;32268:245::-;32334:13;32391;32408:1;32391:18;32387:33;;-1:-1:-1;;32411:9:0;;;;;;;;;-1:-1:-1;32411:9:0;;;32268:245::o;32387:33::-;32462:7;32471:19;32481:8;32471:9;:19::i;:::-;32492:11;32445:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32431:74;;32268:245;;;:::o;583:173::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;743:4:::1;-1:-1:-1::0;;;;;716:32:0::1;737:4;-1:-1:-1::0;;;;;716:32:0::1;;;;;;;;;;;583:173:::0;;:::o;22933:556::-;23018:7;23038:31;23072:25;23088:8;23072:15;:25::i;:::-;23038:59;;23108:31;23142:46;23159:12;:28;;;23142:16;:46::i;:::-;23108:80;;23199:31;23277:1;23247:12;:27;;;:31;;;:165;;23411:1;23247:165;;;23294:96;23362:12;:27;;;23329:30;:28;:30::i;:::-;:60;;;;:::i;23294:96::-;23199:213;-1:-1:-1;23432:49:0;23199:213;23432:23;:49;:::i;28553:154::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28632:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:25;;-1:-1:-1;;28632:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;28673:26;;20471:51:1;;;20538:18;;;20531:50;28673:26:0::1;::::0;20444:18:1;28673:26:0::1;;;;;;;28553:154:::0;;:::o;30619:190::-;30701:18;;;;;;;30693:71;;;;-1:-1:-1;;;30693:71:0;;20794:2:1;30693:71:0;;;20776:21:1;20833:2;20813:18;;;20806:30;20872:34;20852:18;;;20845:62;-1:-1:-1;;;20923:18:1;;;20916:38;20971:19;;30693:71:0;20592:404:1;30693:71:0;30775:26;30791:9;;30775:15;:26::i;4223:168::-;4300:7;4327:56;4344:25;4360:8;4344:15;:25::i;:::-;:38;;;4327:16;:56::i;3791:131::-;3860:6;3893:20;3911:2;3893:15;:20;:::i;398:179::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;489:5:::1;::::0;;-1:-1:-1;;;;;505:12:0;;::::1;-1:-1:-1::0;;;;;;505:12:0;::::1;::::0;::::1;::::0;;;533:36:::1;::::0;489:5;::::1;::::0;505:12;489:5;;533:36:::1;::::0;470:16:::1;::::0;533:36:::1;458:119;398:179:::0;:::o;29434:255::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;29521:159:::1;::::0;;29552:15:::1;29521:159;::::0;::::1;21286:19:1::0;29569:12:0::1;21321::1::0;;;21314:28;;;29583:16:0::1;21358:12:1::0;;;;21351:28;;;;29614:14:0::1;21413:15:1::0;;-1:-1:-1;;21409:53:1;21395:12;;;21388:75;29630:14:0::1;21479:13:1::0;;;21472:29;29646:23:0;::::1;21517:13:1::0;;;21510:29;21555:13;;29521:159:0::1;::::0;;-1:-1:-1;;29521:159:0;;::::1;::::0;;;;;;29511:170;;29521:159:::1;29511:170:::0;;::::1;::::0;29494:14:::1;:187:::0;29434:255::o;25309:170::-;25386:21;;;;:11;:21;;;;;:27;;-1:-1:-1;;;;;;25386:27:0;-1:-1:-1;;;;;25386:27:0;;;;;;;;:21;;25438:17;25386:21;25438:7;:17::i;:::-;-1:-1:-1;;;;;25429:42:0;;;;;;;;;;;25309:170;;:::o;18856:424::-;18927:9;18959;18986:287;18997:1;18993;:5;18986:287;;;19069:14;19086:20;19093:9;;19103:1;19093:12;;;;;;;:::i;:::-;;;;;;;19086:6;:20::i;:::-;19069:37;-1:-1:-1;19184:10:0;-1:-1:-1;;;;;19184:20:0;;;19176:55;;;;-1:-1:-1;;;19176:55:0;;21781:2:1;19176:55:0;;;21763:21:1;21820:2;21800:18;;;21793:30;-1:-1:-1;;;21839:18:1;;;21832:52;21901:18;;19176:55:0;21579:346:1;19176:55:0;19257:3;;;;;19000:273;18986:287;;30135:229;30252:7;30236:13;:11;:13::i;:::-;:23;;;;:::i;:::-;29772:4;30222:38;;30214:99;;;;-1:-1:-1;;;30214:99:0;;22132:2:1;30214:99:0;;;22114:21:1;22171:2;22151:18;;;22144:30;22210:34;22190:18;;;22183:62;-1:-1:-1;;;22261:18:1;;;22254:33;22304:19;;30214:99:0;21930:399:1;30214:99:0;30324:32;30338:8;30348:7;30324:13;:32::i;24682:506::-;24783:4;24800:14;24817:17;24825:8;24817:7;:17::i;:::-;24800:34;;24949:8;-1:-1:-1;;;;;24939:18:0;:6;-1:-1:-1;;;;;24939:18:0;;:121;;;-1:-1:-1;25027:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;25027:33:0;;;:21;;:33;24939:121;:240;;;-1:-1:-1;;;;;;25145:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;24939:240;24845:335;24682:506;-1:-1:-1;;;;24682:506:0:o;17252:792::-;17412:17;17420:8;17412:7;:17::i;:::-;-1:-1:-1;;;;;17403:26:0;:5;-1:-1:-1;;;;;17403:26:0;;17395:68;;;;-1:-1:-1;;;17395:68:0;;22536:2:1;17395:68:0;;;22518:21:1;22575:2;22555:18;;;22548:30;22614:31;22594:18;;;22587:59;22663:18;;17395:68:0;22334:353:1;17395:68:0;-1:-1:-1;;;;;17517:17:0;;17509:55;;;;-1:-1:-1;;;17509:55:0;;22894:2:1;17509:55:0;;;22876:21:1;22933:2;22913:18;;;22906:30;22972:27;22952:18;;;22945:55;23017:18;;17509:55:0;22692:349:1;17509:55:0;17617:21;;;;:11;:21;;;;;;;;17610:28;;-1:-1:-1;;;;;;17610:28:0;;;;;;17685:10;:20;;;;;;:32;;;;;-1:-1:-1;;;;;17685:32:0;;;;;17764:30;:28;:30::i;:::-;17728:20;;;;:10;:20;;;;;;;;:66;;;;;;-1:-1:-1;;;17728:66:0;-1:-1:-1;;;;17728:66:0;;;;;;-1:-1:-1;;;;;17869:19:0;;;;;;:12;:19;;;;;;:29;;-1:-1:-1;;17869:29:0;;;;;;-1:-1:-1;;17869:29:0;;;;;;;17913:17;;;;;;;;;:27;;;;;-1:-1:-1;17913:27:0;;;;;;;;;;;;;;18006:30;17739:8;;17913:17;-1:-1:-1;;;;;;;;;;;18006:30:0;;17252:792;;;:::o;30844:326::-;30973:8;:15;30952:10;:17;:36;30944:72;;;;-1:-1:-1;;;30944:72:0;;23248:2:1;30944:72:0;;;23230:21:1;23287:2;23267:18;;;23260:30;23326:25;23306:18;;;23299:53;23369:18;;30944:72:0;23046:347:1;30944:72:0;31032:9;31027:136;31051:10;:17;31047:1;:21;31027:136;;;31086:33;31092:10;31103:1;31092:13;;;;;;;;:::i;:::-;;;;;;;31107:8;31116:1;31107:11;;;;;;;;:::i;:::-;;;;;;;31086:5;:33::i;:::-;31146:3;;31027:136;;25942:228;-1:-1:-1;;;;;26055:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;:47;;-1:-1:-1;;26055:47:0;;;;;;;;;;26118:44;;540:41:1;;;26118:44:0;;513:18:1;26118:44:0;;;;;;;25942:228;;;:::o;31804:458::-;31862:13;31892:6;31902:1;31892:11;31888:32;;-1:-1:-1;;31907:10:0;;;;;;;;;;;;-1:-1:-1;;;31907:10:0;;;;;31804:458::o;31888:32::-;31949:6;31930:16;31983:52;31990:13;;31983:52;;32007:9;;;;:::i;:::-;;-1:-1:-1;32018:14:0;;-1:-1:-1;32030:2:0;32018:14;;:::i;:::-;;;31983:52;;;32045:20;32078:7;32068:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32068:18:0;;32045:41;;32097:124;32104:11;;32097:124;;32119:9;;;;:::i;:::-;;-1:-1:-1;32189:11:0;;-1:-1:-1;32198:2:0;32189:6;:11;:::i;:::-;32176:26;;:2;:26;:::i;:::-;32149:55;;32130:7;32138;32130:16;;;;;;;;:::i;:::-;;;;:74;-1:-1:-1;;;;;32130:74:0;;;;;;;;-1:-1:-1;32206:12:0;32216:2;32206:12;;:::i;:::-;;;32097:124;;19514:430;19587:9;19619;19646:291;19657:1;19653;:5;19646:291;;;19731:14;19748:22;19757:9;;19767:1;19757:12;;;;;;;:::i;:::-;;;;;;;19748:8;:22::i;:::-;19731:39;-1:-1:-1;19848:10:0;-1:-1:-1;;;;;19848:20:0;;;19840:55;;;;-1:-1:-1;;;19840:55:0;;21781:2:1;19840:55:0;;;21763:21:1;21820:2;21800:18;;;21793:30;-1:-1:-1;;;21839:18:1;;;21832:52;21901:18;;19840:55:0;21579:346:1;19840:55:0;19921:3;;;;;19660:277;19646:291;;11189:215;11249:7;11351:45;11370:8;11380:15;11351:18;:45::i;16485:306::-;16582:7;16600:140;16623:12;16607:13;:28;16600:140;;;16652:29;16669:12;16652:29;;:::i;:::-;;;16696:32;16710:3;16715:12;16696:13;:32::i;:::-;16600:140;;;16750:33;16764:3;16769:13;16750;:33::i;11792:188::-;11853:7;11941:31;11960:8;11970:1;8572:2231;8669:7;8761:31;8795:25;8811:8;8795:15;:25::i;:::-;8848:18;;8902:27;;;;8761:59;;-1:-1:-1;8848:18:0;8997:42;9016:8;8761:59;8997:18;:42::i;:::-;9097:21;;;;:11;:21;;;;;9090:28;;-1:-1:-1;;;;;;9090:28:0;;;9188:14;;9184:1375;;9290:20;;;;9282:94;;;;-1:-1:-1;;;9282:94:0;;23858:2:1;9282:94:0;;;23840:21:1;23897:2;23877:18;;;23870:30;23936:34;23916:18;;;23909:62;-1:-1:-1;;;23987:18:1;;;23980:42;24039:19;;9282:94:0;23656:408:1;9282:94:0;-1:-1:-1;;;;;9504:20:0;;;;;;:12;:20;;;;;;:30;;-1:-1:-1;;9504:30:0;;;;;;;-1:-1:-1;;9504:30:0;;;;;;;2108:4;9553:30;;;;;;:40;;;;;-1:-1:-1;9553:40:0;;;;;;;;;;;;;;;9681:44;;9716:8;;2108:4;;-1:-1:-1;;;;;;;;;;;9681:44:0;;9184:1375;;;9883:15;:20;;9902:1;9883:20;9875:96;;;;-1:-1:-1;;;9875:96:0;;24271:2:1;9875:96:0;;;24253:21:1;24310:2;24290:18;;;24283:30;24349:34;24329:18;;;24322:62;-1:-1:-1;;;24400:18:1;;;24393:44;24454:19;;9875:96:0;24069:410:1;9875:96:0;-1:-1:-1;;;;;10099:20:0;;;;;;:12;:20;;;;;;;:30;;;;;;;;;-1:-1:-1;;10099:30:0;;;;;;:12;10161:16;2108:4;;2026:95;10161:16;-1:-1:-1;;;;;10148:30:0;;;;;;;;;;;;-1:-1:-1;10148:30:0;;;:40;;-1:-1:-1;;10148:40:0;;;;;;-1:-1:-1;;10148:40:0;;;;;;;10351:15;10318:30;:28;:30::i;:::-;:48;;;;:::i;:::-;10381:20;;;;:10;:20;;;;;:51;;10297:69;;-1:-1:-1;10297:69:0;;10381:36;;:51;;10297:69;;-1:-1:-1;;;10381:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10538:8;10530:6;-1:-1:-1;;;;;10503:44:0;10512:16;2108:4;;2026:95;10512:16;-1:-1:-1;;;;;10503:44:0;-1:-1:-1;;;;;;;;;;;10503:44:0;;;;;;;;;9810:749;9184:1375;10658:30;10677:10;10658:18;:30::i;:::-;10620:20;;;;:10;:20;;;;;:68;;;;;;;-1:-1:-1;;;10620:68:0;-1:-1:-1;;;;10620:68:0;;;;;;;;;-1:-1:-1;10789:6:0;-1:-1:-1;;8572:2231:0;;;;:::o;15247:1059::-;-1:-1:-1;;;;;15367:17:0;;15359:59;;;;-1:-1:-1;;;15359:59:0;;24863:2:1;15359:59:0;;;24845:21:1;24902:2;24882:18;;;24875:30;24941:31;24921:18;;;24914:59;24990:18;;15359:59:0;24661:353:1;15359:59:0;15513:12;15502:7;:23;;15494:90;;;;-1:-1:-1;;;15494:90:0;;25221:2:1;15494:90:0;;;25203:21:1;25260:2;25240:18;;;25233:30;25299:34;25279:18;;;25272:62;-1:-1:-1;;;25350:18:1;;;25343:38;25398:19;;15494:90:0;25019:404:1;15494:90:0;15654:10;;15635:16;15692:18;15703:7;15654:10;15692:18;:::i;:::-;15784:19;;;;:9;:19;;;;;:31;;-1:-1:-1;;;;;;15784:31:0;-1:-1:-1;;;;;15784:31:0;;;;;15675:35;-1:-1:-1;15861:30:0;:28;:30::i;:::-;15826:19;;;;:9;:19;;;;;;;;:65;;-1:-1:-1;;;;15826:65:0;-1:-1:-1;;;15826:65:0;;;;;;;;-1:-1:-1;;;;;16018:17:0;;;;:12;:17;;;;;:44;;-1:-1:-1;;16077:49:0;;16018:44;;;;;;;16077:49;;;;-1:-1:-1;;16018:44:0;;;;;;16077:49;;;;;;;;;;;;;;;;;16143:77;16153:35;;16179:8;;-1:-1:-1;;;;;16153:35:0;;;16170:1;;-1:-1:-1;;;;;;;;;;;16153:35:0;16170:1;;16153:35;16212:6;16199:10;;;;;;:19;16143:77;;16279:10;:19;-1:-1:-1;;;15247:1059:0:o;7739:300::-;7966:1;7928:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;7928:26:0;7924:108;;7985:20;;;;:10;:20;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7985:35:0;-1:-1:-1;;;;;7985:35:0;;;-1:-1:-1;;;7985:35:0;;;;;-1:-1:-1;;;;;7985:35:0;;;;-1:-1:-1;;;7985:35:0;-1:-1:-1;;;;;;7985:35:0;;;-1:-1:-1;;;;;7985:35:0;;;;;;;;;;;;;;;;;;;7739:300;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:592::-;663:6;671;724:2;712:9;703:7;699:23;695:32;692:52;;;740:1;737;730:12;692:52;780:9;767:23;809:18;850:2;842:6;839:14;836:34;;;866:1;863;856:12;836:34;904:6;893:9;889:22;879:32;;949:7;942:4;938:2;934:13;930:27;920:55;;971:1;968;961:12;920:55;1011:2;998:16;1037:2;1029:6;1026:14;1023:34;;;1053:1;1050;1043:12;1023:34;1098:7;1093:2;1084:6;1080:2;1076:15;1072:24;1069:37;1066:57;;;1119:1;1116;1109:12;1066:57;1150:2;1142:11;;;;;1172:6;;-1:-1:-1;592:592:1;;-1:-1:-1;;;;592:592:1:o;1189:250::-;1274:1;1284:113;1298:6;1295:1;1292:13;1284:113;;;1374:11;;;1368:18;1355:11;;;1348:39;1320:2;1313:10;1284:113;;;-1:-1:-1;;1431:1:1;1413:16;;1406:27;1189:250::o;1444:271::-;1486:3;1524:5;1518:12;1551:6;1546:3;1539:19;1567:76;1636:6;1629:4;1624:3;1620:14;1613:4;1606:5;1602:16;1567:76;:::i;:::-;1697:2;1676:15;-1:-1:-1;;1672:29:1;1663:39;;;;1704:4;1659:50;;1444:271;-1:-1:-1;;1444:271:1:o;1720:220::-;1869:2;1858:9;1851:21;1832:4;1889:45;1930:2;1919:9;1915:18;1907:6;1889:45;:::i;1945:180::-;2004:6;2057:2;2045:9;2036:7;2032:23;2028:32;2025:52;;;2073:1;2070;2063:12;2025:52;-1:-1:-1;2096:23:1;;1945:180;-1:-1:-1;1945:180:1:o;2338:173::-;2406:20;;-1:-1:-1;;;;;2455:31:1;;2445:42;;2435:70;;2501:1;2498;2491:12;2516:254;2584:6;2592;2645:2;2633:9;2624:7;2620:23;2616:32;2613:52;;;2661:1;2658;2651:12;2613:52;2684:29;2703:9;2684:29;:::i;:::-;2674:39;2760:2;2745:18;;;;2732:32;;-1:-1:-1;;;2516:254:1:o;2775:367::-;2838:8;2848:6;2902:3;2895:4;2887:6;2883:17;2879:27;2869:55;;2920:1;2917;2910:12;2869:55;-1:-1:-1;2943:20:1;;2986:18;2975:30;;2972:50;;;3018:1;3015;3008:12;2972:50;3055:4;3047:6;3043:17;3031:29;;3115:3;3108:4;3098:6;3095:1;3091:14;3083:6;3079:27;3075:38;3072:47;3069:67;;;3132:1;3129;3122:12;3069:67;2775:367;;;;;:::o;3147:437::-;3233:6;3241;3294:2;3282:9;3273:7;3269:23;3265:32;3262:52;;;3310:1;3307;3300:12;3262:52;3350:9;3337:23;3383:18;3375:6;3372:30;3369:50;;;3415:1;3412;3405:12;3369:50;3454:70;3516:7;3507:6;3496:9;3492:22;3454:70;:::i;:::-;3543:8;;3428:96;;-1:-1:-1;3147:437:1;-1:-1:-1;;;;3147:437:1:o;3589:160::-;3654:20;;3710:13;;3703:21;3693:32;;3683:60;;3739:1;3736;3729:12;3754:180;3810:6;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3902:26;3918:9;3902:26;:::i;4121:328::-;4198:6;4206;4214;4267:2;4255:9;4246:7;4242:23;4238:32;4235:52;;;4283:1;4280;4273:12;4235:52;4306:29;4325:9;4306:29;:::i;:::-;4296:39;;4354:38;4388:2;4377:9;4373:18;4354:38;:::i;:::-;4344:48;;4439:2;4428:9;4424:18;4411:32;4401:42;;4121:328;;;;;:::o;4926:511::-;5021:6;5029;5037;5090:2;5078:9;5069:7;5065:23;5061:32;5058:52;;;5106:1;5103;5096:12;5058:52;5129:29;5148:9;5129:29;:::i;:::-;5119:39;;5209:2;5198:9;5194:18;5181:32;5236:18;5228:6;5225:30;5222:50;;;5268:1;5265;5258:12;5222:50;5307:70;5369:7;5360:6;5349:9;5345:22;5307:70;:::i;:::-;4926:511;;5396:8;;-1:-1:-1;5281:96:1;;-1:-1:-1;;;;4926:511:1:o;5442:186::-;5501:6;5554:2;5542:9;5533:7;5529:23;5525:32;5522:52;;;5570:1;5567;5560:12;5522:52;5593:29;5612:9;5593:29;:::i;5633:276::-;5691:6;5744:2;5732:9;5723:7;5719:23;5715:32;5712:52;;;5760:1;5757;5750:12;5712:52;5799:9;5786:23;5849:10;5842:5;5838:22;5831:5;5828:33;5818:61;;5875:1;5872;5865:12;5914:632;6085:2;6137:21;;;6207:13;;6110:18;;;6229:22;;;6056:4;;6085:2;6308:15;;;;6282:2;6267:18;;;6056:4;6351:169;6365:6;6362:1;6359:13;6351:169;;;6426:13;;6414:26;;6495:15;;;;6460:12;;;;6387:1;6380:9;6351:169;;;-1:-1:-1;6537:3:1;;5914:632;-1:-1:-1;;;;;;5914:632:1:o;6551:773::-;6673:6;6681;6689;6697;6750:2;6738:9;6729:7;6725:23;6721:32;6718:52;;;6766:1;6763;6756:12;6718:52;6806:9;6793:23;6835:18;6876:2;6868:6;6865:14;6862:34;;;6892:1;6889;6882:12;6862:34;6931:70;6993:7;6984:6;6973:9;6969:22;6931:70;:::i;:::-;7020:8;;-1:-1:-1;6905:96:1;-1:-1:-1;7108:2:1;7093:18;;7080:32;;-1:-1:-1;7124:16:1;;;7121:36;;;7153:1;7150;7143:12;7121:36;;7192:72;7256:7;7245:8;7234:9;7230:24;7192:72;:::i;:::-;6551:773;;;;-1:-1:-1;7283:8:1;-1:-1:-1;;;;6551:773:1:o;8004:254::-;8069:6;8077;8130:2;8118:9;8109:7;8105:23;8101:32;8098:52;;;8146:1;8143;8136:12;8098:52;8169:29;8188:9;8169:29;:::i;:::-;8159:39;;8217:35;8248:2;8237:9;8233:18;8217:35;:::i;:::-;8207:45;;8004:254;;;;;:::o;8263:127::-;8324:10;8319:3;8315:20;8312:1;8305:31;8355:4;8352:1;8345:15;8379:4;8376:1;8369:15;8395:1138;8490:6;8498;8506;8514;8567:3;8555:9;8546:7;8542:23;8538:33;8535:53;;;8584:1;8581;8574:12;8535:53;8607:29;8626:9;8607:29;:::i;:::-;8597:39;;8655:38;8689:2;8678:9;8674:18;8655:38;:::i;:::-;8645:48;;8740:2;8729:9;8725:18;8712:32;8702:42;;8795:2;8784:9;8780:18;8767:32;8818:18;8859:2;8851:6;8848:14;8845:34;;;8875:1;8872;8865:12;8845:34;8913:6;8902:9;8898:22;8888:32;;8958:7;8951:4;8947:2;8943:13;8939:27;8929:55;;8980:1;8977;8970:12;8929:55;9016:2;9003:16;9038:2;9034;9031:10;9028:36;;;9044:18;;:::i;:::-;9119:2;9113:9;9087:2;9173:13;;-1:-1:-1;;9169:22:1;;;9193:2;9165:31;9161:40;9149:53;;;9217:18;;;9237:22;;;9214:46;9211:72;;;9263:18;;:::i;:::-;9303:10;9299:2;9292:22;9338:2;9330:6;9323:18;9378:7;9373:2;9368;9364;9360:11;9356:20;9353:33;9350:53;;;9399:1;9396;9389:12;9350:53;9455:2;9450;9446;9442:11;9437:2;9429:6;9425:15;9412:46;9500:1;9495:2;9490;9482:6;9478:15;9474:24;9467:35;9521:6;9511:16;;;;;;;8395:1138;;;;;;;:::o;10096:260::-;10164:6;10172;10225:2;10213:9;10204:7;10200:23;10196:32;10193:52;;;10241:1;10238;10231:12;10193:52;10264:29;10283:9;10264:29;:::i;:::-;10254:39;;10312:38;10346:2;10335:9;10331:18;10312:38;:::i;10361:334::-;10563:2;10545:21;;;10602:2;10582:18;;;10575:30;-1:-1:-1;;;10636:2:1;10621:18;;10614:40;10686:2;10671:18;;10361:334::o;10700:380::-;10779:1;10775:12;;;;10822;;;10843:61;;10897:4;10889:6;10885:17;10875:27;;10843:61;10950:2;10942:6;10939:14;10919:18;10916:38;10913:161;;10996:10;10991:3;10987:20;10984:1;10977:31;11031:4;11028:1;11021:15;11059:4;11056:1;11049:15;10913:161;;10700:380;;;:::o;11211:545::-;11313:2;11308:3;11305:11;11302:448;;;11349:1;11374:5;11370:2;11363:17;11419:4;11415:2;11405:19;11489:2;11477:10;11473:19;11470:1;11466:27;11460:4;11456:38;11525:4;11513:10;11510:20;11507:47;;;-1:-1:-1;11548:4:1;11507:47;11603:2;11598:3;11594:12;11591:1;11587:20;11581:4;11577:31;11567:41;;11658:82;11676:2;11669:5;11666:13;11658:82;;;11721:17;;;11702:1;11691:13;11658:82;;11932:1206;12056:18;12051:3;12048:27;12045:53;;;12078:18;;:::i;:::-;12107:94;12197:3;12157:38;12189:4;12183:11;12157:38;:::i;:::-;12151:4;12107:94;:::i;:::-;12227:1;12252:2;12247:3;12244:11;12269:1;12264:616;;;;12924:1;12941:3;12938:93;;;-1:-1:-1;12997:19:1;;;12984:33;12938:93;-1:-1:-1;;11889:1:1;11885:11;;;11881:24;11877:29;11867:40;11913:1;11909:11;;;11864:57;13044:78;;12237:895;;12264:616;11158:1;11151:14;;;11195:4;11182:18;;-1:-1:-1;;12300:17:1;;;12401:9;12423:229;12437:7;12434:1;12431:14;12423:229;;;12526:19;;;12513:33;12498:49;;12633:4;12618:20;;;;12586:1;12574:14;;;;12453:12;12423:229;;;12427:3;12680;12671:7;12668:16;12665:159;;;12804:1;12800:6;12794:3;12788;12785:1;12781:11;12777:21;12773:34;12769:39;12756:9;12751:3;12747:19;12734:33;12730:79;12722:6;12715:95;12665:159;;;12867:1;12861:3;12858:1;12854:11;12850:19;12844:4;12837:33;12237:895;;;11932:1206;;;:::o;14250:127::-;14311:10;14306:3;14302:20;14299:1;14292:31;14342:4;14339:1;14332:15;14366:4;14363:1;14356:15;14382:128;14449:9;;;14470:11;;;14467:37;;;14484:18;;:::i;14918:127::-;14979:10;14974:3;14970:20;14967:1;14960:31;15010:4;15007:1;15000:15;15034:4;15031:1;15024:15;15050:135;15089:3;15110:17;;;15107:43;;15130:18;;:::i;:::-;-1:-1:-1;15177:1:1;15166:13;;15050:135::o;15190:168::-;15230:7;15296:1;15292;15288:6;15284:14;15281:1;15278:21;15273:1;15266:9;15259:17;15255:45;15252:71;;;15303:18;;:::i;:::-;-1:-1:-1;15343:9:1;;15190:168::o;15363:125::-;15428:9;;;15449:10;;;15446:36;;;15462:18;;:::i;15493:127::-;15554:10;15549:3;15545:20;15542:1;15535:31;15585:4;15582:1;15575:15;15609:4;15606:1;15599:15;15625:120;15665:1;15691;15681:35;;15696:18;;:::i;:::-;-1:-1:-1;15730:9:1;;15625:120::o;15750:489::-;-1:-1:-1;;;;;16019:15:1;;;16001:34;;16071:15;;16066:2;16051:18;;16044:43;16118:2;16103:18;;16096:34;;;16166:3;16161:2;16146:18;;16139:31;;;15944:4;;16187:46;;16213:19;;16205:6;16187:46;:::i;:::-;16179:54;15750:489;-1:-1:-1;;;;;;15750:489:1:o;16244:287::-;16373:3;16411:6;16405:13;16427:66;16486:6;16481:3;16474:4;16466:6;16462:17;16427:66;:::i;:::-;16509:16;;;;;16244:287;-1:-1:-1;;16244:287:1:o;16536:249::-;16605:6;16658:2;16646:9;16637:7;16633:23;16629:32;16626:52;;;16674:1;16671;16664:12;16626:52;16706:9;16700:16;16725:30;16749:5;16725:30;:::i;17565:1352::-;17691:3;17685:10;17718:18;17710:6;17707:30;17704:56;;;17740:18;;:::i;:::-;17769:97;17859:6;17819:38;17851:4;17845:11;17819:38;:::i;:::-;17813:4;17769:97;:::i;:::-;17921:4;;17985:2;17974:14;;18002:1;17997:663;;;;18704:1;18721:6;18718:89;;;-1:-1:-1;18773:19:1;;;18767:26;18718:89;-1:-1:-1;;11889:1:1;11885:11;;;11881:24;11877:29;11867:40;11913:1;11909:11;;;11864:57;18820:81;;17967:944;;17997:663;11158:1;11151:14;;;11195:4;11182:18;;-1:-1:-1;;18033:20:1;;;18151:236;18165:7;18162:1;18159:14;18151:236;;;18254:19;;;18248:26;18233:42;;18346:27;;;;18314:1;18302:14;;;;18181:19;;18151:236;;;18155:3;18415:6;18406:7;18403:19;18400:201;;;18476:19;;;18470:26;-1:-1:-1;;18559:1:1;18555:14;;;18571:3;18551:24;18547:37;18543:42;18528:58;18513:74;;18400:201;-1:-1:-1;;;;;18647:1:1;18631:14;;;18627:22;18614:36;;-1:-1:-1;17565:1352:1:o;18922:722::-;18972:3;19013:5;19007:12;19042:36;19068:9;19042:36;:::i;:::-;19097:1;19114:18;;;19141:133;;;;19288:1;19283:355;;;;19107:531;;19141:133;-1:-1:-1;;19174:24:1;;19162:37;;19247:14;;19240:22;19228:35;;19219:45;;;-1:-1:-1;19141:133:1;;19283:355;19314:5;19311:1;19304:16;19343:4;19388:2;19385:1;19375:16;19413:1;19427:165;19441:6;19438:1;19435:13;19427:165;;;19519:14;;19506:11;;;19499:35;19562:16;;;;19456:10;;19427:165;;;19431:3;;;19621:6;19616:3;19612:16;19605:23;;19107:531;;;;;18922:722;;;;:::o;19649:469::-;19870:3;19898:38;19932:3;19924:6;19898:38;:::i;:::-;19965:6;19959:13;19981:65;20039:6;20035:2;20028:4;20020:6;20016:17;19981:65;:::i;:::-;20062:50;20104:6;20100:2;20096:15;20088:6;20062:50;:::i;:::-;20055:57;19649:469;-1:-1:-1;;;;;;;19649:469:1:o;20123:175::-;20191:10;20234;;;20222;;;20218:27;;20257:12;;;20254:38;;;20272:18;;:::i;:::-;20254:38;20123:175;;;;:::o;23398:136::-;23437:3;23465:5;23455:39;;23474:18;;:::i;:::-;-1:-1:-1;;;23510:18:1;;23398:136::o;23539:112::-;23571:1;23597;23587:35;;23602:18;;:::i;:::-;-1:-1:-1;23636:9:1;;23539:112::o;24484:172::-;24551:10;24581;;;24593;;;24577:27;;24616:11;;;24613:37;;;24630:18;;:::i

Swarm Source

ipfs://4c1628d6160e2b92999a30d3a8edef811363fe11c3a9e67024315442cce1bbec

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.