docs: @Nullable
    public static String javaScriptUnescape (@Nullable final String sInput)
    {
      if (StringHelper.hasNoText (sInput))
        return sInput;
  
      final char [] aInput = sInput.toCharArray ();
      if (!ArrayHelper.contains (aInput, MASK_CHAR))
        return sInput;
  
      final char [] ret = new char [aInput.length];
      int nIndex = 0;
      char cPrevChar = '\u0000';
      for (int i = 0; i < aInput.length; i++)
      {
        final char cCurrent = aInput[i];
        if (cPrevChar == MASK_CHAR)
        {
          switch (cCurrent)
          {
            case '"':
            case '\'':
            case '\\':
            case '/':
              ret[nIndex++] = cCurrent;
              break;
            case 't':
              ret[nIndex++] = '\t';
              break;
            case 'n':
              ret[nIndex++] = '\n';
              break;
            case 'f':
              ret[nIndex++] = '\f';
              break;
            case 'x':
              final char cHex1 = aInput[++i];
              final char cHex2 = aInput[++i];
              ret[nIndex++] = (char) StringHelper.getHexByte (cHex1, cHex2);
              break;
            default:
              ret[nIndex++] = MASK_CHAR;
              ret[nIndex++] = cCurrent;
              break;
          }
          cPrevChar = 0;
        }
        else
        {
          if (cCurrent != MASK_CHAR)
            ret[nIndex++] = cCurrent;
          cPrevChar = cCurrent;
        }
      }
  
      // Last char is a mask char? append!
      if (cPrevChar == MASK_CHAR)
        ret[nIndex++] = MASK_CHAR;
  
      return new String (ret, 0, nIndex);
    }