function buyoutWithData(uint256 _deedId, string name, string description, string imageUrl, string infoUrl)
        public
        payable
        whenNotPaused 
    {
        
        require(buyoutsEnabledFromTimestamp <= block.timestamp);
    
        address currentOwner = identifierToOwner[_deedId];
    
        
        require(currentOwner != 0x0);
        
        
        uint256[] memory claimedSurroundingPlots = _claimedSurroundingPlots(_deedId);
        
        
        uint256 totalCost = _calculateAndAssignBuyoutProceeds(currentOwner, _deedId, claimedSurroundingPlots);
        
        
        require(msg.value >= totalCost);
        
        
        _transfer(currentOwner, msg.sender, _deedId);
        
        
        SetData(_deedId, name, description, imageUrl, infoUrl);
        
        
        identifierToBuyoutPrice[_deedId] = nextBuyoutPrice(totalCost);
        
        
        if (!identifierToBoughtOutOnce[_deedId]) {
            identifierToBoughtOutOnce[_deedId] = true;
        }
        
        
        
        
        uint256 excess = msg.value - totalCost;
        
        if (excess > 0) {
            
            
            msg.sender.transfer(excess);
        }
    }