Program: 170786
Project: 170786
Buggy source:
protected static String renderMessage(BuddyPluginBeta beta,ChatInstance chat,ChatMessage message,String original_msg,int message_type,int start,List<StyleRange> new_ranges,Font info_font,Color info_colour,Font bold_font,Font italic_font){
  String msg=original_msg;
  try {
{
      List<Object> segments=new ArrayList<>();
      int pos=0;
      while (true) {
        int old_pos=pos;
        pos=original_msg.indexOf(':',old_pos);
        if (pos == -1) {
          String tail=original_msg.substring(old_pos);
          if (tail.length() > 0) {
            segments.add(tail);
          }
          break;
        }
        boolean was_url=false;
        String protocol="String_Node_Str";
        for (int i=pos - 1; i >= 0; i--) {
          char c=original_msg.charAt(i);
          if (!Character.isLetterOrDigit(c)) {
            if (c == '"') {
              protocol=c + protocol;
            }
            break;
          }
          protocol=c + protocol;
        }
        if (protocol.length() > 0) {
          char term_char=' ';
          if (protocol.startsWith("String_Node_Str")) {
            term_char='"';
          }
          int url_start=pos - protocol.length();
          int url_end=original_msg.length();
          for (int i=pos + 1; i < url_end; i++) {
            char c=original_msg.charAt(i);
            if (c == term_char || (term_char == ' ' && Character.isWhitespace(c))) {
              url_end=term_char == ' ' ? i : (i + 1);
              break;
            }
          }
          if (url_end > pos + 1 && !Character.isDigit(protocol.charAt(0))) {
            try {
              String url_str=protocol + original_msg.substring(pos,url_end);
              if (url_str.startsWith("String_Node_Str") && url_str.endsWith("String_Node_Str")) {
                url_str=url_str.substring(1,url_str.length() - 1);
                protocol=protocol.substring(1);
              }
              URL url=new URL(url_str);
              if (url_start > old_pos) {
                segments.add(original_msg.substring(old_pos,url_start));
              }
              segments.add(url);
              was_url=true;
              pos=url_end;
            }
 catch (            Throwable e) {
            }
          }
        }
        if (!was_url) {
          pos++;
          segments.add(original_msg.substring(old_pos,pos));
        }
      }
      if (segments.size() > 1) {
        List<Object> temp=new ArrayList<>(segments.size());
        String str="String_Node_Str";
        for (        Object obj : segments) {
          if (obj instanceof String) {
            str+=obj;
          }
 else {
            if (str.length() > 0) {
              temp.add(str);
            }
            str="String_Node_Str";
            temp.add(obj);
          }
        }
        if (str.length() > 0) {
          temp.add(str);
        }
        segments=temp;
      }
      Map<String,String> params=new HashMap<>();
      for (int i=0; i < segments.size(); i++) {
        Object obj=segments.get(i);
        if (obj instanceof URL) {
          params.clear();
          String str=((URL)obj).toExternalForm();
          int qpos=str.indexOf('?');
          if (qpos > 0) {
            int hpos=str.lastIndexOf("String_Node_Str");
            String[] bits=str.substring(qpos + 1,hpos == -1 ? str.length() : hpos).split("String_Node_Str");
            for (            String bit : bits) {
              String[] temp=bit.split("String_Node_Str",2);
              if (temp.length == 2) {
                params.put(temp[0],temp[1]);
              }
            }
            if (hpos > 0 && str.endsWith("String_Node_Str")) {
              str=str.substring(0,hpos) + "String_Node_Str" + expand(params,str.substring(hpos + 2,str.length() - 2),false)+ "String_Node_Str";
              try {
                segments.set(i,new URL(str));
              }
 catch (              Throwable e) {
                Debug.out(e);
              }
            }
          }
 else {
            int hpos=str.lastIndexOf("String_Node_Str");
            if (hpos > 0 && str.endsWith("String_Node_Str")) {
              str=str.substring(0,hpos) + "String_Node_Str" + str.substring(hpos + 2,str.length() - 2)+ "String_Node_Str";
              try {
                segments.set(i,new URL(str));
              }
 catch (              Throwable e) {
                Debug.out(e);
              }
            }
          }
        }
 else {
          String str=(String)obj;
          if (message_type == ChatMessage.MT_NORMAL) {
            str=expandResources(str);
            if (bold_font != null) {
              str=expandEmphasis(str);
            }
          }
          if (params.size() > 0) {
            str=expand(params,str,true);
          }
          segments.set(i,str);
        }
      }
      StringBuilder sb=new StringBuilder(1024);
      for (      Object obj : segments) {
        if (obj instanceof URL) {
          sb.append("String_Node_Str").append(((URL)obj).toExternalForm()).append("String_Node_Str");
        }
 else {
          String segment_str=(String)obj;
          try {
            String my_nick=chat.getNickname(true);
            my_nick=my_nick.replaceAll("String_Node_Str","String_Node_Str");
            if (my_nick.length() > 0 && segment_str.contains(my_nick) && message_type == ChatMessage.MT_NORMAL) {
              StringBuilder temp=new StringBuilder(segment_str.length() + 1024);
              int nick_len=my_nick.length();
              int segment_len=segment_str.length();
              int segment_pos=0;
              while (segment_pos < segment_len) {
                int next_pos=segment_str.indexOf(my_nick,segment_pos);
                if (next_pos >= 0) {
                  temp.append(segment_str.substring(segment_pos,next_pos));
                  boolean match=true;
                  if (next_pos > 0) {
                    if (Character.isLetterOrDigit(segment_str.charAt(next_pos - 1))) {
                      match=false;
                    }
                  }
                  int nick_end=next_pos + nick_len;
                  if (nick_end < segment_len) {
                    if (Character.isLetterOrDigit(segment_str.charAt(nick_end))) {
                      match=false;
                    }
                  }
                  if (match) {
                    temp.append("String_Node_Str").append(UrlUtils.encode(my_nick)).append("String_Node_Str");
                  }
 else {
                    temp.append(my_nick);
                  }
                  segment_pos=next_pos + nick_len;
                }
 else {
                  temp.append(segment_str.substring(segment_pos));
                  break;
                }
              }
              segment_str=temp.toString();
            }
          }
 catch (          Throwable e) {
            Debug.out(e);
          }
          sb.append(segment_str);
        }
      }
      msg=sb.toString();
    }
{
      int next_style_start=start;
      int pos=0;
      while (pos < msg.length()) {
        pos=msg.indexOf(':',pos);
        if (pos == -1) {
          break;
        }
        String protocol="String_Node_Str";
        for (int i=pos - 1; i >= 0; i--) {
          char c=msg.charAt(i);
          if (!Character.isLetterOrDigit(c)) {
            if (c == '"') {
              protocol=c + protocol;
            }
            break;
          }
          protocol=c + protocol;
        }
        if (protocol.length() > 0) {
          char term_char=' ';
          if (protocol.startsWith("String_Node_Str")) {
            term_char='"';
          }
          int url_start=pos - protocol.length();
          int url_end=msg.length();
          for (int i=pos + 1; i < url_end; i++) {
            char c=msg.charAt(i);
            if (c == term_char || (term_char == ' ' && Character.isWhitespace(c))) {
              url_end=term_char == ' ' ? i : (i + 1);
              break;
            }
          }
          if (url_end > pos + 1 && !Character.isDigit(protocol.charAt(0))) {
            try {
              String url_str=protocol + msg.substring(pos,url_end);
              if (url_str.startsWith("String_Node_Str") && url_str.endsWith("String_Node_Str")) {
                url_str=url_str.substring(1,url_str.length() - 1);
                protocol=protocol.substring(1);
              }
              if (protocol.equalsIgnoreCase("String_Node_Str")) {
                if (url_str.toLowerCase(Locale.US).startsWith("String_Node_Str")) {
                  if (beta != null && !beta.isI2PAvailable()) {
                    throw (new Exception("String_Node_Str"));
                  }
                }
              }
 else {
                URL url=new URL(url_str);
              }
              String original_url_str=url_str;
              String display_url=UrlUtils.decode(url_str);
              int hack_pos=url_str.lastIndexOf("String_Node_Str");
              if (hack_pos > 0 && url_str.endsWith("String_Node_Str")) {
                String substitution=url_str.substring(hack_pos + 2,url_str.length() - 2).trim();
                url_str=url_str.substring(0,hack_pos);
                boolean safe=protocol.equals("String_Node_Str") || protocol.equals("String_Node_Str");
                if (safe || UrlUtils.parseTextForURL(substitution,true) == null) {
                  display_url=UrlUtils.decode(substitution);
                }
 else {
                  display_url=UrlUtils.decode(url_str);
                }
              }
              if (term_char != ' ' || !display_url.equals(original_url_str)) {
                int old_len=msg.length();
                msg=msg.substring(0,url_start) + display_url + msg.substring(url_end);
                url_end+=(msg.length() - old_len);
              }
              int this_style_start=start + url_start;
              int this_style_length=display_url.length();
              if (this_style_start > next_style_start) {
                if (message_type == ChatMessage.MT_INFO) {
                  StyleRange styleRange=new MyStyleRange(message);
                  styleRange.start=next_style_start;
                  styleRange.length=this_style_start - next_style_start;
                  styleRange.foreground=info_colour;
                  styleRange.font=info_font;
                  new_ranges.add(styleRange);
                  next_style_start=this_style_start + this_style_length;
                }
              }
              boolean will_work=true;
              Font fail_font=bold_font;
              try {
                String lc_url=url_str.toLowerCase(Locale.US);
                if (lc_url.startsWith("String_Node_Str")) {
                  if ((!lc_url.contains("String_Node_Str")) || lc_url.contains("String_Node_Str") || lc_url.endsWith("String_Node_Str")) {
                    if (!lc_url.contains("String_Node_Str")) {
                      will_work=false;
                    }
                  }
                }
 else                 if (lc_url.startsWith("String_Node_Str") || lc_url.startsWith("String_Node_Str")) {
                  will_work=false;
                }
 else                 if (lc_url.startsWith("String_Node_Str")) {
                  fail_font=italic_font;
                  will_work=false;
                }
              }
 catch (              Throwable e) {
              }
              if (will_work) {
                StyleRange styleRange=new MyStyleRange(message);
                styleRange.start=this_style_start;
                styleRange.length=this_style_length;
                styleRange.foreground=Colors.blue;
                styleRange.underline=true;
                styleRange.data=url_str;
                new_ranges.add(styleRange);
              }
 else {
                StyleRange styleRange=new MyStyleRange(message);
                styleRange.start=this_style_start;
                styleRange.length=this_style_length;
                styleRange.font=fail_font;
                new_ranges.add(styleRange);
              }
            }
 catch (            Throwable e) {
            }
          }
          pos=url_end;
        }
 else {
          pos=pos + 1;
        }
      }
      if (next_style_start < start + msg.length()) {
        if (message_type == ChatMessage.MT_INFO) {
          StyleRange styleRange=new MyStyleRange(message);
          styleRange.start=next_style_start;
          styleRange.length=start + msg.length() - next_style_start;
          styleRange.foreground=info_colour;
          styleRange.font=info_font;
          new_ranges.add(styleRange);
        }
      }
    }
  }
 catch (  Throwable e) {
    Debug.out(e);
  }
  return (msg);
}

Fixed version (ground truth):
protected static String renderMessage(BuddyPluginBeta beta,ChatInstance chat,ChatMessage message,String original_msg,int message_type,int start,List<StyleRange> new_ranges,Font info_font,Color info_colour,Font bold_font,Font italic_font){
  String msg=original_msg;
  try {
{
      List<Object> segments=new ArrayList<>();
      int pos=0;
      while (true) {
        int old_pos=pos;
        pos=original_msg.indexOf(':',old_pos);
        if (pos == -1) {
          String tail=original_msg.substring(old_pos);
          if (tail.length() > 0) {
            segments.add(tail);
          }
          break;
        }
        boolean was_url=false;
        String protocol="String_Node_Str";
        for (int i=pos - 1; i >= 0; i--) {
          char c=original_msg.charAt(i);
          if (!Character.isLetterOrDigit(c)) {
            if (c == '"') {
              protocol=c + protocol;
            }
            break;
          }
          protocol=c + protocol;
        }
        if (protocol.length() > 0) {
          char term_char=' ';
          if (protocol.startsWith("String_Node_Str")) {
            term_char='"';
          }
          int url_start=pos - protocol.length();
          int url_end=original_msg.length();
          for (int i=pos + 1; i < url_end; i++) {
            char c=original_msg.charAt(i);
            if (c == term_char || (term_char == ' ' && Character.isWhitespace(c))) {
              url_end=term_char == ' ' ? i : (i + 1);
              break;
            }
          }
          if (url_end > pos + 1 && !Character.isDigit(protocol.charAt(0))) {
            try {
              String url_str=protocol + original_msg.substring(pos,url_end);
              if (url_str.startsWith("String_Node_Str") && url_str.endsWith("String_Node_Str")) {
                url_str=url_str.substring(1,url_str.length() - 1);
                protocol=protocol.substring(1);
              }
              URL url=new URL(url_str);
              if (url_start > old_pos) {
                segments.add(original_msg.substring(old_pos,url_start));
              }
              segments.add(url);
              was_url=true;
              pos=url_end;
            }
 catch (            Throwable e) {
            }
          }
        }
        if (!was_url) {
          pos++;
          segments.add(original_msg.substring(old_pos,pos));
        }
      }
      if (segments.size() > 1) {
        List<Object> temp=new ArrayList<>(segments.size());
        String str="String_Node_Str";
        for (        Object obj : segments) {
          if (obj instanceof String) {
            str+=obj;
          }
 else {
            if (str.length() > 0) {
              temp.add(str);
            }
            str="String_Node_Str";
            temp.add(obj);
          }
        }
        if (str.length() > 0) {
          temp.add(str);
        }
        segments=temp;
      }
      Map<String,String> params=new HashMap<>();
      for (int i=0; i < segments.size(); i++) {
        Object obj=segments.get(i);
        if (obj instanceof URL) {
          params.clear();
          String str=((URL)obj).toExternalForm();
          int qpos=str.indexOf('?');
          if (qpos > 0) {
            int hpos=str.lastIndexOf("String_Node_Str");
            if (hpos < qpos) {
              hpos=-1;
            }
            String[] bits=str.substring(qpos + 1,hpos == -1 ? str.length() : hpos).split("String_Node_Str");
            for (            String bit : bits) {
              String[] temp=bit.split("String_Node_Str",2);
              if (temp.length == 2) {
                params.put(temp[0],temp[1]);
              }
            }
            if (hpos > 0 && str.endsWith("String_Node_Str")) {
              str=str.substring(0,hpos) + "String_Node_Str" + expand(params,str.substring(hpos + 2,str.length() - 2),false)+ "String_Node_Str";
              try {
                segments.set(i,new URL(str));
              }
 catch (              Throwable e) {
                Debug.out(e);
              }
            }
          }
 else {
            int hpos=str.lastIndexOf("String_Node_Str");
            if (hpos > 0 && str.endsWith("String_Node_Str")) {
              str=str.substring(0,hpos) + "String_Node_Str" + str.substring(hpos + 2,str.length() - 2)+ "String_Node_Str";
              try {
                segments.set(i,new URL(str));
              }
 catch (              Throwable e) {
                Debug.out(e);
              }
            }
          }
        }
 else {
          String str=(String)obj;
          if (message_type == ChatMessage.MT_NORMAL) {
            str=expandResources(str);
            if (bold_font != null) {
              str=expandEmphasis(str);
            }
          }
          if (params.size() > 0) {
            str=expand(params,str,true);
          }
          segments.set(i,str);
        }
      }
      StringBuilder sb=new StringBuilder(1024);
      for (      Object obj : segments) {
        if (obj instanceof URL) {
          sb.append("String_Node_Str").append(((URL)obj).toExternalForm()).append("String_Node_Str");
        }
 else {
          String segment_str=(String)obj;
          try {
            String my_nick=chat.getNickname(true);
            my_nick=my_nick.replaceAll("String_Node_Str","String_Node_Str");
            if (my_nick.length() > 0 && segment_str.contains(my_nick) && message_type == ChatMessage.MT_NORMAL) {
              StringBuilder temp=new StringBuilder(segment_str.length() + 1024);
              int nick_len=my_nick.length();
              int segment_len=segment_str.length();
              int segment_pos=0;
              while (segment_pos < segment_len) {
                int next_pos=segment_str.indexOf(my_nick,segment_pos);
                if (next_pos >= 0) {
                  temp.append(segment_str.substring(segment_pos,next_pos));
                  boolean match=true;
                  if (next_pos > 0) {
                    if (Character.isLetterOrDigit(segment_str.charAt(next_pos - 1))) {
                      match=false;
                    }
                  }
                  int nick_end=next_pos + nick_len;
                  if (nick_end < segment_len) {
                    if (Character.isLetterOrDigit(segment_str.charAt(nick_end))) {
                      match=false;
                    }
                  }
                  if (match) {
                    temp.append("String_Node_Str").append(UrlUtils.encode(my_nick)).append("String_Node_Str");
                  }
 else {
                    temp.append(my_nick);
                  }
                  segment_pos=next_pos + nick_len;
                }
 else {
                  temp.append(segment_str.substring(segment_pos));
                  break;
                }
              }
              segment_str=temp.toString();
            }
          }
 catch (          Throwable e) {
            Debug.out(e);
          }
          sb.append(segment_str);
        }
      }
      msg=sb.toString();
    }
{
      int next_style_start=start;
      int pos=0;
      while (pos < msg.length()) {
        pos=msg.indexOf(':',pos);
        if (pos == -1) {
          break;
        }
        String protocol="String_Node_Str";
        for (int i=pos - 1; i >= 0; i--) {
          char c=msg.charAt(i);
          if (!Character.isLetterOrDigit(c)) {
            if (c == '"') {
              protocol=c + protocol;
            }
            break;
          }
          protocol=c + protocol;
        }
        if (protocol.length() > 0) {
          char term_char=' ';
          if (protocol.startsWith("String_Node_Str")) {
            term_char='"';
          }
          int url_start=pos - protocol.length();
          int url_end=msg.length();
          for (int i=pos + 1; i < url_end; i++) {
            char c=msg.charAt(i);
            if (c == term_char || (term_char == ' ' && Character.isWhitespace(c))) {
              url_end=term_char == ' ' ? i : (i + 1);
              break;
            }
          }
          if (url_end > pos + 1 && !Character.isDigit(protocol.charAt(0))) {
            try {
              String url_str=protocol + msg.substring(pos,url_end);
              if (url_str.startsWith("String_Node_Str") && url_str.endsWith("String_Node_Str")) {
                url_str=url_str.substring(1,url_str.length() - 1);
                protocol=protocol.substring(1);
              }
              if (protocol.equalsIgnoreCase("String_Node_Str")) {
                if (url_str.toLowerCase(Locale.US).startsWith("String_Node_Str")) {
                  if (beta != null && !beta.isI2PAvailable()) {
                    throw (new Exception("String_Node_Str"));
                  }
                }
              }
 else {
                URL url=new URL(url_str);
              }
              String original_url_str=url_str;
              String display_url=UrlUtils.decode(url_str);
              int hack_pos=url_str.lastIndexOf("String_Node_Str");
              if (hack_pos > 0 && url_str.endsWith("String_Node_Str")) {
                String substitution=url_str.substring(hack_pos + 2,url_str.length() - 2).trim();
                url_str=url_str.substring(0,hack_pos);
                boolean safe=protocol.equals("String_Node_Str") || protocol.equals("String_Node_Str");
                if (safe || UrlUtils.parseTextForURL(substitution,true) == null) {
                  display_url=UrlUtils.decode(substitution);
                }
 else {
                  display_url=UrlUtils.decode(url_str);
                }
              }
              if (term_char != ' ' || !display_url.equals(original_url_str)) {
                int old_len=msg.length();
                msg=msg.substring(0,url_start) + display_url + msg.substring(url_end);
                url_end+=(msg.length() - old_len);
              }
              int this_style_start=start + url_start;
              int this_style_length=display_url.length();
              if (this_style_start > next_style_start) {
                if (message_type == ChatMessage.MT_INFO) {
                  StyleRange styleRange=new MyStyleRange(message);
                  styleRange.start=next_style_start;
                  styleRange.length=this_style_start - next_style_start;
                  styleRange.foreground=info_colour;
                  styleRange.font=info_font;
                  new_ranges.add(styleRange);
                  next_style_start=this_style_start + this_style_length;
                }
              }
              boolean will_work=true;
              Font fail_font=bold_font;
              try {
                String lc_url=url_str.toLowerCase(Locale.US);
                if (lc_url.startsWith("String_Node_Str")) {
                  if ((!lc_url.contains("String_Node_Str")) || lc_url.contains("String_Node_Str") || lc_url.endsWith("String_Node_Str")) {
                    if (!lc_url.contains("String_Node_Str")) {
                      will_work=false;
                    }
                  }
                }
 else                 if (lc_url.startsWith("String_Node_Str") || lc_url.startsWith("String_Node_Str")) {
                  will_work=false;
                }
 else                 if (lc_url.startsWith("String_Node_Str")) {
                  fail_font=italic_font;
                  will_work=false;
                }
              }
 catch (              Throwable e) {
              }
              if (will_work) {
                StyleRange styleRange=new MyStyleRange(message);
                styleRange.start=this_style_start;
                styleRange.length=this_style_length;
                styleRange.foreground=Colors.blue;
                styleRange.underline=true;
                styleRange.data=url_str;
                new_ranges.add(styleRange);
              }
 else {
                StyleRange styleRange=new MyStyleRange(message);
                styleRange.start=this_style_start;
                styleRange.length=this_style_length;
                styleRange.font=fail_font;
                new_ranges.add(styleRange);
              }
            }
 catch (            Throwable e) {
            }
          }
          pos=url_end;
        }
 else {
          pos=pos + 1;
        }
      }
      if (next_style_start < start + msg.length()) {
        if (message_type == ChatMessage.MT_INFO) {
          StyleRange styleRange=new MyStyleRange(message);
          styleRange.start=next_style_start;
          styleRange.length=start + msg.length() - next_style_start;
          styleRange.foreground=info_colour;
          styleRange.font=info_font;
          new_ranges.add(styleRange);
        }
      }
    }
  }
 catch (  Throwable e) {
    Debug.out(e);
  }
  return (msg);
}