public void _initKeyboard(double sec) {
    log("> initKeyboard");
    // javascript entry point to discover the keyboard
    if (!isSecure(sec)) return;
    if (charMap != null) {
      dohrobot.call("_onKeyboard", new Object[] {});
      return;
    }

    AccessController.doPrivileged(
        new PrivilegedAction() {
          public Object run() {
            charMap = new HashMap();
            KeyEvent event = new KeyEvent(applet(), 0, 0, 0, KeyEvent.VK_SPACE, ' ');
            charMap.put(new Integer(32), event);
            try {
              // a-zA-Z0-9 + 29 others
              vkKeys = new Vector();
              for (char i = 'a'; i <= 'z'; i++) {
                vkKeys.add(
                    new Integer(
                        KeyEvent.class
                            .getField("VK_" + Character.toUpperCase((char) i))
                            .getInt(null)));
              }
              for (char i = '0'; i <= '9'; i++) {
                vkKeys.add(
                    new Integer(
                        KeyEvent.class
                            .getField("VK_" + Character.toUpperCase((char) i))
                            .getInt(null)));
              }
              int[] mykeys =
                  new int[] {
                    KeyEvent.VK_COMMA,
                    KeyEvent.VK_MINUS,
                    KeyEvent.VK_PERIOD,
                    KeyEvent.VK_SLASH,
                    KeyEvent.VK_SEMICOLON,
                    KeyEvent.VK_LEFT_PARENTHESIS,
                    KeyEvent.VK_NUMBER_SIGN,
                    KeyEvent.VK_PLUS,
                    KeyEvent.VK_RIGHT_PARENTHESIS,
                    KeyEvent.VK_UNDERSCORE,
                    KeyEvent.VK_EXCLAMATION_MARK,
                    KeyEvent.VK_DOLLAR,
                    KeyEvent.VK_CIRCUMFLEX,
                    KeyEvent.VK_AMPERSAND,
                    KeyEvent.VK_ASTERISK,
                    KeyEvent.VK_QUOTEDBL,
                    KeyEvent.VK_LESS,
                    KeyEvent.VK_GREATER,
                    KeyEvent.VK_BRACELEFT,
                    KeyEvent.VK_BRACERIGHT,
                    KeyEvent.VK_COLON,
                    KeyEvent.VK_BACK_QUOTE,
                    KeyEvent.VK_QUOTE,
                    KeyEvent.VK_OPEN_BRACKET,
                    KeyEvent.VK_BACK_SLASH,
                    KeyEvent.VK_CLOSE_BRACKET,
                    KeyEvent.VK_EQUALS
                  };
              for (int i = 0; i < mykeys.length; i++) {
                vkKeys.add(new Integer(mykeys[i]));
              }
            } catch (Exception e) {
              e.printStackTrace();
            }
            Thread thread =
                new Thread() {
                  public void run() {
                    robot.setAutoDelay(0);
                    log("< initKeyboard");
                    pressNext();
                  }
                };
            thread.start();
            return null;
          }
        });
  }