protected String printVarInsnNode(VarInsnNode vin, ListIterator<?> it) {
    StringBuilder sb = new StringBuilder();
    sb.append(nameOpcode(vin.opcode()));
    sb.append(vin.var);
    if (Decompiler.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.DEBUG_HELPERS)) {
      if (vin.var == 0 && !Modifier.isStatic(mNode.access)) {
        sb.append(" // reference to self");
      } else {
        final int refIndex = vin.var - (Modifier.isStatic(mNode.access) ? 0 : 1);
        if (refIndex >= 0 && refIndex < args.length - 1) {
          sb.append(" // reference to " + args[refIndex].name);
        }
      }
    }

    return sb.toString();
  }
  @Override
  public void execute(ArrayList<ClassNode> classNodeList) {
    JOptionPane pane =
        new JOptionPane(
            "WARNING: This will load the classes into the JVM and execute allatori decrypter function"
                + BytecodeViewer.nl
                + "for each class. IF THE FILE YOU'RE LOADING IS MALICIOUS, DO NOT CONTINUE.");
    Object[] options = new String[] {"Continue", "Cancel"};
    pane.setOptions(options);
    JDialog dialog = pane.createDialog(BytecodeViewer.viewer, "Bytecode Viewer - WARNING");
    dialog.setVisible(true);
    Object obj = pane.getValue();
    int result = -1;
    for (int k = 0; k < options.length; k++) if (options[k].equals(obj)) result = k;

    if (result == 0) {
      try {

        if (!className.equals("*")) {
          for (ClassNode classNode : classNodeList) {
            if (classNode.name.equals(className)) scanClassNode(classNode);
          }
        } else {
          for (ClassNode classNode : classNodeList) {
            scanClassNode(classNode);
          }
        }
      } catch (Exception e) {
        new ExceptionUI(e, "github.com/Szperak");
      } finally {
        frame.appendText(out.toString());
        frame.setVisible(true);
      }
    }
  }
  protected String printMethodInsnNode(MethodInsnNode min, ListIterator<?> it) {
    StringBuilder sb = new StringBuilder();
    sb.append(nameOpcode(min.opcode()) + " " + min.owner + " " + min.name + "(");

    String desc = min.desc;
    try {
      if (Type.getType(min.desc) != null) desc = Type.getType(min.desc).getClassName();

      if (desc == null || desc.equals("null")) desc = min.desc;
    } catch (java.lang.ArrayIndexOutOfBoundsException e) {

    }

    sb.append(desc);

    sb.append(");");

    return sb.toString();
  }
  protected String printInvokeDynamicInsNode(InvokeDynamicInsnNode idin) {
    StringBuilder sb = new StringBuilder();
    sb.append(nameOpcode(idin.opcode()) + " " + idin.bsm.getName() + "(");

    String desc = idin.desc;
    String partedDesc = idin.desc.substring(2);
    try {
      if (Type.getType(partedDesc) != null) desc = Type.getType(partedDesc).getClassName();

      if (desc == null || desc.equals("null")) desc = idin.desc;
    } catch (java.lang.ArrayIndexOutOfBoundsException e) {

    }

    sb.append(desc);

    sb.append(");");

    return sb.toString();
  }
 private void log(String msg) {
   out.append(msg);
   out.append(BytecodeViewer.nl);
 }