function m(str, is_binary)
{
    var result = "";
    var i = 0;
    var x;
    var shiftreg = 0;
    var count = -1;


    for (i=0; i < str.length; i++) {
        c = str.charAt(i);
        if ('A' <= c && c <= 'Z')
        x = str.charCodeAt(i) - 65;
        else if ('a' <= c && c <= 'z')
        x = str.charCodeAt(i) - 97 + 26;
        else if ('0' <= c && c <= '9')
        x = str.charCodeAt(i) - 48 + 52;
        else if (c == '+')
        x = 62;
        else if (c == '/')
        x = 63;
        else
        continue;

        count++;

        switch (count % 4)
        {
            case 0:
            shiftreg = x;
            continue;
            case 1:
            v = (shiftreg<<2) | (x >> 4);
            shiftreg = x & 0x0F;
            break;
            case 2:
            v = (shiftreg<<4) | (x >> 2);
            shiftreg = x & 0x03;
            break;
            case 3:
            v = (shiftreg<<6) | (x >> 0);
            shiftreg = x & 0x00;
            break;
        }

        if (!is_binary && (v < 32 || v > 126) && (v != 0x0d) && (v != 0x0a)) { result = result + "<"; result = result + "0123456789ABCDEF".charAt((v/16)&0x0F); result = result + "0123456789ABCDEF".charAt((v/1)&0x0F); result = result + ">"; }  else result = result + String.fromCharCode(v);

    }
    return result.toString();
}