contract BasicToken is ERC20Basic {
    using SafeMath for uint256;

    mapping (address => uint256) public balances;
    mapping (address => bool) public onChain;
    address[] public ownersOfToken;


    function ownersLen() constant returns (uint256) { return ownersOfToken.length; }
    function ownerAddress(uint256 number) constant returns (address) { return ownersOfToken[number]; }

    /**
    * @dev transfer token for a specified address
    * @param _to The address to transfer to.
    * @param _value The amount to be transferred.
    */
    function transfer(address _to, uint256 _value) {

        require(balances[msg.sender] >= _value);
        // Check if the sender has enough
        require(balances[_to] + _value >= balances[_to]);
        // Check for overflows

        if (!onChain[_to]){
            ownersOfToken.push(_to);
            onChain[_to] = true;
        }
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender, _to, _value);
    }

    // burn tokens from sender balance
    function burn(uint256 _value) {

        require(balances[msg.sender] >= _value);
        // Check if the sender has enough

        balances[msg.sender] = balances[msg.sender].sub(_value);
        totalSupply.sub(_value);
        Burn(msg.sender, _value);
    }


    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) constant returns (uint256 balance) {
        return balances[_owner];
    }

}
function transfer(address _to, uint256 _value) {

    require(balances[msg.sender] >= _value);
    // Check if the sender has enough
    require(balances[_to] + _value >= balances[_to]);
    // Check for overflows

    if (!onChain[_to]){
        ownersOfToken.push(_to);
        onChain[_to] = true;
    }
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
}

/**
 * @dev transfer token for a specified address
 * @param _to The address to transfer to.
 * @param _value The amount to be transferred.
 */