static int getTokenValue(Ejs *ejs, EjsObj *obj, cchar *fullToken, cchar *token, MprBuf *buf, EjsAny *missing, 
    EjsString *join)
{
    EjsAny      *vp;
    EjsString   *svalue;
    EjsName     qname;
    char        *rest, *first, *str;

    rest = (char*) (schr(token, '.') ? sclone(token) : token);
    first = ssplit(rest, ".", &rest);
    
    qname.name = ejsCreateStringFromAsc(ejs, first);
    qname.space = 0;
    if ((vp = ejsGetPropertyByName(ejs, obj, qname)) != 0) {
        if (rest && *rest && ejsIsPot(ejs, vp)) {
            return getTokenValue(ejs, vp, fullToken, rest, buf, missing, join);
        } else {
            if (ejsIs(ejs, vp, Array)) {
                svalue = ejsJoinArray(ejs, vp, join); 
            } else {
                svalue = ejsToString(ejs, vp);
            }
            mprPutStringToBuf(buf, svalue->value);
        }
    } else if (!missing || (vp == ESV(null) || vp == ESV(undefined))) {
        ejsThrowReferenceError(ejs, "Missing property %s", fullToken);
        return 0;
    } else if (missing == ESV(true)) {
        mprPutStringToBuf(buf, "${");
        mprPutStringToBuf(buf, fullToken);
        mprPutCharToBuf(buf, '}');
    } else if (missing == ESV(false)) {
        /* Omit */;
    } else {
        str = ejsToMulti(ejs, missing);
        //  DEPRECATE LEGACY
        if (smatch(str, "${}")) {
            mprPutStringToBuf(buf, "${");
            mprPutStringToBuf(buf, fullToken);
            mprPutCharToBuf(buf, '}');
        } else {
            mprPutStringToBuf(buf, str);
        }
    }
    return 1;
}
NVD is only using a subset of CWE for mapping instead of the entire CWE, and the weakness type is not covered by that subset.