*  @param prefix list all users with this prefix (overrides start and amount),
     *  use "" to not specify one
     *  @return a String[] containing the usernames
     *  @throws IOException if a network error occurs
     *  @since 0.28
     */
    public String[] allUsers(String start, int number, String prefix) throws IOException
    {
        // sanitise
        max = 50;
        StringBuilder url = new StringBuilder(query);
        url.append("list=allusers&aulimit=");
        String next = "";
        if (prefix.isEmpty())
        {
            url.append(number > max ? max : number);
            next = URLEncoder.encode(start, "UTF-8");
        }
        else
        {
            url.append(max);
            url.append("&auprefix=");
            url.append(URLEncoder.encode(normalize(prefix), "UTF-8"));
        }
        ArrayList<String> members = new ArrayList<String>(6667); // enough for most requests
        do
        {
            String temp = url.toString();
            if (!next.isEmpty())
                temp += ("&aufrom=" + URLEncoder.encode(next, "UTF-8"));
            String line = fetch(temp, "allUsers");

            // parse
            if (line.contains("aufrom=\""))
                next = parseAttribute(line, "aufrom", 0);
            else
                next = null;
            for (int w = line.indexOf("<u "); w > 0; w = line.indexOf("<u ", ++w))
            {
                members.add(decode(parseAttribute(line, "name", w)));
                if (members.size() == number)
                {
                    next = null;
                    break;
                }
            }
        }
        while (next != null);
        int size = members.size();
        log(Level.INFO, "Successfully retrieved user list (" + size + " users)", "allUsers");
        return members.toArray(new String[size]);
    }